From 754f72f1fb0ff8fb7189b5014bc8e00df5f16ec3 Mon Sep 17 00:00:00 2001 From: doomchild Date: Wed, 24 Jul 2024 13:56:12 -0500 Subject: [PATCH 1/4] Refactored all awaits into CPS --- src/TaskExtensions.cs | 95 +++++++++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 27 deletions(-) diff --git a/src/TaskExtensions.cs b/src/TaskExtensions.cs index 7a84bd0..3a19e3c 100644 --- a/src/TaskExtensions.cs +++ b/src/TaskExtensions.cs @@ -49,7 +49,7 @@ public static Task Ap( Task> morphismTask ) => morphismTask.IsFaulted ? Task.FromException(PotentiallyUnwindException(morphismTask.Exception!)) - : task.ResultMap(async value => (await morphismTask)(value)).Unwrap(); + : task.ResultMap(value => morphismTask.Result(value)); /// /// Monadic 'bimap'. @@ -99,13 +99,13 @@ public static Task BiBind( this Task task, Func> onFaulted, Func> onFulfilled - ) => task.ContinueWith(async continuationTask => + ) => task.ContinueWith(continuationTask => { if (continuationTask.IsCanceled) { try { - await continuationTask; + T result = continuationTask.Result; } catch (OperationCanceledException exception) { @@ -115,8 +115,8 @@ Func> onFulfilled return continuationTask.IsFaulted ? onFaulted(PotentiallyUnwindException(continuationTask.Exception!)) - : onFulfilled(await continuationTask); - }).Unwrap().Unwrap(); + : onFulfilled(continuationTask.Result); + }).Unwrap(); /// /// Disjunctive `leftMap`. @@ -132,10 +132,10 @@ public static Task ExceptionMap(this Task task, Func task.BiMap(onFaulted, Identity); public static Task ExceptionMap(this Task task, Func> onFaulted) - => task.ContinueWith(async continuationTask => continuationTask.IsFaulted - ? Task.FromException(await onFaulted(PotentiallyUnwindException(continuationTask.Exception))) + => task.ContinueWith(continuationTask => continuationTask.IsFaulted + ? Task.FromException(onFaulted(PotentiallyUnwindException(continuationTask.Exception)).Exception) : continuationTask - ).Unwrap().Unwrap(); + ).Unwrap(); /// /// Allows a fulfilled to be transitioned to a faulted one if the @@ -211,11 +211,17 @@ public static Task Filter( this Task task, Predicate predicate, Func> morphism - ) where E : Exception => task.Bind( - async value => predicate(value) - ? Task.FromResult(value) - : Task.FromException(await morphism(value)) - ).Unwrap(); + ) where E: Exception + { + return task.ContinueWith(continuationTask => + { + T result = continuationTask.Result; + + return predicate(result) == true + ? Task.FromResult(result) + : morphism(result).ContinueWith(failureTask => Task.FromException(failureTask.Result)).Unwrap(); + }).Unwrap(); + } /// /// Allows a fulfilled to be transitioned to a faulted one if the @@ -256,9 +262,23 @@ public static Task Filter(this Task task, Func> predicate /// A function that produces the exception to fault with if the /// returns false. /// The transformed task. - public static Task Filter(this Task task, Func> predicate, Func morphism) - => task.Bind(async value => await predicate(value) ? Task.FromResult(value) : Task.FromException(morphism(value))) - .Unwrap(); + public static Task Filter( + this Task task, + Func> predicate, + Func morphism + ) + { + return task.ContinueWith(continuationTask => + { + T predicateValue = continuationTask.Result; + + return predicate(predicateValue) + .ContinueWith(predicateTask => predicateTask.Result + ? Task.FromResult(predicateValue) + : Task.FromException(morphism(predicateValue)) + ).Unwrap(); + }).Unwrap(); + } /// /// Allows a fulfilled to be transitioned to a faulted one if the @@ -275,7 +295,20 @@ public static Task Filter( this Task task, Func> predicate, Func> morphism - ) where E : Exception => task.Filter(predicate, _ => morphism()); + ) where E : Exception + { + return task.ContinueWith(continuationTask => + { + T continuationValue = continuationTask.Result; + + return predicate(continuationValue).ContinueWith(predicateTask => + { + return predicateTask.Result + ? Task.FromResult(continuationValue) + : morphism().ContinueWith(morphismTask => Task.FromException(morphismTask.Result)).Unwrap(); + }).Unwrap(); + }).Unwrap(); + } /// /// Allows a fulfilled to be transitioned to a faulted one if the @@ -292,11 +325,20 @@ public static Task Filter( this Task task, Func> predicate, Func> morphism - ) where E : Exception => task.Bind( - async value => (await predicate(value)) - ? Task.FromResult(value) - : Task.FromException(await morphism(value)) - ).Unwrap(); + ) where E : Exception + { + return task.ContinueWith(continuationTask => + { + T continuationValue = continuationTask.Result; + + return predicate(continuationValue).ContinueWith(predicateTask => + { + return predicateTask.Result + ? Task.FromResult(continuationValue) + : morphism(continuationValue).ContinueWith(morphismTask => Task.FromException(morphismTask.Result)).Unwrap(); + }).Unwrap(); + }).Unwrap(); + } /// /// Disjunctive 'rightMap'. Can be thought of as 'fmap' for s. @@ -391,12 +433,11 @@ public static Task Delay( this Task task, TimeSpan delayInterval, CancellationToken cancellationToken = default - ) => task.ContinueWith(async continuationTask => + ) => task.ContinueWith(continuationTask => { - await Task.Delay(delayInterval, cancellationToken); - - return continuationTask; - }).Unwrap().Unwrap(); + return Task.Delay(delayInterval, cancellationToken) + .ContinueWith(delayTask => continuationTask.Result); + }).Unwrap(); /// /// Faults a with a provided . From c8e354d256d9e5644b44b89937b626dd78d1f541 Mon Sep 17 00:00:00 2001 From: doomchild Date: Thu, 25 Jul 2024 10:52:12 -0500 Subject: [PATCH 2/4] Added .Then overloads that allow for fewer closures --- .../TaskChaining_FixedRetryParams.html | 223 +++ .../TaskChaining_RetryException.html | 185 +++ coveragereport/TaskChaining_RetryParams.html | 223 +++ .../TaskChaining_TaskExtensions.html | 1365 +++++++++++++++++ coveragereport/TaskChaining_TaskExtras.html | 435 ++++++ coveragereport/TaskChaining_TaskStatics.html | 279 ++++ coveragereport/class.js | 218 +++ coveragereport/icon_cog.svg | 1 + coveragereport/icon_cog_dark.svg | 1 + coveragereport/icon_cube.svg | 2 + coveragereport/icon_cube_dark.svg | 1 + coveragereport/icon_fork.svg | 2 + coveragereport/icon_fork_dark.svg | 1 + coveragereport/icon_info-circled.svg | 2 + coveragereport/icon_info-circled_dark.svg | 2 + coveragereport/icon_minus.svg | 2 + coveragereport/icon_minus_dark.svg | 1 + coveragereport/icon_plus.svg | 2 + coveragereport/icon_plus_dark.svg | 1 + coveragereport/icon_search-minus.svg | 2 + coveragereport/icon_search-minus_dark.svg | 1 + coveragereport/icon_search-plus.svg | 2 + coveragereport/icon_search-plus_dark.svg | 1 + coveragereport/icon_sponsor.svg | 2 + coveragereport/icon_star.svg | 2 + coveragereport/icon_star_dark.svg | 2 + coveragereport/icon_up-dir.svg | 2 + coveragereport/icon_up-dir_active.svg | 2 + coveragereport/icon_up-down-dir.svg | 2 + coveragereport/icon_up-down-dir_dark.svg | 2 + coveragereport/icon_wrench.svg | 2 + coveragereport/icon_wrench_dark.svg | 1 + coveragereport/index.htm | 185 +++ coveragereport/index.html | 185 +++ coveragereport/main.js | 293 ++++ coveragereport/report.css | 819 ++++++++++ src/TaskExtensions.cs | 108 +- src/TaskExtensionsThen.cs | 296 ++++ tests/unit/TaskChainingTests.cs | 396 ----- tests/unit/TaskChainingThenTests.cs | 797 ++++++++++ 40 files changed, 5559 insertions(+), 489 deletions(-) create mode 100644 coveragereport/TaskChaining_FixedRetryParams.html create mode 100644 coveragereport/TaskChaining_RetryException.html create mode 100644 coveragereport/TaskChaining_RetryParams.html create mode 100644 coveragereport/TaskChaining_TaskExtensions.html create mode 100644 coveragereport/TaskChaining_TaskExtras.html create mode 100644 coveragereport/TaskChaining_TaskStatics.html create mode 100644 coveragereport/class.js create mode 100644 coveragereport/icon_cog.svg create mode 100644 coveragereport/icon_cog_dark.svg create mode 100644 coveragereport/icon_cube.svg create mode 100644 coveragereport/icon_cube_dark.svg create mode 100644 coveragereport/icon_fork.svg create mode 100644 coveragereport/icon_fork_dark.svg create mode 100644 coveragereport/icon_info-circled.svg create mode 100644 coveragereport/icon_info-circled_dark.svg create mode 100644 coveragereport/icon_minus.svg create mode 100644 coveragereport/icon_minus_dark.svg create mode 100644 coveragereport/icon_plus.svg create mode 100644 coveragereport/icon_plus_dark.svg create mode 100644 coveragereport/icon_search-minus.svg create mode 100644 coveragereport/icon_search-minus_dark.svg create mode 100644 coveragereport/icon_search-plus.svg create mode 100644 coveragereport/icon_search-plus_dark.svg create mode 100644 coveragereport/icon_sponsor.svg create mode 100644 coveragereport/icon_star.svg create mode 100644 coveragereport/icon_star_dark.svg create mode 100644 coveragereport/icon_up-dir.svg create mode 100644 coveragereport/icon_up-dir_active.svg create mode 100644 coveragereport/icon_up-down-dir.svg create mode 100644 coveragereport/icon_up-down-dir_dark.svg create mode 100644 coveragereport/icon_wrench.svg create mode 100644 coveragereport/icon_wrench_dark.svg create mode 100644 coveragereport/index.htm create mode 100644 coveragereport/index.html create mode 100644 coveragereport/main.js create mode 100644 coveragereport/report.css create mode 100644 src/TaskExtensionsThen.cs create mode 100644 tests/unit/TaskChainingThenTests.cs diff --git a/coveragereport/TaskChaining_FixedRetryParams.html b/coveragereport/TaskChaining_FixedRetryParams.html new file mode 100644 index 0000000..ba3183b --- /dev/null +++ b/coveragereport/TaskChaining_FixedRetryParams.html @@ -0,0 +1,223 @@ + + + + + + + +RLC.TaskChaining.FixedRetryParams - Coverage Report + +
+

< Summary

+
+
+
Information
+
+
+ + + + + + + + + + + + + +
Class:RLC.TaskChaining.FixedRetryParams
Assembly:TaskChaining
File(s):/Users/doomchild/code/github/task-chaining/src/RetryParams.cs
+
+
+
+
+
+
+
Line coverage
+
+
100%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:10
Uncovered lines:0
Coverable lines:10
Total lines:37
Line coverage:100%
+
+
+
+
+
Branch coverage
+
+
N/A
+
+ + + + + + + + + + + + + +
Covered branches:0
Total branches:0
Branch coverage:N/A
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Metrics

+
+ +++++++ + + + + + + + + + + +
MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_MaxRetries()100%11100%
get_RetryInterval()100%11100%
get_RetryBackoffRate()100%11100%
get_OnRetry()100%11100%
get_ShouldRetry()100%11100%
get_Default()100%11100%
+
+

File(s)

+

/Users/doomchild/code/github/task-chaining/src/RetryParams.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2
 3namespace RLC.TaskChaining;
 4
 5public record RetryParams(
 6  int? MaxRetries,
 7  TimeSpan? RetryInterval,
 8  double? RetryBackoffRate,
 9  Action<int, TimeSpan, Exception>? OnRetry,
 10  Predicate<Exception>? ShouldRetry
 11)
 12{
 13  public static RetryParams Default
 14  {
 15    get
 16    {
 17      return new (3, TimeSpan.FromMilliseconds(1000), 2, (_, _, _) => { }, exception => true);
 18    }
 19  }
 20}
 21
 1622internal record FixedRetryParams(
 5523  int MaxRetries,
 5524  TimeSpan RetryInterval,
 5525  double RetryBackoffRate,
 7926  Action<int, TimeSpan, Exception> OnRetry,
 4027  Predicate<Exception> ShouldRetry
 1628)
 29{
 30  public static FixedRetryParams Default
 31  {
 32    get
 133    {
 1034      return new(3, TimeSpan.FromMilliseconds(1000), 2, (_, _, _) => { }, exception => true);
 135    }
 36  }
 37}
+
+
+
+ + \ No newline at end of file diff --git a/coveragereport/TaskChaining_RetryException.html b/coveragereport/TaskChaining_RetryException.html new file mode 100644 index 0000000..cc0a62f --- /dev/null +++ b/coveragereport/TaskChaining_RetryException.html @@ -0,0 +1,185 @@ + + + + + + + +RLC.TaskChaining.RetryException - Coverage Report + +
+

< Summary

+
+
+
Information
+
+
+ + + + + + + + + + + + + +
Class:RLC.TaskChaining.RetryException
Assembly:TaskChaining
File(s):/Users/doomchild/code/github/task-chaining/src/RetryException.cs
+
+
+
+
+
+
+
Line coverage
+
+
100%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:3
Uncovered lines:0
Coverable lines:3
Total lines:11
Line coverage:100%
+
+
+
+
+
Branch coverage
+
+
N/A
+
+ + + + + + + + + + + + + +
Covered branches:0
Total branches:0
Branch coverage:N/A
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Metrics

+
+ +++++++ + + + + +
MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
+
+

File(s)

+

/Users/doomchild/code/github/task-chaining/src/RetryException.cs

+
+ + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2
 3namespace RLC.TaskChaining;
 4
 5public class RetryException : Exception
 6{
 7  public RetryException(int maxRetries, Exception? innerException = null)
 118    : base($"Retries exhausted after {maxRetries} attempts", innerException)
 119  {
 1110  }
 11}
+
+
+
+
+

Methods/Properties

+.ctor(System.Int32,System.Exception)
+
+
+ + \ No newline at end of file diff --git a/coveragereport/TaskChaining_RetryParams.html b/coveragereport/TaskChaining_RetryParams.html new file mode 100644 index 0000000..4df5018 --- /dev/null +++ b/coveragereport/TaskChaining_RetryParams.html @@ -0,0 +1,223 @@ + + + + + + + +RLC.TaskChaining.RetryParams - Coverage Report + +
+

< Summary

+
+
+
Information
+
+
+ + + + + + + + + + + + + +
Class:RLC.TaskChaining.RetryParams
Assembly:TaskChaining
File(s):/Users/doomchild/code/github/task-chaining/src/RetryParams.cs
+
+
+
+
+
+
+
Line coverage
+
+
100%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:10
Uncovered lines:0
Coverable lines:10
Total lines:37
Line coverage:100%
+
+
+
+
+
Branch coverage
+
+
N/A
+
+ + + + + + + + + + + + + +
Covered branches:0
Total branches:0
Branch coverage:N/A
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Metrics

+
+ +++++++ + + + + + + + + + + +
MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_MaxRetries()100%11100%
get_RetryInterval()100%11100%
get_RetryBackoffRate()100%11100%
get_OnRetry()100%11100%
get_ShouldRetry()100%11100%
get_Default()100%11100%
+
+

File(s)

+

/Users/doomchild/code/github/task-chaining/src/RetryParams.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2
 3namespace RLC.TaskChaining;
 4
 125public record RetryParams(
 156  int? MaxRetries,
 157  TimeSpan? RetryInterval,
 158  double? RetryBackoffRate,
 159  Action<int, TimeSpan, Exception>? OnRetry,
 1510  Predicate<Exception>? ShouldRetry
 1211)
 12{
 13  public static RetryParams Default
 14  {
 15    get
 1016    {
 8217      return new (3, TimeSpan.FromMilliseconds(1000), 2, (_, _, _) => { }, exception => true);
 1018    }
 19  }
 20}
 21
 22internal record FixedRetryParams(
 23  int MaxRetries,
 24  TimeSpan RetryInterval,
 25  double RetryBackoffRate,
 26  Action<int, TimeSpan, Exception> OnRetry,
 27  Predicate<Exception> ShouldRetry
 28)
 29{
 30  public static FixedRetryParams Default
 31  {
 32    get
 33    {
 34      return new(3, TimeSpan.FromMilliseconds(1000), 2, (_, _, _) => { }, exception => true);
 35    }
 36  }
 37}
+
+
+
+ + \ No newline at end of file diff --git a/coveragereport/TaskChaining_TaskExtensions.html b/coveragereport/TaskChaining_TaskExtensions.html new file mode 100644 index 0000000..56ec58d --- /dev/null +++ b/coveragereport/TaskChaining_TaskExtensions.html @@ -0,0 +1,1365 @@ + + + + + + + +RLC.TaskChaining.TaskExtensions - Coverage Report + +
+

< Summary

+ +
+
+
Line coverage
+
+
67%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:193
Uncovered lines:92
Coverable lines:285
Total lines:1035
Line coverage:67.7%
+
+
+
+
+
Branch coverage
+
+
59%
+
+ + + + + + + + + + + + + +
Covered branches:37
Total branches:62
Branch coverage:59.6%
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Metrics

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: PotentiallyUnwindException(...)50%22100%
File 1: HandleCancellation(...)100%1.24137.5%
File 1: Alt(...)100%22100%
File 1: Alt(...)100%22100%
File 1: Ap(...)100%22100%
File 1: BiMap(...)100%11100%
File 1: Bind(...)100%11100%
File 1: BiBind(...)100%44100%
File 1: ExceptionMap(...)100%210%
File 1: ExceptionMap(...)0%620%
File 1: Filter(...)100%11100%
File 1: Filter(...)100%11100%
File 1: Filter(...)100%22100%
File 1: Filter(...)100%11100%
File 1: Filter(...)100%44100%
File 1: Filter(...)100%11100%
File 1: Filter(...)100%11100%
File 1: Filter(...)100%22100%
File 1: Filter(...)100%44100%
File 1: Filter(...)100%44100%
File 1: ResultMap(...)100%11100%
File 1: Recover(...)100%11100%
File 1: Recover(...)100%11100%
File 1: Catch(...)100%11100%
File 1: Catch(...)100%11100%
File 1: CatchWhen(...)100%22100%
File 1: CatchWhen(...)100%22100%
File 1: Delay(...)100%11100%
File 1: Fault(...)100%11100%
File 1: Fault(...)100%11100%
File 1: Fault(...)100%11100%
File 1: Fault(...)100%11100%
File 1: Retry(...)100%11100%
File 1: Retry(...)100%11100%
File 1: Retry(...)100%11100%
File 1: Retry(...)100%11100%
File 2: IfFaulted(...)100%11100%
File 2: IfFaulted(...)100%1.03168.96%
File 2: IfFaulted(...)100%11100%
File 3: IfFulfilled(...)100%11100%
File 3: IfFulfilled(...)100%11100%
File 3: IfFulfilled(...)100%11100%
File 4: Tap(...)100%11100%
File 4: Tap(...)100%210%
File 4: Tap(...)100%210%
File 4: Tap(...)100%11100%
File 4: Tap(...)100%210%
File 4: Tap(...)100%210%
File 4: Tap(...)100%11100%
File 4: Tap(...)100%11100%
File 5: Then(...)100%11100%
File 5: Then(...)100%11100%
File 5: Then(...)100%11100%
File 5: Then(...)100%11100%
File 5: Then(...)100%11100%
File 5: Then(...)100%11100%
File 5: Then(...)75%4.06484.61%
File 5: Then(...)75%4.06484.61%
File 5: Then(...)0%2040%
File 5: Then(...)0%2040%
File 5: Then(...)0%2040%
File 5: Then(...)0%2040%
File 5: Then(...)0%2040%
+
+

File(s)

+

/Users/doomchild/code/github/task-chaining/src/TaskExtensions.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Threading;
 3using System.Threading.Tasks;
 4
 5namespace RLC.TaskChaining;
 6
 7using static TaskStatics;
 8
 9public static partial class TaskExtensions
 10{
 11  #region Monadic Functions
 12
 11513  private static Exception PotentiallyUnwindException(AggregateException exception) => exception.InnerException != null
 11514    ? exception.InnerException
 11515    : exception;
 16
 17  private static Exception HandleCancellation<T>(this Task<T> task)
 318  {
 19    try
 320    {
 321      T result = task.Result;
 22
 023      return new Exception("Expected canceled task");
 24    }
 025    catch (OperationCanceledException exception)
 026    {
 027      return exception;
 28    }
 029  }
 30
 31  /// <summary>
 32  /// Monadic 'alt'.
 33  /// </summary>
 34  /// <remarks>This method allows you to swap a faulted <see name="Task{T}"/> with an alternate
 35  /// <see name="Task{T}"/>.</remarks>
 36  /// <typeparam name="T">The task's underlying type.</typeparam>
 37  /// <param name="other">The replacement <see name="Task{T}"/>.</param>
 38  /// <returns>The alternative value if the original <see name="Task{T}"/> was faulted, otherwise the original
 39  /// <see name="Task{T}"/>.</returns>
 240  public static Task<T> Alt<T>(this Task<T> task, Task<T> other) => task.IsFaulted ? other : task;
 41
 42  /// <summary>
 43  /// Monadic 'alt'.
 44  /// </summary>
 45  /// <remarks>This method allows you to swap a faulted <see name="Task{T}"/> with an alternate <see name="Task{T}"/>
 46  /// produced by the supplier function.</remarks>
 47  /// <typeparam name="T">The task's underlying type.</typeparam>
 48  /// <param name="supplier">A supplier function.</param>
 49  /// <returns>The alternative value if the original <see name="Task{T}"/> was faulted, otherwise the original
 50  /// <see name="Task{T}"/>.</returns>
 251  public static Task<T> Alt<T>(this Task<T> task, Func<Task<T>> supplier) => task.IsFaulted ? supplier() : task;
 52
 53  /// <summary>
 54  /// Monadic 'ap'.
 55  /// </summary>
 56  /// <typeparam name="T">The task's underlying type.</typeparam>
 57  /// <typeparams name="TR">The type of the other input value to <paramref name="morphismTask"/>.</typeparam>
 58  /// <typeparam name="TNext">The transformed type.</typeparam>
 59  /// <param name="morphismTask">A <see cref="Task{Func{T, TR, TNext}}"/> containing the transformation function. </para
 60  /// <returns>The transformed task.</returns>
 61  public static Task<TNext> Ap<T, TNext>(
 62    this Task<T> task,
 63    Task<Func<T, TNext>> morphismTask
 464  ) => morphismTask.IsFaulted
 465    ? Task.FromException<TNext>(PotentiallyUnwindException(morphismTask.Exception!))
 666    : task.ResultMap(value => morphismTask.Result(value));
 67
 68  /// <summary>
 69  /// Monadic 'bimap'.
 70  /// </summary>
 71  /// <remarks>This method allows you to specify a transformation for both sides (fulfilled and faulted) of a
 72  /// <see name="Task{T}"/>.  If the input <see name="Task{T}"/> is fulfilled, the <code>onFulfilled</code> function
 73  /// will be executed, otherwise the <code>onFaulted</code> function will be executed.  Note that this method
 74  /// does NOT allow a faulted <see name="Task{T}"/> to be transitioned back into a fulfilled one.</remarks>
 75  /// <typeparam name="T">The task's underlying type.</typeparam>
 76  /// <typeparam name="TNext">The transformed type.</typeparam>
 77  /// <param name="onFaulted">The function to run if the task is faulted.</param>
 78  /// <param name="onFulfilled">The function to run if the task is fulfilled.</param>
 79  /// <returns>The transformed task.</returns>
 80  public static Task<TNext> BiMap<T, TNext>(
 81    this Task<T> task,
 82    Func<Exception, Exception> onFaulted,
 83    Func<T, TNext> onFulfilled
 5184  ) => task.BiBind(
 5185    Pipe2(onFaulted, Task.FromException<TNext>),
 5186    Pipe2(onFulfilled, Task.FromResult)
 5187  );
 88
 89  /// <summary>
 90  /// Monadic 'bind'.
 91  /// </summary>
 92  /// <remarks>This is the normal monadic 'bind' in which a function transforms the <see name="Task{T}"/>'s unwrapped
 93  /// value into a wrapped <see name="Task{T}"/>.</remarks>
 94  /// <typeparam name="T">The task's underlying type.</typeparam>
 95  /// <typeparam name="TNext">The transformed type.</typeparam>
 96  /// <param name="onFulfilled">The function to run if the task is fulfilled.</param>
 97  /// <returns>The transformed task.</returns>
 3098  public static Task<TNext> Bind<T, TNext>(this Task<T> task, Func<T, Task<TNext>> onFulfilled) => task.BiBind(
 3099    Task.FromException<TNext>,
 30100    onFulfilled
 30101  );
 102
 103  /// <summary>
 104  /// Monadic 'bind' on both sides of a <see name="Task{T}"/>.
 105  /// </summary>
 106  /// <remarks>This method allows either side of a <see name="Task{T}"/> (faulted or fulfilled) to be bound to a new
 107  /// type.  Note that this method requires a faulted <see name="Task{T}"/> to be transitioned back into a fulfilled
 108  /// one.</remarks>
 109  /// <typeparam name="T">The task's underlying type.</typeparam>
 110  /// <typeparam name="TNext">The transformed type.</typeparam>
 111  /// <returns>The transformed task.</returns>
 112  public static Task<TNext> BiBind<T, TNext>(
 113    this Task<T> task,
 114    Func<Exception, Task<TNext>> onFaulted,
 115    Func<T, Task<TNext>> onFulfilled
 176116  ) => task.ContinueWith(continuationTask =>
 176117    {
 176118      if (continuationTask.IsCanceled)
 3119      {
 3120        return Task.FromException<TNext>(HandleCancellation(task));
 176121      }
 176122
 173123      return continuationTask.IsFaulted
 173124        ? onFaulted(PotentiallyUnwindException(continuationTask.Exception!))
 173125        : onFulfilled(continuationTask.Result);
 326126    }).Unwrap();
 127
 128  /// <summary>
 129  /// Disjunctive `leftMap`.
 130  /// </summary>
 131  /// <remarks>This method allows a faulted <see name="Task{T}"/>'s <see name="Exception"/> to be transformed into
 132  /// another type of <see name="Exception"/> (<see name="Task{T}"/>'s left side is pinned to <see name="Exception"/>).
 133  /// This can be used to transform an <see name="Exception"/> to add context or to use a custom exception
 134  /// type.</remarks>
 135  /// <typeparam name="T">The task's underlying type.</typeparam>
 136  /// <param name="onFaulted">The transformation function.</param>
 137  /// <returns>The transformated task.</returns>
 138  public static Task<T> ExceptionMap<T>(this Task<T> task, Func<Exception, Exception> onFaulted)
 0139    => task.BiMap(onFaulted, Identity);
 140
 141  public static Task<T> ExceptionMap<T>(this Task<T> task, Func<Exception, Task<Exception>> onFaulted)
 0142    => task.ContinueWith(continuationTask => continuationTask.IsFaulted
 0143      ? Task.FromException<T>(onFaulted(PotentiallyUnwindException(continuationTask.Exception)).Exception)
 0144      : continuationTask
 0145    ).Unwrap();
 146
 147  /// <summary>
 148  /// Allows a fulfilled <see name="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 149  /// returns <code>false</code>.
 150  /// </summary>
 151  /// <remarks>This method provides another way to perform validation on the value contained within the
 152  /// <see name="Task{T}"/>.</remarks>
 153  /// <typeparam name="T">The task's underlying type.</typeparam>
 154  /// <param name="predicate">The predicate to run on the <see name="Task{T}"/>'s value.</param>
 155  /// <param name="exception">The exception to fault with if the <paramref name="predicate"/> returns
 156  /// <code>false</code>.</param>
 157  /// <returns>The transformed task.</returns>
 158  public static Task<T> Filter<T>(this Task<T> task, Predicate<T> predicate, Exception exception)
 3159    => task.Filter(predicate, Constant(exception));
 160
 161  /// <summary>
 162  /// Allows a fulfilled <see name="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 163  /// returns <code>false</code>.
 164  /// </summary>
 165  /// <remarks>This method provides another way to perform validation on the value contained within the
 166  /// <see name="Task{T}"/>.</remarks>
 167  /// <typeparam name="T">The task's underlying type.</typeparam>
 168  /// <param name="predicate">The predicate to run on the <see name="Task{T}"/>'s value.</param>
 169  /// <param name="supplier">A supplier function that produces the exception to fault with if the
 170  /// <paramref name="predicate"/> returns <code>false</code>.</param>
 171  /// <returns>The transformed task.</returns>
 172  public static Task<T> Filter<T>(this Task<T> task, Predicate<T> predicate, Func<Exception> supplier)
 4173    => task.Filter(predicate, _ => supplier());
 174
 175  /// <summary>
 176  /// Allows a fulfilled <see cref="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 177  /// returns <code>false</code>.
 178  /// </summary>
 179  /// <remarks>This method provides another way to perform validation on the value contained within the
 180  /// <see name="Task{T}"/>.</remarks>
 181  /// <typeparam name="T">The task's underlying type.</typeparam>
 182  /// <param name="predicate">The predicate to run on the <see cref="Task{T}"/>'s value.</param>
 183  /// <param name="morphism">A function that produces the exception to fault with if the <paramref name="predicate"/>
 184  /// returns <code>false</code>.</param>
 185  /// <returns>The transformed task.</returns>
 186  public static Task<T> Filter<T>(this Task<T> task, Predicate<T> predicate, Func<T, Exception> morphism)
 12187    => task.Bind(value => predicate(value) ? Task.FromResult(value) : Task.FromException<T>(morphism(value)));
 188
 189  /// <summary>
 190  /// Allows a fulfilled <see cref="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 191  /// return <code>false</code>.
 192  /// </summary>
 193  /// <typeparam name="T">The task's underlying type.</typeparam>
 194  /// <typeparam name="E">The type of <see cref="Exception"/> that <paramref name="morphism"/> returns.</typeparam>
 195  /// <param name="task">The task.</param>
 196  /// <param name="predicate">The predicate to run on the <see cref="Task{T}"/>'s value.</param>
 197  /// <param name="morphism">A function that produces a <see cref="Task{E}"/> to fault with if the
 198  /// <paramref name="predicate"/>returns <code>false</code>.</param>
 199  /// <returns>The transformed task.</returns>
 200  public static Task<T> Filter<T, E>(
 201    this Task<T> task,
 202    Predicate<T> predicate,
 203    Func<Task<E>> morphism
 4204  ) where E : Exception => task.Filter(predicate, _ => morphism());
 205
 206  /// <summary>
 207  /// Allows a fulfilled <see cref="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 208  /// return <code>false</code>.
 209  /// </summary>
 210  /// <typeparam name="T">The task's underlying type.</typeparam>
 211  /// <typeparam name="E">The type of <see cref="Exception"/> that <paramref name="morphism"/> returns.</typeparam>
 212  /// <param name="task">The task.</param>
 213  /// <param name="predicate">The predicate to run on the <see cref="Task{T}"/>'s value.</param>
 214  /// <param name="morphism">A function that produces a <see cref="Task{E}"/> to fault with if the
 215  /// <paramref name="predicate"/>returns <code>false</code>.</param>
 216  /// <returns>The transformed task.</returns>
 217  public static Task<T> Filter<T, E>(
 218    this Task<T> task,
 219    Predicate<T> predicate,
 220    Func<T, Task<E>> morphism
 221  ) where E: Exception
 6222  {
 6223    return task.ContinueWith(continuationTask =>
 6224    {
 6225      T result = continuationTask.Result;
 6226
 6227      return predicate(result) == true
 6228        ? Task.FromResult(result)
 8229        : morphism(result).ContinueWith(failureTask => Task.FromException<T>(failureTask.Result)).Unwrap();
 12230    }).Unwrap();
 6231  }
 232
 233  /// <summary>
 234  /// Allows a fulfilled <see name="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 235  /// returns <code>false</code>.
 236  /// </summary>
 237  /// <remarks>This method provides another way to perform validation on the value contained within the
 238  /// <see name="Task{T}"/>.</remarks>
 239  /// <typeparam name="T">The task's underlying type.</typeparam>
 240  /// <param name="predicate">The predicate to run on the <see name="Task{T}"/>'s value.</param>
 241  /// <param name="exception">The exception to fault with if the <paramref name="predicate"/> returns
 242  /// <code>false</code>.</param>
 243  /// <returns>The transformed task.</returns>
 244  public static Task<T> Filter<T>(this Task<T> task, Func<T, Task<bool>> predicate, Exception exception)
 3245    => task.Filter(predicate, Constant(exception));
 246
 247  /// <summary>
 248  /// Allows a fulfilled <see name="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 249  /// returns <code>false</code>.
 250  /// </summary>
 251  /// <remarks>This method provides another way to perform validation on the value contained within the
 252  /// <see name="Task{T}"/>.</remarks>
 253  /// <typeparam name="T">The task's underlying type.</typeparam>
 254  /// <param name="predicate">The predicate to run on the <see name="Task{T}"/>'s value.</param>
 255  /// <param name="supplier">A supplier function that produces the exception to fault with if the
 256  /// <paramref name="predicate"/> returns <code>false</code>.</param>
 257  /// <returns>The transformed task.</returns>
 258  public static Task<T> Filter<T>(this Task<T> task, Func<T, Task<bool>> predicate, Func<Exception> supplier)
 4259    => task.Filter(predicate, _ => supplier());
 260
 261  /// <summary>
 262  /// Allows a fulfilled <see cref="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 263  /// returns <code>false</code>.
 264  /// </summary>
 265  /// <remarks>This method provides another way to perform validation on the value contained within the
 266  /// <see name="Task{T}"/>.</remarks>
 267  /// <typeparam name="T">The task's underlying type.</typeparam>
 268  /// <param name="predicate">The predicate to run on the <see cref="Task{T}"/>'s value.</param>
 269  /// <param name="morphism">A function that produces the exception to fault with if the <paramref name="predicate"/>
 270  /// returns <code>false</code>.</param>
 271  /// <returns>The transformed task.</returns>
 272  public static Task<T> Filter<T>(
 273    this Task<T> task,
 274    Func<T, Task<bool>> predicate,
 275    Func<T, Exception> morphism
 276  )
 6277  {
 6278    return task.ContinueWith(continuationTask =>
 6279    {
 6280      T predicateValue = continuationTask.Result;
 6281
 6282      return predicate(predicateValue)
 6283        .ContinueWith(predicateTask => predicateTask.Result
 6284                      ? Task.FromResult(predicateValue)
 6285                      : Task.FromException<T>(morphism(predicateValue))
 6286        ).Unwrap();
 12287    }).Unwrap();
 6288  }
 289
 290  /// <summary>
 291  /// Allows a fulfilled <see cref="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 292  /// return <code>false</code>.
 293  /// </summary>
 294  /// <typeparam name="T">The task's underlying type.</typeparam>
 295  /// <typeparam name="E">The type of <see cref="Exception"/> that <paramref name="morphism"/> returns.</typeparam>
 296  /// <param name="task">The task.</param>
 297  /// <param name="predicate">The predicate to run on the <see cref="Task{T}"/>'s value.</param>
 298  /// <param name="morphism">A function that produces a <see cref="Task{E}"/> to fault with if the
 299  /// <paramref name="predicate"/>returns <code>false</code>.</param>
 300  /// <returns>The transformed task.</returns>
 301  public static Task<T> Filter<T, E>(
 302    this Task<T> task,
 303    Func<T, Task<bool>> predicate,
 304    Func<Task<E>> morphism
 305  ) where E : Exception
 3306  {
 3307    return task.ContinueWith(continuationTask =>
 3308    {
 3309      T continuationValue = continuationTask.Result;
 3310
 3311      return predicate(continuationValue).ContinueWith(predicateTask =>
 3312      {
 3313        return predicateTask.Result
 3314          ? Task.FromResult(continuationValue)
 4315          : morphism().ContinueWith(morphismTask => Task.FromException<T>(morphismTask.Result)).Unwrap();
 6316      }).Unwrap();
 6317    }).Unwrap();
 3318  }
 319
 320  /// <summary>
 321  /// Allows a fulfilled <see cref="Task{T}"/> to be transitioned to a faulted one if the <paramref name="predicate"/>
 322  /// return <code>false</code>.
 323  /// </summary>
 324  /// <typeparam name="T">The task's underlying type.</typeparam>
 325  /// <typeparam name="E">The type of <see cref="Exception"/> that <paramref name="morphism"/> returns.</typeparam>
 326  /// <param name="task">The task.</param>
 327  /// <param name="predicate">The predicate to run on the <see cref="Task{T}"/>'s value.</param>
 328  /// <param name="morphism">A function that produces a <see cref="Task{E}"/> to fault with if the
 329  /// <paramref name="predicate"/>returns <code>false</code>.</param>
 330  /// <returns>The transformed task.</returns>
 331  public static Task<T> Filter<T, E>(
 332    this Task<T> task,
 333    Func<T, Task<bool>> predicate,
 334    Func<T, Task<E>> morphism
 335  ) where E : Exception
 3336  {
 3337    return task.ContinueWith(continuationTask =>
 3338    {
 3339      T continuationValue = continuationTask.Result;
 3340
 3341      return predicate(continuationValue).ContinueWith(predicateTask =>
 3342      {
 3343        return predicateTask.Result
 3344          ? Task.FromResult(continuationValue)
 4345          : morphism(continuationValue).ContinueWith(morphismTask => Task.FromException<T>(morphismTask.Result)).Unwrap(
 6346      }).Unwrap();
 6347    }).Unwrap();
 3348  }
 349
 350  /// <summary>
 351  /// Disjunctive 'rightMap'.  Can be thought of as 'fmap' for <see name="Task{T}"/>s.
 352  /// </summary>
 353  /// <remarks>This method allows the value in a fulfilled <see name="Task{T}"/> to be transformed into another
 354  /// type.</remarks>
 355  /// <typeparam name="T">The task's underlying type.</typeparam>
 356  /// <typeparam name="TNext">The transformed type.</typeparam>
 357  /// <param name="morphism">The transformation function.</param>
 358  /// <returns>The transformed task.</returns>
 359  public static Task<TNext> ResultMap<T, TNext>(this Task<T> task, Func<T, TNext> morphism)
 51360    => task.BiMap(Identity, morphism);
 361
 362  /// <summary>
 363  /// Allows a faulted <see name="Task{T}"/> to be transitioned to a fulfilled one.
 364  /// </summary>
 365  /// <typeparam name="T">The task's underlying type.</typeparam>
 366  /// <param name="morphism">The function to convert an <see name="Exception"/> into a <typeparamref name="T"/>.</param>
 367  /// <returns>The transformed task.</returns>
 368  public static Task<T> Recover<T>(this Task<T> task, Func<Exception, T> morphism)
 3369    => task.Then(Identity, morphism);
 370
 371  /// <summary>
 372  /// Allows a faulted <see name="Task{T}"/> to be transitioned to a fulfilled one.
 373  /// </summary>
 374  /// <typeparam name="T">The task's underlying type.</typeparam>
 375  /// <param name="morphism">The function to convert an <see name="Exception"/> into a <typeparamref name="T"/>.</param>
 376  /// <returns>The transformed task.</returns>
 377  public static Task<T> Recover<T>(this Task<T> task, Func<Exception, Task<T>> morphism)
 64378    => task.BiBind(morphism, Task.FromResult);
 379
 380  #endregion
 381
 382  /// <summary>
 383  /// Allows a faulted <see name="Task{T}"/> to be transitioned to a fulfilled one.
 384  /// </summary>
 385  /// <remarks>This method is an alias to <code>Task.Recover</code>.</remarks>
 386  /// <typeparam name="T">The task's underlying type.</typeparam>
 387  /// <param name="onFaulted">The function to convert an <see name="Exception"/> into a
 388  /// <typeparamref name="T"/>.</param>
 389  /// <returns>The transformed task.</returns>
 3390  public static Task<T> Catch<T>(this Task<T> task, Func<Exception, T> onFaulted) => task.Recover(onFaulted);
 391
 392  /// <summary>
 393  /// Allows a faulted <see name="Task{T}"/> to be transitioned to a fulfilled one.
 394  /// </summary>
 395  /// <remarks>This method is an alias to <code>Task.Recover</code> in order to line up with the expected Promise
 396  /// API.</remarks>
 397  /// <typeparam name="T">The task's underlying type.</typeparam>
 398  /// <param name="onFaulted">The function to convert an <see name="Exception"/> into a
 399  /// <typeparamref name="T"/>.</param>
 400  /// <returns>The transformed task.</returns>
 60401  public static Task<T> Catch<T>(this Task<T> task, Func<Exception, Task<T>> onFaulted) => task.Recover(onFaulted);
 402
 403  /// <summary>
 404  /// Transitions a faulted <see name="Task{T}"/> into a fulfilled one if the contained exception matches the supplied
 405  /// type.
 406  /// </summary>
 407  /// <remarks>This method is an alias to <code>Task.Recover</code> in order to line up with the expected Promise
 408  /// API.</remarks>
 409  /// <typeparam name="T">The task's underlying type.</typeparam>
 410  /// <typeparam name="TException">The type of exception to catch.</typeparam>
 411  /// <param name="onFaulted">The function to convert a <typeparamref name="TException" /> into a
 412  /// <typeparamref name="T"/>.</param>
 413  /// <returns>The transformed task.</returns>
 414  public static Task<T> CatchWhen<T, TException>(this Task<T> task, Func<TException, T> onFaulted)
 2415    where TException : Exception => task.Recover(
 2416      ex => ex is TException
 2417      ? Task.FromResult(onFaulted((TException) ex))
 2418      : task
 2419    );
 420
 421  /// <summary>
 422  /// Transitions a faulted <see name="Task{T}"/> into a fulfilled one if the contained exception matches the supplied
 423  /// type.
 424  /// </summary>
 425  /// <remarks>This method is an alias to <code>Task.Recover</code> in order to line up with the expected Promise
 426  /// API.</remarks>
 427  /// <typeparam name="T">The task's underlying type.</typeparam>
 428  /// <typeparam name="TException">The type of exception to catch.</typeparam>
 429  /// <param name="onFaulted">The function to convert a <typeparamref name="TException" /> into a
 430  /// <typeparamref name="T"/>.</param>
 431  /// <returns>The transformed task.</returns>
 432  public static Task<T> CatchWhen<T, TException>(this Task<T> task, Func<TException, Task<T>> onFaulted)
 2433    where TException : Exception => task.Recover(
 2434      ex => ex is TException
 2435      ? onFaulted((TException) ex)
 2436      : task
 2437    );
 438
 439  public static Task<T> Delay<T>(
 440    this Task<T> task,
 441    TimeSpan delayInterval,
 442    CancellationToken cancellationToken = default
 1443  ) => task.ContinueWith(continuationTask =>
 1444  {
 1445    return Task.Delay(delayInterval, cancellationToken)
 2446      .ContinueWith(delayTask => continuationTask.Result);
 2447  }).Unwrap();
 448
 449  /// <summary>
 450  /// Faults a <see cref="Task{T}"/> with a provided <see cref="Exception"/>.
 451  /// </summary>
 452  /// <typeparam name="T">The task's underlying type.</typeparam>
 453  /// <param name="task">The task.</param>
 454  /// <param name="exception">The exception that will be used to fault the task.</param>
 455  /// <returns>The task.</returns>
 3456  public static Task<T> Fault<T>(this Task<T> task, Exception exception) => task.Fault(_ => exception);
 457
 458  /// <summary>
 459  /// Faults a <see cref="Task{T}"/> with an <see cref="Exception"/> produced by <paramref name="faultMorphism"/>.
 460  /// </summary>
 461  /// <typeparam name="T">The task's underlying type.</typeparam>
 462  /// <param name="task">The task.</param>
 463  /// <param name="faultMorphism">The function that will produce the <see cref="Exception"/>.</param>
 464  /// <returns>The task.</returns>
 2465  public static Task<T> Fault<T>(this Task<T> task, Func<T, Exception> faultMorphism) => task.ResultMap(
 1466    value => Task.FromException<T>(faultMorphism(value))
 2467  ).Unwrap();
 468
 469  /// <summary>
 470  /// Faults a <see cref="Task{T}"/> with a provided <see cref="Exception"/>.
 471  /// </summary>
 472  /// <typeparam name="T">The input task's underlying type.</typeparam>
 473  /// <typeparam name="TNext">The output task's underlying type.</typeparam>
 474  /// <param name="task">The task.</param>
 475  /// <param name="exception">The exception that will be used to fault the task.</param>
 476  /// <returns>The task.</returns>
 477  public static Task<TNext> Fault<T, TNext>(this Task<T> task, Exception exception) =>
 3478    task.Fault<T, TNext>(_ => exception);
 479
 480  /// <summary>
 481  /// Faults a <see cref="Task{T}"/> with an <see cref="Exception"/> produced by <paramref name="faultMorphism"/>.
 482  /// </summary>
 483  /// <typeparam name="T">The input task's underlying type.</typeparam>
 484  /// <typeparam name="TNext">The output task's underlying type.</typeparam>
 485  /// <param name="task">The task.</param>
 486  /// <param name="faultMorphism">The function that will produce the <see cref="Exception"/>.</param>
 487  /// <returns>The task.</returns>
 2488  public static Task<TNext> Fault<T, TNext>(this Task<T> task, Func<T, Exception> faultMorphism) => task.ResultMap(
 1489    value => Task.FromException<TNext>(faultMorphism(value))
 2490  ).Unwrap();
 491
 492  public static Task<TNext> Retry<T, TNext>(
 493    this Task<T> task,
 494    Func<T, Task<TNext>> retryFunc,
 495    RetryParams retryOptions
 28496  ) => task.ResultMap(value => TaskExtras.Retry(() => retryFunc(value), retryOptions)).Unwrap();
 497
 498  public static Task<TNext> Retry<T, TNext>(this Task<T> task, Func<T, TNext> retryFunc, RetryParams retryOptions)
 11499    => task.Retry(value => Task.FromResult(retryFunc(value)), retryOptions);
 500
 501  public static Task<TNext> Retry<T, TNext>(this Task<T> task, Func<T, Task<TNext>> retryFunc)
 1502    => task.Retry(retryFunc, RetryParams.Default);
 503
 504  public static Task<TNext> Retry<T, TNext>(this Task<T> task, Func<T, TNext> retryFunc)
 1505    => task.Retry(retryFunc, RetryParams.Default);
 506}
+
+

/Users/doomchild/code/github/task-chaining/src/TaskExtensionsIfFaulted.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Threading;
 3using System.Threading.Tasks;
 4
 5namespace RLC.TaskChaining;
 6
 7using static TaskStatics;
 8
 9public static partial class TaskExtensions
 10{
 11  /// <summary>
 12  /// Performs an action if the <see name="Task{T}"/> is in a faulted state.
 13  /// </summary>
 14  /// <typeparam name="T">The task's underlying type.</typeparam>
 15  /// <param name="onFaulted">The action to perform if the task is faulted.</param>
 16  /// <returns>The task.</returns>
 17  public static Task<T> IfFaulted<T>(this Task<T> task, Action<Exception> onFaulted)
 1218    => task.IfFaulted<T, T>(exception =>
 719    {
 720      onFaulted(exception);
 1221
 722      return Task.FromException<T>(exception);
 1923    });
 24
 25  /// <summary>
 26  /// Executes a function and throws away the result if the <see name="Task{T}"/> is in a faulted state.
 27  /// </summary>
 28  /// <typeparam name="T">The task's underlying type.</typeparam>
 29  /// <typeparam name="R">The output task's underlying type.</typeparam>
 30  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 31  /// <returns>The task.</returns>
 32  public static Task<T> IfFaulted<T, R>(this Task<T> task, Func<Exception, Task<R>> onFaulted)
 1833    => task.ContinueWith(async continuationTask =>
 1834    {
 1835      if (continuationTask.IsFaulted)
 1136      {
 1137        Exception taskException = PotentiallyUnwindException(continuationTask.Exception!);
 1838
 1139        return Task.FromException<R>(PotentiallyUnwindException(continuationTask.Exception!))
 1140          .Catch<R>(ex => onFaulted(ex))
 1141          .Then(
 142            _ => Task.FromException<T>(taskException),
 1043            _ => Task.FromException<T>(taskException)
 1144          );
 1845      }
 746      else if (continuationTask.IsCanceled)
 047      {
 1848        try
 049        {
 050          await continuationTask;
 051        }
 052        catch(OperationCanceledException exception)
 053        {
 054          await onFaulted(exception);
 1855
 056          return Task.FromException<T>(exception);
 1857        }
 058      }
 1859
 760      return continuationTask;
 3661    }).Unwrap().Unwrap();
 62
 63  /// <summary>
 64  /// Executes a function and throws away the result if the <see name="Task{T}"/> is in a faulted state.
 65  /// </summary>
 66  /// <typeparam name="T">The task's underlying type.</typeparam>
 67  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 68  /// <returns>The task.</returns>
 69  public static Task<T> IfFaulted<T>(this Task<T> task, Func<Exception, Task> onFaulted)
 670    => task.IfFaulted<T, T>(exception => onFaulted(exception).ContinueWith(continuationTask => Task.FromException<T>(exc
 71}
+
+

/Users/doomchild/code/github/task-chaining/src/TaskExtensionsIfFulfilled.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Threading;
 3using System.Threading.Tasks;
 4
 5namespace RLC.TaskChaining;
 6
 7using static TaskStatics;
 8
 9public static partial class TaskExtensions
 10{
 11  /// <summary>
 12  /// Performs an action if the <see name="Task{T}"/> is in a fulfilled state.
 13  /// </summary>
 14  /// <typeparam name="T">The task's underlying type.</typeparam>
 15  /// <param name="consumer">The action to perform if the task is fulfilled.</param>
 16  /// <returns>The task.</returns>
 17  public static Task<T> IfFulfilled<T>(this Task<T> task, Action<T> consumer)
 1218    => task.ResultMap(TaskStatics.Tap(consumer));
 19
 20  /// <summary>
 21  /// Executes a function and throws away the result if the <see name="Task{T}"/> is in a fulfilled state.
 22  /// </summary>
 23  /// <typeparam name="T">The task's underlying type.</typeparam>
 24  /// <typeparam name="R">The type of the discarded result of <paramref name="func"/>.</typeparam>
 25  /// <param name="task">The task.</param>
 26  /// <param name="func">The function to execute if the task is fulfilled.</param>
 27  /// <returns>The task.</returns>
 28  public static Task<T> IfFulfilled<T, R>(this Task<T> task, Func<T, Task<R>> func)
 829    => task.ContinueWith(async continuationTask =>
 830    {
 831      if (continuationTask.IsFaulted || continuationTask.IsCanceled)
 232      {
 233        return continuationTask;
 834      }
 835      else
 636      {
 637        T value = await continuationTask;
 838
 1239        return Task.FromResult(value).Then(func).Then(_ => value, _ => value);
 840      }
 1641    }).Unwrap().Unwrap();
 42
 43  /// <summary>
 44  /// Executes a function and throws away the result if the <see name="Task{T}"/> is in a fulfilled state.
 45  /// </summary>
 46  /// <typeparam name="T">The task's underlying type.</typeparam>
 47  /// <typeparam name="R">The type of the discarded result of <paramref name="func"/>.</typeparam>
 48  /// <param name="task">The task.</param>
 49  /// <param name="func">The function to execute if the task is fulfilled.</param>
 50  /// <returns>The task.</returns>
 51  public static Task<T> IfFulfilled<T>(this Task<T> task, Func<T, Task> func)
 1052    => task.IfFulfilled<T, T>(value => Task.FromResult(value).Then(func).Then(_ => value, _ => value));
 53}
+
+

/Users/doomchild/code/github/task-chaining/src/TaskExtensionsTap.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Threading;
 3using System.Threading.Tasks;
 4
 5namespace RLC.TaskChaining;
 6
 7using static TaskStatics;
 8
 9public static partial class TaskExtensions
 10{
 11  /// <summary>
 12  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 13  /// </summary>
 14  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 15  /// value, such as logging.</remarks>
 16  /// <typeparam name="T">The task's underlying type.</typeparam>
 17  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 18  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 19  /// <returns>The task.</returns>
 20  public static Task<T> Tap<T>(this Task<T> task, Action<T> onFulfilled, Action<Exception> onFaulted)
 621    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 22
 23  /// <summary>
 24  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 25  /// </summary>
 26  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 27  /// value, such as logging.</remarks>
 28  /// <typeparam name="T">The task's underlying type.</typeparam>
 29  /// <typeparam name="R">The output type of the <paramref name="onFaulted" /> function.
 30  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 31  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 32  /// <returns>The task.</returns>
 33  public static Task<T> Tap<T, R>(this Task<T> task, Action<T> onFulfilled, Func<Exception, Task<R>> onFaulted)
 034    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 35
 36  /// <summary>
 37  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 38  /// </summary>
 39  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 40  /// value, such as logging.</remarks>
 41  /// <typeparam name="T">The task's underlying type.</typeparam>
 42  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 43  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 44  /// <returns>The task.</returns>
 45  public static Task<T> Tap<T>(this Task<T> task, Action<T> onFulfilled, Func<Exception, Task> onFaulted)
 046    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 47
 48  /// <summary>
 49  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 50  /// </summary>
 51  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 52  /// value, such as logging.</remarks>
 53  /// <typeparam name="T">The task's underlying type.</typeparam>
 54  /// <typeparam name="R">The output type of the <paramref name="onFaulted" /> function.
 55  /// <param name="onFulfilled">The action to perform if the task is fulfilled.</param>
 56  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 57  /// <returns>The task.</returns>
 58  public static Task<T> Tap<T, R>(this Task<T> task, Func<T, Task<R>> onFulfilled, Action<Exception> onFaulted)
 159    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 60
 61  /// <summary>
 62  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 63  /// </summary>
 64  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 65  /// value, such as logging.</remarks>
 66  /// <typeparam name="T">The task's underlying type.</typeparam>
 67  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 68  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 69  /// <returns>The task.</returns>
 70  public static Task<T> Tap<T>(this Task<T> task, Func<T, Task> onFulfilled, Action<Exception> onFaulted)
 071    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 72
 73  /// <summary>
 74  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 75  /// </summary>
 76  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 77  /// value, such as logging.</remarks>
 78  /// <typeparam name="T">The task's underlying type.</typeparam>
 79  /// <typeparam name="R">The output type of the <paramref name="onFaulted" /> function.
 80  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 81  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 82  /// <returns>The task.</returns>
 83  public static Task<T> Tap<T, R, S>(this Task<T> task, Func<T, Task<R>> onFulfilled, Func<Exception, Task<S>> onFaulted
 084    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 85
 86  /// <summary>
 87  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 88  /// </summary>
 89  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 90  /// value, such as logging.</remarks>
 91  /// <typeparam name="T">The task's underlying type.</typeparam>
 92  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 93  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 94  /// <returns>The task.</returns>
 95  public static Task<T> Tap<T>(this Task<T> task, Func<T, Task> onFulfilled, Func<Exception, Task> onFaulted)
 196    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 97
 98  /// <summary>
 99  /// Executes a function and discards the result on a <see name="Task{T}"/> whether it is in a fulfilled or faulted sta
 100  /// </summary>
 101  /// <remarks>This method is useful if you need to perform a side effect without altering the <see name"Task{T}"/>'s
 102  /// value, such as logging.</remarks>
 103  /// <typeparam name="T">The task's underlying type.</typeparam>
 104  /// <param name="onFulfilled">The function to execute if the task is fulfilled.</param>
 105  /// <param name="onFaulted">The function to execute if the task is faulted.</param>
 106  /// <returns>The task.</returns>
 107  public static Task<T> Tap<T, R>(this Task<T> task, Func<T, Task> onFulfilled, Func<Exception, Task<R>> onFaulted)
 1108    => task.IfFulfilled(onFulfilled).IfFaulted(onFaulted);
 109}
+
+

/Users/doomchild/code/github/task-chaining/src/TaskExtensionsThen.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Threading;
 3using System.Threading.Tasks;
 4
 5namespace RLC.TaskChaining;
 6
 7using static TaskStatics;
 8
 9public static partial class TaskExtensions
 10{
 11  /// <summary>
 12  /// Transforms the value in a fulfilled <see name="Task{T}"/> to another type.
 13  /// </summary>
 14  /// <remarks>This method is an alias to <code>Task.ResultMap</code>.</remarks>
 15  /// <typeparam name="T">The task's underlying type.</typeparam>
 16  /// <typeparam name="TNext">The transformed type.</typeparam>
 17  /// <param name="onFulfilled">The transformation function.</param>
 18  /// <returns>The transformed task.</returns>
 19  public static Task<TNext> Then<T, TNext>(this Task<T> task, Func<T, TNext> onFulfilled)
 2620    => task.ResultMap(onFulfilled);
 21
 22  /// <summary>
 23  /// Transforms the value in a fulfilled <see name="Task{T}"/> to another type.
 24  /// </summary>
 25  /// <remarks>This method is an alias to <code>Task.Bind</code>.</remarks>
 26  /// <typeparam name="T">The task's underlying type.</typeparam>
 27  /// <typeparam name="TNext">The transformed type.</typeparam>
 28  /// <param name="onFulfilled">The transformation function.</param>
 29  /// <returns>The transformed task.</returns>
 30  public static Task<TNext> Then<T, TNext>(this Task<T> task, Func<T, Task<TNext>> onFulfilled)
 2431    => task.Bind(onFulfilled);
 32
 33  /// <summary>
 34  /// Transforms both sides of a <see name="Task{T}"/>.
 35  /// </summary>
 36  /// <remarks>This method is an alias to <code>Task.BiBind</code>.</remarks>
 37  /// <typeparam name="T">The task's underlying type.</typeparam>
 38  /// <typeparam name="TNext">The transformed type.</typeparam>
 39  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 40  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 41  /// <returns>The transformed task.</returns>
 42  public static Task<TNext> Then<T, TNext>(
 43    this Task<T> task,
 44    Func<T, TNext> onFulfilled,
 45    Func<Exception, TNext> onFaulted
 1446  ) => task.BiBind(
 1447    Pipe2(onFaulted, Task.FromResult),
 1448    Pipe2(onFulfilled, Task.FromResult)
 1449  );
 50
 51  /// <summary>
 52  /// Transforms both sides of a <see name="Task{T}"/>.
 53  /// </summary>
 54  /// <remarks>This method is an alias to <code>Task.BiBind</code>.</remarks>
 55  /// <typeparam name="T">The task's underlying type.</typeparam>
 56  /// <typeparam name="TNext">The transformed type.</typeparam>
 57  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 58  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 59  /// <returns>The transformed task.</returns>
 60  public static Task<TNext> Then<T, TNext>(
 61    this Task<T> task,
 62    Func<T, TNext> onFulfilled,
 63    Func<Exception, Task<TNext>> onFaulted
 264  ) => task.BiBind(onFaulted, Pipe2(onFulfilled, Task.FromResult));
 65
 66  /// <summary>
 67  /// Transforms both sides of a <see name="Task{T}"/>.
 68  /// </summary>
 69  /// <remarks>This method is an alias to <code>Task.BiBind</code>.</remarks>
 70  /// <typeparam name="T">The task's underlying type.</typeparam>
 71  /// <typeparam name="TNext">The transformed type.</typeparam>
 72  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 73  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 74  /// <returns>The transformed task.</returns>
 75  public static Task<TNext> Then<T, TNext>(
 76    this Task<T> task,
 77    Func<T, Task<TNext>> onFulfilled,
 78    Func<Exception, TNext> onFaulted
 279  ) => task.BiBind(Pipe2(onFaulted, Task.FromResult), onFulfilled);
 80
 81  /// <summary>
 82  /// Transforms both sides of a <see name="Task{T}"/>.
 83  /// </summary>
 84  /// <remarks>This method is an alias to <code>Task.BiBind</code>.</remarks>
 85  /// <typeparam name="T">The task's underlying type.</typeparam>
 86  /// <typeparam name="TNext">The transformed type.</typeparam>
 87  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 88  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 89  /// <returns>The transformed task.</returns>
 90  public static Task<TNext> Then<T, TNext>(
 91    this Task<T> task,
 92    Func<T, Task<TNext>> onFulfilled,
 93    Func<Exception, Task<TNext>> onFaulted
 1394  ) => task.BiBind(onFaulted, onFulfilled);
 95
 96  /// <summary>
 97  /// Transforms the value in a fulfilled <see name="Task{T}"/> to another type.
 98  /// </summary>
 99  /// <typeparam name="T">The task's underlying type.</typeparams>
 100  /// <typeparam name="TNext">The transformed type.</typeparam>
 101  /// <param name="onFulfilled">The transformation function.</param>
 102  /// <param name="cancellationToken">A cancellation token</param>
 103  /// <returns>The transformed task</returns>
 104  public static Task<TNext> Then<T, TNext>(
 105    this Task<T> task,
 106    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 107    CancellationToken cancellationToken = default
 108  )
 8109  {
 8110    return task.ContinueWith(continuationTask =>
 8111    {
 8112      if (continuationTask.IsCanceled)
 0113      {
 0114        return Task.FromException<TNext>(HandleCancellation(continuationTask));
 8115      }
 8116
 8117      return continuationTask.IsFaulted
 8118        ? Task.FromException<TNext>(PotentiallyUnwindException(continuationTask.Exception))
 8119        : onFulfilled(continuationTask.Result, cancellationToken);
 13120    }).Unwrap();
 8121  }
 122
 123  /// <summary>
 124  /// Transforms both sides of a <see name="Task{T}"/>.
 125  /// </summary>
 126  /// <typeparam name="T">The task's underlying type.</typeparam>
 127  /// <typeparam name="TNext">The transformed type.</typeparam>
 128  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 129  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 130  /// <param name="cancellationToken">A cancellation token.</param>
 131  /// <returns>The transformed task.</returns>
 132  public static Task<TNext> Then<T, TNext>(
 133    this Task<T> task,
 134    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 135    Func<Exception> onFaulted,
 136    CancellationToken cancellationToken = default
 137  )
 2138  {
 2139    return task.ContinueWith(continuationTask =>
 2140    {
 2141      if (continuationTask.IsCanceled)
 0142      {
 0143        return Task.FromException<TNext>(HandleCancellation(task));
 2144      }
 2145
 2146      return continuationTask.IsFaulted
 2147        ? Task.FromException<TNext>(onFaulted())
 2148        : onFulfilled(continuationTask.Result, cancellationToken);
 4149    }).Unwrap();
 2150  }
 151
 152  /// <summary>
 153  /// Transforms both sides of a <see name="Task{T}"/>.
 154  /// </summary>
 155  /// <typeparam name="T">The task's underlying type.</typeparam>
 156  /// <typeparam name="TNext">The transformed type.</typeparam>
 157  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 158  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 159  /// <param name="cancellationToken">A cancellation token.</param>
 160  /// <returns>The transformed task.</returns>
 161  public static Task<TNext> Then<T, TNext>(
 162    this Task<T> task,
 163    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 164    Func<TNext> onFaulted,
 165    CancellationToken cancellationToken = default
 166  )
 0167  {
 0168    return task.ContinueWith(continuationTask =>
 0169    {
 0170      if (continuationTask.IsCanceled)
 0171      {
 0172        return Task.FromException<TNext>(HandleCancellation(task));
 0173      }
 0174
 0175      return continuationTask.IsFaulted
 0176        ? Task.FromResult(onFaulted())
 0177        : onFulfilled(continuationTask.Result, cancellationToken);
 0178    }).Unwrap();
 0179  }
 180
 181  /// <summary>
 182  /// Transforms both sides of a <see name="Task{T}"/>.
 183  /// </summary>
 184  /// <typeparam name="T">The task's underlying type.</typeparam>
 185  /// <typeparam name="TNext">The transformed type.</typeparam>
 186  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 187  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 188  /// <param name="cancellationToken">A cancellation token.</param>
 189  /// <returns>The transformed task.</returns>
 190  public static Task<TNext> Then<T, TNext>(
 191    this Task<T> task,
 192    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 193    Func<Task<TNext>> onFaulted,
 194    CancellationToken cancellationToken = default
 195  )
 0196  {
 0197    return task.ContinueWith(continuationTask =>
 0198    {
 0199      if (continuationTask.IsCanceled)
 0200      {
 0201        return Task.FromException<TNext>(HandleCancellation(task));
 0202      }
 0203
 0204      return continuationTask.IsFaulted
 0205        ? onFaulted()
 0206        : onFulfilled(continuationTask.Result, cancellationToken);
 0207    }).Unwrap();
 0208  }
 209
 210  /// <summary>
 211  /// Transforms both sides of a <see name="Task{T}"/>.
 212  /// </summary>
 213  /// <typeparam name="T">The task's underlying type.</typeparam>
 214  /// <typeparam name="TNext">The transformed type.</typeparam>
 215  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 216  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 217  /// <param name="cancellationToken">A cancellation token.</param>
 218  /// <returns>The transformed task.</returns>
 219  public static Task<TNext> Then<T, TNext>(
 220    this Task<T> task,
 221    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 222    Func<Exception, Exception> onFaulted,
 223    CancellationToken cancellationToken = default
 224  )
 0225  {
 0226    return task.ContinueWith(continuationTask =>
 0227    {
 0228      if (continuationTask.IsCanceled)
 0229      {
 0230        return Task.FromException<TNext>(HandleCancellation(task));
 0231      }
 0232
 0233      return continuationTask.IsFaulted
 0234        ? Task.FromException<TNext>(onFaulted(PotentiallyUnwindException(continuationTask.Exception)))
 0235        : onFulfilled(continuationTask.Result, cancellationToken);
 0236    }).Unwrap();
 0237  }
 238
 239  /// <summary>
 240  /// Transforms both sides of a <see name="Task{T}"/>.
 241  /// </summary>
 242  /// <typeparam name="T">The task's underlying type.</typeparam>
 243  /// <typeparam name="TNext">The transformed type.</typeparam>
 244  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 245  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 246  /// <param name="cancellationToken">A cancellation token.</param>
 247  /// <returns>The transformed task.</returns>
 248  public static Task<TNext> Then<T, TNext>(
 249    this Task<T> task,
 250    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 251    Func<Exception, TNext> onFaulted,
 252    CancellationToken cancellationToken = default
 253  )
 0254  {
 0255    return task.ContinueWith(continuationTask =>
 0256    {
 0257      if (continuationTask.IsCanceled)
 0258      {
 0259        return Task.FromException<TNext>(HandleCancellation(task));
 0260      }
 0261
 0262      return continuationTask.IsFaulted
 0263        ? Task.FromResult(onFaulted(PotentiallyUnwindException(continuationTask.Exception)))
 0264        : onFulfilled(continuationTask.Result, cancellationToken);
 0265    }).Unwrap();
 0266  }
 267
 268  /// <summary>
 269  /// Transforms both sides of a <see name="Task{T}"/>.
 270  /// </summary>
 271  /// <typeparam name="T">The task's underlying type.</typeparam>
 272  /// <typeparam name="TNext">The transformed type.</typeparam>
 273  /// <param name="onFulfilled">The transformation function for a fulfilled task.</param>
 274  /// <param name="onFaulted">The transformation function for a faulted task.</param>
 275  /// <param name="cancellationToken">A cancellation token.</param>
 276  /// <returns>The transformed task.</returns>
 277  public static Task<TNext> Then<T, TNext>(
 278    this Task<T> task,
 279    Func<T, CancellationToken, Task<TNext>> onFulfilled,
 280    Func<Exception, Task<TNext>> onFaulted,
 281    CancellationToken cancellationToken = default
 282  )
 0283  {
 0284    return task.ContinueWith(continuationTask =>
 0285    {
 0286      if (continuationTask.IsCanceled)
 0287      {
 0288        return Task.FromException<TNext>(HandleCancellation(continuationTask));
 0289      }
 0290
 0291      return continuationTask.IsFaulted
 0292        ? onFaulted(PotentiallyUnwindException(continuationTask.Exception))
 0293        : onFulfilled(continuationTask.Result, cancellationToken);
 0294    }).Unwrap();
 0295  }
 296}
+
+
+
+
+

Methods/Properties

+PotentiallyUnwindException(System.AggregateException)
+HandleCancellation(System.Threading.Tasks.Task`1<T>)
+Alt(System.Threading.Tasks.Task`1<T>,System.Threading.Tasks.Task`1<T>)
+Alt(System.Threading.Tasks.Task`1<T>,System.Func`1<System.Threading.Tasks.Task`1<T>>)
+Ap(System.Threading.Tasks.Task`1<T>,System.Threading.Tasks.Task`1<System.Func`2<T,TNext>>)
+BiMap(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Exception>,System.Func`2<T,TNext>)
+Bind(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>)
+BiBind(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<TNext>>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>)
+ExceptionMap(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Exception>)
+ExceptionMap(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<System.Exception>>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Predicate`1<T>,System.Exception)
+Filter(System.Threading.Tasks.Task`1<T>,System.Predicate`1<T>,System.Func`1<System.Exception>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Predicate`1<T>,System.Func`2<T,System.Exception>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Predicate`1<T>,System.Func`1<System.Threading.Tasks.Task`1<E>>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Predicate`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<E>>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<System.Boolean>>,System.Exception)
+Filter(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<System.Boolean>>,System.Func`1<System.Exception>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<System.Boolean>>,System.Func`2<T,System.Exception>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<System.Boolean>>,System.Func`1<System.Threading.Tasks.Task`1<E>>)
+Filter(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<System.Boolean>>,System.Func`2<T,System.Threading.Tasks.Task`1<E>>)
+ResultMap(System.Threading.Tasks.Task`1<T>,System.Func`2<T,TNext>)
+Recover(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,T>)
+Recover(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<T>>)
+Catch(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,T>)
+Catch(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<T>>)
+CatchWhen(System.Threading.Tasks.Task`1<T>,System.Func`2<TException,T>)
+CatchWhen(System.Threading.Tasks.Task`1<T>,System.Func`2<TException,System.Threading.Tasks.Task`1<T>>)
+Delay(System.Threading.Tasks.Task`1<T>,System.TimeSpan,System.Threading.CancellationToken)
+Fault(System.Threading.Tasks.Task`1<T>,System.Exception)
+Fault(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Exception>)
+Fault(System.Threading.Tasks.Task`1<T>,System.Exception)
+Fault(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Exception>)
+Retry(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>,RLC.TaskChaining.RetryParams)
+Retry(System.Threading.Tasks.Task`1<T>,System.Func`2<T,TNext>,RLC.TaskChaining.RetryParams)
+Retry(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>)
+Retry(System.Threading.Tasks.Task`1<T>,System.Func`2<T,TNext>)
+IfFaulted(System.Threading.Tasks.Task`1<T>,System.Action`1<System.Exception>)
+IfFaulted(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<R>>)
+IfFaulted(System.Threading.Tasks.Task`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task>)
+IfFulfilled(System.Threading.Tasks.Task`1<T>,System.Action`1<T>)
+IfFulfilled(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<R>>)
+IfFulfilled(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Action`1<T>,System.Action`1<System.Exception>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Action`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<R>>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Action`1<T>,System.Func`2<System.Exception,System.Threading.Tasks.Task>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<R>>,System.Action`1<System.Exception>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task>,System.Action`1<System.Exception>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<R>>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<S>>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task>,System.Func`2<System.Exception,System.Threading.Tasks.Task>)
+Tap(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<R>>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`2<T,TNext>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`2<T,TNext>,System.Func`2<System.Exception,TNext>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`2<T,TNext>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<TNext>>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>,System.Func`2<System.Exception,TNext>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`2<T,System.Threading.Tasks.Task`1<TNext>>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<TNext>>)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Threading.CancellationToken)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Func`1<System.Exception>,System.Threading.CancellationToken)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Func`1<TNext>,System.Threading.CancellationToken)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Func`1<System.Threading.Tasks.Task`1<TNext>>,System.Threading.CancellationToken)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Func`2<System.Exception,System.Exception>,System.Threading.CancellationToken)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Func`2<System.Exception,TNext>,System.Threading.CancellationToken)
+Then(System.Threading.Tasks.Task`1<T>,System.Func`3<T,System.Threading.CancellationToken,System.Threading.Tasks.Task`1<TNext>>,System.Func`2<System.Exception,System.Threading.Tasks.Task`1<TNext>>,System.Threading.CancellationToken)
+
+
+ + \ No newline at end of file diff --git a/coveragereport/TaskChaining_TaskExtras.html b/coveragereport/TaskChaining_TaskExtras.html new file mode 100644 index 0000000..721d309 --- /dev/null +++ b/coveragereport/TaskChaining_TaskExtras.html @@ -0,0 +1,435 @@ + + + + + + + +RLC.TaskChaining.TaskExtras - Coverage Report + +
+

< Summary

+
+
+
Information
+
+
+ + + + + + + + + + + + + +
Class:RLC.TaskChaining.TaskExtras
Assembly:TaskChaining
File(s):/Users/doomchild/code/github/task-chaining/src/TaskExtras.cs
+
+
+
+
+
+
+
Line coverage
+
+
100%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:61
Uncovered lines:0
Coverable lines:61
Total lines:237
Line coverage:100%
+
+
+
+
+
Branch coverage
+
+
100%
+
+ + + + + + + + + + + + + +
Covered branches:22
Total branches:22
Branch coverage:100%
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Metrics

+
+ +++++++ + + + + + + + + + + + + + + + + +
MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
RejectIf(...)100%22100%
RejectIf(...)100%11100%
ReRejectIf(...)100%22100%
ResolveIf(...)100%22100%
ResolveIf(...)100%22100%
Defer(...)100%11100%
Defer(...)100%11100%
.cctor()100%11100%
DoRetry(...)100%44100%
Retry(...)100%1010100%
Retry(...)100%11100%
Retry(...)100%11100%
Retry(...)100%11100%
+
+

File(s)

+

/Users/doomchild/code/github/task-chaining/src/TaskExtras.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Threading.Tasks;
 3
 4namespace RLC.TaskChaining;
 5
 6public static class TaskExtras
 7{
 8  /// <summary>
 9  /// Produces a faulted <see cref="Task{T}"/> if the <paramref name="predicate"/> returns <code>false</code>.
 10  /// </summary>
 11  /// <example>This is a handy way to perform validation.  You might do something like the following:
 12  /// <code>
 13  /// Task.FromResult(someString)
 14  ///   .Then(RejectIf(
 15  ///      string.IsNullOrWhitespace,
 16  ///      s => new Exception($"nameof(someString) must not be blank")
 17  ///   ));
 18  /// </code>
 19  /// </example>
 20  /// <typeparam name="T">The task's underlying type.</typeparam>
 21  /// <param name="predicate">A predicate to evaluate with the input argument.</param>
 22  /// <param name="rejectionMorphism">A function that takes a <typeparamref name="T"/> and returns an
 23  /// <see cref="Exception"/>.</param>
 24  /// <returns>A function that performs rejection.</returns>
 25  public static Func<T, Task<T>> RejectIf<T>(
 26    Predicate<T> predicate,
 27    Func<T, Exception> rejectionMorphism
 628  ) => value => predicate(value)
 629    ? Task.FromException<T>(rejectionMorphism(value))
 630    : Task.FromResult(value);
 31
 32  /// <summary>
 33  /// Produces a faulted <see cref="Task{T}"/> if the <paramref name="predicate"/> returns <code>false</code>.
 34  /// </summary>
 35  /// <example>This is a handy way to perform validation.  You might do something like the following:
 36  /// <code>
 37  /// Task.FromResult(someString)
 38  ///   .Then(RejectIf(
 39  ///      string.IsNullOrWhitespace,
 40  ///      async s => BuildTaskOfException(s)
 41  ///   ));
 42  /// </code>
 43  /// </example>
 44  /// <typeparam name="T">The task's underlying type.</typeparam>
 45  /// <param name="predicate">A predicate to evaluate with the input argument.</param>
 46  /// <param name="rejectionMorphism">A function that takes a <typeparamref name="T"/> and returns a
 47  /// <see cref="Task{Exception}"/>.</param>
 48  /// <returns>A function that performs rejection.</returns>
 49  public static Func<T, Task<T>> RejectIf<T, E>(
 50    Predicate<T> predicate,
 51    Func<T, Task<E>> rejectionMorphism
 652  ) where E: Exception => value => Task.FromResult(value)
 353    .Then(async v => predicate(value)
 354      ? await Task.FromException<T>(await rejectionMorphism(v))
 355      : v
 656    );
 57  //) => async value => predicate(value)
 58  //  ? await Task.FromException<T>(await rejectionMorphism(value))
 59  //  : value;
 60
 61  /// <summary>
 62  /// Allows a faulted <see cref="Task{T}"/> to transform its <see cref="Exception"/> into a different type of
 63  /// <see cref="Exception"/> if the <paramref name="predicate"/> returns <code>true</code>.
 64  /// </summary>
 65  /// <remarks>This is intended to be used with <code>Task.Catch</code> to allow for converting one
 66  /// <see cref="Exception"/> into another.  For example, a <see cref="System.Web.HttpException"/> could be wrapped
 67  /// with a custom type that adds extra context.</remarks>
 68  /// <typeparam name="T">The task's underlying type.</typeparam>
 69  /// <param name="predicate">A predicate to evaluate with the <see cref="Task{T}"/>'s <see cref="Exception"/>.</param>
 70  /// <param name="rerejectionMorphism">A function that takes an <see cref="Exception"/> and returns an
 71  /// <see cref="Exception"/>.</param>
 72  /// <returns>A function that performs re-rejection.</returns>
 73  public static Func<Exception, Task<T>> ReRejectIf<T>(
 74    Predicate<Exception> predicate,
 75    Func<Exception, Exception> rerejectionMorphism
 476  ) => exception => predicate(exception)
 477    ? Task.FromException<T>(rerejectionMorphism(exception))
 478    : Task.FromException<T>(exception);
 79
 80  /// <summary>
 81  /// Produces a fulfilled <see cref="Task{T}"/> using the output of the <paramref name="fulfillmentMorphism"/> if the
 82  /// <paramref name="predicate"/> returns <code>true</code>.
 83  /// </summary>
 84  /// <example>This is a handy way to return to a non-faulted state.  You might do something like the following:
 85  /// <code>
 86  /// Task.FromResult(someUrl)
 87  ///   .Then(httpClient.GetAsync)
 88  ///   .Catch(ResolveIf(
 89  ///      exception => exception is HttpRequestException,
 90  ///      exception => someFallbackValue
 91  ///   ));
 92  /// </code>
 93  /// </example>
 94  /// <typeparam name="T">The task's underlying type.</typeparam>
 95  /// <param name="predicate">A predicate to evaluate with the <see cref="Task{T}"/>'s <see cref="Exception"/>.</param>
 96  /// <param name="fulfillmentMorphism">A function that takes an <see cref="Exception"/> and returns a
 97  /// <typeparamref name="T"/>.</param>
 98  /// <returns>A function that performs fulfillment.</returns>
 99  public static Func<Exception, Task<T>> ResolveIf<T>(
 100    Predicate<Exception> predicate,
 101    Func<Exception, T> fulfillmentMorphism
 4102  ) => value => predicate(value)
 4103    ? Task.FromResult(fulfillmentMorphism(value))
 4104    : Task.FromException<T>(value);
 105
 106  /// <summary>
 107  /// Produces a fulfilled <see cref="Task{T}"/> using the output of the <paramref name="fulfillmentMorphism"/> if the
 108  /// <paramref name="predicate"/> returns <code>true</code>.
 109  /// </summary>
 110  /// <example>This is a handy way to return to a non-faulted state.  You might do something like the following:
 111  /// <code>
 112  /// Task.FromResult(someUrl)
 113  ///   .Then(httpClient.GetAsync)
 114  ///   .Catch(ResolveIf(
 115  ///      exception => exception is HttpRequestException,
 116  ///      exception => someFallbackValue
 117  ///   ));
 118  /// </code>
 119  /// </example>
 120  /// <typeparam name="T">The task's underlying type.</typeparam>
 121  /// <param name="predicate">A predicate to evaluate with the <see cref="Task{T}"/>'s <see cref="Exception"/>.</param>
 122  /// <param name="fulfillmentMorphism">A function that takes an <see cref="Exception"/> and returns a
 123  /// <typeparamref name="T"/>.</param>
 124  /// <returns>A function that performs fulfillment.</returns>
 125  public static Func<Exception, Task<T>> ResolveIf<T>(
 126    Predicate<Exception> predicate,
 127    Func<Exception, Task<T>> resolutionSupplier
 86128  ) => value => predicate(value)
 86129    ? resolutionSupplier(value)
 86130    : Task.FromException<T>(value);
 131
 132  /// <summary>
 133  /// A function that executes the <paramref name="supplier"/> after <paramref name="deferTime"/> has elapsed.
 134  /// </summary>
 135  /// <typeparam name="T">The task's underlying type.</typeparam>
 136  /// <param name="supplier">A supplier function.</param>
 137  /// <param name="deferTime">The length of time to defer execution.</param>
 138  /// <returns>A function that performs deferred execution.</returns>
 139  public static Task<T> Defer<T>(Func<T> supplier, TimeSpan deferTime) =>
 2140    Defer(() => Task.FromResult(supplier()), deferTime);
 141
 142  /// <summary>
 143  /// A function that executes the <paramref name="supplier"/> after <paramref name="deferTime"/> has elapsed.
 144  /// </summary>
 145  /// <typeparam name="T">The task's underlying type.</typeparam>
 146  /// <param name="supplier">A supplier function.</param>
 147  /// <param name="deferTime">The length of time to defer execution.</param>
 148  /// <returns>A function that performs deferred execution.</returns>
 149  public static Task<T> Defer<T>(Func<Task<T>> supplier, TimeSpan deferTime) =>
 40150    Task.Run(async () =>
 40151    {
 40152      await Task.Delay(deferTime);
 40153
 40154      return await supplier();
 47155    });
 156
 1157  private static FixedRetryParams RetryDefaults = FixedRetryParams.Default;
 158
 159  private static Task<T> DoRetry<T>(
 160    Func<Task<T>> supplier,
 161    FixedRetryParams retryParams,
 162    Exception? exception,
 163    int attempts = 0
 164  )
 54165  {
 54166    TimeSpan duration = TimeSpan.FromMilliseconds(
 54167      retryParams.RetryInterval.TotalMilliseconds * Math.Pow(retryParams.RetryBackoffRate, attempts)
 54168    );
 169
 54170    return attempts >= retryParams.MaxRetries
 54171      ? Task.FromException<T>(new RetryException(attempts, exception))
 54172      : Task.Run(supplier)
 54173        .Catch(ResolveIf(
 39174          exception => retryParams.ShouldRetry(exception),
 54175          exception =>
 39176          {
 39177            if(retryParams.OnRetry != null)
 39178            {
 39179              retryParams.OnRetry(attempts, duration, exception);
 39180            }
 54181
 39182            return Defer(
 39183              () => DoRetry(supplier, retryParams, exception, attempts + 1),
 39184              duration
 39185            );
 39186          }
 54187        ));
 54188  }
 189
 190  /// <summary>
 191  /// A function that performs retries of the <paramref name="supplier"/> if it fails.
 192  /// </summary>
 193  /// <typeparam name="T">The task's underlying type.</typeparam>
 194  /// <param name="supplier">A supplier function.</param>
 195  /// <param name="retryParams">The retry parameters.</param>
 196  /// <returns>A function that retries execution of the <paramref name="supplier"/>.</returns>
 197  public static Task<T> Retry<T>(Func<Task<T>> supplier, RetryParams retryParams)
 15198  {
 15199    FixedRetryParams fixedRetryParams = new FixedRetryParams(
 15200      retryParams.MaxRetries ?? RetryDefaults.MaxRetries,
 15201      retryParams.RetryInterval ?? RetryDefaults.RetryInterval,
 15202      retryParams.RetryBackoffRate ?? RetryDefaults.RetryBackoffRate,
 15203      retryParams.OnRetry ?? RetryDefaults.OnRetry,
 15204      retryParams.ShouldRetry ?? RetryDefaults.ShouldRetry
 15205    );
 206
 15207    return DoRetry(supplier, fixedRetryParams, null, 0);
 15208  }
 209
 210  /// <summary>
 211  /// A function that performs retries of the <paramref name="supplier"/> if it fails using the default retry parameters
 212  /// </summary>
 213  /// <typeparam name="T">The task's underlying type.</typeparam>
 214  /// <param name="supplier">A supplier function.</param>
 215  /// <returns>A function that retries execution of the <paramref name="supplier"/>.</returns>
 216  public static Task<T> Retry<T>(Func<Task<T>> supplier) =>
 3217    Retry(supplier, RetryParams.Default);
 218
 219  /// <summary>
 220  /// A function that performs retries of the <paramref name="supplier"/> if it fails.
 221  /// </summary>
 222  /// <typeparam name="T">The task's underlying type.</typeparam>
 223  /// <param name="supplier">A supplier function.</param>
 224  /// <param name="retryParams">The retry parameters.</param>
 225  /// <returns>A function that retries execution of the <paramref name="supplier"/>.</returns>
 226  public static Task<T> Retry<T>(Func<T> supplier, RetryParams retryParams) =>
 24227    Retry(() => Task.Run(supplier), retryParams);
 228
 229  /// <summary>
 230  /// A function that performs retries of the <paramref name="supplier"/> if it fails using the default retry parameters
 231  /// </summary>
 232  /// <typeparam name="T">The task's underlying type.</typeparam>
 233  /// <param name="supplier">A supplier function.</param>
 234  /// <returns>A function that retries execution of the <paramref name="supplier"/>.</returns>
 235  public static Task<T> Retry<T>(Func<T> supplier) =>
 5236    Retry(supplier, RetryParams.Default);
 237}
+
+
+
+ + \ No newline at end of file diff --git a/coveragereport/TaskChaining_TaskStatics.html b/coveragereport/TaskChaining_TaskStatics.html new file mode 100644 index 0000000..399de22 --- /dev/null +++ b/coveragereport/TaskChaining_TaskStatics.html @@ -0,0 +1,279 @@ + + + + + + + +RLC.TaskChaining.TaskStatics - Coverage Report + +
+

< Summary

+
+
+
Information
+
+
+ + + + + + + + + + + + + +
Class:RLC.TaskChaining.TaskStatics
Assembly:TaskChaining
File(s):/Users/doomchild/code/github/task-chaining/src/TaskStatics.cs
+
+
+
+
+
+
+
Line coverage
+
+
61%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:13
Uncovered lines:8
Coverable lines:21
Total lines:93
Line coverage:61.9%
+
+
+
+
+
Branch coverage
+
+
N/A
+
+ + + + + + + + + + + + + +
Covered branches:0
Total branches:0
Branch coverage:N/A
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Metrics

+
+ +++++++ + + + + + + + + + + +
MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Constant(...)100%11100%
Constant(...)100%11100%
Identity(...)100%11100%
Invoke(...)100%11100%
Pipe2(...)100%11100%
Tap(...)100%11100%
Tap(...)100%210%
+
+

File(s)

+

/Users/doomchild/code/github/task-chaining/src/TaskStatics.cs

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#LineLine coverage
 1using System;
 2using System.Runtime.CompilerServices;
 3using System.Threading.Tasks;
 4
 5namespace RLC.TaskChaining;
 6
 7public static class TaskStatics
 8{
 9  /// <summary>
 10  /// Wraps a value in a supplier function.
 11  /// </summary>
 12  /// <typeparam name="T">The type of the supplied value.</typeparam>
 13  /// <param name="value">The value to supply.</param>
 14  /// <returns>A supplier function.</returns>
 15  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 816  public static Func<T> Constant<T>(T value) => () => value;
 17
 18  /// <summary>
 19  /// Wraps a value in a <typeparamref name="T"/> -> <typeparamref name="U"/> function that ignores the input value.
 20  /// </summary>
 21  /// <typeparam name="T">The input type of the resulting function.</typeparam>
 22  /// <typeparam name="U">The output type of the resulting function.</typeparam>
 23  /// <param name="value">A function that ignores its input argument and returns <paramref name="value"/></param>
 24  /// <returns></returns>
 25  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 1226  public static Func<T, U> Constant<T, U>(U value) => _ => value;
 27
 28  /// <summary>
 29  /// Returns its input value.
 30  /// </summary>
 31  /// <typeparam name="T">Type of the input value.</typeparam>
 32  /// <param name="value">The value to return.</param>
 33  /// <returns>The input value.</returns>
 34  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 1235  public static T Identity<T>(T value) => value;
 36
 37  /// <summary>
 38  /// Executes the input supplier function.
 39  /// </summary>
 40  /// <typeparam name="T">The output type of the supplier function.</typeparam>
 41  /// <param name="supplier">The supplier function to execute.</param>
 42  /// <returns></returns>
 43  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 144  public static T Invoke<T>(Func<T> supplier) => supplier();
 45
 46  /// <summary>
 47  /// Composes two functions together.
 48  /// </summary>
 49  /// <typeparam name="TA">The input type of the first function.</typeparam>
 50  /// <typeparam name="TB">The output type of the first function and the input type of the second function.</typeparam>
 51  /// <typeparam name="TC">The output type of the second function.</typeparam>
 52  /// <param name="f">The first function to compose.</param>
 53  /// <param name="g">The second function to compose.</param>
 54  /// <returns>The composition of both functions.</returns>
 55  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 19856  public static Func<TA, TC> Pipe2<TA, TB, TC>(Func<TA, TB> f, Func<TB, TC> g) => x => g(f(x));
 57
 58  /// <summary>
 59  /// Wraps an <see cref="Action{TTappedValue}"/> in a <see cref="Func{TTappedValue, TTappedValue}"/> that executes the
 60  /// Action and then returns the input value.
 61  /// </summary>
 62  /// <typeparam name="TTappedValue">The type of the value passed into the Action and returned.</typeparam>
 63  /// <param name="consumer">The Action to perform on the input value.</param>
 64  /// <returns>A function that takes a value, executes the <param name="consumer"/>, and returns the value.</returns>
 65  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 66  public static Func<TTappedValue, TTappedValue> Tap<TTappedValue>(Action<TTappedValue> consumer)
 1267  {
 1268    return value =>
 469    {
 470      consumer(value);
 1271
 472      return value;
 1673    };
 1274  }
 75
 76  /// <summary>
 77  /// Wraps a <see cref="Func{TTappedValue, Task}"/> (the async verion of an <see cref="Action" />) in a
 78  /// <see cref="Func{TTappedValue, TTappedValue}"/> that executes the Func and then returns the input value.
 79  /// </summary>
 80  /// <typeparam name="TTappedValue">The type of the value passed into the Action and returned.</typeparam>
 81  /// <param name="consumer">The Action to perform on the input value.</param>
 82  /// <returns>A function that takes a value, executes the <param name="consumer"/>, and returns the value.</returns>
 83  [MethodImpl(MethodImplOptions.AggressiveInlining)]
 84  public static Func<TTappedValue, Task<TTappedValue>> Tap<TTappedValue>(Func<TTappedValue, Task> consumer)
 085  {
 086    return async value =>
 087    {
 088      await consumer(value);
 089
 090      return value;
 091    };
 092  }
 93}
+
+
+
+ + \ No newline at end of file diff --git a/coveragereport/class.js b/coveragereport/class.js new file mode 100644 index 0000000..69101ee --- /dev/null +++ b/coveragereport/class.js @@ -0,0 +1,218 @@ +/* Chartist.js 0.11.4 + * Copyright © 2019 Gion Kunz + * Free to use under either the WTFPL license or the MIT license. + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT + */ + +!function (a, b) { "function" == typeof define && define.amd ? define("Chartist", [], function () { return a.Chartist = b() }) : "object" == typeof module && module.exports ? module.exports = b() : a.Chartist = b() }(this, function () { + var a = { version: "0.11.4" }; return function (a, b) { "use strict"; var c = a.window, d = a.document; b.namespaces = { svg: "http://www.w3.org/2000/svg", xmlns: "http://www.w3.org/2000/xmlns/", xhtml: "http://www.w3.org/1999/xhtml", xlink: "http://www.w3.org/1999/xlink", ct: "http://gionkunz.github.com/chartist-js/ct" }, b.noop = function (a) { return a }, b.alphaNumerate = function (a) { return String.fromCharCode(97 + a % 26) }, b.extend = function (a) { var c, d, e; for (a = a || {}, c = 1; c < arguments.length; c++) { d = arguments[c]; for (var f in d) e = d[f], "object" != typeof e || null === e || e instanceof Array ? a[f] = e : a[f] = b.extend(a[f], e) } return a }, b.replaceAll = function (a, b, c) { return a.replace(new RegExp(b, "g"), c) }, b.ensureUnit = function (a, b) { return "number" == typeof a && (a += b), a }, b.quantity = function (a) { if ("string" == typeof a) { var b = /^(\d+)\s*(.*)$/g.exec(a); return { value: +b[1], unit: b[2] || void 0 } } return { value: a } }, b.querySelector = function (a) { return a instanceof Node ? a : d.querySelector(a) }, b.times = function (a) { return Array.apply(null, new Array(a)) }, b.sum = function (a, b) { return a + (b ? b : 0) }, b.mapMultiply = function (a) { return function (b) { return b * a } }, b.mapAdd = function (a) { return function (b) { return b + a } }, b.serialMap = function (a, c) { var d = [], e = Math.max.apply(null, a.map(function (a) { return a.length })); return b.times(e).forEach(function (b, e) { var f = a.map(function (a) { return a[e] }); d[e] = c.apply(null, f) }), d }, b.roundWithPrecision = function (a, c) { var d = Math.pow(10, c || b.precision); return Math.round(a * d) / d }, b.precision = 8, b.escapingMap = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }, b.serialize = function (a) { return null === a || void 0 === a ? a : ("number" == typeof a ? a = "" + a : "object" == typeof a && (a = JSON.stringify({ data: a })), Object.keys(b.escapingMap).reduce(function (a, c) { return b.replaceAll(a, c, b.escapingMap[c]) }, a)) }, b.deserialize = function (a) { if ("string" != typeof a) return a; a = Object.keys(b.escapingMap).reduce(function (a, c) { return b.replaceAll(a, b.escapingMap[c], c) }, a); try { a = JSON.parse(a), a = void 0 !== a.data ? a.data : a } catch (c) { } return a }, b.createSvg = function (a, c, d, e) { var f; return c = c || "100%", d = d || "100%", Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function (a) { return a.getAttributeNS(b.namespaces.xmlns, "ct") }).forEach(function (b) { a.removeChild(b) }), f = new b.Svg("svg").attr({ width: c, height: d }).addClass(e), f._node.style.width = c, f._node.style.height = d, a.appendChild(f._node), f }, b.normalizeData = function (a, c, d) { var e, f = { raw: a, normalized: {} }; return f.normalized.series = b.getDataArray({ series: a.series || [] }, c, d), e = f.normalized.series.every(function (a) { return a instanceof Array }) ? Math.max.apply(null, f.normalized.series.map(function (a) { return a.length })) : f.normalized.series.length, f.normalized.labels = (a.labels || []).slice(), Array.prototype.push.apply(f.normalized.labels, b.times(Math.max(0, e - f.normalized.labels.length)).map(function () { return "" })), c && b.reverseData(f.normalized), f }, b.safeHasProperty = function (a, b) { return null !== a && "object" == typeof a && a.hasOwnProperty(b) }, b.isDataHoleValue = function (a) { return null === a || void 0 === a || "number" == typeof a && isNaN(a) }, b.reverseData = function (a) { a.labels.reverse(), a.series.reverse(); for (var b = 0; b < a.series.length; b++)"object" == typeof a.series[b] && void 0 !== a.series[b].data ? a.series[b].data.reverse() : a.series[b] instanceof Array && a.series[b].reverse() }, b.getDataArray = function (a, c, d) { function e(a) { if (b.safeHasProperty(a, "value")) return e(a.value); if (b.safeHasProperty(a, "data")) return e(a.data); if (a instanceof Array) return a.map(e); if (!b.isDataHoleValue(a)) { if (d) { var c = {}; return "string" == typeof d ? c[d] = b.getNumberOrUndefined(a) : c.y = b.getNumberOrUndefined(a), c.x = a.hasOwnProperty("x") ? b.getNumberOrUndefined(a.x) : c.x, c.y = a.hasOwnProperty("y") ? b.getNumberOrUndefined(a.y) : c.y, c } return b.getNumberOrUndefined(a) } } return a.series.map(e) }, b.normalizePadding = function (a, b) { return b = b || 0, "number" == typeof a ? { top: a, right: a, bottom: a, left: a } : { top: "number" == typeof a.top ? a.top : b, right: "number" == typeof a.right ? a.right : b, bottom: "number" == typeof a.bottom ? a.bottom : b, left: "number" == typeof a.left ? a.left : b } }, b.getMetaData = function (a, b) { var c = a.data ? a.data[b] : a[b]; return c ? c.meta : void 0 }, b.orderOfMagnitude = function (a) { return Math.floor(Math.log(Math.abs(a)) / Math.LN10) }, b.projectLength = function (a, b, c) { return b / c.range * a }, b.getAvailableHeight = function (a, c) { return Math.max((b.quantity(c.height).value || a.height()) - (c.chartPadding.top + c.chartPadding.bottom) - c.axisX.offset, 0) }, b.getHighLow = function (a, c, d) { function e(a) { if (void 0 !== a) if (a instanceof Array) for (var b = 0; b < a.length; b++)e(a[b]); else { var c = d ? +a[d] : +a; g && c > f.high && (f.high = c), h && c < f.low && (f.low = c) } } c = b.extend({}, c, d ? c["axis" + d.toUpperCase()] : {}); var f = { high: void 0 === c.high ? -Number.MAX_VALUE : +c.high, low: void 0 === c.low ? Number.MAX_VALUE : +c.low }, g = void 0 === c.high, h = void 0 === c.low; return (g || h) && e(a), (c.referenceValue || 0 === c.referenceValue) && (f.high = Math.max(c.referenceValue, f.high), f.low = Math.min(c.referenceValue, f.low)), f.high <= f.low && (0 === f.low ? f.high = 1 : f.low < 0 ? f.high = 0 : f.high > 0 ? f.low = 0 : (f.high = 1, f.low = 0)), f }, b.isNumeric = function (a) { return null !== a && isFinite(a) }, b.isFalseyButZero = function (a) { return !a && 0 !== a }, b.getNumberOrUndefined = function (a) { return b.isNumeric(a) ? +a : void 0 }, b.isMultiValue = function (a) { return "object" == typeof a && ("x" in a || "y" in a) }, b.getMultiValue = function (a, c) { return b.isMultiValue(a) ? b.getNumberOrUndefined(a[c || "y"]) : b.getNumberOrUndefined(a) }, b.rho = function (a) { function b(a, c) { return a % c === 0 ? c : b(c, a % c) } function c(a) { return a * a + 1 } if (1 === a) return a; var d, e = 2, f = 2; if (a % 2 === 0) return 2; do e = c(e) % a, f = c(c(f)) % a, d = b(Math.abs(e - f), a); while (1 === d); return d }, b.getBounds = function (a, c, d, e) { function f(a, b) { return a === (a += b) && (a *= 1 + (b > 0 ? o : -o)), a } var g, h, i, j = 0, k = { high: c.high, low: c.low }; k.valueRange = k.high - k.low, k.oom = b.orderOfMagnitude(k.valueRange), k.step = Math.pow(10, k.oom), k.min = Math.floor(k.low / k.step) * k.step, k.max = Math.ceil(k.high / k.step) * k.step, k.range = k.max - k.min, k.numberOfSteps = Math.round(k.range / k.step); var l = b.projectLength(a, k.step, k), m = l < d, n = e ? b.rho(k.range) : 0; if (e && b.projectLength(a, 1, k) >= d) k.step = 1; else if (e && n < k.step && b.projectLength(a, n, k) >= d) k.step = n; else for (; ;) { if (m && b.projectLength(a, k.step, k) <= d) k.step *= 2; else { if (m || !(b.projectLength(a, k.step / 2, k) >= d)) break; if (k.step /= 2, e && k.step % 1 !== 0) { k.step *= 2; break } } if (j++ > 1e3) throw new Error("Exceeded maximum number of iterations while optimizing scale step!") } var o = 2.221e-16; for (k.step = Math.max(k.step, o), h = k.min, i = k.max; h + k.step <= k.low;)h = f(h, k.step); for (; i - k.step >= k.high;)i = f(i, -k.step); k.min = h, k.max = i, k.range = k.max - k.min; var p = []; for (g = k.min; g <= k.max; g = f(g, k.step)) { var q = b.roundWithPrecision(g); q !== p[p.length - 1] && p.push(q) } return k.values = p, k }, b.polarToCartesian = function (a, b, c, d) { var e = (d - 90) * Math.PI / 180; return { x: a + c * Math.cos(e), y: b + c * Math.sin(e) } }, b.createChartRect = function (a, c, d) { var e = !(!c.axisX && !c.axisY), f = e ? c.axisY.offset : 0, g = e ? c.axisX.offset : 0, h = a.width() || b.quantity(c.width).value || 0, i = a.height() || b.quantity(c.height).value || 0, j = b.normalizePadding(c.chartPadding, d); h = Math.max(h, f + j.left + j.right), i = Math.max(i, g + j.top + j.bottom); var k = { padding: j, width: function () { return this.x2 - this.x1 }, height: function () { return this.y1 - this.y2 } }; return e ? ("start" === c.axisX.position ? (k.y2 = j.top + g, k.y1 = Math.max(i - j.bottom, k.y2 + 1)) : (k.y2 = j.top, k.y1 = Math.max(i - j.bottom - g, k.y2 + 1)), "start" === c.axisY.position ? (k.x1 = j.left + f, k.x2 = Math.max(h - j.right, k.x1 + 1)) : (k.x1 = j.left, k.x2 = Math.max(h - j.right - f, k.x1 + 1))) : (k.x1 = j.left, k.x2 = Math.max(h - j.right, k.x1 + 1), k.y2 = j.top, k.y1 = Math.max(i - j.bottom, k.y2 + 1)), k }, b.createGrid = function (a, c, d, e, f, g, h, i) { var j = {}; j[d.units.pos + "1"] = a, j[d.units.pos + "2"] = a, j[d.counterUnits.pos + "1"] = e, j[d.counterUnits.pos + "2"] = e + f; var k = g.elem("line", j, h.join(" ")); i.emit("draw", b.extend({ type: "grid", axis: d, index: c, group: g, element: k }, j)) }, b.createGridBackground = function (a, b, c, d) { var e = a.elem("rect", { x: b.x1, y: b.y2, width: b.width(), height: b.height() }, c, !0); d.emit("draw", { type: "gridBackground", group: a, element: e }) }, b.createLabel = function (a, c, e, f, g, h, i, j, k, l, m) { var n, o = {}; if (o[g.units.pos] = a + i[g.units.pos], o[g.counterUnits.pos] = i[g.counterUnits.pos], o[g.units.len] = c, o[g.counterUnits.len] = Math.max(0, h - 10), l) { var p = d.createElement("span"); p.className = k.join(" "), p.setAttribute("xmlns", b.namespaces.xhtml), p.innerText = f[e], p.style[g.units.len] = Math.round(o[g.units.len]) + "px", p.style[g.counterUnits.len] = Math.round(o[g.counterUnits.len]) + "px", n = j.foreignObject(p, b.extend({ style: "overflow: visible;" }, o)) } else n = j.elem("text", o, k.join(" ")).text(f[e]); m.emit("draw", b.extend({ type: "label", axis: g, index: e, group: j, element: n, text: f[e] }, o)) }, b.getSeriesOption = function (a, b, c) { if (a.name && b.series && b.series[a.name]) { var d = b.series[a.name]; return d.hasOwnProperty(c) ? d[c] : b[c] } return b[c] }, b.optionsProvider = function (a, d, e) { function f(a) { var f = h; if (h = b.extend({}, j), d) for (i = 0; i < d.length; i++) { var g = c.matchMedia(d[i][0]); g.matches && (h = b.extend(h, d[i][1])) } e && a && e.emit("optionsChanged", { previousOptions: f, currentOptions: h }) } function g() { k.forEach(function (a) { a.removeListener(f) }) } var h, i, j = b.extend({}, a), k = []; if (!c.matchMedia) throw "window.matchMedia not found! Make sure you're using a polyfill."; if (d) for (i = 0; i < d.length; i++) { var l = c.matchMedia(d[i][0]); l.addListener(f), k.push(l) } return f(), { removeMediaQueryListeners: g, getCurrentOptions: function () { return b.extend({}, h) } } }, b.splitIntoSegments = function (a, c, d) { var e = { increasingX: !1, fillHoles: !1 }; d = b.extend({}, e, d); for (var f = [], g = !0, h = 0; h < a.length; h += 2)void 0 === b.getMultiValue(c[h / 2].value) ? d.fillHoles || (g = !0) : (d.increasingX && h >= 2 && a[h] <= a[h - 2] && (g = !0), g && (f.push({ pathCoordinates: [], valueData: [] }), g = !1), f[f.length - 1].pathCoordinates.push(a[h], a[h + 1]), f[f.length - 1].valueData.push(c[h / 2])); return f } }(this || global, a), function (a, b) { "use strict"; b.Interpolation = {}, b.Interpolation.none = function (a) { var c = { fillHoles: !1 }; return a = b.extend({}, c, a), function (c, d) { for (var e = new b.Svg.Path, f = !0, g = 0; g < c.length; g += 2) { var h = c[g], i = c[g + 1], j = d[g / 2]; void 0 !== b.getMultiValue(j.value) ? (f ? e.move(h, i, !1, j) : e.line(h, i, !1, j), f = !1) : a.fillHoles || (f = !0) } return e } }, b.Interpolation.simple = function (a) { var c = { divisor: 2, fillHoles: !1 }; a = b.extend({}, c, a); var d = 1 / Math.max(1, a.divisor); return function (c, e) { for (var f, g, h, i = new b.Svg.Path, j = 0; j < c.length; j += 2) { var k = c[j], l = c[j + 1], m = (k - f) * d, n = e[j / 2]; void 0 !== n.value ? (void 0 === h ? i.move(k, l, !1, n) : i.curve(f + m, g, k - m, l, k, l, !1, n), f = k, g = l, h = n) : a.fillHoles || (f = k = h = void 0) } return i } }, b.Interpolation.cardinal = function (a) { var c = { tension: 1, fillHoles: !1 }; a = b.extend({}, c, a); var d = Math.min(1, Math.max(0, a.tension)), e = 1 - d; return function f(c, g) { var h = b.splitIntoSegments(c, g, { fillHoles: a.fillHoles }); if (h.length) { if (h.length > 1) { var i = []; return h.forEach(function (a) { i.push(f(a.pathCoordinates, a.valueData)) }), b.Svg.Path.join(i) } if (c = h[0].pathCoordinates, g = h[0].valueData, c.length <= 4) return b.Interpolation.none()(c, g); for (var j, k = (new b.Svg.Path).move(c[0], c[1], !1, g[0]), l = 0, m = c.length; m - 2 * !j > l; l += 2) { var n = [{ x: +c[l - 2], y: +c[l - 1] }, { x: +c[l], y: +c[l + 1] }, { x: +c[l + 2], y: +c[l + 3] }, { x: +c[l + 4], y: +c[l + 5] }]; j ? l ? m - 4 === l ? n[3] = { x: +c[0], y: +c[1] } : m - 2 === l && (n[2] = { x: +c[0], y: +c[1] }, n[3] = { x: +c[2], y: +c[3] }) : n[0] = { x: +c[m - 2], y: +c[m - 1] } : m - 4 === l ? n[3] = n[2] : l || (n[0] = { x: +c[l], y: +c[l + 1] }), k.curve(d * (-n[0].x + 6 * n[1].x + n[2].x) / 6 + e * n[2].x, d * (-n[0].y + 6 * n[1].y + n[2].y) / 6 + e * n[2].y, d * (n[1].x + 6 * n[2].x - n[3].x) / 6 + e * n[2].x, d * (n[1].y + 6 * n[2].y - n[3].y) / 6 + e * n[2].y, n[2].x, n[2].y, !1, g[(l + 2) / 2]) } return k } return b.Interpolation.none()([]) } }, b.Interpolation.monotoneCubic = function (a) { var c = { fillHoles: !1 }; return a = b.extend({}, c, a), function d(c, e) { var f = b.splitIntoSegments(c, e, { fillHoles: a.fillHoles, increasingX: !0 }); if (f.length) { if (f.length > 1) { var g = []; return f.forEach(function (a) { g.push(d(a.pathCoordinates, a.valueData)) }), b.Svg.Path.join(g) } if (c = f[0].pathCoordinates, e = f[0].valueData, c.length <= 4) return b.Interpolation.none()(c, e); var h, i, j = [], k = [], l = c.length / 2, m = [], n = [], o = [], p = []; for (h = 0; h < l; h++)j[h] = c[2 * h], k[h] = c[2 * h + 1]; for (h = 0; h < l - 1; h++)o[h] = k[h + 1] - k[h], p[h] = j[h + 1] - j[h], n[h] = o[h] / p[h]; for (m[0] = n[0], m[l - 1] = n[l - 2], h = 1; h < l - 1; h++)0 === n[h] || 0 === n[h - 1] || n[h - 1] > 0 != n[h] > 0 ? m[h] = 0 : (m[h] = 3 * (p[h - 1] + p[h]) / ((2 * p[h] + p[h - 1]) / n[h - 1] + (p[h] + 2 * p[h - 1]) / n[h]), isFinite(m[h]) || (m[h] = 0)); for (i = (new b.Svg.Path).move(j[0], k[0], !1, e[0]), h = 0; h < l - 1; h++)i.curve(j[h] + p[h] / 3, k[h] + m[h] * p[h] / 3, j[h + 1] - p[h] / 3, k[h + 1] - m[h + 1] * p[h] / 3, j[h + 1], k[h + 1], !1, e[h + 1]); return i } return b.Interpolation.none()([]) } }, b.Interpolation.step = function (a) { var c = { postpone: !0, fillHoles: !1 }; return a = b.extend({}, c, a), function (c, d) { for (var e, f, g, h = new b.Svg.Path, i = 0; i < c.length; i += 2) { var j = c[i], k = c[i + 1], l = d[i / 2]; void 0 !== l.value ? (void 0 === g ? h.move(j, k, !1, l) : (a.postpone ? h.line(j, f, !1, g) : h.line(e, k, !1, l), h.line(j, k, !1, l)), e = j, f = k, g = l) : a.fillHoles || (e = f = g = void 0) } return h } } }(this || global, a), function (a, b) { "use strict"; b.EventEmitter = function () { function a(a, b) { d[a] = d[a] || [], d[a].push(b) } function b(a, b) { d[a] && (b ? (d[a].splice(d[a].indexOf(b), 1), 0 === d[a].length && delete d[a]) : delete d[a]) } function c(a, b) { d[a] && d[a].forEach(function (a) { a(b) }), d["*"] && d["*"].forEach(function (c) { c(a, b) }) } var d = []; return { addEventHandler: a, removeEventHandler: b, emit: c } } }(this || global, a), function (a, b) { "use strict"; function c(a) { var b = []; if (a.length) for (var c = 0; c < a.length; c++)b.push(a[c]); return b } function d(a, c) { var d = c || this.prototype || b.Class, e = Object.create(d); b.Class.cloneDefinitions(e, a); var f = function () { var a, c = e.constructor || function () { }; return a = this === b ? Object.create(e) : this, c.apply(a, Array.prototype.slice.call(arguments, 0)), a }; return f.prototype = e, f["super"] = d, f.extend = this.extend, f } function e() { var a = c(arguments), b = a[0]; return a.splice(1, a.length - 1).forEach(function (a) { Object.getOwnPropertyNames(a).forEach(function (c) { delete b[c], Object.defineProperty(b, c, Object.getOwnPropertyDescriptor(a, c)) }) }), b } b.Class = { extend: d, cloneDefinitions: e } }(this || global, a), function (a, b) { "use strict"; function c(a, c, d) { return a && (this.data = a || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.eventEmitter.emit("data", { type: "update", data: this.data })), c && (this.options = b.extend({}, d ? this.options : this.defaultOptions, c), this.initializeTimeoutId || (this.optionsProvider.removeMediaQueryListeners(), this.optionsProvider = b.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter))), this.initializeTimeoutId || this.createChart(this.optionsProvider.getCurrentOptions()), this } function d() { return this.initializeTimeoutId ? i.clearTimeout(this.initializeTimeoutId) : (i.removeEventListener("resize", this.resizeListener), this.optionsProvider.removeMediaQueryListeners()), this } function e(a, b) { return this.eventEmitter.addEventHandler(a, b), this } function f(a, b) { return this.eventEmitter.removeEventHandler(a, b), this } function g() { i.addEventListener("resize", this.resizeListener), this.optionsProvider = b.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter), this.eventEmitter.addEventHandler("optionsChanged", function () { this.update() }.bind(this)), this.options.plugins && this.options.plugins.forEach(function (a) { a instanceof Array ? a[0](this, a[1]) : a(this) }.bind(this)), this.eventEmitter.emit("data", { type: "initial", data: this.data }), this.createChart(this.optionsProvider.getCurrentOptions()), this.initializeTimeoutId = void 0 } function h(a, c, d, e, f) { this.container = b.querySelector(a), this.data = c || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.defaultOptions = d, this.options = e, this.responsiveOptions = f, this.eventEmitter = b.EventEmitter(), this.supportsForeignObject = b.Svg.isSupported("Extensibility"), this.supportsAnimations = b.Svg.isSupported("AnimationEventsAttribute"), this.resizeListener = function () { this.update() }.bind(this), this.container && (this.container.__chartist__ && this.container.__chartist__.detach(), this.container.__chartist__ = this), this.initializeTimeoutId = setTimeout(g.bind(this), 0) } var i = a.window; b.Base = b.Class.extend({ constructor: h, optionsProvider: void 0, container: void 0, svg: void 0, eventEmitter: void 0, createChart: function () { throw new Error("Base chart type can't be instantiated!") }, update: c, detach: d, on: e, off: f, version: b.version, supportsForeignObject: !1 }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e, f) { a instanceof Element ? this._node = a : (this._node = y.createElementNS(b.namespaces.svg, a), "svg" === a && this.attr({ "xmlns:ct": b.namespaces.ct })), c && this.attr(c), d && this.addClass(d), e && (f && e._node.firstChild ? e._node.insertBefore(this._node, e._node.firstChild) : e._node.appendChild(this._node)) } function d(a, c) { return "string" == typeof a ? c ? this._node.getAttributeNS(c, a) : this._node.getAttribute(a) : (Object.keys(a).forEach(function (c) { if (void 0 !== a[c]) if (c.indexOf(":") !== -1) { var d = c.split(":"); this._node.setAttributeNS(b.namespaces[d[0]], c, a[c]) } else this._node.setAttribute(c, a[c]) }.bind(this)), this) } function e(a, c, d, e) { return new b.Svg(a, c, d, this, e) } function f() { return this._node.parentNode instanceof SVGElement ? new b.Svg(this._node.parentNode) : null } function g() { for (var a = this._node; "svg" !== a.nodeName;)a = a.parentNode; return new b.Svg(a) } function h(a) { var c = this._node.querySelector(a); return c ? new b.Svg(c) : null } function i(a) { var c = this._node.querySelectorAll(a); return c.length ? new b.Svg.List(c) : null } function j() { return this._node } function k(a, c, d, e) { if ("string" == typeof a) { var f = y.createElement("div"); f.innerHTML = a, a = f.firstChild } a.setAttribute("xmlns", b.namespaces.xmlns); var g = this.elem("foreignObject", c, d, e); return g._node.appendChild(a), g } function l(a) { return this._node.appendChild(y.createTextNode(a)), this } function m() { for (; this._node.firstChild;)this._node.removeChild(this._node.firstChild); return this } function n() { return this._node.parentNode.removeChild(this._node), this.parent() } function o(a) { return this._node.parentNode.replaceChild(a._node, this._node), a } function p(a, b) { return b && this._node.firstChild ? this._node.insertBefore(a._node, this._node.firstChild) : this._node.appendChild(a._node), this } function q() { return this._node.getAttribute("class") ? this._node.getAttribute("class").trim().split(/\s+/) : [] } function r(a) { return this._node.setAttribute("class", this.classes(this._node).concat(a.trim().split(/\s+/)).filter(function (a, b, c) { return c.indexOf(a) === b }).join(" ")), this } function s(a) { var b = a.trim().split(/\s+/); return this._node.setAttribute("class", this.classes(this._node).filter(function (a) { return b.indexOf(a) === -1 }).join(" ")), this } function t() { return this._node.setAttribute("class", ""), this } function u() { return this._node.getBoundingClientRect().height } function v() { return this._node.getBoundingClientRect().width } function w(a, c, d) { return void 0 === c && (c = !0), Object.keys(a).forEach(function (e) { function f(a, c) { var f, g, h, i = {}; a.easing && (h = a.easing instanceof Array ? a.easing : b.Svg.Easing[a.easing], delete a.easing), a.begin = b.ensureUnit(a.begin, "ms"), a.dur = b.ensureUnit(a.dur, "ms"), h && (a.calcMode = "spline", a.keySplines = h.join(" "), a.keyTimes = "0;1"), c && (a.fill = "freeze", i[e] = a.from, this.attr(i), g = b.quantity(a.begin || 0).value, a.begin = "indefinite"), f = this.elem("animate", b.extend({ attributeName: e }, a)), c && setTimeout(function () { try { f._node.beginElement() } catch (b) { i[e] = a.to, this.attr(i), f.remove() } }.bind(this), g), d && f._node.addEventListener("beginEvent", function () { d.emit("animationBegin", { element: this, animate: f._node, params: a }) }.bind(this)), f._node.addEventListener("endEvent", function () { d && d.emit("animationEnd", { element: this, animate: f._node, params: a }), c && (i[e] = a.to, this.attr(i), f.remove()) }.bind(this)) } a[e] instanceof Array ? a[e].forEach(function (a) { f.bind(this)(a, !1) }.bind(this)) : f.bind(this)(a[e], c) }.bind(this)), this } function x(a) { var c = this; this.svgElements = []; for (var d = 0; d < a.length; d++)this.svgElements.push(new b.Svg(a[d])); Object.keys(b.Svg.prototype).filter(function (a) { return ["constructor", "parent", "querySelector", "querySelectorAll", "replace", "append", "classes", "height", "width"].indexOf(a) === -1 }).forEach(function (a) { c[a] = function () { var d = Array.prototype.slice.call(arguments, 0); return c.svgElements.forEach(function (c) { b.Svg.prototype[a].apply(c, d) }), c } }) } var y = a.document; b.Svg = b.Class.extend({ constructor: c, attr: d, elem: e, parent: f, root: g, querySelector: h, querySelectorAll: i, getNode: j, foreignObject: k, text: l, empty: m, remove: n, replace: o, append: p, classes: q, addClass: r, removeClass: s, removeAllClasses: t, height: u, width: v, animate: w }), b.Svg.isSupported = function (a) { return y.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#" + a, "1.1") }; var z = { easeInSine: [.47, 0, .745, .715], easeOutSine: [.39, .575, .565, 1], easeInOutSine: [.445, .05, .55, .95], easeInQuad: [.55, .085, .68, .53], easeOutQuad: [.25, .46, .45, .94], easeInOutQuad: [.455, .03, .515, .955], easeInCubic: [.55, .055, .675, .19], easeOutCubic: [.215, .61, .355, 1], easeInOutCubic: [.645, .045, .355, 1], easeInQuart: [.895, .03, .685, .22], easeOutQuart: [.165, .84, .44, 1], easeInOutQuart: [.77, 0, .175, 1], easeInQuint: [.755, .05, .855, .06], easeOutQuint: [.23, 1, .32, 1], easeInOutQuint: [.86, 0, .07, 1], easeInExpo: [.95, .05, .795, .035], easeOutExpo: [.19, 1, .22, 1], easeInOutExpo: [1, 0, 0, 1], easeInCirc: [.6, .04, .98, .335], easeOutCirc: [.075, .82, .165, 1], easeInOutCirc: [.785, .135, .15, .86], easeInBack: [.6, -.28, .735, .045], easeOutBack: [.175, .885, .32, 1.275], easeInOutBack: [.68, -.55, .265, 1.55] }; b.Svg.Easing = z, b.Svg.List = b.Class.extend({ constructor: x }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e, f, g) { var h = b.extend({ command: f ? a.toLowerCase() : a.toUpperCase() }, c, g ? { data: g } : {}); d.splice(e, 0, h) } function d(a, b) { a.forEach(function (c, d) { t[c.command.toLowerCase()].forEach(function (e, f) { b(c, e, d, f, a) }) }) } function e(a, c) { this.pathElements = [], this.pos = 0, this.close = a, this.options = b.extend({}, u, c) } function f(a) { return void 0 !== a ? (this.pos = Math.max(0, Math.min(this.pathElements.length, a)), this) : this.pos } function g(a) { return this.pathElements.splice(this.pos, a), this } function h(a, b, d, e) { return c("M", { x: +a, y: +b }, this.pathElements, this.pos++, d, e), this } function i(a, b, d, e) { return c("L", { x: +a, y: +b }, this.pathElements, this.pos++, d, e), this } function j(a, b, d, e, f, g, h, i) { return c("C", { x1: +a, y1: +b, x2: +d, y2: +e, x: +f, y: +g }, this.pathElements, this.pos++, h, i), this } function k(a, b, d, e, f, g, h, i, j) { return c("A", { rx: +a, ry: +b, xAr: +d, lAf: +e, sf: +f, x: +g, y: +h }, this.pathElements, this.pos++, i, j), this } function l(a) { var c = a.replace(/([A-Za-z])([0-9])/g, "$1 $2").replace(/([0-9])([A-Za-z])/g, "$1 $2").split(/[\s,]+/).reduce(function (a, b) { return b.match(/[A-Za-z]/) && a.push([]), a[a.length - 1].push(b), a }, []); "Z" === c[c.length - 1][0].toUpperCase() && c.pop(); var d = c.map(function (a) { var c = a.shift(), d = t[c.toLowerCase()]; return b.extend({ command: c }, d.reduce(function (b, c, d) { return b[c] = +a[d], b }, {})) }), e = [this.pos, 0]; return Array.prototype.push.apply(e, d), Array.prototype.splice.apply(this.pathElements, e), this.pos += d.length, this } function m() { var a = Math.pow(10, this.options.accuracy); return this.pathElements.reduce(function (b, c) { var d = t[c.command.toLowerCase()].map(function (b) { return this.options.accuracy ? Math.round(c[b] * a) / a : c[b] }.bind(this)); return b + c.command + d.join(",") }.bind(this), "") + (this.close ? "Z" : "") } function n(a, b) { return d(this.pathElements, function (c, d) { c[d] *= "x" === d[0] ? a : b }), this } function o(a, b) { return d(this.pathElements, function (c, d) { c[d] += "x" === d[0] ? a : b }), this } function p(a) { return d(this.pathElements, function (b, c, d, e, f) { var g = a(b, c, d, e, f); (g || 0 === g) && (b[c] = g) }), this } function q(a) { var c = new b.Svg.Path(a || this.close); return c.pos = this.pos, c.pathElements = this.pathElements.slice().map(function (a) { return b.extend({}, a) }), c.options = b.extend({}, this.options), c } function r(a) { var c = [new b.Svg.Path]; return this.pathElements.forEach(function (d) { d.command === a.toUpperCase() && 0 !== c[c.length - 1].pathElements.length && c.push(new b.Svg.Path), c[c.length - 1].pathElements.push(d) }), c } function s(a, c, d) { for (var e = new b.Svg.Path(c, d), f = 0; f < a.length; f++)for (var g = a[f], h = 0; h < g.pathElements.length; h++)e.pathElements.push(g.pathElements[h]); return e } var t = { m: ["x", "y"], l: ["x", "y"], c: ["x1", "y1", "x2", "y2", "x", "y"], a: ["rx", "ry", "xAr", "lAf", "sf", "x", "y"] }, u = { accuracy: 3 }; b.Svg.Path = b.Class.extend({ constructor: e, position: f, remove: g, move: h, line: i, curve: j, arc: k, scale: n, translate: o, transform: p, parse: l, stringify: m, clone: q, splitByCommand: r }), b.Svg.Path.elementDescriptions = t, b.Svg.Path.join = s }(this || global, a), function (a, b) { "use strict"; function c(a, b, c, d) { this.units = a, this.counterUnits = a === e.x ? e.y : e.x, this.chartRect = b, this.axisLength = b[a.rectEnd] - b[a.rectStart], this.gridOffset = b[a.rectOffset], this.ticks = c, this.options = d } function d(a, c, d, e, f) { var g = e["axis" + this.units.pos.toUpperCase()], h = this.ticks.map(this.projectValue.bind(this)), i = this.ticks.map(g.labelInterpolationFnc); h.forEach(function (j, k) { var l, m = { x: 0, y: 0 }; l = h[k + 1] ? h[k + 1] - j : Math.max(this.axisLength - j, 30), b.isFalseyButZero(i[k]) && "" !== i[k] || ("x" === this.units.pos ? (j = this.chartRect.x1 + j, m.x = e.axisX.labelOffset.x, "start" === e.axisX.position ? m.y = this.chartRect.padding.top + e.axisX.labelOffset.y + (d ? 5 : 20) : m.y = this.chartRect.y1 + e.axisX.labelOffset.y + (d ? 5 : 20)) : (j = this.chartRect.y1 - j, m.y = e.axisY.labelOffset.y - (d ? l : 0), "start" === e.axisY.position ? m.x = d ? this.chartRect.padding.left + e.axisY.labelOffset.x : this.chartRect.x1 - 10 : m.x = this.chartRect.x2 + e.axisY.labelOffset.x + 10), g.showGrid && b.createGrid(j, k, this, this.gridOffset, this.chartRect[this.counterUnits.len](), a, [e.classNames.grid, e.classNames[this.units.dir]], f), g.showLabel && b.createLabel(j, l, k, i, this, g.offset, m, c, [e.classNames.label, e.classNames[this.units.dir], "start" === g.position ? e.classNames[g.position] : e.classNames.end], d, f)) }.bind(this)) } var e = (a.window, a.document, { x: { pos: "x", len: "width", dir: "horizontal", rectStart: "x1", rectEnd: "x2", rectOffset: "y2" }, y: { pos: "y", len: "height", dir: "vertical", rectStart: "y2", rectEnd: "y1", rectOffset: "x1" } }); b.Axis = b.Class.extend({ constructor: c, createGridAndLabels: d, projectValue: function (a, b, c) { throw new Error("Base axis can't be instantiated!") } }), b.Axis.units = e }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e) { var f = e.highLow || b.getHighLow(c, e, a.pos); this.bounds = b.getBounds(d[a.rectEnd] - d[a.rectStart], f, e.scaleMinSpace || 20, e.onlyInteger), this.range = { min: this.bounds.min, max: this.bounds.max }, b.AutoScaleAxis["super"].constructor.call(this, a, d, this.bounds.values, e) } function d(a) { return this.axisLength * (+b.getMultiValue(a, this.units.pos) - this.bounds.min) / this.bounds.range } a.window, a.document; b.AutoScaleAxis = b.Axis.extend({ constructor: c, projectValue: d }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e) { var f = e.highLow || b.getHighLow(c, e, a.pos); this.divisor = e.divisor || 1, this.ticks = e.ticks || b.times(this.divisor).map(function (a, b) { return f.low + (f.high - f.low) / this.divisor * b }.bind(this)), this.ticks.sort(function (a, b) { return a - b }), this.range = { min: f.low, max: f.high }, b.FixedScaleAxis["super"].constructor.call(this, a, d, this.ticks, e), this.stepLength = this.axisLength / this.divisor } function d(a) { return this.axisLength * (+b.getMultiValue(a, this.units.pos) - this.range.min) / (this.range.max - this.range.min) } a.window, a.document; b.FixedScaleAxis = b.Axis.extend({ constructor: c, projectValue: d }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e) { b.StepAxis["super"].constructor.call(this, a, d, e.ticks, e); var f = Math.max(1, e.ticks.length - (e.stretch ? 1 : 0)); this.stepLength = this.axisLength / f } function d(a, b) { return this.stepLength * b } a.window, a.document; b.StepAxis = b.Axis.extend({ constructor: c, projectValue: d }) }(this || global, a), function (a, b) { "use strict"; function c(a) { var c = b.normalizeData(this.data, a.reverseData, !0); this.svg = b.createSvg(this.container, a.width, a.height, a.classNames.chart); var d, f, g = this.svg.elem("g").addClass(a.classNames.gridGroup), h = this.svg.elem("g"), i = this.svg.elem("g").addClass(a.classNames.labelGroup), j = b.createChartRect(this.svg, a, e.padding); d = void 0 === a.axisX.type ? new b.StepAxis(b.Axis.units.x, c.normalized.series, j, b.extend({}, a.axisX, { ticks: c.normalized.labels, stretch: a.fullWidth })) : a.axisX.type.call(b, b.Axis.units.x, c.normalized.series, j, a.axisX), f = void 0 === a.axisY.type ? new b.AutoScaleAxis(b.Axis.units.y, c.normalized.series, j, b.extend({}, a.axisY, { high: b.isNumeric(a.high) ? a.high : a.axisY.high, low: b.isNumeric(a.low) ? a.low : a.axisY.low })) : a.axisY.type.call(b, b.Axis.units.y, c.normalized.series, j, a.axisY), d.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), f.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && b.createGridBackground(g, j, a.classNames.gridBackground, this.eventEmitter), c.raw.series.forEach(function (e, g) { var i = h.elem("g"); i.attr({ "ct:series-name": e.name, "ct:meta": b.serialize(e.meta) }), i.addClass([a.classNames.series, e.className || a.classNames.series + "-" + b.alphaNumerate(g)].join(" ")); var k = [], l = []; c.normalized.series[g].forEach(function (a, h) { var i = { x: j.x1 + d.projectValue(a, h, c.normalized.series[g]), y: j.y1 - f.projectValue(a, h, c.normalized.series[g]) }; k.push(i.x, i.y), l.push({ value: a, valueIndex: h, meta: b.getMetaData(e, h) }) }.bind(this)); var m = { lineSmooth: b.getSeriesOption(e, a, "lineSmooth"), showPoint: b.getSeriesOption(e, a, "showPoint"), showLine: b.getSeriesOption(e, a, "showLine"), showArea: b.getSeriesOption(e, a, "showArea"), areaBase: b.getSeriesOption(e, a, "areaBase") }, n = "function" == typeof m.lineSmooth ? m.lineSmooth : m.lineSmooth ? b.Interpolation.monotoneCubic() : b.Interpolation.none(), o = n(k, l); if (m.showPoint && o.pathElements.forEach(function (c) { var h = i.elem("line", { x1: c.x, y1: c.y, x2: c.x + .01, y2: c.y }, a.classNames.point).attr({ "ct:value": [c.data.value.x, c.data.value.y].filter(b.isNumeric).join(","), "ct:meta": b.serialize(c.data.meta) }); this.eventEmitter.emit("draw", { type: "point", value: c.data.value, index: c.data.valueIndex, meta: c.data.meta, series: e, seriesIndex: g, axisX: d, axisY: f, group: i, element: h, x: c.x, y: c.y }) }.bind(this)), m.showLine) { var p = i.elem("path", { d: o.stringify() }, a.classNames.line, !0); this.eventEmitter.emit("draw", { type: "line", values: c.normalized.series[g], path: o.clone(), chartRect: j, index: g, series: e, seriesIndex: g, seriesMeta: e.meta, axisX: d, axisY: f, group: i, element: p }) } if (m.showArea && f.range) { var q = Math.max(Math.min(m.areaBase, f.range.max), f.range.min), r = j.y1 - f.projectValue(q); o.splitByCommand("M").filter(function (a) { return a.pathElements.length > 1 }).map(function (a) { var b = a.pathElements[0], c = a.pathElements[a.pathElements.length - 1]; return a.clone(!0).position(0).remove(1).move(b.x, r).line(b.x, b.y).position(a.pathElements.length + 1).line(c.x, r) }).forEach(function (b) { var h = i.elem("path", { d: b.stringify() }, a.classNames.area, !0); this.eventEmitter.emit("draw", { type: "area", values: c.normalized.series[g], path: b.clone(), series: e, seriesIndex: g, axisX: d, axisY: f, chartRect: j, index: g, group: i, element: h }) }.bind(this)) } }.bind(this)), this.eventEmitter.emit("created", { bounds: f.bounds, chartRect: j, axisX: d, axisY: f, svg: this.svg, options: a }) } function d(a, c, d, f) { b.Line["super"].constructor.call(this, a, c, e, b.extend({}, e, d), f) } var e = (a.window, a.document, { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, type: void 0 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, type: void 0, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, showLine: !0, showPoint: !0, showArea: !1, areaBase: 0, lineSmooth: !0, showGridBackground: !1, low: void 0, high: void 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, fullWidth: !1, reverseData: !1, classNames: { chart: "ct-chart-line", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", line: "ct-line", point: "ct-point", area: "ct-area", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }); b.Line = b.Base.extend({ constructor: d, createChart: c }) }(this || global, a), function (a, b) { + "use strict"; function c(a) { + var c, d; a.distributeSeries ? (c = b.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), c.normalized.series = c.normalized.series.map(function (a) { return [a] })) : c = b.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), this.svg = b.createSvg(this.container, a.width, a.height, a.classNames.chart + (a.horizontalBars ? " " + a.classNames.horizontalBars : "")); var f = this.svg.elem("g").addClass(a.classNames.gridGroup), g = this.svg.elem("g"), h = this.svg.elem("g").addClass(a.classNames.labelGroup); + if (a.stackBars && 0 !== c.normalized.series.length) { var i = b.serialMap(c.normalized.series, function () { return Array.prototype.slice.call(arguments).map(function (a) { return a }).reduce(function (a, b) { return { x: a.x + (b && b.x) || 0, y: a.y + (b && b.y) || 0 } }, { x: 0, y: 0 }) }); d = b.getHighLow([i], a, a.horizontalBars ? "x" : "y") } else d = b.getHighLow(c.normalized.series, a, a.horizontalBars ? "x" : "y"); d.high = +a.high || (0 === a.high ? 0 : d.high), d.low = +a.low || (0 === a.low ? 0 : d.low); var j, k, l, m, n, o = b.createChartRect(this.svg, a, e.padding); k = a.distributeSeries && a.stackBars ? c.normalized.labels.slice(0, 1) : c.normalized.labels, a.horizontalBars ? (j = m = void 0 === a.axisX.type ? new b.AutoScaleAxis(b.Axis.units.x, c.normalized.series, o, b.extend({}, a.axisX, { highLow: d, referenceValue: 0 })) : a.axisX.type.call(b, b.Axis.units.x, c.normalized.series, o, b.extend({}, a.axisX, { highLow: d, referenceValue: 0 })), l = n = void 0 === a.axisY.type ? new b.StepAxis(b.Axis.units.y, c.normalized.series, o, { ticks: k }) : a.axisY.type.call(b, b.Axis.units.y, c.normalized.series, o, a.axisY)) : (l = m = void 0 === a.axisX.type ? new b.StepAxis(b.Axis.units.x, c.normalized.series, o, { ticks: k }) : a.axisX.type.call(b, b.Axis.units.x, c.normalized.series, o, a.axisX), j = n = void 0 === a.axisY.type ? new b.AutoScaleAxis(b.Axis.units.y, c.normalized.series, o, b.extend({}, a.axisY, { highLow: d, referenceValue: 0 })) : a.axisY.type.call(b, b.Axis.units.y, c.normalized.series, o, b.extend({}, a.axisY, { highLow: d, referenceValue: 0 }))); var p = a.horizontalBars ? o.x1 + j.projectValue(0) : o.y1 - j.projectValue(0), q = []; l.createGridAndLabels(f, h, this.supportsForeignObject, a, this.eventEmitter), j.createGridAndLabels(f, h, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && b.createGridBackground(f, o, a.classNames.gridBackground, this.eventEmitter), c.raw.series.forEach(function (d, e) { var f, h, i = e - (c.raw.series.length - 1) / 2; f = a.distributeSeries && !a.stackBars ? l.axisLength / c.normalized.series.length / 2 : a.distributeSeries && a.stackBars ? l.axisLength / 2 : l.axisLength / c.normalized.series[e].length / 2, h = g.elem("g"), h.attr({ "ct:series-name": d.name, "ct:meta": b.serialize(d.meta) }), h.addClass([a.classNames.series, d.className || a.classNames.series + "-" + b.alphaNumerate(e)].join(" ")), c.normalized.series[e].forEach(function (g, k) { var r, s, t, u; if (u = a.distributeSeries && !a.stackBars ? e : a.distributeSeries && a.stackBars ? 0 : k, r = a.horizontalBars ? { x: o.x1 + j.projectValue(g && g.x ? g.x : 0, k, c.normalized.series[e]), y: o.y1 - l.projectValue(g && g.y ? g.y : 0, u, c.normalized.series[e]) } : { x: o.x1 + l.projectValue(g && g.x ? g.x : 0, u, c.normalized.series[e]), y: o.y1 - j.projectValue(g && g.y ? g.y : 0, k, c.normalized.series[e]) }, l instanceof b.StepAxis && (l.options.stretch || (r[l.units.pos] += f * (a.horizontalBars ? -1 : 1)), r[l.units.pos] += a.stackBars || a.distributeSeries ? 0 : i * a.seriesBarDistance * (a.horizontalBars ? -1 : 1)), t = q[k] || p, q[k] = t - (p - r[l.counterUnits.pos]), void 0 !== g) { var v = {}; v[l.units.pos + "1"] = r[l.units.pos], v[l.units.pos + "2"] = r[l.units.pos], !a.stackBars || "accumulate" !== a.stackMode && a.stackMode ? (v[l.counterUnits.pos + "1"] = p, v[l.counterUnits.pos + "2"] = r[l.counterUnits.pos]) : (v[l.counterUnits.pos + "1"] = t, v[l.counterUnits.pos + "2"] = q[k]), v.x1 = Math.min(Math.max(v.x1, o.x1), o.x2), v.x2 = Math.min(Math.max(v.x2, o.x1), o.x2), v.y1 = Math.min(Math.max(v.y1, o.y2), o.y1), v.y2 = Math.min(Math.max(v.y2, o.y2), o.y1); var w = b.getMetaData(d, k); s = h.elem("line", v, a.classNames.bar).attr({ "ct:value": [g.x, g.y].filter(b.isNumeric).join(","), "ct:meta": b.serialize(w) }), this.eventEmitter.emit("draw", b.extend({ type: "bar", value: g, index: k, meta: w, series: d, seriesIndex: e, axisX: m, axisY: n, chartRect: o, group: h, element: s }, v)) } }.bind(this)) }.bind(this)), this.eventEmitter.emit("created", { bounds: j.bounds, chartRect: o, axisX: m, axisY: n, svg: this.svg, options: a }) + } function d(a, c, d, f) { b.Bar["super"].constructor.call(this, a, c, e, b.extend({}, e, d), f) } var e = (a.window, a.document, { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, scaleMinSpace: 30, onlyInteger: !1 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, high: void 0, low: void 0, referenceValue: 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, seriesBarDistance: 15, stackBars: !1, stackMode: "accumulate", horizontalBars: !1, distributeSeries: !1, reverseData: !1, showGridBackground: !1, classNames: { chart: "ct-chart-bar", horizontalBars: "ct-horizontal-bars", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", bar: "ct-bar", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }); b.Bar = b.Base.extend({ constructor: d, createChart: c }) + }(this || global, a), function (a, b) { "use strict"; function c(a, b, c) { var d = b.x > a.x; return d && "explode" === c || !d && "implode" === c ? "start" : d && "implode" === c || !d && "explode" === c ? "end" : "middle" } function d(a) { var d, e, g, h, i, j = b.normalizeData(this.data), k = [], l = a.startAngle; this.svg = b.createSvg(this.container, a.width, a.height, a.donut ? a.classNames.chartDonut : a.classNames.chartPie), e = b.createChartRect(this.svg, a, f.padding), g = Math.min(e.width() / 2, e.height() / 2), i = a.total || j.normalized.series.reduce(function (a, b) { return a + b }, 0); var m = b.quantity(a.donutWidth); "%" === m.unit && (m.value *= g / 100), g -= a.donut && !a.donutSolid ? m.value / 2 : 0, h = "outside" === a.labelPosition || a.donut && !a.donutSolid ? g : "center" === a.labelPosition ? 0 : a.donutSolid ? g - m.value / 2 : g / 2, h += a.labelOffset; var n = { x: e.x1 + e.width() / 2, y: e.y2 + e.height() / 2 }, o = 1 === j.raw.series.filter(function (a) { return a.hasOwnProperty("value") ? 0 !== a.value : 0 !== a }).length; j.raw.series.forEach(function (a, b) { k[b] = this.svg.elem("g", null, null) }.bind(this)), a.showLabel && (d = this.svg.elem("g", null, null)), j.raw.series.forEach(function (e, f) { if (0 !== j.normalized.series[f] || !a.ignoreEmptyValues) { k[f].attr({ "ct:series-name": e.name }), k[f].addClass([a.classNames.series, e.className || a.classNames.series + "-" + b.alphaNumerate(f)].join(" ")); var p = i > 0 ? l + j.normalized.series[f] / i * 360 : 0, q = Math.max(0, l - (0 === f || o ? 0 : .2)); p - q >= 359.99 && (p = q + 359.99); var r, s, t, u = b.polarToCartesian(n.x, n.y, g, q), v = b.polarToCartesian(n.x, n.y, g, p), w = new b.Svg.Path(!a.donut || a.donutSolid).move(v.x, v.y).arc(g, g, 0, p - l > 180, 0, u.x, u.y); a.donut ? a.donutSolid && (t = g - m.value, r = b.polarToCartesian(n.x, n.y, t, l - (0 === f || o ? 0 : .2)), s = b.polarToCartesian(n.x, n.y, t, p), w.line(r.x, r.y), w.arc(t, t, 0, p - l > 180, 1, s.x, s.y)) : w.line(n.x, n.y); var x = a.classNames.slicePie; a.donut && (x = a.classNames.sliceDonut, a.donutSolid && (x = a.classNames.sliceDonutSolid)); var y = k[f].elem("path", { d: w.stringify() }, x); if (y.attr({ "ct:value": j.normalized.series[f], "ct:meta": b.serialize(e.meta) }), a.donut && !a.donutSolid && (y._node.style.strokeWidth = m.value + "px"), this.eventEmitter.emit("draw", { type: "slice", value: j.normalized.series[f], totalDataSum: i, index: f, meta: e.meta, series: e, group: k[f], element: y, path: w.clone(), center: n, radius: g, startAngle: l, endAngle: p }), a.showLabel) { var z; z = 1 === j.raw.series.length ? { x: n.x, y: n.y } : b.polarToCartesian(n.x, n.y, h, l + (p - l) / 2); var A; A = j.normalized.labels && !b.isFalseyButZero(j.normalized.labels[f]) ? j.normalized.labels[f] : j.normalized.series[f]; var B = a.labelInterpolationFnc(A, f); if (B || 0 === B) { var C = d.elem("text", { dx: z.x, dy: z.y, "text-anchor": c(n, z, a.labelDirection) }, a.classNames.label).text("" + B); this.eventEmitter.emit("draw", { type: "label", index: f, group: d, element: C, text: "" + B, x: z.x, y: z.y }) } } l = p } }.bind(this)), this.eventEmitter.emit("created", { chartRect: e, svg: this.svg, options: a }) } function e(a, c, d, e) { b.Pie["super"].constructor.call(this, a, c, f, b.extend({}, f, d), e) } var f = (a.window, a.document, { width: void 0, height: void 0, chartPadding: 5, classNames: { chartPie: "ct-chart-pie", chartDonut: "ct-chart-donut", series: "ct-series", slicePie: "ct-slice-pie", sliceDonut: "ct-slice-donut", sliceDonutSolid: "ct-slice-donut-solid", label: "ct-label" }, startAngle: 0, total: void 0, donut: !1, donutSolid: !1, donutWidth: 60, showLabel: !0, labelOffset: 0, labelPosition: "inside", labelInterpolationFnc: b.noop, labelDirection: "neutral", reverseData: !1, ignoreEmptyValues: !1 }); b.Pie = b.Base.extend({ constructor: e, createChart: d, determineAnchorPosition: c }) }(this || global, a), a +}); +//# sourceMappingURL=chartist.min.js.map + +var i, l, selectedLine = null; + +/* Navigate to hash without browser history entry */ +var navigateToHash = function () { + if (window.history !== undefined && window.history.replaceState !== undefined) { + window.history.replaceState(undefined, undefined, this.getAttribute("href")); + } +}; + +var hashLinks = document.getElementsByClassName('navigatetohash'); +for (i = 0, l = hashLinks.length; i < l; i++) { + hashLinks[i].addEventListener('click', navigateToHash); +} + +/* Switch test method */ +var switchTestMethod = function () { + var method = this.getAttribute("value"); + console.log("Selected test method: " + method); + + var lines, i, l, coverageData, lineAnalysis, cells; + + lines = document.querySelectorAll('.lineAnalysis tr'); + + for (i = 1, l = lines.length; i < l; i++) { + coverageData = JSON.parse(lines[i].getAttribute('data-coverage').replace(/'/g, '"')); + lineAnalysis = coverageData[method]; + cells = lines[i].querySelectorAll('td'); + if (lineAnalysis === undefined) { + lineAnalysis = coverageData.AllTestMethods; + if (lineAnalysis.LVS !== 'gray') { + cells[0].setAttribute('class', 'red'); + cells[1].innerText = cells[1].textContent = '0'; + cells[4].setAttribute('class', 'lightred'); + } + } else { + cells[0].setAttribute('class', lineAnalysis.LVS); + cells[1].innerText = cells[1].textContent = lineAnalysis.VC; + cells[4].setAttribute('class', 'light' + lineAnalysis.LVS); + } + } +}; + +var testMethods = document.getElementsByClassName('switchtestmethod'); +for (i = 0, l = testMethods.length; i < l; i++) { + testMethods[i].addEventListener('change', switchTestMethod); +} + +/* Highlight test method by line */ +var toggleLine = function () { + if (selectedLine === this) { + selectedLine = null; + } else { + selectedLine = null; + unhighlightTestMethods(); + highlightTestMethods.call(this); + selectedLine = this; + } + +}; +var highlightTestMethods = function () { + if (selectedLine !== null) { + return; + } + + var lineAnalysis; + var coverageData = JSON.parse(this.getAttribute('data-coverage').replace(/'/g, '"')); + var testMethods = document.getElementsByClassName('testmethod'); + + for (i = 0, l = testMethods.length; i < l; i++) { + lineAnalysis = coverageData[testMethods[i].id]; + if (lineAnalysis === undefined) { + testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); + } else { + testMethods[i].className += ' light' + lineAnalysis.LVS; + } + } +}; +var unhighlightTestMethods = function () { + if (selectedLine !== null) { + return; + } + + var testMethods = document.getElementsByClassName('testmethod'); + for (i = 0, l = testMethods.length; i < l; i++) { + testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); + } +}; +var coverableLines = document.getElementsByClassName('coverableline'); +for (i = 0, l = coverableLines.length; i < l; i++) { + coverableLines[i].addEventListener('click', toggleLine); + coverableLines[i].addEventListener('mouseenter', highlightTestMethods); + coverableLines[i].addEventListener('mouseleave', unhighlightTestMethods); +} + +/* History charts */ +var renderChart = function (chart) { + // Remove current children (e.g. PNG placeholder) + while (chart.firstChild) { + chart.firstChild.remove(); + } + + var chartData = window[chart.getAttribute('data-data')]; + var options = { + axisY: { + type: undefined, + onlyInteger: true + }, + lineSmooth: false, + low: 0, + high: 100, + scaleMinSpace: 20, + onlyInteger: true, + fullWidth: true + }; + var lineChart = new Chartist.Line(chart, { + labels: [], + series: chartData.series + }, options); + + /* Zoom */ + var zoomButtonDiv = document.createElement("div"); + zoomButtonDiv.className = "toggleZoom"; + var zoomButtonLink = document.createElement("a"); + zoomButtonLink.setAttribute("href", ""); + var zoomButtonText = document.createElement("i"); + zoomButtonText.className = "icon-search-plus"; + + zoomButtonLink.appendChild(zoomButtonText); + zoomButtonDiv.appendChild(zoomButtonLink); + + chart.appendChild(zoomButtonDiv); + + zoomButtonDiv.addEventListener('click', function (event) { + event.preventDefault(); + + if (options.axisY.type === undefined) { + options.axisY.type = Chartist.AutoScaleAxis; + zoomButtonText.className = "icon-search-minus"; + } else { + options.axisY.type = undefined; + zoomButtonText.className = "icon-search-plus"; + } + + lineChart.update(null, options); + }); + + var tooltip = document.createElement("div"); + tooltip.className = "tooltip"; + + chart.appendChild(tooltip); + + /* Tooltips */ + var showToolTip = function () { + var index = this.getAttribute('ct:meta'); + + tooltip.innerHTML = chartData.tooltips[index]; + tooltip.style.display = 'block'; + }; + + var moveToolTip = function (event) { + var box = chart.getBoundingClientRect(); + var left = event.pageX - box.left - window.pageXOffset; + var top = event.pageY - box.top - window.pageYOffset; + + left = left + 20; + top = top - tooltip.offsetHeight / 2; + + if (left + tooltip.offsetWidth > box.width) { + left -= tooltip.offsetWidth + 40; + } + + if (top < 0) { + top = 0; + } + + if (top + tooltip.offsetHeight > box.height) { + top = box.height - tooltip.offsetHeight; + } + + tooltip.style.left = left + 'px'; + tooltip.style.top = top + 'px'; + }; + + var hideToolTip = function () { + tooltip.style.display = 'none'; + }; + chart.addEventListener('mousemove', moveToolTip); + + lineChart.on('created', function () { + var chartPoints = chart.getElementsByClassName('ct-point'); + for (i = 0, l = chartPoints.length; i < l; i++) { + chartPoints[i].addEventListener('mousemove', showToolTip); + chartPoints[i].addEventListener('mouseout', hideToolTip); + } + }); +}; + +var charts = document.getElementsByClassName('historychart'); +for (i = 0, l = charts.length; i < l; i++) { + renderChart(charts[i]); +} \ No newline at end of file diff --git a/coveragereport/icon_cog.svg b/coveragereport/icon_cog.svg new file mode 100644 index 0000000..d730bf1 --- /dev/null +++ b/coveragereport/icon_cog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_cog_dark.svg b/coveragereport/icon_cog_dark.svg new file mode 100644 index 0000000..ccbcd9b --- /dev/null +++ b/coveragereport/icon_cog_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_cube.svg b/coveragereport/icon_cube.svg new file mode 100644 index 0000000..3302443 --- /dev/null +++ b/coveragereport/icon_cube.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_cube_dark.svg b/coveragereport/icon_cube_dark.svg new file mode 100644 index 0000000..3e7f0fa --- /dev/null +++ b/coveragereport/icon_cube_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_fork.svg b/coveragereport/icon_fork.svg new file mode 100644 index 0000000..f0148b3 --- /dev/null +++ b/coveragereport/icon_fork.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_fork_dark.svg b/coveragereport/icon_fork_dark.svg new file mode 100644 index 0000000..11930c9 --- /dev/null +++ b/coveragereport/icon_fork_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_info-circled.svg b/coveragereport/icon_info-circled.svg new file mode 100644 index 0000000..252166b --- /dev/null +++ b/coveragereport/icon_info-circled.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_info-circled_dark.svg b/coveragereport/icon_info-circled_dark.svg new file mode 100644 index 0000000..252166b --- /dev/null +++ b/coveragereport/icon_info-circled_dark.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_minus.svg b/coveragereport/icon_minus.svg new file mode 100644 index 0000000..3c30c36 --- /dev/null +++ b/coveragereport/icon_minus.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_minus_dark.svg b/coveragereport/icon_minus_dark.svg new file mode 100644 index 0000000..2516b6f --- /dev/null +++ b/coveragereport/icon_minus_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_plus.svg b/coveragereport/icon_plus.svg new file mode 100644 index 0000000..7932723 --- /dev/null +++ b/coveragereport/icon_plus.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_plus_dark.svg b/coveragereport/icon_plus_dark.svg new file mode 100644 index 0000000..6ed4edd --- /dev/null +++ b/coveragereport/icon_plus_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_search-minus.svg b/coveragereport/icon_search-minus.svg new file mode 100644 index 0000000..c174eb5 --- /dev/null +++ b/coveragereport/icon_search-minus.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_search-minus_dark.svg b/coveragereport/icon_search-minus_dark.svg new file mode 100644 index 0000000..9caaffb --- /dev/null +++ b/coveragereport/icon_search-minus_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_search-plus.svg b/coveragereport/icon_search-plus.svg new file mode 100644 index 0000000..04b24ec --- /dev/null +++ b/coveragereport/icon_search-plus.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_search-plus_dark.svg b/coveragereport/icon_search-plus_dark.svg new file mode 100644 index 0000000..5324194 --- /dev/null +++ b/coveragereport/icon_search-plus_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/icon_sponsor.svg b/coveragereport/icon_sponsor.svg new file mode 100644 index 0000000..bf6d959 --- /dev/null +++ b/coveragereport/icon_sponsor.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_star.svg b/coveragereport/icon_star.svg new file mode 100644 index 0000000..b23c54e --- /dev/null +++ b/coveragereport/icon_star.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_star_dark.svg b/coveragereport/icon_star_dark.svg new file mode 100644 index 0000000..49c0d03 --- /dev/null +++ b/coveragereport/icon_star_dark.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_up-dir.svg b/coveragereport/icon_up-dir.svg new file mode 100644 index 0000000..567c11f --- /dev/null +++ b/coveragereport/icon_up-dir.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_up-dir_active.svg b/coveragereport/icon_up-dir_active.svg new file mode 100644 index 0000000..bb22554 --- /dev/null +++ b/coveragereport/icon_up-dir_active.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_up-down-dir.svg b/coveragereport/icon_up-down-dir.svg new file mode 100644 index 0000000..62a3f9c --- /dev/null +++ b/coveragereport/icon_up-down-dir.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_up-down-dir_dark.svg b/coveragereport/icon_up-down-dir_dark.svg new file mode 100644 index 0000000..2820a25 --- /dev/null +++ b/coveragereport/icon_up-down-dir_dark.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_wrench.svg b/coveragereport/icon_wrench.svg new file mode 100644 index 0000000..b6aa318 --- /dev/null +++ b/coveragereport/icon_wrench.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/coveragereport/icon_wrench_dark.svg b/coveragereport/icon_wrench_dark.svg new file mode 100644 index 0000000..5c77a9c --- /dev/null +++ b/coveragereport/icon_wrench_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/coveragereport/index.htm b/coveragereport/index.htm new file mode 100644 index 0000000..0c8d7e7 --- /dev/null +++ b/coveragereport/index.htm @@ -0,0 +1,185 @@ + + + + + + + +Summary - Coverage Report + +
+

SummaryStarSponsor

+
+
+
Information
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Parser:Cobertura
Assemblies:1
Classes:6
Files:9
Coverage date:7/24/2024 - 5:44:06 PM
+
+
+
+
+
Line coverage
+
+
74%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:290
Uncovered lines:100
Coverable lines:390
Total lines:1413
Line coverage:74.3%
+
+
+
+
+
Branch coverage
+
+
70%
+
+ + + + + + + + + + + + + +
Covered branches:59
Total branches:84
Branch coverage:70.2%
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Risk Hotspots

+ + +

No risk hotspots found.

+

Coverage

+ +
+ +++++++++++++ + + + + + + + + + + + + +
Line coverageBranch coverage
NameCoveredUncoveredCoverableTotalPercentageCoveredTotalPercentage
TaskChaining290100390145074.3%
  
598470.2%
  
RLC.TaskChaining.FixedRetryParams1001037100%
 
00
 
RLC.TaskChaining.RetryException30311100%
 
00
 
RLC.TaskChaining.RetryParams1001037100%
 
00
 
RLC.TaskChaining.TaskExtensions19392285103567.7%
  
376259.6%
  
RLC.TaskChaining.TaskExtras61061237100%
 
2222100%
 
RLC.TaskChaining.TaskStatics138219361.9%
  
00
 
+
+
+
+ + \ No newline at end of file diff --git a/coveragereport/index.html b/coveragereport/index.html new file mode 100644 index 0000000..0c8d7e7 --- /dev/null +++ b/coveragereport/index.html @@ -0,0 +1,185 @@ + + + + + + + +Summary - Coverage Report + +
+

SummaryStarSponsor

+
+
+
Information
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Parser:Cobertura
Assemblies:1
Classes:6
Files:9
Coverage date:7/24/2024 - 5:44:06 PM
+
+
+
+
+
Line coverage
+
+
74%
+
+ + + + + + + + + + + + + + + + + + + + + +
Covered lines:290
Uncovered lines:100
Coverable lines:390
Total lines:1413
Line coverage:74.3%
+
+
+
+
+
Branch coverage
+
+
70%
+
+ + + + + + + + + + + + + +
Covered branches:59
Total branches:84
Branch coverage:70.2%
+
+
+
+
+
Method coverage
+
+
+

Feature is only available for sponsors

+Upgrade to PRO version +
+
+
+
+

Risk Hotspots

+ + +

No risk hotspots found.

+

Coverage

+ +
+ +++++++++++++ + + + + + + + + + + + + +
Line coverageBranch coverage
NameCoveredUncoveredCoverableTotalPercentageCoveredTotalPercentage
TaskChaining290100390145074.3%
  
598470.2%
  
RLC.TaskChaining.FixedRetryParams1001037100%
 
00
 
RLC.TaskChaining.RetryException30311100%
 
00
 
RLC.TaskChaining.RetryParams1001037100%
 
00
 
RLC.TaskChaining.TaskExtensions19392285103567.7%
  
376259.6%
  
RLC.TaskChaining.TaskExtras61061237100%
 
2222100%
 
RLC.TaskChaining.TaskStatics138219361.9%
  
00
 
+
+
+
+ + \ No newline at end of file diff --git a/coveragereport/main.js b/coveragereport/main.js new file mode 100644 index 0000000..3d569e1 --- /dev/null +++ b/coveragereport/main.js @@ -0,0 +1,293 @@ +/* Chartist.js 0.11.4 + * Copyright © 2019 Gion Kunz + * Free to use under either the WTFPL license or the MIT license. + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL + * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT + */ + +!function (a, b) { "function" == typeof define && define.amd ? define("Chartist", [], function () { return a.Chartist = b() }) : "object" == typeof module && module.exports ? module.exports = b() : a.Chartist = b() }(this, function () { + var a = { version: "0.11.4" }; return function (a, b) { "use strict"; var c = a.window, d = a.document; b.namespaces = { svg: "http://www.w3.org/2000/svg", xmlns: "http://www.w3.org/2000/xmlns/", xhtml: "http://www.w3.org/1999/xhtml", xlink: "http://www.w3.org/1999/xlink", ct: "http://gionkunz.github.com/chartist-js/ct" }, b.noop = function (a) { return a }, b.alphaNumerate = function (a) { return String.fromCharCode(97 + a % 26) }, b.extend = function (a) { var c, d, e; for (a = a || {}, c = 1; c < arguments.length; c++) { d = arguments[c]; for (var f in d) e = d[f], "object" != typeof e || null === e || e instanceof Array ? a[f] = e : a[f] = b.extend(a[f], e) } return a }, b.replaceAll = function (a, b, c) { return a.replace(new RegExp(b, "g"), c) }, b.ensureUnit = function (a, b) { return "number" == typeof a && (a += b), a }, b.quantity = function (a) { if ("string" == typeof a) { var b = /^(\d+)\s*(.*)$/g.exec(a); return { value: +b[1], unit: b[2] || void 0 } } return { value: a } }, b.querySelector = function (a) { return a instanceof Node ? a : d.querySelector(a) }, b.times = function (a) { return Array.apply(null, new Array(a)) }, b.sum = function (a, b) { return a + (b ? b : 0) }, b.mapMultiply = function (a) { return function (b) { return b * a } }, b.mapAdd = function (a) { return function (b) { return b + a } }, b.serialMap = function (a, c) { var d = [], e = Math.max.apply(null, a.map(function (a) { return a.length })); return b.times(e).forEach(function (b, e) { var f = a.map(function (a) { return a[e] }); d[e] = c.apply(null, f) }), d }, b.roundWithPrecision = function (a, c) { var d = Math.pow(10, c || b.precision); return Math.round(a * d) / d }, b.precision = 8, b.escapingMap = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }, b.serialize = function (a) { return null === a || void 0 === a ? a : ("number" == typeof a ? a = "" + a : "object" == typeof a && (a = JSON.stringify({ data: a })), Object.keys(b.escapingMap).reduce(function (a, c) { return b.replaceAll(a, c, b.escapingMap[c]) }, a)) }, b.deserialize = function (a) { if ("string" != typeof a) return a; a = Object.keys(b.escapingMap).reduce(function (a, c) { return b.replaceAll(a, b.escapingMap[c], c) }, a); try { a = JSON.parse(a), a = void 0 !== a.data ? a.data : a } catch (c) { } return a }, b.createSvg = function (a, c, d, e) { var f; return c = c || "100%", d = d || "100%", Array.prototype.slice.call(a.querySelectorAll("svg")).filter(function (a) { return a.getAttributeNS(b.namespaces.xmlns, "ct") }).forEach(function (b) { a.removeChild(b) }), f = new b.Svg("svg").attr({ width: c, height: d }).addClass(e), f._node.style.width = c, f._node.style.height = d, a.appendChild(f._node), f }, b.normalizeData = function (a, c, d) { var e, f = { raw: a, normalized: {} }; return f.normalized.series = b.getDataArray({ series: a.series || [] }, c, d), e = f.normalized.series.every(function (a) { return a instanceof Array }) ? Math.max.apply(null, f.normalized.series.map(function (a) { return a.length })) : f.normalized.series.length, f.normalized.labels = (a.labels || []).slice(), Array.prototype.push.apply(f.normalized.labels, b.times(Math.max(0, e - f.normalized.labels.length)).map(function () { return "" })), c && b.reverseData(f.normalized), f }, b.safeHasProperty = function (a, b) { return null !== a && "object" == typeof a && a.hasOwnProperty(b) }, b.isDataHoleValue = function (a) { return null === a || void 0 === a || "number" == typeof a && isNaN(a) }, b.reverseData = function (a) { a.labels.reverse(), a.series.reverse(); for (var b = 0; b < a.series.length; b++)"object" == typeof a.series[b] && void 0 !== a.series[b].data ? a.series[b].data.reverse() : a.series[b] instanceof Array && a.series[b].reverse() }, b.getDataArray = function (a, c, d) { function e(a) { if (b.safeHasProperty(a, "value")) return e(a.value); if (b.safeHasProperty(a, "data")) return e(a.data); if (a instanceof Array) return a.map(e); if (!b.isDataHoleValue(a)) { if (d) { var c = {}; return "string" == typeof d ? c[d] = b.getNumberOrUndefined(a) : c.y = b.getNumberOrUndefined(a), c.x = a.hasOwnProperty("x") ? b.getNumberOrUndefined(a.x) : c.x, c.y = a.hasOwnProperty("y") ? b.getNumberOrUndefined(a.y) : c.y, c } return b.getNumberOrUndefined(a) } } return a.series.map(e) }, b.normalizePadding = function (a, b) { return b = b || 0, "number" == typeof a ? { top: a, right: a, bottom: a, left: a } : { top: "number" == typeof a.top ? a.top : b, right: "number" == typeof a.right ? a.right : b, bottom: "number" == typeof a.bottom ? a.bottom : b, left: "number" == typeof a.left ? a.left : b } }, b.getMetaData = function (a, b) { var c = a.data ? a.data[b] : a[b]; return c ? c.meta : void 0 }, b.orderOfMagnitude = function (a) { return Math.floor(Math.log(Math.abs(a)) / Math.LN10) }, b.projectLength = function (a, b, c) { return b / c.range * a }, b.getAvailableHeight = function (a, c) { return Math.max((b.quantity(c.height).value || a.height()) - (c.chartPadding.top + c.chartPadding.bottom) - c.axisX.offset, 0) }, b.getHighLow = function (a, c, d) { function e(a) { if (void 0 !== a) if (a instanceof Array) for (var b = 0; b < a.length; b++)e(a[b]); else { var c = d ? +a[d] : +a; g && c > f.high && (f.high = c), h && c < f.low && (f.low = c) } } c = b.extend({}, c, d ? c["axis" + d.toUpperCase()] : {}); var f = { high: void 0 === c.high ? -Number.MAX_VALUE : +c.high, low: void 0 === c.low ? Number.MAX_VALUE : +c.low }, g = void 0 === c.high, h = void 0 === c.low; return (g || h) && e(a), (c.referenceValue || 0 === c.referenceValue) && (f.high = Math.max(c.referenceValue, f.high), f.low = Math.min(c.referenceValue, f.low)), f.high <= f.low && (0 === f.low ? f.high = 1 : f.low < 0 ? f.high = 0 : f.high > 0 ? f.low = 0 : (f.high = 1, f.low = 0)), f }, b.isNumeric = function (a) { return null !== a && isFinite(a) }, b.isFalseyButZero = function (a) { return !a && 0 !== a }, b.getNumberOrUndefined = function (a) { return b.isNumeric(a) ? +a : void 0 }, b.isMultiValue = function (a) { return "object" == typeof a && ("x" in a || "y" in a) }, b.getMultiValue = function (a, c) { return b.isMultiValue(a) ? b.getNumberOrUndefined(a[c || "y"]) : b.getNumberOrUndefined(a) }, b.rho = function (a) { function b(a, c) { return a % c === 0 ? c : b(c, a % c) } function c(a) { return a * a + 1 } if (1 === a) return a; var d, e = 2, f = 2; if (a % 2 === 0) return 2; do e = c(e) % a, f = c(c(f)) % a, d = b(Math.abs(e - f), a); while (1 === d); return d }, b.getBounds = function (a, c, d, e) { function f(a, b) { return a === (a += b) && (a *= 1 + (b > 0 ? o : -o)), a } var g, h, i, j = 0, k = { high: c.high, low: c.low }; k.valueRange = k.high - k.low, k.oom = b.orderOfMagnitude(k.valueRange), k.step = Math.pow(10, k.oom), k.min = Math.floor(k.low / k.step) * k.step, k.max = Math.ceil(k.high / k.step) * k.step, k.range = k.max - k.min, k.numberOfSteps = Math.round(k.range / k.step); var l = b.projectLength(a, k.step, k), m = l < d, n = e ? b.rho(k.range) : 0; if (e && b.projectLength(a, 1, k) >= d) k.step = 1; else if (e && n < k.step && b.projectLength(a, n, k) >= d) k.step = n; else for (; ;) { if (m && b.projectLength(a, k.step, k) <= d) k.step *= 2; else { if (m || !(b.projectLength(a, k.step / 2, k) >= d)) break; if (k.step /= 2, e && k.step % 1 !== 0) { k.step *= 2; break } } if (j++ > 1e3) throw new Error("Exceeded maximum number of iterations while optimizing scale step!") } var o = 2.221e-16; for (k.step = Math.max(k.step, o), h = k.min, i = k.max; h + k.step <= k.low;)h = f(h, k.step); for (; i - k.step >= k.high;)i = f(i, -k.step); k.min = h, k.max = i, k.range = k.max - k.min; var p = []; for (g = k.min; g <= k.max; g = f(g, k.step)) { var q = b.roundWithPrecision(g); q !== p[p.length - 1] && p.push(q) } return k.values = p, k }, b.polarToCartesian = function (a, b, c, d) { var e = (d - 90) * Math.PI / 180; return { x: a + c * Math.cos(e), y: b + c * Math.sin(e) } }, b.createChartRect = function (a, c, d) { var e = !(!c.axisX && !c.axisY), f = e ? c.axisY.offset : 0, g = e ? c.axisX.offset : 0, h = a.width() || b.quantity(c.width).value || 0, i = a.height() || b.quantity(c.height).value || 0, j = b.normalizePadding(c.chartPadding, d); h = Math.max(h, f + j.left + j.right), i = Math.max(i, g + j.top + j.bottom); var k = { padding: j, width: function () { return this.x2 - this.x1 }, height: function () { return this.y1 - this.y2 } }; return e ? ("start" === c.axisX.position ? (k.y2 = j.top + g, k.y1 = Math.max(i - j.bottom, k.y2 + 1)) : (k.y2 = j.top, k.y1 = Math.max(i - j.bottom - g, k.y2 + 1)), "start" === c.axisY.position ? (k.x1 = j.left + f, k.x2 = Math.max(h - j.right, k.x1 + 1)) : (k.x1 = j.left, k.x2 = Math.max(h - j.right - f, k.x1 + 1))) : (k.x1 = j.left, k.x2 = Math.max(h - j.right, k.x1 + 1), k.y2 = j.top, k.y1 = Math.max(i - j.bottom, k.y2 + 1)), k }, b.createGrid = function (a, c, d, e, f, g, h, i) { var j = {}; j[d.units.pos + "1"] = a, j[d.units.pos + "2"] = a, j[d.counterUnits.pos + "1"] = e, j[d.counterUnits.pos + "2"] = e + f; var k = g.elem("line", j, h.join(" ")); i.emit("draw", b.extend({ type: "grid", axis: d, index: c, group: g, element: k }, j)) }, b.createGridBackground = function (a, b, c, d) { var e = a.elem("rect", { x: b.x1, y: b.y2, width: b.width(), height: b.height() }, c, !0); d.emit("draw", { type: "gridBackground", group: a, element: e }) }, b.createLabel = function (a, c, e, f, g, h, i, j, k, l, m) { var n, o = {}; if (o[g.units.pos] = a + i[g.units.pos], o[g.counterUnits.pos] = i[g.counterUnits.pos], o[g.units.len] = c, o[g.counterUnits.len] = Math.max(0, h - 10), l) { var p = d.createElement("span"); p.className = k.join(" "), p.setAttribute("xmlns", b.namespaces.xhtml), p.innerText = f[e], p.style[g.units.len] = Math.round(o[g.units.len]) + "px", p.style[g.counterUnits.len] = Math.round(o[g.counterUnits.len]) + "px", n = j.foreignObject(p, b.extend({ style: "overflow: visible;" }, o)) } else n = j.elem("text", o, k.join(" ")).text(f[e]); m.emit("draw", b.extend({ type: "label", axis: g, index: e, group: j, element: n, text: f[e] }, o)) }, b.getSeriesOption = function (a, b, c) { if (a.name && b.series && b.series[a.name]) { var d = b.series[a.name]; return d.hasOwnProperty(c) ? d[c] : b[c] } return b[c] }, b.optionsProvider = function (a, d, e) { function f(a) { var f = h; if (h = b.extend({}, j), d) for (i = 0; i < d.length; i++) { var g = c.matchMedia(d[i][0]); g.matches && (h = b.extend(h, d[i][1])) } e && a && e.emit("optionsChanged", { previousOptions: f, currentOptions: h }) } function g() { k.forEach(function (a) { a.removeListener(f) }) } var h, i, j = b.extend({}, a), k = []; if (!c.matchMedia) throw "window.matchMedia not found! Make sure you're using a polyfill."; if (d) for (i = 0; i < d.length; i++) { var l = c.matchMedia(d[i][0]); l.addListener(f), k.push(l) } return f(), { removeMediaQueryListeners: g, getCurrentOptions: function () { return b.extend({}, h) } } }, b.splitIntoSegments = function (a, c, d) { var e = { increasingX: !1, fillHoles: !1 }; d = b.extend({}, e, d); for (var f = [], g = !0, h = 0; h < a.length; h += 2)void 0 === b.getMultiValue(c[h / 2].value) ? d.fillHoles || (g = !0) : (d.increasingX && h >= 2 && a[h] <= a[h - 2] && (g = !0), g && (f.push({ pathCoordinates: [], valueData: [] }), g = !1), f[f.length - 1].pathCoordinates.push(a[h], a[h + 1]), f[f.length - 1].valueData.push(c[h / 2])); return f } }(this || global, a), function (a, b) { "use strict"; b.Interpolation = {}, b.Interpolation.none = function (a) { var c = { fillHoles: !1 }; return a = b.extend({}, c, a), function (c, d) { for (var e = new b.Svg.Path, f = !0, g = 0; g < c.length; g += 2) { var h = c[g], i = c[g + 1], j = d[g / 2]; void 0 !== b.getMultiValue(j.value) ? (f ? e.move(h, i, !1, j) : e.line(h, i, !1, j), f = !1) : a.fillHoles || (f = !0) } return e } }, b.Interpolation.simple = function (a) { var c = { divisor: 2, fillHoles: !1 }; a = b.extend({}, c, a); var d = 1 / Math.max(1, a.divisor); return function (c, e) { for (var f, g, h, i = new b.Svg.Path, j = 0; j < c.length; j += 2) { var k = c[j], l = c[j + 1], m = (k - f) * d, n = e[j / 2]; void 0 !== n.value ? (void 0 === h ? i.move(k, l, !1, n) : i.curve(f + m, g, k - m, l, k, l, !1, n), f = k, g = l, h = n) : a.fillHoles || (f = k = h = void 0) } return i } }, b.Interpolation.cardinal = function (a) { var c = { tension: 1, fillHoles: !1 }; a = b.extend({}, c, a); var d = Math.min(1, Math.max(0, a.tension)), e = 1 - d; return function f(c, g) { var h = b.splitIntoSegments(c, g, { fillHoles: a.fillHoles }); if (h.length) { if (h.length > 1) { var i = []; return h.forEach(function (a) { i.push(f(a.pathCoordinates, a.valueData)) }), b.Svg.Path.join(i) } if (c = h[0].pathCoordinates, g = h[0].valueData, c.length <= 4) return b.Interpolation.none()(c, g); for (var j, k = (new b.Svg.Path).move(c[0], c[1], !1, g[0]), l = 0, m = c.length; m - 2 * !j > l; l += 2) { var n = [{ x: +c[l - 2], y: +c[l - 1] }, { x: +c[l], y: +c[l + 1] }, { x: +c[l + 2], y: +c[l + 3] }, { x: +c[l + 4], y: +c[l + 5] }]; j ? l ? m - 4 === l ? n[3] = { x: +c[0], y: +c[1] } : m - 2 === l && (n[2] = { x: +c[0], y: +c[1] }, n[3] = { x: +c[2], y: +c[3] }) : n[0] = { x: +c[m - 2], y: +c[m - 1] } : m - 4 === l ? n[3] = n[2] : l || (n[0] = { x: +c[l], y: +c[l + 1] }), k.curve(d * (-n[0].x + 6 * n[1].x + n[2].x) / 6 + e * n[2].x, d * (-n[0].y + 6 * n[1].y + n[2].y) / 6 + e * n[2].y, d * (n[1].x + 6 * n[2].x - n[3].x) / 6 + e * n[2].x, d * (n[1].y + 6 * n[2].y - n[3].y) / 6 + e * n[2].y, n[2].x, n[2].y, !1, g[(l + 2) / 2]) } return k } return b.Interpolation.none()([]) } }, b.Interpolation.monotoneCubic = function (a) { var c = { fillHoles: !1 }; return a = b.extend({}, c, a), function d(c, e) { var f = b.splitIntoSegments(c, e, { fillHoles: a.fillHoles, increasingX: !0 }); if (f.length) { if (f.length > 1) { var g = []; return f.forEach(function (a) { g.push(d(a.pathCoordinates, a.valueData)) }), b.Svg.Path.join(g) } if (c = f[0].pathCoordinates, e = f[0].valueData, c.length <= 4) return b.Interpolation.none()(c, e); var h, i, j = [], k = [], l = c.length / 2, m = [], n = [], o = [], p = []; for (h = 0; h < l; h++)j[h] = c[2 * h], k[h] = c[2 * h + 1]; for (h = 0; h < l - 1; h++)o[h] = k[h + 1] - k[h], p[h] = j[h + 1] - j[h], n[h] = o[h] / p[h]; for (m[0] = n[0], m[l - 1] = n[l - 2], h = 1; h < l - 1; h++)0 === n[h] || 0 === n[h - 1] || n[h - 1] > 0 != n[h] > 0 ? m[h] = 0 : (m[h] = 3 * (p[h - 1] + p[h]) / ((2 * p[h] + p[h - 1]) / n[h - 1] + (p[h] + 2 * p[h - 1]) / n[h]), isFinite(m[h]) || (m[h] = 0)); for (i = (new b.Svg.Path).move(j[0], k[0], !1, e[0]), h = 0; h < l - 1; h++)i.curve(j[h] + p[h] / 3, k[h] + m[h] * p[h] / 3, j[h + 1] - p[h] / 3, k[h + 1] - m[h + 1] * p[h] / 3, j[h + 1], k[h + 1], !1, e[h + 1]); return i } return b.Interpolation.none()([]) } }, b.Interpolation.step = function (a) { var c = { postpone: !0, fillHoles: !1 }; return a = b.extend({}, c, a), function (c, d) { for (var e, f, g, h = new b.Svg.Path, i = 0; i < c.length; i += 2) { var j = c[i], k = c[i + 1], l = d[i / 2]; void 0 !== l.value ? (void 0 === g ? h.move(j, k, !1, l) : (a.postpone ? h.line(j, f, !1, g) : h.line(e, k, !1, l), h.line(j, k, !1, l)), e = j, f = k, g = l) : a.fillHoles || (e = f = g = void 0) } return h } } }(this || global, a), function (a, b) { "use strict"; b.EventEmitter = function () { function a(a, b) { d[a] = d[a] || [], d[a].push(b) } function b(a, b) { d[a] && (b ? (d[a].splice(d[a].indexOf(b), 1), 0 === d[a].length && delete d[a]) : delete d[a]) } function c(a, b) { d[a] && d[a].forEach(function (a) { a(b) }), d["*"] && d["*"].forEach(function (c) { c(a, b) }) } var d = []; return { addEventHandler: a, removeEventHandler: b, emit: c } } }(this || global, a), function (a, b) { "use strict"; function c(a) { var b = []; if (a.length) for (var c = 0; c < a.length; c++)b.push(a[c]); return b } function d(a, c) { var d = c || this.prototype || b.Class, e = Object.create(d); b.Class.cloneDefinitions(e, a); var f = function () { var a, c = e.constructor || function () { }; return a = this === b ? Object.create(e) : this, c.apply(a, Array.prototype.slice.call(arguments, 0)), a }; return f.prototype = e, f["super"] = d, f.extend = this.extend, f } function e() { var a = c(arguments), b = a[0]; return a.splice(1, a.length - 1).forEach(function (a) { Object.getOwnPropertyNames(a).forEach(function (c) { delete b[c], Object.defineProperty(b, c, Object.getOwnPropertyDescriptor(a, c)) }) }), b } b.Class = { extend: d, cloneDefinitions: e } }(this || global, a), function (a, b) { "use strict"; function c(a, c, d) { return a && (this.data = a || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.eventEmitter.emit("data", { type: "update", data: this.data })), c && (this.options = b.extend({}, d ? this.options : this.defaultOptions, c), this.initializeTimeoutId || (this.optionsProvider.removeMediaQueryListeners(), this.optionsProvider = b.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter))), this.initializeTimeoutId || this.createChart(this.optionsProvider.getCurrentOptions()), this } function d() { return this.initializeTimeoutId ? i.clearTimeout(this.initializeTimeoutId) : (i.removeEventListener("resize", this.resizeListener), this.optionsProvider.removeMediaQueryListeners()), this } function e(a, b) { return this.eventEmitter.addEventHandler(a, b), this } function f(a, b) { return this.eventEmitter.removeEventHandler(a, b), this } function g() { i.addEventListener("resize", this.resizeListener), this.optionsProvider = b.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter), this.eventEmitter.addEventHandler("optionsChanged", function () { this.update() }.bind(this)), this.options.plugins && this.options.plugins.forEach(function (a) { a instanceof Array ? a[0](this, a[1]) : a(this) }.bind(this)), this.eventEmitter.emit("data", { type: "initial", data: this.data }), this.createChart(this.optionsProvider.getCurrentOptions()), this.initializeTimeoutId = void 0 } function h(a, c, d, e, f) { this.container = b.querySelector(a), this.data = c || {}, this.data.labels = this.data.labels || [], this.data.series = this.data.series || [], this.defaultOptions = d, this.options = e, this.responsiveOptions = f, this.eventEmitter = b.EventEmitter(), this.supportsForeignObject = b.Svg.isSupported("Extensibility"), this.supportsAnimations = b.Svg.isSupported("AnimationEventsAttribute"), this.resizeListener = function () { this.update() }.bind(this), this.container && (this.container.__chartist__ && this.container.__chartist__.detach(), this.container.__chartist__ = this), this.initializeTimeoutId = setTimeout(g.bind(this), 0) } var i = a.window; b.Base = b.Class.extend({ constructor: h, optionsProvider: void 0, container: void 0, svg: void 0, eventEmitter: void 0, createChart: function () { throw new Error("Base chart type can't be instantiated!") }, update: c, detach: d, on: e, off: f, version: b.version, supportsForeignObject: !1 }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e, f) { a instanceof Element ? this._node = a : (this._node = y.createElementNS(b.namespaces.svg, a), "svg" === a && this.attr({ "xmlns:ct": b.namespaces.ct })), c && this.attr(c), d && this.addClass(d), e && (f && e._node.firstChild ? e._node.insertBefore(this._node, e._node.firstChild) : e._node.appendChild(this._node)) } function d(a, c) { return "string" == typeof a ? c ? this._node.getAttributeNS(c, a) : this._node.getAttribute(a) : (Object.keys(a).forEach(function (c) { if (void 0 !== a[c]) if (c.indexOf(":") !== -1) { var d = c.split(":"); this._node.setAttributeNS(b.namespaces[d[0]], c, a[c]) } else this._node.setAttribute(c, a[c]) }.bind(this)), this) } function e(a, c, d, e) { return new b.Svg(a, c, d, this, e) } function f() { return this._node.parentNode instanceof SVGElement ? new b.Svg(this._node.parentNode) : null } function g() { for (var a = this._node; "svg" !== a.nodeName;)a = a.parentNode; return new b.Svg(a) } function h(a) { var c = this._node.querySelector(a); return c ? new b.Svg(c) : null } function i(a) { var c = this._node.querySelectorAll(a); return c.length ? new b.Svg.List(c) : null } function j() { return this._node } function k(a, c, d, e) { if ("string" == typeof a) { var f = y.createElement("div"); f.innerHTML = a, a = f.firstChild } a.setAttribute("xmlns", b.namespaces.xmlns); var g = this.elem("foreignObject", c, d, e); return g._node.appendChild(a), g } function l(a) { return this._node.appendChild(y.createTextNode(a)), this } function m() { for (; this._node.firstChild;)this._node.removeChild(this._node.firstChild); return this } function n() { return this._node.parentNode.removeChild(this._node), this.parent() } function o(a) { return this._node.parentNode.replaceChild(a._node, this._node), a } function p(a, b) { return b && this._node.firstChild ? this._node.insertBefore(a._node, this._node.firstChild) : this._node.appendChild(a._node), this } function q() { return this._node.getAttribute("class") ? this._node.getAttribute("class").trim().split(/\s+/) : [] } function r(a) { return this._node.setAttribute("class", this.classes(this._node).concat(a.trim().split(/\s+/)).filter(function (a, b, c) { return c.indexOf(a) === b }).join(" ")), this } function s(a) { var b = a.trim().split(/\s+/); return this._node.setAttribute("class", this.classes(this._node).filter(function (a) { return b.indexOf(a) === -1 }).join(" ")), this } function t() { return this._node.setAttribute("class", ""), this } function u() { return this._node.getBoundingClientRect().height } function v() { return this._node.getBoundingClientRect().width } function w(a, c, d) { return void 0 === c && (c = !0), Object.keys(a).forEach(function (e) { function f(a, c) { var f, g, h, i = {}; a.easing && (h = a.easing instanceof Array ? a.easing : b.Svg.Easing[a.easing], delete a.easing), a.begin = b.ensureUnit(a.begin, "ms"), a.dur = b.ensureUnit(a.dur, "ms"), h && (a.calcMode = "spline", a.keySplines = h.join(" "), a.keyTimes = "0;1"), c && (a.fill = "freeze", i[e] = a.from, this.attr(i), g = b.quantity(a.begin || 0).value, a.begin = "indefinite"), f = this.elem("animate", b.extend({ attributeName: e }, a)), c && setTimeout(function () { try { f._node.beginElement() } catch (b) { i[e] = a.to, this.attr(i), f.remove() } }.bind(this), g), d && f._node.addEventListener("beginEvent", function () { d.emit("animationBegin", { element: this, animate: f._node, params: a }) }.bind(this)), f._node.addEventListener("endEvent", function () { d && d.emit("animationEnd", { element: this, animate: f._node, params: a }), c && (i[e] = a.to, this.attr(i), f.remove()) }.bind(this)) } a[e] instanceof Array ? a[e].forEach(function (a) { f.bind(this)(a, !1) }.bind(this)) : f.bind(this)(a[e], c) }.bind(this)), this } function x(a) { var c = this; this.svgElements = []; for (var d = 0; d < a.length; d++)this.svgElements.push(new b.Svg(a[d])); Object.keys(b.Svg.prototype).filter(function (a) { return ["constructor", "parent", "querySelector", "querySelectorAll", "replace", "append", "classes", "height", "width"].indexOf(a) === -1 }).forEach(function (a) { c[a] = function () { var d = Array.prototype.slice.call(arguments, 0); return c.svgElements.forEach(function (c) { b.Svg.prototype[a].apply(c, d) }), c } }) } var y = a.document; b.Svg = b.Class.extend({ constructor: c, attr: d, elem: e, parent: f, root: g, querySelector: h, querySelectorAll: i, getNode: j, foreignObject: k, text: l, empty: m, remove: n, replace: o, append: p, classes: q, addClass: r, removeClass: s, removeAllClasses: t, height: u, width: v, animate: w }), b.Svg.isSupported = function (a) { return y.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#" + a, "1.1") }; var z = { easeInSine: [.47, 0, .745, .715], easeOutSine: [.39, .575, .565, 1], easeInOutSine: [.445, .05, .55, .95], easeInQuad: [.55, .085, .68, .53], easeOutQuad: [.25, .46, .45, .94], easeInOutQuad: [.455, .03, .515, .955], easeInCubic: [.55, .055, .675, .19], easeOutCubic: [.215, .61, .355, 1], easeInOutCubic: [.645, .045, .355, 1], easeInQuart: [.895, .03, .685, .22], easeOutQuart: [.165, .84, .44, 1], easeInOutQuart: [.77, 0, .175, 1], easeInQuint: [.755, .05, .855, .06], easeOutQuint: [.23, 1, .32, 1], easeInOutQuint: [.86, 0, .07, 1], easeInExpo: [.95, .05, .795, .035], easeOutExpo: [.19, 1, .22, 1], easeInOutExpo: [1, 0, 0, 1], easeInCirc: [.6, .04, .98, .335], easeOutCirc: [.075, .82, .165, 1], easeInOutCirc: [.785, .135, .15, .86], easeInBack: [.6, -.28, .735, .045], easeOutBack: [.175, .885, .32, 1.275], easeInOutBack: [.68, -.55, .265, 1.55] }; b.Svg.Easing = z, b.Svg.List = b.Class.extend({ constructor: x }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e, f, g) { var h = b.extend({ command: f ? a.toLowerCase() : a.toUpperCase() }, c, g ? { data: g } : {}); d.splice(e, 0, h) } function d(a, b) { a.forEach(function (c, d) { t[c.command.toLowerCase()].forEach(function (e, f) { b(c, e, d, f, a) }) }) } function e(a, c) { this.pathElements = [], this.pos = 0, this.close = a, this.options = b.extend({}, u, c) } function f(a) { return void 0 !== a ? (this.pos = Math.max(0, Math.min(this.pathElements.length, a)), this) : this.pos } function g(a) { return this.pathElements.splice(this.pos, a), this } function h(a, b, d, e) { return c("M", { x: +a, y: +b }, this.pathElements, this.pos++, d, e), this } function i(a, b, d, e) { return c("L", { x: +a, y: +b }, this.pathElements, this.pos++, d, e), this } function j(a, b, d, e, f, g, h, i) { return c("C", { x1: +a, y1: +b, x2: +d, y2: +e, x: +f, y: +g }, this.pathElements, this.pos++, h, i), this } function k(a, b, d, e, f, g, h, i, j) { return c("A", { rx: +a, ry: +b, xAr: +d, lAf: +e, sf: +f, x: +g, y: +h }, this.pathElements, this.pos++, i, j), this } function l(a) { var c = a.replace(/([A-Za-z])([0-9])/g, "$1 $2").replace(/([0-9])([A-Za-z])/g, "$1 $2").split(/[\s,]+/).reduce(function (a, b) { return b.match(/[A-Za-z]/) && a.push([]), a[a.length - 1].push(b), a }, []); "Z" === c[c.length - 1][0].toUpperCase() && c.pop(); var d = c.map(function (a) { var c = a.shift(), d = t[c.toLowerCase()]; return b.extend({ command: c }, d.reduce(function (b, c, d) { return b[c] = +a[d], b }, {})) }), e = [this.pos, 0]; return Array.prototype.push.apply(e, d), Array.prototype.splice.apply(this.pathElements, e), this.pos += d.length, this } function m() { var a = Math.pow(10, this.options.accuracy); return this.pathElements.reduce(function (b, c) { var d = t[c.command.toLowerCase()].map(function (b) { return this.options.accuracy ? Math.round(c[b] * a) / a : c[b] }.bind(this)); return b + c.command + d.join(",") }.bind(this), "") + (this.close ? "Z" : "") } function n(a, b) { return d(this.pathElements, function (c, d) { c[d] *= "x" === d[0] ? a : b }), this } function o(a, b) { return d(this.pathElements, function (c, d) { c[d] += "x" === d[0] ? a : b }), this } function p(a) { return d(this.pathElements, function (b, c, d, e, f) { var g = a(b, c, d, e, f); (g || 0 === g) && (b[c] = g) }), this } function q(a) { var c = new b.Svg.Path(a || this.close); return c.pos = this.pos, c.pathElements = this.pathElements.slice().map(function (a) { return b.extend({}, a) }), c.options = b.extend({}, this.options), c } function r(a) { var c = [new b.Svg.Path]; return this.pathElements.forEach(function (d) { d.command === a.toUpperCase() && 0 !== c[c.length - 1].pathElements.length && c.push(new b.Svg.Path), c[c.length - 1].pathElements.push(d) }), c } function s(a, c, d) { for (var e = new b.Svg.Path(c, d), f = 0; f < a.length; f++)for (var g = a[f], h = 0; h < g.pathElements.length; h++)e.pathElements.push(g.pathElements[h]); return e } var t = { m: ["x", "y"], l: ["x", "y"], c: ["x1", "y1", "x2", "y2", "x", "y"], a: ["rx", "ry", "xAr", "lAf", "sf", "x", "y"] }, u = { accuracy: 3 }; b.Svg.Path = b.Class.extend({ constructor: e, position: f, remove: g, move: h, line: i, curve: j, arc: k, scale: n, translate: o, transform: p, parse: l, stringify: m, clone: q, splitByCommand: r }), b.Svg.Path.elementDescriptions = t, b.Svg.Path.join = s }(this || global, a), function (a, b) { "use strict"; function c(a, b, c, d) { this.units = a, this.counterUnits = a === e.x ? e.y : e.x, this.chartRect = b, this.axisLength = b[a.rectEnd] - b[a.rectStart], this.gridOffset = b[a.rectOffset], this.ticks = c, this.options = d } function d(a, c, d, e, f) { var g = e["axis" + this.units.pos.toUpperCase()], h = this.ticks.map(this.projectValue.bind(this)), i = this.ticks.map(g.labelInterpolationFnc); h.forEach(function (j, k) { var l, m = { x: 0, y: 0 }; l = h[k + 1] ? h[k + 1] - j : Math.max(this.axisLength - j, 30), b.isFalseyButZero(i[k]) && "" !== i[k] || ("x" === this.units.pos ? (j = this.chartRect.x1 + j, m.x = e.axisX.labelOffset.x, "start" === e.axisX.position ? m.y = this.chartRect.padding.top + e.axisX.labelOffset.y + (d ? 5 : 20) : m.y = this.chartRect.y1 + e.axisX.labelOffset.y + (d ? 5 : 20)) : (j = this.chartRect.y1 - j, m.y = e.axisY.labelOffset.y - (d ? l : 0), "start" === e.axisY.position ? m.x = d ? this.chartRect.padding.left + e.axisY.labelOffset.x : this.chartRect.x1 - 10 : m.x = this.chartRect.x2 + e.axisY.labelOffset.x + 10), g.showGrid && b.createGrid(j, k, this, this.gridOffset, this.chartRect[this.counterUnits.len](), a, [e.classNames.grid, e.classNames[this.units.dir]], f), g.showLabel && b.createLabel(j, l, k, i, this, g.offset, m, c, [e.classNames.label, e.classNames[this.units.dir], "start" === g.position ? e.classNames[g.position] : e.classNames.end], d, f)) }.bind(this)) } var e = (a.window, a.document, { x: { pos: "x", len: "width", dir: "horizontal", rectStart: "x1", rectEnd: "x2", rectOffset: "y2" }, y: { pos: "y", len: "height", dir: "vertical", rectStart: "y2", rectEnd: "y1", rectOffset: "x1" } }); b.Axis = b.Class.extend({ constructor: c, createGridAndLabels: d, projectValue: function (a, b, c) { throw new Error("Base axis can't be instantiated!") } }), b.Axis.units = e }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e) { var f = e.highLow || b.getHighLow(c, e, a.pos); this.bounds = b.getBounds(d[a.rectEnd] - d[a.rectStart], f, e.scaleMinSpace || 20, e.onlyInteger), this.range = { min: this.bounds.min, max: this.bounds.max }, b.AutoScaleAxis["super"].constructor.call(this, a, d, this.bounds.values, e) } function d(a) { return this.axisLength * (+b.getMultiValue(a, this.units.pos) - this.bounds.min) / this.bounds.range } a.window, a.document; b.AutoScaleAxis = b.Axis.extend({ constructor: c, projectValue: d }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e) { var f = e.highLow || b.getHighLow(c, e, a.pos); this.divisor = e.divisor || 1, this.ticks = e.ticks || b.times(this.divisor).map(function (a, b) { return f.low + (f.high - f.low) / this.divisor * b }.bind(this)), this.ticks.sort(function (a, b) { return a - b }), this.range = { min: f.low, max: f.high }, b.FixedScaleAxis["super"].constructor.call(this, a, d, this.ticks, e), this.stepLength = this.axisLength / this.divisor } function d(a) { return this.axisLength * (+b.getMultiValue(a, this.units.pos) - this.range.min) / (this.range.max - this.range.min) } a.window, a.document; b.FixedScaleAxis = b.Axis.extend({ constructor: c, projectValue: d }) }(this || global, a), function (a, b) { "use strict"; function c(a, c, d, e) { b.StepAxis["super"].constructor.call(this, a, d, e.ticks, e); var f = Math.max(1, e.ticks.length - (e.stretch ? 1 : 0)); this.stepLength = this.axisLength / f } function d(a, b) { return this.stepLength * b } a.window, a.document; b.StepAxis = b.Axis.extend({ constructor: c, projectValue: d }) }(this || global, a), function (a, b) { "use strict"; function c(a) { var c = b.normalizeData(this.data, a.reverseData, !0); this.svg = b.createSvg(this.container, a.width, a.height, a.classNames.chart); var d, f, g = this.svg.elem("g").addClass(a.classNames.gridGroup), h = this.svg.elem("g"), i = this.svg.elem("g").addClass(a.classNames.labelGroup), j = b.createChartRect(this.svg, a, e.padding); d = void 0 === a.axisX.type ? new b.StepAxis(b.Axis.units.x, c.normalized.series, j, b.extend({}, a.axisX, { ticks: c.normalized.labels, stretch: a.fullWidth })) : a.axisX.type.call(b, b.Axis.units.x, c.normalized.series, j, a.axisX), f = void 0 === a.axisY.type ? new b.AutoScaleAxis(b.Axis.units.y, c.normalized.series, j, b.extend({}, a.axisY, { high: b.isNumeric(a.high) ? a.high : a.axisY.high, low: b.isNumeric(a.low) ? a.low : a.axisY.low })) : a.axisY.type.call(b, b.Axis.units.y, c.normalized.series, j, a.axisY), d.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), f.createGridAndLabels(g, i, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && b.createGridBackground(g, j, a.classNames.gridBackground, this.eventEmitter), c.raw.series.forEach(function (e, g) { var i = h.elem("g"); i.attr({ "ct:series-name": e.name, "ct:meta": b.serialize(e.meta) }), i.addClass([a.classNames.series, e.className || a.classNames.series + "-" + b.alphaNumerate(g)].join(" ")); var k = [], l = []; c.normalized.series[g].forEach(function (a, h) { var i = { x: j.x1 + d.projectValue(a, h, c.normalized.series[g]), y: j.y1 - f.projectValue(a, h, c.normalized.series[g]) }; k.push(i.x, i.y), l.push({ value: a, valueIndex: h, meta: b.getMetaData(e, h) }) }.bind(this)); var m = { lineSmooth: b.getSeriesOption(e, a, "lineSmooth"), showPoint: b.getSeriesOption(e, a, "showPoint"), showLine: b.getSeriesOption(e, a, "showLine"), showArea: b.getSeriesOption(e, a, "showArea"), areaBase: b.getSeriesOption(e, a, "areaBase") }, n = "function" == typeof m.lineSmooth ? m.lineSmooth : m.lineSmooth ? b.Interpolation.monotoneCubic() : b.Interpolation.none(), o = n(k, l); if (m.showPoint && o.pathElements.forEach(function (c) { var h = i.elem("line", { x1: c.x, y1: c.y, x2: c.x + .01, y2: c.y }, a.classNames.point).attr({ "ct:value": [c.data.value.x, c.data.value.y].filter(b.isNumeric).join(","), "ct:meta": b.serialize(c.data.meta) }); this.eventEmitter.emit("draw", { type: "point", value: c.data.value, index: c.data.valueIndex, meta: c.data.meta, series: e, seriesIndex: g, axisX: d, axisY: f, group: i, element: h, x: c.x, y: c.y }) }.bind(this)), m.showLine) { var p = i.elem("path", { d: o.stringify() }, a.classNames.line, !0); this.eventEmitter.emit("draw", { type: "line", values: c.normalized.series[g], path: o.clone(), chartRect: j, index: g, series: e, seriesIndex: g, seriesMeta: e.meta, axisX: d, axisY: f, group: i, element: p }) } if (m.showArea && f.range) { var q = Math.max(Math.min(m.areaBase, f.range.max), f.range.min), r = j.y1 - f.projectValue(q); o.splitByCommand("M").filter(function (a) { return a.pathElements.length > 1 }).map(function (a) { var b = a.pathElements[0], c = a.pathElements[a.pathElements.length - 1]; return a.clone(!0).position(0).remove(1).move(b.x, r).line(b.x, b.y).position(a.pathElements.length + 1).line(c.x, r) }).forEach(function (b) { var h = i.elem("path", { d: b.stringify() }, a.classNames.area, !0); this.eventEmitter.emit("draw", { type: "area", values: c.normalized.series[g], path: b.clone(), series: e, seriesIndex: g, axisX: d, axisY: f, chartRect: j, index: g, group: i, element: h }) }.bind(this)) } }.bind(this)), this.eventEmitter.emit("created", { bounds: f.bounds, chartRect: j, axisX: d, axisY: f, svg: this.svg, options: a }) } function d(a, c, d, f) { b.Line["super"].constructor.call(this, a, c, e, b.extend({}, e, d), f) } var e = (a.window, a.document, { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, type: void 0 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, type: void 0, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, showLine: !0, showPoint: !0, showArea: !1, areaBase: 0, lineSmooth: !0, showGridBackground: !1, low: void 0, high: void 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, fullWidth: !1, reverseData: !1, classNames: { chart: "ct-chart-line", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", line: "ct-line", point: "ct-point", area: "ct-area", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }); b.Line = b.Base.extend({ constructor: d, createChart: c }) }(this || global, a), function (a, b) { + "use strict"; function c(a) { + var c, d; a.distributeSeries ? (c = b.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), c.normalized.series = c.normalized.series.map(function (a) { return [a] })) : c = b.normalizeData(this.data, a.reverseData, a.horizontalBars ? "x" : "y"), this.svg = b.createSvg(this.container, a.width, a.height, a.classNames.chart + (a.horizontalBars ? " " + a.classNames.horizontalBars : "")); var f = this.svg.elem("g").addClass(a.classNames.gridGroup), g = this.svg.elem("g"), h = this.svg.elem("g").addClass(a.classNames.labelGroup); + if (a.stackBars && 0 !== c.normalized.series.length) { var i = b.serialMap(c.normalized.series, function () { return Array.prototype.slice.call(arguments).map(function (a) { return a }).reduce(function (a, b) { return { x: a.x + (b && b.x) || 0, y: a.y + (b && b.y) || 0 } }, { x: 0, y: 0 }) }); d = b.getHighLow([i], a, a.horizontalBars ? "x" : "y") } else d = b.getHighLow(c.normalized.series, a, a.horizontalBars ? "x" : "y"); d.high = +a.high || (0 === a.high ? 0 : d.high), d.low = +a.low || (0 === a.low ? 0 : d.low); var j, k, l, m, n, o = b.createChartRect(this.svg, a, e.padding); k = a.distributeSeries && a.stackBars ? c.normalized.labels.slice(0, 1) : c.normalized.labels, a.horizontalBars ? (j = m = void 0 === a.axisX.type ? new b.AutoScaleAxis(b.Axis.units.x, c.normalized.series, o, b.extend({}, a.axisX, { highLow: d, referenceValue: 0 })) : a.axisX.type.call(b, b.Axis.units.x, c.normalized.series, o, b.extend({}, a.axisX, { highLow: d, referenceValue: 0 })), l = n = void 0 === a.axisY.type ? new b.StepAxis(b.Axis.units.y, c.normalized.series, o, { ticks: k }) : a.axisY.type.call(b, b.Axis.units.y, c.normalized.series, o, a.axisY)) : (l = m = void 0 === a.axisX.type ? new b.StepAxis(b.Axis.units.x, c.normalized.series, o, { ticks: k }) : a.axisX.type.call(b, b.Axis.units.x, c.normalized.series, o, a.axisX), j = n = void 0 === a.axisY.type ? new b.AutoScaleAxis(b.Axis.units.y, c.normalized.series, o, b.extend({}, a.axisY, { highLow: d, referenceValue: 0 })) : a.axisY.type.call(b, b.Axis.units.y, c.normalized.series, o, b.extend({}, a.axisY, { highLow: d, referenceValue: 0 }))); var p = a.horizontalBars ? o.x1 + j.projectValue(0) : o.y1 - j.projectValue(0), q = []; l.createGridAndLabels(f, h, this.supportsForeignObject, a, this.eventEmitter), j.createGridAndLabels(f, h, this.supportsForeignObject, a, this.eventEmitter), a.showGridBackground && b.createGridBackground(f, o, a.classNames.gridBackground, this.eventEmitter), c.raw.series.forEach(function (d, e) { var f, h, i = e - (c.raw.series.length - 1) / 2; f = a.distributeSeries && !a.stackBars ? l.axisLength / c.normalized.series.length / 2 : a.distributeSeries && a.stackBars ? l.axisLength / 2 : l.axisLength / c.normalized.series[e].length / 2, h = g.elem("g"), h.attr({ "ct:series-name": d.name, "ct:meta": b.serialize(d.meta) }), h.addClass([a.classNames.series, d.className || a.classNames.series + "-" + b.alphaNumerate(e)].join(" ")), c.normalized.series[e].forEach(function (g, k) { var r, s, t, u; if (u = a.distributeSeries && !a.stackBars ? e : a.distributeSeries && a.stackBars ? 0 : k, r = a.horizontalBars ? { x: o.x1 + j.projectValue(g && g.x ? g.x : 0, k, c.normalized.series[e]), y: o.y1 - l.projectValue(g && g.y ? g.y : 0, u, c.normalized.series[e]) } : { x: o.x1 + l.projectValue(g && g.x ? g.x : 0, u, c.normalized.series[e]), y: o.y1 - j.projectValue(g && g.y ? g.y : 0, k, c.normalized.series[e]) }, l instanceof b.StepAxis && (l.options.stretch || (r[l.units.pos] += f * (a.horizontalBars ? -1 : 1)), r[l.units.pos] += a.stackBars || a.distributeSeries ? 0 : i * a.seriesBarDistance * (a.horizontalBars ? -1 : 1)), t = q[k] || p, q[k] = t - (p - r[l.counterUnits.pos]), void 0 !== g) { var v = {}; v[l.units.pos + "1"] = r[l.units.pos], v[l.units.pos + "2"] = r[l.units.pos], !a.stackBars || "accumulate" !== a.stackMode && a.stackMode ? (v[l.counterUnits.pos + "1"] = p, v[l.counterUnits.pos + "2"] = r[l.counterUnits.pos]) : (v[l.counterUnits.pos + "1"] = t, v[l.counterUnits.pos + "2"] = q[k]), v.x1 = Math.min(Math.max(v.x1, o.x1), o.x2), v.x2 = Math.min(Math.max(v.x2, o.x1), o.x2), v.y1 = Math.min(Math.max(v.y1, o.y2), o.y1), v.y2 = Math.min(Math.max(v.y2, o.y2), o.y1); var w = b.getMetaData(d, k); s = h.elem("line", v, a.classNames.bar).attr({ "ct:value": [g.x, g.y].filter(b.isNumeric).join(","), "ct:meta": b.serialize(w) }), this.eventEmitter.emit("draw", b.extend({ type: "bar", value: g, index: k, meta: w, series: d, seriesIndex: e, axisX: m, axisY: n, chartRect: o, group: h, element: s }, v)) } }.bind(this)) }.bind(this)), this.eventEmitter.emit("created", { bounds: j.bounds, chartRect: o, axisX: m, axisY: n, svg: this.svg, options: a }) + } function d(a, c, d, f) { b.Bar["super"].constructor.call(this, a, c, e, b.extend({}, e, d), f) } var e = (a.window, a.document, { axisX: { offset: 30, position: "end", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, scaleMinSpace: 30, onlyInteger: !1 }, axisY: { offset: 40, position: "start", labelOffset: { x: 0, y: 0 }, showLabel: !0, showGrid: !0, labelInterpolationFnc: b.noop, scaleMinSpace: 20, onlyInteger: !1 }, width: void 0, height: void 0, high: void 0, low: void 0, referenceValue: 0, chartPadding: { top: 15, right: 15, bottom: 5, left: 10 }, seriesBarDistance: 15, stackBars: !1, stackMode: "accumulate", horizontalBars: !1, distributeSeries: !1, reverseData: !1, showGridBackground: !1, classNames: { chart: "ct-chart-bar", horizontalBars: "ct-horizontal-bars", label: "ct-label", labelGroup: "ct-labels", series: "ct-series", bar: "ct-bar", grid: "ct-grid", gridGroup: "ct-grids", gridBackground: "ct-grid-background", vertical: "ct-vertical", horizontal: "ct-horizontal", start: "ct-start", end: "ct-end" } }); b.Bar = b.Base.extend({ constructor: d, createChart: c }) + }(this || global, a), function (a, b) { "use strict"; function c(a, b, c) { var d = b.x > a.x; return d && "explode" === c || !d && "implode" === c ? "start" : d && "implode" === c || !d && "explode" === c ? "end" : "middle" } function d(a) { var d, e, g, h, i, j = b.normalizeData(this.data), k = [], l = a.startAngle; this.svg = b.createSvg(this.container, a.width, a.height, a.donut ? a.classNames.chartDonut : a.classNames.chartPie), e = b.createChartRect(this.svg, a, f.padding), g = Math.min(e.width() / 2, e.height() / 2), i = a.total || j.normalized.series.reduce(function (a, b) { return a + b }, 0); var m = b.quantity(a.donutWidth); "%" === m.unit && (m.value *= g / 100), g -= a.donut && !a.donutSolid ? m.value / 2 : 0, h = "outside" === a.labelPosition || a.donut && !a.donutSolid ? g : "center" === a.labelPosition ? 0 : a.donutSolid ? g - m.value / 2 : g / 2, h += a.labelOffset; var n = { x: e.x1 + e.width() / 2, y: e.y2 + e.height() / 2 }, o = 1 === j.raw.series.filter(function (a) { return a.hasOwnProperty("value") ? 0 !== a.value : 0 !== a }).length; j.raw.series.forEach(function (a, b) { k[b] = this.svg.elem("g", null, null) }.bind(this)), a.showLabel && (d = this.svg.elem("g", null, null)), j.raw.series.forEach(function (e, f) { if (0 !== j.normalized.series[f] || !a.ignoreEmptyValues) { k[f].attr({ "ct:series-name": e.name }), k[f].addClass([a.classNames.series, e.className || a.classNames.series + "-" + b.alphaNumerate(f)].join(" ")); var p = i > 0 ? l + j.normalized.series[f] / i * 360 : 0, q = Math.max(0, l - (0 === f || o ? 0 : .2)); p - q >= 359.99 && (p = q + 359.99); var r, s, t, u = b.polarToCartesian(n.x, n.y, g, q), v = b.polarToCartesian(n.x, n.y, g, p), w = new b.Svg.Path(!a.donut || a.donutSolid).move(v.x, v.y).arc(g, g, 0, p - l > 180, 0, u.x, u.y); a.donut ? a.donutSolid && (t = g - m.value, r = b.polarToCartesian(n.x, n.y, t, l - (0 === f || o ? 0 : .2)), s = b.polarToCartesian(n.x, n.y, t, p), w.line(r.x, r.y), w.arc(t, t, 0, p - l > 180, 1, s.x, s.y)) : w.line(n.x, n.y); var x = a.classNames.slicePie; a.donut && (x = a.classNames.sliceDonut, a.donutSolid && (x = a.classNames.sliceDonutSolid)); var y = k[f].elem("path", { d: w.stringify() }, x); if (y.attr({ "ct:value": j.normalized.series[f], "ct:meta": b.serialize(e.meta) }), a.donut && !a.donutSolid && (y._node.style.strokeWidth = m.value + "px"), this.eventEmitter.emit("draw", { type: "slice", value: j.normalized.series[f], totalDataSum: i, index: f, meta: e.meta, series: e, group: k[f], element: y, path: w.clone(), center: n, radius: g, startAngle: l, endAngle: p }), a.showLabel) { var z; z = 1 === j.raw.series.length ? { x: n.x, y: n.y } : b.polarToCartesian(n.x, n.y, h, l + (p - l) / 2); var A; A = j.normalized.labels && !b.isFalseyButZero(j.normalized.labels[f]) ? j.normalized.labels[f] : j.normalized.series[f]; var B = a.labelInterpolationFnc(A, f); if (B || 0 === B) { var C = d.elem("text", { dx: z.x, dy: z.y, "text-anchor": c(n, z, a.labelDirection) }, a.classNames.label).text("" + B); this.eventEmitter.emit("draw", { type: "label", index: f, group: d, element: C, text: "" + B, x: z.x, y: z.y }) } } l = p } }.bind(this)), this.eventEmitter.emit("created", { chartRect: e, svg: this.svg, options: a }) } function e(a, c, d, e) { b.Pie["super"].constructor.call(this, a, c, f, b.extend({}, f, d), e) } var f = (a.window, a.document, { width: void 0, height: void 0, chartPadding: 5, classNames: { chartPie: "ct-chart-pie", chartDonut: "ct-chart-donut", series: "ct-series", slicePie: "ct-slice-pie", sliceDonut: "ct-slice-donut", sliceDonutSolid: "ct-slice-donut-solid", label: "ct-label" }, startAngle: 0, total: void 0, donut: !1, donutSolid: !1, donutWidth: 60, showLabel: !0, labelOffset: 0, labelPosition: "inside", labelInterpolationFnc: b.noop, labelDirection: "neutral", reverseData: !1, ignoreEmptyValues: !1 }); b.Pie = b.Base.extend({ constructor: e, createChart: d, determineAnchorPosition: c }) }(this || global, a), a +}); +//# sourceMappingURL=chartist.min.js.map + +var i, l, selectedLine = null; + +/* Navigate to hash without browser history entry */ +var navigateToHash = function () { + if (window.history !== undefined && window.history.replaceState !== undefined) { + window.history.replaceState(undefined, undefined, this.getAttribute("href")); + } +}; + +var hashLinks = document.getElementsByClassName('navigatetohash'); +for (i = 0, l = hashLinks.length; i < l; i++) { + hashLinks[i].addEventListener('click', navigateToHash); +} + +/* Switch test method */ +var switchTestMethod = function () { + var method = this.getAttribute("value"); + console.log("Selected test method: " + method); + + var lines, i, l, coverageData, lineAnalysis, cells; + + lines = document.querySelectorAll('.lineAnalysis tr'); + + for (i = 1, l = lines.length; i < l; i++) { + coverageData = JSON.parse(lines[i].getAttribute('data-coverage').replace(/'/g, '"')); + lineAnalysis = coverageData[method]; + cells = lines[i].querySelectorAll('td'); + if (lineAnalysis === undefined) { + lineAnalysis = coverageData.AllTestMethods; + if (lineAnalysis.LVS !== 'gray') { + cells[0].setAttribute('class', 'red'); + cells[1].innerText = cells[1].textContent = '0'; + cells[4].setAttribute('class', 'lightred'); + } + } else { + cells[0].setAttribute('class', lineAnalysis.LVS); + cells[1].innerText = cells[1].textContent = lineAnalysis.VC; + cells[4].setAttribute('class', 'light' + lineAnalysis.LVS); + } + } +}; + +var testMethods = document.getElementsByClassName('switchtestmethod'); +for (i = 0, l = testMethods.length; i < l; i++) { + testMethods[i].addEventListener('change', switchTestMethod); +} + +/* Highlight test method by line */ +var toggleLine = function () { + if (selectedLine === this) { + selectedLine = null; + } else { + selectedLine = null; + unhighlightTestMethods(); + highlightTestMethods.call(this); + selectedLine = this; + } + +}; +var highlightTestMethods = function () { + if (selectedLine !== null) { + return; + } + + var lineAnalysis; + var coverageData = JSON.parse(this.getAttribute('data-coverage').replace(/'/g, '"')); + var testMethods = document.getElementsByClassName('testmethod'); + + for (i = 0, l = testMethods.length; i < l; i++) { + lineAnalysis = coverageData[testMethods[i].id]; + if (lineAnalysis === undefined) { + testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); + } else { + testMethods[i].className += ' light' + lineAnalysis.LVS; + } + } +}; +var unhighlightTestMethods = function () { + if (selectedLine !== null) { + return; + } + + var testMethods = document.getElementsByClassName('testmethod'); + for (i = 0, l = testMethods.length; i < l; i++) { + testMethods[i].className = testMethods[i].className.replace(/\s*light.+/g, ""); + } +}; +var coverableLines = document.getElementsByClassName('coverableline'); +for (i = 0, l = coverableLines.length; i < l; i++) { + coverableLines[i].addEventListener('click', toggleLine); + coverableLines[i].addEventListener('mouseenter', highlightTestMethods); + coverableLines[i].addEventListener('mouseleave', unhighlightTestMethods); +} + +/* History charts */ +var renderChart = function (chart) { + // Remove current children (e.g. PNG placeholder) + while (chart.firstChild) { + chart.firstChild.remove(); + } + + var chartData = window[chart.getAttribute('data-data')]; + var options = { + axisY: { + type: undefined, + onlyInteger: true + }, + lineSmooth: false, + low: 0, + high: 100, + scaleMinSpace: 20, + onlyInteger: true, + fullWidth: true + }; + var lineChart = new Chartist.Line(chart, { + labels: [], + series: chartData.series + }, options); + + /* Zoom */ + var zoomButtonDiv = document.createElement("div"); + zoomButtonDiv.className = "toggleZoom"; + var zoomButtonLink = document.createElement("a"); + zoomButtonLink.setAttribute("href", ""); + var zoomButtonText = document.createElement("i"); + zoomButtonText.className = "icon-search-plus"; + + zoomButtonLink.appendChild(zoomButtonText); + zoomButtonDiv.appendChild(zoomButtonLink); + + chart.appendChild(zoomButtonDiv); + + zoomButtonDiv.addEventListener('click', function (event) { + event.preventDefault(); + + if (options.axisY.type === undefined) { + options.axisY.type = Chartist.AutoScaleAxis; + zoomButtonText.className = "icon-search-minus"; + } else { + options.axisY.type = undefined; + zoomButtonText.className = "icon-search-plus"; + } + + lineChart.update(null, options); + }); + + var tooltip = document.createElement("div"); + tooltip.className = "tooltip"; + + chart.appendChild(tooltip); + + /* Tooltips */ + var showToolTip = function () { + var index = this.getAttribute('ct:meta'); + + tooltip.innerHTML = chartData.tooltips[index]; + tooltip.style.display = 'block'; + }; + + var moveToolTip = function (event) { + var box = chart.getBoundingClientRect(); + var left = event.pageX - box.left - window.pageXOffset; + var top = event.pageY - box.top - window.pageYOffset; + + left = left + 20; + top = top - tooltip.offsetHeight / 2; + + if (left + tooltip.offsetWidth > box.width) { + left -= tooltip.offsetWidth + 40; + } + + if (top < 0) { + top = 0; + } + + if (top + tooltip.offsetHeight > box.height) { + top = box.height - tooltip.offsetHeight; + } + + tooltip.style.left = left + 'px'; + tooltip.style.top = top + 'px'; + }; + + var hideToolTip = function () { + tooltip.style.display = 'none'; + }; + chart.addEventListener('mousemove', moveToolTip); + + lineChart.on('created', function () { + var chartPoints = chart.getElementsByClassName('ct-point'); + for (i = 0, l = chartPoints.length; i < l; i++) { + chartPoints[i].addEventListener('mousemove', showToolTip); + chartPoints[i].addEventListener('mouseout', hideToolTip); + } + }); +}; + +var charts = document.getElementsByClassName('historychart'); +for (i = 0, l = charts.length; i < l; i++) { + renderChart(charts[i]); +} + +var assemblies = [ + { + "name": "TaskChaining", + "classes": [ + { "name": "RLC.TaskChaining.FixedRetryParams", "rp": "TaskChaining_FixedRetryParams.html", "cl": 10, "ucl": 0, "cal": 10, "tl": 37, "cb": 0, "tb": 0, "cm": 0, "tm": 0, "lch": [], "bch": [], "mch": [], "hc": [], "metrics": { } }, + { "name": "RLC.TaskChaining.RetryException", "rp": "TaskChaining_RetryException.html", "cl": 3, "ucl": 0, "cal": 3, "tl": 11, "cb": 0, "tb": 0, "cm": 0, "tm": 0, "lch": [], "bch": [], "mch": [], "hc": [], "metrics": { } }, + { "name": "RLC.TaskChaining.RetryParams", "rp": "TaskChaining_RetryParams.html", "cl": 10, "ucl": 0, "cal": 10, "tl": 37, "cb": 0, "tb": 0, "cm": 0, "tm": 0, "lch": [], "bch": [], "mch": [], "hc": [], "metrics": { } }, + { "name": "RLC.TaskChaining.TaskExtensions", "rp": "TaskChaining_TaskExtensions.html", "cl": 193, "ucl": 92, "cal": 285, "tl": 1035, "cb": 37, "tb": 62, "cm": 0, "tm": 0, "lch": [], "bch": [], "mch": [], "hc": [], "metrics": { } }, + { "name": "RLC.TaskChaining.TaskExtras", "rp": "TaskChaining_TaskExtras.html", "cl": 61, "ucl": 0, "cal": 61, "tl": 237, "cb": 22, "tb": 22, "cm": 0, "tm": 0, "lch": [], "bch": [], "mch": [], "hc": [], "metrics": { } }, + { "name": "RLC.TaskChaining.TaskStatics", "rp": "TaskChaining_TaskStatics.html", "cl": 13, "ucl": 8, "cal": 21, "tl": 93, "cb": 0, "tb": 0, "cm": 0, "tm": 0, "lch": [], "bch": [], "mch": [], "hc": [], "metrics": { } }, + ]}, +]; + +var metrics = [{ "name": "Crap Score", "abbreviation": "crp", "explanationUrl": "https://googletesting.blogspot.de/2011/02/this-code-is-crap.html" }, { "name": "Cyclomatic complexity", "abbreviation": "cc", "explanationUrl": "https://en.wikipedia.org/wiki/Cyclomatic_complexity" }, { "name": "Line coverage", "abbreviation": "cov", "explanationUrl": "https://en.wikipedia.org/wiki/Code_coverage" }, { "name": "Branch coverage", "abbreviation": "bcov", "explanationUrl": "https://en.wikipedia.org/wiki/Code_coverage" }]; + +var historicCoverageExecutionTimes = []; + +var riskHotspotMetrics = [ +]; + +var riskHotspots = [ +]; + +var branchCoverageAvailable = true; +var methodCoverageAvailable = false; +var maximumDecimalPlacesForCoverageQuotas = 1; + + +var translations = { +'top': 'Top:', +'all': 'All', +'assembly': 'Assembly', +'class': 'Class', +'method': 'Method', +'lineCoverage': 'Line coverage', +'noGrouping': 'No grouping', +'byAssembly': 'By assembly', +'byNamespace': 'By namespace, Level:', +'all': 'All', +'collapseAll': 'Collapse all', +'expandAll': 'Expand all', +'grouping': 'Grouping:', +'filter': 'Filter:', +'name': 'Name', +'covered': 'Covered', +'uncovered': 'Uncovered', +'coverable': 'Coverable', +'total': 'Total', +'coverage': 'Line coverage', +'branchCoverage': 'Branch coverage', +'methodCoverage': 'Method coverage', +'percentage': 'Percentage', +'history': 'Coverage history', +'compareHistory': 'Compare with:', +'date': 'Date', +'allChanges': 'All changes', +'selectCoverageTypes': 'Select coverage types', +'selectCoverageTypesAndMetrics': 'Select coverage types & metrics', +'coverageTypes': 'Coverage types', +'metrics': 'Metrics', +'methodCoverageProVersion': 'Feature is only available for sponsors', +'lineCoverageIncreaseOnly': 'Line coverage: Increase only', +'lineCoverageDecreaseOnly': 'Line coverage: Decrease only', +'branchCoverageIncreaseOnly': 'Branch coverage: Increase only', +'branchCoverageDecreaseOnly': 'Branch coverage: Decrease only', +'methodCoverageIncreaseOnly': 'Method coverage: Increase only', +'methodCoverageDecreaseOnly': 'Method coverage: Decrease only' +}; + + +(()=>{"use strict";var e,_={},p={};function n(e){var a=p[e];if(void 0!==a)return a.exports;var r=p[e]={exports:{}};return _[e](r,r.exports,n),r.exports}n.m=_,e=[],n.O=(a,r,u,l)=>{if(!r){var o=1/0;for(f=0;f=l)&&Object.keys(n.O).every(h=>n.O[h](r[t]))?r.splice(t--,1):(v=!1,l0&&e[f-1][2]>l;f--)e[f]=e[f-1];e[f]=[r,u,l]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a}),a},n.d=(e,a)=>{for(var r in a)n.o(a,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),(()=>{var e={121:0};n.O.j=u=>0===e[u];var a=(u,l)=>{var t,c,[f,o,v]=l,s=0;if(f.some(d=>0!==e[d])){for(t in o)n.o(o,t)&&(n.m[t]=o[t]);if(v)var b=v(n)}for(u&&u(l);s{ye(935)},935:()=>{const ee=globalThis;function J(t){return(ee.__Zone_symbol_prefix||"__zone_symbol__")+t}const de=Object.getOwnPropertyDescriptor,Ie=Object.defineProperty,Le=Object.getPrototypeOf,ht=Object.create,dt=Array.prototype.slice,Me="addEventListener",Ze="removeEventListener",Ae=J(Me),je=J(Ze),ce="true",ae="false",ke=J("");function He(t,r){return Zone.current.wrap(t,r)}function xe(t,r,c,n,i){return Zone.current.scheduleMacroTask(t,r,c,n,i)}const H=J,we=typeof window<"u",_e=we?window:void 0,K=we&&_e||globalThis,_t="removeAttribute";function Ge(t,r){for(let c=t.length-1;c>=0;c--)"function"==typeof t[c]&&(t[c]=He(t[c],r+"_"+c));return t}function ze(t){return!t||!1!==t.writable&&!("function"==typeof t.get&&typeof t.set>"u")}const qe=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,Re=!("nw"in K)&&typeof K.process<"u"&&"[object process]"===K.process.toString(),Ve=!Re&&!qe&&!(!we||!_e.HTMLElement),Xe=typeof K.process<"u"&&"[object process]"===K.process.toString()&&!qe&&!(!we||!_e.HTMLElement),Ce={},Ye=function(t){if(!(t=t||K.event))return;let r=Ce[t.type];r||(r=Ce[t.type]=H("ON_PROPERTY"+t.type));const c=this||t.target||K,n=c[r];let i;return Ve&&c===_e&&"error"===t.type?(i=n&&n.call(this,t.message,t.filename,t.lineno,t.colno,t.error),!0===i&&t.preventDefault()):(i=n&&n.apply(this,arguments),null!=i&&!i&&t.preventDefault()),i};function $e(t,r,c){let n=de(t,r);if(!n&&c&&de(c,r)&&(n={enumerable:!0,configurable:!0}),!n||!n.configurable)return;const i=H("on"+r+"patched");if(t.hasOwnProperty(i)&&t[i])return;delete n.writable,delete n.value;const u=n.get,_=n.set,E=r.slice(2);let y=Ce[E];y||(y=Ce[E]=H("ON_PROPERTY"+E)),n.set=function(C){let T=this;!T&&t===K&&(T=K),T&&("function"==typeof T[y]&&T.removeEventListener(E,Ye),_&&_.call(T,null),T[y]=C,"function"==typeof C&&T.addEventListener(E,Ye,!1))},n.get=function(){let C=this;if(!C&&t===K&&(C=K),!C)return null;const T=C[y];if(T)return T;if(u){let Z=u.call(this);if(Z)return n.set.call(this,Z),"function"==typeof C[_t]&&C.removeAttribute(r),Z}return null},Ie(t,r,n),t[i]=!0}function Ke(t,r,c){if(r)for(let n=0;nfunction(_,E){const y=c(_,E);return y.cbIdx>=0&&"function"==typeof E[y.cbIdx]?xe(y.name,E[y.cbIdx],y,i):u.apply(_,E)})}function ue(t,r){t[H("OriginalDelegate")]=r}let Je=!1,Be=!1;function pt(){if(Je)return Be;Je=!0;try{const t=_e.navigator.userAgent;(-1!==t.indexOf("MSIE ")||-1!==t.indexOf("Trident/")||-1!==t.indexOf("Edge/"))&&(Be=!0)}catch{}return Be}let Ee=!1;if(typeof window<"u")try{const t=Object.defineProperty({},"passive",{get:function(){Ee=!0}});window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch{Ee=!1}const yt={useG:!0},te={},Qe={},et=new RegExp("^"+ke+"(\\w+)(true|false)$"),tt=H("propagationStopped");function nt(t,r){const c=(r?r(t):t)+ae,n=(r?r(t):t)+ce,i=ke+c,u=ke+n;te[t]={},te[t][ae]=i,te[t][ce]=u}function mt(t,r,c,n){const i=n&&n.add||Me,u=n&&n.rm||Ze,_=n&&n.listeners||"eventListeners",E=n&&n.rmAll||"removeAllListeners",y=H(i),C="."+i+":",T="prependListener",Z="."+T+":",P=function(b,h,B){if(b.isRemoved)return;const z=b.callback;let Y;"object"==typeof z&&z.handleEvent&&(b.callback=g=>z.handleEvent(g),b.originalDelegate=z);try{b.invoke(b,h,[B])}catch(g){Y=g}const F=b.options;return F&&"object"==typeof F&&F.once&&h[u].call(h,B.type,b.originalDelegate?b.originalDelegate:b.callback,F),Y};function j(b,h,B){if(!(h=h||t.event))return;const z=b||h.target||t,Y=z[te[h.type][B?ce:ae]];if(Y){const F=[];if(1===Y.length){const g=P(Y[0],z,h);g&&F.push(g)}else{const g=Y.slice();for(let U=0;U{throw U})}}}const W=function(b){return j(this,b,!1)},x=function(b){return j(this,b,!0)};function re(b,h){if(!b)return!1;let B=!0;h&&void 0!==h.useG&&(B=h.useG);const z=h&&h.vh;let Y=!0;h&&void 0!==h.chkDup&&(Y=h.chkDup);let F=!1;h&&void 0!==h.rt&&(F=h.rt);let g=b;for(;g&&!g.hasOwnProperty(i);)g=Le(g);if(!g&&b[i]&&(g=b),!g||g[y])return!1;const U=h&&h.eventNameToString,O={},w=g[y]=g[i],v=g[H(u)]=g[u],D=g[H(_)]=g[_],Q=g[H(E)]=g[E];let q;h&&h.prepend&&(q=g[H(h.prepend)]=g[h.prepend]);const $=B?function(s){if(!O.isExisting)return w.call(O.target,O.eventName,O.capture?x:W,O.options)}:function(s){return w.call(O.target,O.eventName,s.invoke,O.options)},A=B?function(s){if(!s.isRemoved){const l=te[s.eventName];let k;l&&(k=l[s.capture?ce:ae]);const R=k&&s.target[k];if(R)for(let p=0;poe.zone.cancelTask(oe);s.call(ge,"abort",ie,{once:!0}),oe.removeAbortListener=()=>ge.removeEventListener("abort",ie)}return O.target=null,Pe&&(Pe.taskData=null),ct&&(O.options.once=!0),!Ee&&"boolean"==typeof oe.options||(oe.options=se),oe.target=L,oe.capture=Ue,oe.eventName=M,V&&(oe.originalDelegate=G),I?pe.unshift(oe):pe.push(oe),p?L:void 0}};return g[i]=a(w,C,$,A,F),q&&(g[T]=a(q,Z,function(s){return q.call(O.target,O.eventName,s.invoke,O.options)},A,F,!0)),g[u]=function(){const s=this||t;let l=arguments[0];h&&h.transferEventName&&(l=h.transferEventName(l));const k=arguments[2],R=!!k&&("boolean"==typeof k||k.capture),p=arguments[1];if(!p)return v.apply(this,arguments);if(z&&!z(v,p,s,arguments))return;const I=te[l];let L;I&&(L=I[R?ce:ae]);const M=L&&s[L];if(M)for(let G=0;Gfunction(i,u){i[tt]=!0,n&&n.apply(i,u)})}const De=H("zoneTask");function Te(t,r,c,n){let i=null,u=null;c+=n;const _={};function E(C){const T=C.data;return T.args[0]=function(){return C.invoke.apply(this,arguments)},T.handleId=i.apply(t,T.args),C}function y(C){return u.call(t,C.data.handleId)}i=le(t,r+=n,C=>function(T,Z){if("function"==typeof Z[0]){const P={isPeriodic:"Interval"===n,delay:"Timeout"===n||"Interval"===n?Z[1]||0:void 0,args:Z},j=Z[0];Z[0]=function(){try{return j.apply(this,arguments)}finally{P.isPeriodic||("number"==typeof P.handleId?delete _[P.handleId]:P.handleId&&(P.handleId[De]=null))}};const W=xe(r,Z[0],P,E,y);if(!W)return W;const x=W.data.handleId;return"number"==typeof x?_[x]=W:x&&(x[De]=W),x&&x.ref&&x.unref&&"function"==typeof x.ref&&"function"==typeof x.unref&&(W.ref=x.ref.bind(x),W.unref=x.unref.bind(x)),"number"==typeof x||x?x:W}return C.apply(t,Z)}),u=le(t,c,C=>function(T,Z){const P=Z[0];let j;"number"==typeof P?j=_[P]:(j=P&&P[De],j||(j=P)),j&&"string"==typeof j.type?"notScheduled"!==j.state&&(j.cancelFn&&j.data.isPeriodic||0===j.runCount)&&("number"==typeof P?delete _[P]:P&&(P[De]=null),j.zone.cancelTask(j)):C.apply(t,Z)})}function ot(t,r,c){if(!c||0===c.length)return r;const n=c.filter(u=>u.target===t);if(!n||0===n.length)return r;const i=n[0].ignoreProperties;return r.filter(u=>-1===i.indexOf(u))}function st(t,r,c,n){t&&Ke(t,ot(t,r,c),n)}function Fe(t){return Object.getOwnPropertyNames(t).filter(r=>r.startsWith("on")&&r.length>2).map(r=>r.substring(2))}function Ot(t,r,c,n,i){const u=Zone.__symbol__(n);if(r[u])return;const _=r[u]=r[n];r[n]=function(E,y,C){return y&&y.prototype&&i.forEach(function(T){const Z=`${c}.${n}::`+T,P=y.prototype;try{if(P.hasOwnProperty(T)){const j=t.ObjectGetOwnPropertyDescriptor(P,T);j&&j.value?(j.value=t.wrapWithCurrentZone(j.value,Z),t._redefineProperty(y.prototype,T,j)):P[T]&&(P[T]=t.wrapWithCurrentZone(P[T],Z))}else P[T]&&(P[T]=t.wrapWithCurrentZone(P[T],Z))}catch{}}),_.call(r,E,y,C)},t.attachOriginToPatched(r[n],_)}const it=function me(){const t=globalThis,r=!0===t[J("forceDuplicateZoneCheck")];if(t.Zone&&(r||"function"!=typeof t.Zone.__symbol__))throw new Error("Zone already loaded.");return t.Zone??=function ye(){const t=ee.performance;function r(N){t&&t.mark&&t.mark(N)}function c(N,d){t&&t.measure&&t.measure(N,d)}r("Zone");let n=(()=>{class N{static#e=this.__symbol__=J;static assertZonePatched(){if(ee.Promise!==O.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let e=N.current;for(;e.parent;)e=e.parent;return e}static get current(){return v.zone}static get currentTask(){return D}static __load_patch(e,o,m=!1){if(O.hasOwnProperty(e)){const S=!0===ee[J("forceDuplicateZoneCheck")];if(!m&&S)throw Error("Already loaded patch: "+e)}else if(!ee["__Zone_disable_"+e]){const S="Zone:"+e;r(S),O[e]=o(ee,N,w),c(S,S)}}get parent(){return this._parent}get name(){return this._name}constructor(e,o){this._parent=e,this._name=o?o.name||"unnamed":"",this._properties=o&&o.properties||{},this._zoneDelegate=new u(this,this._parent&&this._parent._zoneDelegate,o)}get(e){const o=this.getZoneWith(e);if(o)return o._properties[e]}getZoneWith(e){let o=this;for(;o;){if(o._properties.hasOwnProperty(e))return o;o=o._parent}return null}fork(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)}wrap(e,o){if("function"!=typeof e)throw new Error("Expecting function got: "+e);const m=this._zoneDelegate.intercept(this,e,o),S=this;return function(){return S.runGuarded(m,this,arguments,o)}}run(e,o,m,S){v={parent:v,zone:this};try{return this._zoneDelegate.invoke(this,e,o,m,S)}finally{v=v.parent}}runGuarded(e,o=null,m,S){v={parent:v,zone:this};try{try{return this._zoneDelegate.invoke(this,e,o,m,S)}catch($){if(this._zoneDelegate.handleError(this,$))throw $}}finally{v=v.parent}}runTask(e,o,m){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||re).name+"; Execution: "+this.name+")");if(e.state===X&&(e.type===U||e.type===g))return;const S=e.state!=B;S&&e._transitionTo(B,h),e.runCount++;const $=D;D=e,v={parent:v,zone:this};try{e.type==g&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,o,m)}catch(A){if(this._zoneDelegate.handleError(this,A))throw A}}finally{e.state!==X&&e.state!==Y&&(e.type==U||e.data&&e.data.isPeriodic?S&&e._transitionTo(h,B):(e.runCount=0,this._updateTaskCount(e,-1),S&&e._transitionTo(X,B,X))),v=v.parent,D=$}}scheduleTask(e){if(e.zone&&e.zone!==this){let m=this;for(;m;){if(m===e.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${e.zone.name}`);m=m.parent}}e._transitionTo(b,X);const o=[];e._zoneDelegates=o,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(m){throw e._transitionTo(Y,b,X),this._zoneDelegate.handleError(this,m),m}return e._zoneDelegates===o&&this._updateTaskCount(e,1),e.state==b&&e._transitionTo(h,b),e}scheduleMicroTask(e,o,m,S){return this.scheduleTask(new _(F,e,o,m,S,void 0))}scheduleMacroTask(e,o,m,S,$){return this.scheduleTask(new _(g,e,o,m,S,$))}scheduleEventTask(e,o,m,S,$){return this.scheduleTask(new _(U,e,o,m,S,$))}cancelTask(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||re).name+"; Execution: "+this.name+")");if(e.state===h||e.state===B){e._transitionTo(z,h,B);try{this._zoneDelegate.cancelTask(this,e)}catch(o){throw e._transitionTo(Y,z),this._zoneDelegate.handleError(this,o),o}return this._updateTaskCount(e,-1),e._transitionTo(X,z),e.runCount=0,e}}_updateTaskCount(e,o){const m=e._zoneDelegates;-1==o&&(e._zoneDelegates=null);for(let S=0;SN.hasTask(e,o),onScheduleTask:(N,d,e,o)=>N.scheduleTask(e,o),onInvokeTask:(N,d,e,o,m,S)=>N.invokeTask(e,o,m,S),onCancelTask:(N,d,e,o)=>N.cancelTask(e,o)};class u{get zone(){return this._zone}constructor(d,e,o){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this._zone=d,this._parentDelegate=e,this._forkZS=o&&(o&&o.onFork?o:e._forkZS),this._forkDlgt=o&&(o.onFork?e:e._forkDlgt),this._forkCurrZone=o&&(o.onFork?this._zone:e._forkCurrZone),this._interceptZS=o&&(o.onIntercept?o:e._interceptZS),this._interceptDlgt=o&&(o.onIntercept?e:e._interceptDlgt),this._interceptCurrZone=o&&(o.onIntercept?this._zone:e._interceptCurrZone),this._invokeZS=o&&(o.onInvoke?o:e._invokeZS),this._invokeDlgt=o&&(o.onInvoke?e:e._invokeDlgt),this._invokeCurrZone=o&&(o.onInvoke?this._zone:e._invokeCurrZone),this._handleErrorZS=o&&(o.onHandleError?o:e._handleErrorZS),this._handleErrorDlgt=o&&(o.onHandleError?e:e._handleErrorDlgt),this._handleErrorCurrZone=o&&(o.onHandleError?this._zone:e._handleErrorCurrZone),this._scheduleTaskZS=o&&(o.onScheduleTask?o:e._scheduleTaskZS),this._scheduleTaskDlgt=o&&(o.onScheduleTask?e:e._scheduleTaskDlgt),this._scheduleTaskCurrZone=o&&(o.onScheduleTask?this._zone:e._scheduleTaskCurrZone),this._invokeTaskZS=o&&(o.onInvokeTask?o:e._invokeTaskZS),this._invokeTaskDlgt=o&&(o.onInvokeTask?e:e._invokeTaskDlgt),this._invokeTaskCurrZone=o&&(o.onInvokeTask?this._zone:e._invokeTaskCurrZone),this._cancelTaskZS=o&&(o.onCancelTask?o:e._cancelTaskZS),this._cancelTaskDlgt=o&&(o.onCancelTask?e:e._cancelTaskDlgt),this._cancelTaskCurrZone=o&&(o.onCancelTask?this._zone:e._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const m=o&&o.onHasTask;(m||e&&e._hasTaskZS)&&(this._hasTaskZS=m?o:i,this._hasTaskDlgt=e,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,o.onScheduleTask||(this._scheduleTaskZS=i,this._scheduleTaskDlgt=e,this._scheduleTaskCurrZone=this._zone),o.onInvokeTask||(this._invokeTaskZS=i,this._invokeTaskDlgt=e,this._invokeTaskCurrZone=this._zone),o.onCancelTask||(this._cancelTaskZS=i,this._cancelTaskDlgt=e,this._cancelTaskCurrZone=this._zone))}fork(d,e){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,d,e):new n(d,e)}intercept(d,e,o){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,d,e,o):e}invoke(d,e,o,m,S){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,d,e,o,m,S):e.apply(o,m)}handleError(d,e){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,d,e)}scheduleTask(d,e){let o=e;if(this._scheduleTaskZS)this._hasTaskZS&&o._zoneDelegates.push(this._hasTaskDlgtOwner),o=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,d,e),o||(o=e);else if(e.scheduleFn)e.scheduleFn(e);else{if(e.type!=F)throw new Error("Task is missing scheduleFn.");W(e)}return o}invokeTask(d,e,o,m){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,d,e,o,m):e.callback.apply(o,m)}cancelTask(d,e){let o;if(this._cancelTaskZS)o=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,d,e);else{if(!e.cancelFn)throw Error("Task is not cancelable");o=e.cancelFn(e)}return o}hasTask(d,e){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,d,e)}catch(o){this.handleError(d,o)}}_updateTaskCount(d,e){const o=this._taskCounts,m=o[d],S=o[d]=m+e;if(S<0)throw new Error("More tasks executed then were scheduled.");0!=m&&0!=S||this.hasTask(this._zone,{microTask:o.microTask>0,macroTask:o.macroTask>0,eventTask:o.eventTask>0,change:d})}}class _{constructor(d,e,o,m,S,$){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=d,this.source=e,this.data=m,this.scheduleFn=S,this.cancelFn=$,!o)throw new Error("callback is not defined");this.callback=o;const A=this;this.invoke=d===U&&m&&m.useG?_.invokeTask:function(){return _.invokeTask.call(ee,A,this,arguments)}}static invokeTask(d,e,o){d||(d=this),Q++;try{return d.runCount++,d.zone.runTask(d,e,o)}finally{1==Q&&x(),Q--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(X,b)}_transitionTo(d,e,o){if(this._state!==e&&this._state!==o)throw new Error(`${this.type} '${this.source}': can not transition to '${d}', expecting state '${e}'${o?" or '"+o+"'":""}, was '${this._state}'.`);this._state=d,d==X&&(this._zoneDelegates=null)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const E=J("setTimeout"),y=J("Promise"),C=J("then");let P,T=[],Z=!1;function j(N){if(P||ee[y]&&(P=ee[y].resolve(0)),P){let d=P[C];d||(d=P.then),d.call(P,N)}else ee[E](N,0)}function W(N){0===Q&&0===T.length&&j(x),N&&T.push(N)}function x(){if(!Z){for(Z=!0;T.length;){const N=T;T=[];for(let d=0;dv,onUnhandledError:q,microtaskDrainDone:q,scheduleMicroTask:W,showUncaughtError:()=>!n[J("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:q,patchMethod:()=>q,bindArguments:()=>[],patchThen:()=>q,patchMacroTask:()=>q,patchEventPrototype:()=>q,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>q,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>q,wrapWithCurrentZone:()=>q,filterProperties:()=>[],attachOriginToPatched:()=>q,_redefineProperty:()=>q,patchCallbacks:()=>q,nativeScheduleMicroTask:j};let v={parent:null,zone:new n(null,null)},D=null,Q=0;function q(){}return c("Zone","Zone"),n}(),t.Zone}();(function It(t){(function Dt(t){t.__load_patch("ZoneAwarePromise",(r,c,n)=>{const i=Object.getOwnPropertyDescriptor,u=Object.defineProperty,E=n.symbol,y=[],C=!1!==r[E("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],T=E("Promise"),Z=E("then"),P="__creationTrace__";n.onUnhandledError=f=>{if(n.showUncaughtError()){const a=f&&f.rejection;a?console.error("Unhandled Promise rejection:",a instanceof Error?a.message:a,"; Zone:",f.zone.name,"; Task:",f.task&&f.task.source,"; Value:",a,a instanceof Error?a.stack:void 0):console.error(f)}},n.microtaskDrainDone=()=>{for(;y.length;){const f=y.shift();try{f.zone.runGuarded(()=>{throw f.throwOriginal?f.rejection:f})}catch(a){W(a)}}};const j=E("unhandledPromiseRejectionHandler");function W(f){n.onUnhandledError(f);try{const a=c[j];"function"==typeof a&&a.call(this,f)}catch{}}function x(f){return f&&f.then}function re(f){return f}function X(f){return A.reject(f)}const b=E("state"),h=E("value"),B=E("finally"),z=E("parentPromiseValue"),Y=E("parentPromiseState"),F="Promise.then",g=null,U=!0,O=!1,w=0;function v(f,a){return s=>{try{N(f,a,s)}catch(l){N(f,!1,l)}}}const D=function(){let f=!1;return function(s){return function(){f||(f=!0,s.apply(null,arguments))}}},Q="Promise resolved with itself",q=E("currentTaskTrace");function N(f,a,s){const l=D();if(f===s)throw new TypeError(Q);if(f[b]===g){let k=null;try{("object"==typeof s||"function"==typeof s)&&(k=s&&s.then)}catch(R){return l(()=>{N(f,!1,R)})(),f}if(a!==O&&s instanceof A&&s.hasOwnProperty(b)&&s.hasOwnProperty(h)&&s[b]!==g)e(s),N(f,s[b],s[h]);else if(a!==O&&"function"==typeof k)try{k.call(s,l(v(f,a)),l(v(f,!1)))}catch(R){l(()=>{N(f,!1,R)})()}else{f[b]=a;const R=f[h];if(f[h]=s,f[B]===B&&a===U&&(f[b]=f[Y],f[h]=f[z]),a===O&&s instanceof Error){const p=c.currentTask&&c.currentTask.data&&c.currentTask.data[P];p&&u(s,q,{configurable:!0,enumerable:!1,writable:!0,value:p})}for(let p=0;p{try{const I=f[h],L=!!s&&B===s[B];L&&(s[z]=I,s[Y]=R);const M=a.run(p,void 0,L&&p!==X&&p!==re?[]:[I]);N(s,!0,M)}catch(I){N(s,!1,I)}},s)}const S=function(){},$=r.AggregateError;class A{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(a){return a instanceof A?a:N(new this(null),U,a)}static reject(a){return N(new this(null),O,a)}static withResolvers(){const a={};return a.promise=new A((s,l)=>{a.resolve=s,a.reject=l}),a}static any(a){if(!a||"function"!=typeof a[Symbol.iterator])return Promise.reject(new $([],"All promises were rejected"));const s=[];let l=0;try{for(let p of a)l++,s.push(A.resolve(p))}catch{return Promise.reject(new $([],"All promises were rejected"))}if(0===l)return Promise.reject(new $([],"All promises were rejected"));let k=!1;const R=[];return new A((p,I)=>{for(let L=0;L{k||(k=!0,p(M))},M=>{R.push(M),l--,0===l&&(k=!0,I(new $(R,"All promises were rejected")))})})}static race(a){let s,l,k=new this((I,L)=>{s=I,l=L});function R(I){s(I)}function p(I){l(I)}for(let I of a)x(I)||(I=this.resolve(I)),I.then(R,p);return k}static all(a){return A.allWithCallback(a)}static allSettled(a){return(this&&this.prototype instanceof A?this:A).allWithCallback(a,{thenCallback:l=>({status:"fulfilled",value:l}),errorCallback:l=>({status:"rejected",reason:l})})}static allWithCallback(a,s){let l,k,R=new this((M,G)=>{l=M,k=G}),p=2,I=0;const L=[];for(let M of a){x(M)||(M=this.resolve(M));const G=I;try{M.then(V=>{L[G]=s?s.thenCallback(V):V,p--,0===p&&l(L)},V=>{s?(L[G]=s.errorCallback(V),p--,0===p&&l(L)):k(V)})}catch(V){k(V)}p++,I++}return p-=2,0===p&&l(L),R}constructor(a){const s=this;if(!(s instanceof A))throw new Error("Must be an instanceof Promise.");s[b]=g,s[h]=[];try{const l=D();a&&a(l(v(s,U)),l(v(s,O)))}catch(l){N(s,!1,l)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return A}then(a,s){let l=this.constructor?.[Symbol.species];(!l||"function"!=typeof l)&&(l=this.constructor||A);const k=new l(S),R=c.current;return this[b]==g?this[h].push(R,k,a,s):o(this,R,k,a,s),k}catch(a){return this.then(null,a)}finally(a){let s=this.constructor?.[Symbol.species];(!s||"function"!=typeof s)&&(s=A);const l=new s(S);l[B]=B;const k=c.current;return this[b]==g?this[h].push(k,l,a,a):o(this,k,l,a,a),l}}A.resolve=A.resolve,A.reject=A.reject,A.race=A.race,A.all=A.all;const Se=r[T]=r.Promise;r.Promise=A;const be=E("thenPatched");function he(f){const a=f.prototype,s=i(a,"then");if(s&&(!1===s.writable||!s.configurable))return;const l=a.then;a[Z]=l,f.prototype.then=function(k,R){return new A((I,L)=>{l.call(this,I,L)}).then(k,R)},f[be]=!0}return n.patchThen=he,Se&&(he(Se),le(r,"fetch",f=>function Oe(f){return function(a,s){let l=f.apply(a,s);if(l instanceof A)return l;let k=l.constructor;return k[be]||he(k),l}}(f))),Promise[c.__symbol__("uncaughtPromiseErrors")]=y,A})})(t),function St(t){t.__load_patch("toString",r=>{const c=Function.prototype.toString,n=H("OriginalDelegate"),i=H("Promise"),u=H("Error"),_=function(){if("function"==typeof this){const T=this[n];if(T)return"function"==typeof T?c.call(T):Object.prototype.toString.call(T);if(this===Promise){const Z=r[i];if(Z)return c.call(Z)}if(this===Error){const Z=r[u];if(Z)return c.call(Z)}}return c.call(this)};_[n]=c,Function.prototype.toString=_;const E=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":E.call(this)}})}(t),function Nt(t){t.__load_patch("util",(r,c,n)=>{const i=Fe(r);n.patchOnProperties=Ke,n.patchMethod=le,n.bindArguments=Ge,n.patchMacroTask=Tt;const u=c.__symbol__("BLACK_LISTED_EVENTS"),_=c.__symbol__("UNPATCHED_EVENTS");r[_]&&(r[u]=r[_]),r[u]&&(c[u]=c[_]=r[u]),n.patchEventPrototype=kt,n.patchEventTarget=mt,n.isIEOrEdge=pt,n.ObjectDefineProperty=Ie,n.ObjectGetOwnPropertyDescriptor=de,n.ObjectCreate=ht,n.ArraySlice=dt,n.patchClass=ve,n.wrapWithCurrentZone=He,n.filterProperties=ot,n.attachOriginToPatched=ue,n._redefineProperty=Object.defineProperty,n.patchCallbacks=Ot,n.getGlobalObjects=()=>({globalSources:Qe,zoneSymbolEventNames:te,eventNames:i,isBrowser:Ve,isMix:Xe,isNode:Re,TRUE_STR:ce,FALSE_STR:ae,ZONE_SYMBOL_PREFIX:ke,ADD_EVENT_LISTENER_STR:Me,REMOVE_EVENT_LISTENER_STR:Ze})})}(t)})(it),function Ct(t){t.__load_patch("legacy",r=>{const c=r[t.__symbol__("legacyPatch")];c&&c()}),t.__load_patch("timers",r=>{const c="set",n="clear";Te(r,c,n,"Timeout"),Te(r,c,n,"Interval"),Te(r,c,n,"Immediate")}),t.__load_patch("requestAnimationFrame",r=>{Te(r,"request","cancel","AnimationFrame"),Te(r,"mozRequest","mozCancel","AnimationFrame"),Te(r,"webkitRequest","webkitCancel","AnimationFrame")}),t.__load_patch("blocking",(r,c)=>{const n=["alert","prompt","confirm"];for(let i=0;ifunction(C,T){return c.current.run(_,r,T,y)})}),t.__load_patch("EventTarget",(r,c,n)=>{(function wt(t,r){r.patchEventPrototype(t,r)})(r,n),function Pt(t,r){if(Zone[r.symbol("patchEventTarget")])return;const{eventNames:c,zoneSymbolEventNames:n,TRUE_STR:i,FALSE_STR:u,ZONE_SYMBOL_PREFIX:_}=r.getGlobalObjects();for(let y=0;y{ve("MutationObserver"),ve("WebKitMutationObserver")}),t.__load_patch("IntersectionObserver",(r,c,n)=>{ve("IntersectionObserver")}),t.__load_patch("FileReader",(r,c,n)=>{ve("FileReader")}),t.__load_patch("on_property",(r,c,n)=>{!function Rt(t,r){if(Re&&!Xe||Zone[t.symbol("patchEvents")])return;const c=r.__Zone_ignore_on_properties;let n=[];if(Ve){const i=window;n=n.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);const u=function gt(){try{const t=_e.navigator.userAgent;if(-1!==t.indexOf("MSIE ")||-1!==t.indexOf("Trident/"))return!0}catch{}return!1}()?[{target:i,ignoreProperties:["error"]}]:[];st(i,Fe(i),c&&c.concat(u),Le(i))}n=n.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let i=0;i{!function bt(t,r){const{isBrowser:c,isMix:n}=r.getGlobalObjects();(c||n)&&t.customElements&&"customElements"in t&&r.patchCallbacks(r,t.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"])}(r,n)}),t.__load_patch("XHR",(r,c)=>{!function C(T){const Z=T.XMLHttpRequest;if(!Z)return;const P=Z.prototype;let W=P[Ae],x=P[je];if(!W){const w=T.XMLHttpRequestEventTarget;if(w){const v=w.prototype;W=v[Ae],x=v[je]}}const re="readystatechange",X="scheduled";function b(w){const v=w.data,D=v.target;D[_]=!1,D[y]=!1;const Q=D[u];W||(W=D[Ae],x=D[je]),Q&&x.call(D,re,Q);const q=D[u]=()=>{if(D.readyState===D.DONE)if(!v.aborted&&D[_]&&w.state===X){const d=D[c.__symbol__("loadfalse")];if(0!==D.status&&d&&d.length>0){const e=w.invoke;w.invoke=function(){const o=D[c.__symbol__("loadfalse")];for(let m=0;mfunction(w,v){return w[i]=0==v[2],w[E]=v[1],z.apply(w,v)}),F=H("fetchTaskAborting"),g=H("fetchTaskScheduling"),U=le(P,"send",()=>function(w,v){if(!0===c.current[g]||w[i])return U.apply(w,v);{const D={target:w,url:w[E],isPeriodic:!1,args:v,aborted:!1},Q=xe("XMLHttpRequest.send",h,D,b,B);w&&!0===w[y]&&!D.aborted&&Q.state===X&&Q.invoke()}}),O=le(P,"abort",()=>function(w,v){const D=function j(w){return w[n]}(w);if(D&&"string"==typeof D.type){if(null==D.cancelFn||D.data&&D.data.aborted)return;D.zone.cancelTask(D)}else if(!0===c.current[F])return O.apply(w,v)})}(r);const n=H("xhrTask"),i=H("xhrSync"),u=H("xhrListener"),_=H("xhrScheduled"),E=H("xhrURL"),y=H("xhrErrorBeforeScheduled")}),t.__load_patch("geolocation",r=>{r.navigator&&r.navigator.geolocation&&function Et(t,r){const c=t.constructor.name;for(let n=0;n{const y=function(){return E.apply(this,Ge(arguments,c+"."+i))};return ue(y,E),y})(u)}}}(r.navigator.geolocation,["getCurrentPosition","watchPosition"])}),t.__load_patch("PromiseRejectionEvent",(r,c)=>{function n(i){return function(u){rt(r,i).forEach(E=>{const y=r.PromiseRejectionEvent;if(y){const C=new y(i,{promise:u.promise,reason:u.rejection});E.invoke(C)}})}}r.PromiseRejectionEvent&&(c[H("unhandledPromiseRejectionHandler")]=n("unhandledrejection"),c[H("rejectionHandledHandler")]=n("rejectionhandled"))}),t.__load_patch("queueMicrotask",(r,c,n)=>{!function vt(t,r){r.patchMethod(t,"queueMicrotask",c=>function(n,i){Zone.current.scheduleMicroTask("queueMicrotask",i[0])})}(r,n)})}(it)}},ee=>{ee(ee.s=50)}]); + +"use strict";(self.webpackChunkcoverage_app=self.webpackChunkcoverage_app||[]).push([[792],{736:()=>{function so(e,n){return Object.is(e,n)}let Ae=null,Gi=!1,qi=1;const Zt=Symbol("SIGNAL");function J(e){const n=Ae;return Ae=e,n}const Fs={version:0,lastCleanEpoch:0,dirty:!1,producerNode:void 0,producerLastReadVersion:void 0,producerIndexOfThis:void 0,nextProducerIndex:0,liveConsumerNode:void 0,liveConsumerIndexOfThis:void 0,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function Ic(e){if(Gi)throw new Error("");if(null===Ae)return;Ae.consumerOnSignalRead(e);const n=Ae.nextProducerIndex++;Bs(Ae),ne.nextProducerIndex;)e.producerNode.pop(),e.producerLastReadVersion.pop(),e.producerIndexOfThis.pop()}}function Sc(e){Bs(e);for(let n=0;n0}function Bs(e){e.producerNode??=[],e.producerIndexOfThis??=[],e.producerLastReadVersion??=[]}function Tp(e){e.liveConsumerNode??=[],e.liveConsumerIndexOfThis??=[]}function Op(e){return void 0!==e.producerNode}const Oc=Symbol("UNSET"),Nc=Symbol("COMPUTING"),js=Symbol("ERRORED"),PI={...Fs,value:Oc,dirty:!0,error:null,equal:so,producerMustRecompute:e=>e.value===Oc||e.value===Nc,producerRecomputeValue(e){if(e.value===Nc)throw new Error("Detected cycle in computations.");const n=e.value;e.value=Nc;const t=Vs(e);let i;try{i=e.computation()}catch(r){i=js,e.error=r}finally{Mc(e,t)}n!==Oc&&n!==js&&i!==js&&e.equal(n,i)?e.value=n:(e.value=i,e.version++)}};let Np=function kI(){throw new Error};function Ap(){Np()}let Us=null;function xp(e,n){Ip()||Ap(),e.equal(e.value,n)||(e.value=n,function jI(e){e.version++,function RI(){qi++}(),bp(e),Us?.()}(e))}const BI={...Fs,equal:so,value:void 0};function Fe(e){return"function"==typeof e}function Lp(e){const t=e(i=>{Error.call(i),i.stack=(new Error).stack});return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}const Ac=Lp(e=>function(t){e(this),this.message=t?`${t.length} errors occurred during unsubscription:\n${t.map((i,r)=>`${r+1}) ${i.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=t});function $s(e,n){if(e){const t=e.indexOf(n);0<=t&&e.splice(t,1)}}class Ot{constructor(n){this.initialTeardown=n,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let n;if(!this.closed){this.closed=!0;const{_parentage:t}=this;if(t)if(this._parentage=null,Array.isArray(t))for(const o of t)o.remove(this);else t.remove(this);const{initialTeardown:i}=this;if(Fe(i))try{i()}catch(o){n=o instanceof Ac?o.errors:[o]}const{_finalizers:r}=this;if(r){this._finalizers=null;for(const o of r)try{Fp(o)}catch(s){n=n??[],s instanceof Ac?n=[...n,...s.errors]:n.push(s)}}if(n)throw new Ac(n)}}add(n){var t;if(n&&n!==this)if(this.closed)Fp(n);else{if(n instanceof Ot){if(n.closed||n._hasParent(this))return;n._addParent(this)}(this._finalizers=null!==(t=this._finalizers)&&void 0!==t?t:[]).push(n)}}_hasParent(n){const{_parentage:t}=this;return t===n||Array.isArray(t)&&t.includes(n)}_addParent(n){const{_parentage:t}=this;this._parentage=Array.isArray(t)?(t.push(n),t):t?[t,n]:n}_removeParent(n){const{_parentage:t}=this;t===n?this._parentage=null:Array.isArray(t)&&$s(t,n)}remove(n){const{_finalizers:t}=this;t&&$s(t,n),n instanceof Ot&&n._removeParent(this)}}Ot.EMPTY=(()=>{const e=new Ot;return e.closed=!0,e})();const Pp=Ot.EMPTY;function kp(e){return e instanceof Ot||e&&"closed"in e&&Fe(e.remove)&&Fe(e.add)&&Fe(e.unsubscribe)}function Fp(e){Fe(e)?e():e.unsubscribe()}const hi={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},zs={setTimeout(e,n,...t){const{delegate:i}=zs;return i?.setTimeout?i.setTimeout(e,n,...t):setTimeout(e,n,...t)},clearTimeout(e){const{delegate:n}=zs;return(n?.clearTimeout||clearTimeout)(e)},delegate:void 0};function Vp(e){zs.setTimeout(()=>{const{onUnhandledError:n}=hi;if(!n)throw e;n(e)})}function Hp(){}const $I=xc("C",void 0,void 0);function xc(e,n,t){return{kind:e,value:n,error:t}}let pi=null;function Gs(e){if(hi.useDeprecatedSynchronousErrorHandling){const n=!pi;if(n&&(pi={errorThrown:!1,error:null}),e(),n){const{errorThrown:t,error:i}=pi;if(pi=null,t)throw i}}else e()}class Rc extends Ot{constructor(n){super(),this.isStopped=!1,n?(this.destination=n,kp(n)&&n.add(this)):this.destination=QI}static create(n,t,i){return new Pc(n,t,i)}next(n){this.isStopped?kc(function GI(e){return xc("N",e,void 0)}(n),this):this._next(n)}error(n){this.isStopped?kc(function zI(e){return xc("E",void 0,e)}(n),this):(this.isStopped=!0,this._error(n))}complete(){this.isStopped?kc($I,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(n){this.destination.next(n)}_error(n){try{this.destination.error(n)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}}const WI=Function.prototype.bind;function Lc(e,n){return WI.call(e,n)}class ZI{constructor(n){this.partialObserver=n}next(n){const{partialObserver:t}=this;if(t.next)try{t.next(n)}catch(i){qs(i)}}error(n){const{partialObserver:t}=this;if(t.error)try{t.error(n)}catch(i){qs(i)}else qs(n)}complete(){const{partialObserver:n}=this;if(n.complete)try{n.complete()}catch(t){qs(t)}}}class Pc extends Rc{constructor(n,t,i){let r;if(super(),Fe(n)||!n)r={next:n??void 0,error:t??void 0,complete:i??void 0};else{let o;this&&hi.useDeprecatedNextContext?(o=Object.create(n),o.unsubscribe=()=>this.unsubscribe(),r={next:n.next&&Lc(n.next,o),error:n.error&&Lc(n.error,o),complete:n.complete&&Lc(n.complete,o)}):r=n}this.destination=new ZI(r)}}function qs(e){hi.useDeprecatedSynchronousErrorHandling?function qI(e){hi.useDeprecatedSynchronousErrorHandling&&pi&&(pi.errorThrown=!0,pi.error=e)}(e):Vp(e)}function kc(e,n){const{onStoppedNotification:t}=hi;t&&zs.setTimeout(()=>t(e,n))}const QI={closed:!0,next:Hp,error:function YI(e){throw e},complete:Hp},Fc="function"==typeof Symbol&&Symbol.observable||"@@observable";function Vc(e){return e}let Nt=(()=>{class e{constructor(t){t&&(this._subscribe=t)}lift(t){const i=new e;return i.source=this,i.operator=t,i}subscribe(t,i,r){const o=function JI(e){return e&&e instanceof Rc||function KI(e){return e&&Fe(e.next)&&Fe(e.error)&&Fe(e.complete)}(e)&&kp(e)}(t)?t:new Pc(t,i,r);return Gs(()=>{const{operator:s,source:a}=this;o.add(s?s.call(o,a):a?this._subscribe(o):this._trySubscribe(o))}),o}_trySubscribe(t){try{return this._subscribe(t)}catch(i){t.error(i)}}forEach(t,i){return new(i=jp(i))((r,o)=>{const s=new Pc({next:a=>{try{t(a)}catch(l){o(l),s.unsubscribe()}},error:o,complete:r});this.subscribe(s)})}_subscribe(t){var i;return null===(i=this.source)||void 0===i?void 0:i.subscribe(t)}[Fc](){return this}pipe(...t){return function Bp(e){return 0===e.length?Vc:1===e.length?e[0]:function(t){return e.reduce((i,r)=>r(i),t)}}(t)(this)}toPromise(t){return new(t=jp(t))((i,r)=>{let o;this.subscribe(s=>o=s,s=>r(s),()=>i(o))})}}return e.create=n=>new e(n),e})();function jp(e){var n;return null!==(n=e??hi.Promise)&&void 0!==n?n:Promise}const XI=Lp(e=>function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});let un=(()=>{class e extends Nt{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(t){const i=new Up(this,this);return i.operator=t,i}_throwIfClosed(){if(this.closed)throw new XI}next(t){Gs(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(const i of this.currentObservers)i.next(t)}})}error(t){Gs(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=t;const{observers:i}=this;for(;i.length;)i.shift().error(t)}})}complete(){Gs(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;const{observers:t}=this;for(;t.length;)t.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var t;return(null===(t=this.observers)||void 0===t?void 0:t.length)>0}_trySubscribe(t){return this._throwIfClosed(),super._trySubscribe(t)}_subscribe(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)}_innerSubscribe(t){const{hasError:i,isStopped:r,observers:o}=this;return i||r?Pp:(this.currentObservers=null,o.push(t),new Ot(()=>{this.currentObservers=null,$s(o,t)}))}_checkFinalizedStatuses(t){const{hasError:i,thrownError:r,isStopped:o}=this;i?t.error(r):o&&t.complete()}asObservable(){const t=new Nt;return t.source=this,t}}return e.create=(n,t)=>new Up(n,t),e})();class Up extends un{constructor(n,t){super(),this.destination=n,this.source=t}next(n){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===i||i.call(t,n)}error(n){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===i||i.call(t,n)}complete(){var n,t;null===(t=null===(n=this.destination)||void 0===n?void 0:n.complete)||void 0===t||t.call(n)}_subscribe(n){var t,i;return null!==(i=null===(t=this.source)||void 0===t?void 0:t.subscribe(n))&&void 0!==i?i:Pp}}class eM extends un{constructor(n){super(),this._value=n}get value(){return this.getValue()}_subscribe(n){const t=super._subscribe(n);return!t.closed&&n.next(this._value),t}getValue(){const{hasError:n,thrownError:t,_value:i}=this;if(n)throw t;return this._throwIfClosed(),i}next(n){super.next(this._value=n)}}function gi(e){return n=>{if(function tM(e){return Fe(e?.lift)}(n))return n.lift(function(t){try{return e(t,this)}catch(i){this.error(i)}});throw new TypeError("Unable to lift unknown Observable type")}}function zn(e,n,t,i,r){return new nM(e,n,t,i,r)}class nM extends Rc{constructor(n,t,i,r,o,s){super(n),this.onFinalize=o,this.shouldUnsubscribe=s,this._next=t?function(a){try{t(a)}catch(l){n.error(l)}}:super._next,this._error=r?function(a){try{r(a)}catch(l){n.error(l)}finally{this.unsubscribe()}}:super._error,this._complete=i?function(){try{i()}catch(a){n.error(a)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var n;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){const{closed:t}=this;super.unsubscribe(),!t&&(null===(n=this.onFinalize)||void 0===n||n.call(this))}}}function Hc(e,n){return gi((t,i)=>{let r=0;t.subscribe(zn(i,o=>{i.next(e.call(n,o,r++))}))})}typeof navigator<"u"&&navigator,typeof navigator<"u"&&!/Opera/.test(navigator.userAgent)&&navigator,typeof navigator<"u"&&(/MSIE/.test(navigator.userAgent)||navigator),typeof navigator<"u"&&!/Opera|WebKit/.test(navigator.userAgent)&&navigator,typeof navigator<"u"&&navigator;const ng="https://g.co/ng/security#xss";class T extends Error{constructor(n,t){super(function Wi(e,n){return`NG0${Math.abs(e)}${n?": "+n:""}`}(n,t)),this.code=n}}function Tn(e){return{toString:e}.toString()}const Yi="__parameters__";function Ki(e,n,t){return Tn(()=>{const i=function Wc(e){return function(...t){if(e){const i=e(...t);for(const r in i)this[r]=i[r]}}}(n);function r(...o){if(this instanceof r)return i.apply(this,o),this;const s=new r(...o);return a.annotation=s,a;function a(l,c,u){const d=l.hasOwnProperty(Yi)?l[Yi]:Object.defineProperty(l,Yi,{value:[]})[Yi];for(;d.length<=u;)d.push(null);return(d[u]=d[u]||[]).push(s),l}}return t&&(r.prototype=Object.create(t.prototype)),r.prototype.ngMetadataName=e,r.annotationCls=r,r})}const me=globalThis;function pe(e){for(let n in e)if(e[n]===pe)return n;throw Error("Could not find renamed property on target object.")}function r0(e,n){for(const t in n)n.hasOwnProperty(t)&&!e.hasOwnProperty(t)&&(e[t]=n[t])}function $e(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map($e).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return`${e.overriddenName}`;if(e.name)return`${e.name}`;const n=e.toString();if(null==n)return""+n;const t=n.indexOf("\n");return-1===t?n:n.substring(0,t)}function Zc(e,n){return null==e||""===e?null===n?"":n:null==n||""===n?e:e+" "+n}const o0=pe({__forward_ref__:pe});function ve(e){return e.__forward_ref__=ve,e.toString=function(){return $e(this())},e}function j(e){return Ks(e)?e():e}function Ks(e){return"function"==typeof e&&e.hasOwnProperty(o0)&&e.__forward_ref__===ve}function ie(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function On(e){return{providers:e.providers||[],imports:e.imports||[]}}function Js(e){return sg(e,ea)||sg(e,ag)}function sg(e,n){return e.hasOwnProperty(n)?e[n]:null}function Xs(e){return e&&(e.hasOwnProperty(Yc)||e.hasOwnProperty(u0))?e[Yc]:null}const ea=pe({\u0275prov:pe}),Yc=pe({\u0275inj:pe}),ag=pe({ngInjectableDef:pe}),u0=pe({ngInjectorDef:pe});class R{constructor(n,t){this._desc=n,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof t?this.__NG_ELEMENT_ID__=t:void 0!==t&&(this.\u0275prov=ie({token:this,providedIn:t.providedIn||"root",factory:t.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}}function eu(e){return e&&!!e.\u0275providers}const co=pe({\u0275cmp:pe}),tu=pe({\u0275dir:pe}),nu=pe({\u0275pipe:pe}),cg=pe({\u0275mod:pe}),Nn=pe({\u0275fac:pe}),uo=pe({__NG_ELEMENT_ID__:pe}),ug=pe({__NG_ENV_ID__:pe});function Z(e){return"string"==typeof e?e:null==e?"":String(e)}function iu(e,n){throw new T(-201,!1)}var re=function(e){return e[e.Default=0]="Default",e[e.Host=1]="Host",e[e.Self=2]="Self",e[e.SkipSelf=4]="SkipSelf",e[e.Optional=8]="Optional",e}(re||{});let ru;function dg(){return ru}function yt(e){const n=ru;return ru=e,n}function fg(e,n,t){const i=Js(e);return i&&"root"==i.providedIn?void 0===i.value?i.value=i.factory():i.value:t&re.Optional?null:void 0!==n?n:void iu()}const fo={},ou="__NG_DI_FLAG__",ta="ngTempTokenPath",m0=/\n/gm,hg="__source";let Ji;function Wn(e){const n=Ji;return Ji=e,n}function y0(e,n=re.Default){if(void 0===Ji)throw new T(-203,!1);return null===Ji?fg(e,void 0,n):Ji.get(e,n&re.Optional?null:void 0,n)}function oe(e,n=re.Default){return(dg()||y0)(j(e),n)}function L(e,n=re.Default){return oe(e,na(n))}function na(e){return typeof e>"u"||"number"==typeof e?e:(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function su(e){const n=[];for(let t=0;tArray.isArray(t)?Xi(t,n):n(t))}function gg(e,n,t){n>=e.length?e.push(t):e.splice(n,0,t)}function ia(e,n){return n>=e.length-1?e.pop():e.splice(n,1)[0]}function Rt(e,n,t){let i=er(e,n);return i>=0?e[1|i]=t:(i=~i,function mg(e,n,t,i){let r=e.length;if(r==n)e.push(t,i);else if(1===r)e.push(i,e[0]),e[0]=t;else{for(r--,e.push(e[r-1],e[r]);r>n;)e[r]=e[r-2],r--;e[n]=t,e[n+1]=i}}(e,i,n,t)),i}function uu(e,n){const t=er(e,n);if(t>=0)return e[1|t]}function er(e,n){return function vg(e,n,t){let i=0,r=e.length>>t;for(;r!==i;){const o=i+(r-i>>1),s=e[o<n?r=o:i=o+1}return~(r<n){s=o-1;break}}}for(;o-1){let o;for(;++ro?"":r[u+1].toLowerCase(),2&i&&c!==d){if(Qt(i))return!1;s=!0}}}}else{if(!s&&!Qt(i)&&!Qt(l))return!1;if(s&&Qt(l))continue;s=!1,i=l|1&i}}return Qt(i)||s}function Qt(e){return!(1&e)}function A0(e,n,t,i){if(null===n)return-1;let r=0;if(i||!t){let o=!1;for(;r-1)for(t++;t0?'="'+a+'"':"")+"]"}else 8&i?r+="."+s:4&i&&(r+=" "+s);else""!==r&&!Qt(s)&&(n+=bg(o,r),r=""),i=s,o=o||!Qt(i);t++}return""!==r&&(n+=bg(o,r)),n}function Kt(e){return Tn(()=>{const n=Mg(e),t={...n,decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection===sa.OnPush,directiveDefs:null,pipeDefs:null,dependencies:n.standalone&&e.dependencies||null,getStandaloneInjector:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||Yt.Emulated,styles:e.styles||ae,_:null,schemas:e.schemas||null,tView:null,id:""};Sg(t);const i=e.dependencies;return t.directiveDefs=aa(i,!1),t.pipeDefs=aa(i,!0),t.id=function U0(e){let n=0;const t=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,e.consts,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery].join("|");for(const r of t)n=Math.imul(31,n)+r.charCodeAt(0)|0;return n+=2147483648,"c"+n}(t),t})}function H0(e){return ee(e)||ze(e)}function B0(e){return null!==e}function Yn(e){return Tn(()=>({type:e.type,bootstrap:e.bootstrap||ae,declarations:e.declarations||ae,imports:e.imports||ae,exports:e.exports||ae,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function Ig(e,n){if(null==e)return dn;const t={};for(const i in e)if(e.hasOwnProperty(i)){const r=e[i];let o,s,a=Zn.None;Array.isArray(r)?(a=r[0],o=r[1],s=r[2]??o):(o=r,s=r),n?(t[o]=a!==Zn.None?[i,a]:i,n[o]=s):t[o]=i}return t}function z(e){return Tn(()=>{const n=Mg(e);return Sg(n),n})}function wt(e){return{type:e.type,name:e.name,factory:null,pure:!1!==e.pure,standalone:!0===e.standalone,onDestroy:e.type.prototype.ngOnDestroy||null}}function ee(e){return e[co]||null}function ze(e){return e[tu]||null}function Je(e){return e[nu]||null}function Mg(e){const n={};return{type:e.type,providersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:n,inputTransforms:null,inputConfig:e.inputs||dn,exportAs:e.exportAs||null,standalone:!0===e.standalone,signals:!0===e.signals,selectors:e.selectors||ae,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,findHostDirectiveDefs:null,hostDirectives:null,inputs:Ig(e.inputs,n),outputs:Ig(e.outputs),debugInfo:null}}function Sg(e){e.features?.forEach(n=>n(e))}function aa(e,n){if(!e)return null;const t=n?Je:H0;return()=>("function"==typeof e?e():e).map(i=>t(i)).filter(B0)}function $0(...e){return{\u0275providers:pu(0,e),\u0275fromNgModule:!0}}function pu(e,...n){const t=[],i=new Set;let r;const o=s=>{t.push(s)};return Xi(n,s=>{const a=s;ca(a,o,[],i)&&(r||=[],r.push(a))}),void 0!==r&&Tg(r,o),t}function Tg(e,n){for(let t=0;t{n(o,i)})}}function ca(e,n,t,i){if(!(e=j(e)))return!1;let r=null,o=Xs(e);const s=!o&&ee(e);if(o||s){if(s&&!s.standalone)return!1;r=e}else{const l=e.ngModule;if(o=Xs(l),!o)return!1;r=l}const a=i.has(r);if(s){if(a)return!1;if(i.add(r),s.dependencies){const l="function"==typeof s.dependencies?s.dependencies():s.dependencies;for(const c of l)ca(c,n,t,i)}}else{if(!o)return!1;{if(null!=o.imports&&!a){let c;i.add(r);try{Xi(o.imports,u=>{ca(u,n,t,i)&&(c||=[],c.push(u))})}finally{}void 0!==c&&Tg(c,n)}if(!a){const c=vi(r)||(()=>new r);n({provide:r,useFactory:c,deps:ae},r),n({provide:du,useValue:r,multi:!0},r),n({provide:fn,useValue:()=>oe(r),multi:!0},r)}const l=o.providers;if(null!=l&&!a){const c=e;gu(l,u=>{n(u,c)})}}}return r!==e&&void 0!==e.providers}function gu(e,n){for(let t of e)eu(t)&&(t=t.\u0275providers),Array.isArray(t)?gu(t,n):n(t)}const z0=pe({provide:String,useValue:pe});function mu(e){return null!==e&&"object"==typeof e&&z0 in e}function yi(e){return"function"==typeof e}const vu=new R(""),ua={},q0={};let _u;function da(){return void 0===_u&&(_u=new oa),_u}class Jt{}class tr extends Jt{get destroyed(){return this._destroyed}constructor(n,t,i,r){super(),this.parent=t,this.source=i,this.scopes=r,this.records=new Map,this._ngOnDestroyHooks=new Set,this._onDestroyHooks=[],this._destroyed=!1,Cu(n,s=>this.processProvider(s)),this.records.set(_g,nr(void 0,this)),r.has("environment")&&this.records.set(Jt,nr(void 0,this));const o=this.records.get(vu);null!=o&&"string"==typeof o.value&&this.scopes.add(o.value),this.injectorDefTypes=new Set(this.get(du,ae,re.Self))}destroy(){this.assertNotDestroyed(),this._destroyed=!0;const n=J(null);try{for(const i of this._ngOnDestroyHooks)i.ngOnDestroy();const t=this._onDestroyHooks;this._onDestroyHooks=[];for(const i of t)i()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),J(n)}}onDestroy(n){return this.assertNotDestroyed(),this._onDestroyHooks.push(n),()=>this.removeOnDestroy(n)}runInContext(n){this.assertNotDestroyed();const t=Wn(this),i=yt(void 0);try{return n()}finally{Wn(t),yt(i)}}get(n,t=fo,i=re.Default){if(this.assertNotDestroyed(),n.hasOwnProperty(ug))return n[ug](this);i=na(i);const o=Wn(this),s=yt(void 0);try{if(!(i&re.SkipSelf)){let l=this.records.get(n);if(void 0===l){const c=function K0(e){return"function"==typeof e||"object"==typeof e&&e instanceof R}(n)&&Js(n);l=c&&this.injectableDefInScope(c)?nr(yu(n),ua):null,this.records.set(n,l)}if(null!=l)return this.hydrate(n,l)}return(i&re.Self?da():this.parent).get(n,t=i&re.Optional&&t===fo?null:t)}catch(a){if("NullInjectorError"===a.name){if((a[ta]=a[ta]||[]).unshift($e(n)),o)throw a;return function w0(e,n,t,i){const r=e[ta];throw n[hg]&&r.unshift(n[hg]),e.message=function E0(e,n,t,i=null){e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.slice(2):e;let r=$e(n);if(Array.isArray(n))r=n.map($e).join(" -> ");else if("object"==typeof n){let o=[];for(let s in n)if(n.hasOwnProperty(s)){let a=n[s];o.push(s+":"+("string"==typeof a?JSON.stringify(a):$e(a)))}r=`{${o.join(", ")}}`}return`${t}${i?"("+i+")":""}[${r}]: ${e.replace(m0,"\n ")}`}("\n"+e.message,r,t,i),e.ngTokenPath=r,e[ta]=null,e}(a,n,"R3InjectorError",this.source)}throw a}finally{yt(s),Wn(o)}}resolveInjectorInitializers(){const n=J(null),t=Wn(this),i=yt(void 0);try{const o=this.get(fn,ae,re.Self);for(const s of o)s()}finally{Wn(t),yt(i),J(n)}}toString(){const n=[],t=this.records;for(const i of t.keys())n.push($e(i));return`R3Injector[${n.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new T(205,!1)}processProvider(n){let t=yi(n=j(n))?n:j(n&&n.provide);const i=function Z0(e){return mu(e)?nr(void 0,e.useValue):nr(Ag(e),ua)}(n);if(!yi(n)&&!0===n.multi){let r=this.records.get(t);r||(r=nr(void 0,ua,!0),r.factory=()=>su(r.multi),this.records.set(t,r)),t=n,r.multi.push(n)}this.records.set(t,i)}hydrate(n,t){const i=J(null);try{return t.value===ua&&(t.value=q0,t.value=t.factory()),"object"==typeof t.value&&t.value&&function Q0(e){return null!==e&&"object"==typeof e&&"function"==typeof e.ngOnDestroy}(t.value)&&this._ngOnDestroyHooks.add(t.value),t.value}finally{J(i)}}injectableDefInScope(n){if(!n.providedIn)return!1;const t=j(n.providedIn);return"string"==typeof t?"any"===t||this.scopes.has(t):this.injectorDefTypes.has(t)}removeOnDestroy(n){const t=this._onDestroyHooks.indexOf(n);-1!==t&&this._onDestroyHooks.splice(t,1)}}function yu(e){const n=Js(e),t=null!==n?n.factory:vi(e);if(null!==t)return t;if(e instanceof R)throw new T(204,!1);if(e instanceof Function)return function W0(e){if(e.length>0)throw new T(204,!1);const t=function c0(e){return e&&(e[ea]||e[ag])||null}(e);return null!==t?()=>t.factory(e):()=>new e}(e);throw new T(204,!1)}function Ag(e,n,t){let i;if(yi(e)){const r=j(e);return vi(r)||yu(r)}if(mu(e))i=()=>j(e.useValue);else if(function Ng(e){return!(!e||!e.useFactory)}(e))i=()=>e.useFactory(...su(e.deps||[]));else if(function Og(e){return!(!e||!e.useExisting)}(e))i=()=>oe(j(e.useExisting));else{const r=j(e&&(e.useClass||e.provide));if(!function Y0(e){return!!e.deps}(e))return vi(r)||yu(r);i=()=>new r(...su(e.deps))}return i}function nr(e,n,t=!1){return{factory:e,value:n,multi:t?[]:void 0}}function Cu(e,n){for(const t of e)Array.isArray(t)?Cu(t,n):t&&eu(t)?Cu(t.\u0275providers,n):n(t)}const Se=0,O=1,V=2,He=3,Xt=4,Xe=5,lt=6,rr=7,Ce=8,Be=9,hn=10,U=11,mo=12,Lg=13,or=14,Te=15,Ci=16,sr=17,An=18,ar=19,Pg=20,Qn=21,pa=22,jt=23,P=25,Eu=1,pn=7,lr=9,xe=10;var ma=function(e){return e[e.None=0]="None",e[e.HasTransplantedViews=2]="HasTransplantedViews",e}(ma||{});function Ke(e){return Array.isArray(e)&&"object"==typeof e[Eu]}function it(e){return Array.isArray(e)&&!0===e[Eu]}function Du(e){return!!(4&e.flags)}function wi(e){return e.componentOffset>-1}function va(e){return!(1&~e.flags)}function en(e){return!!e.template}function _o(e){return!!(512&e[V])}class dS{constructor(n,t,i){this.previousValue=n,this.currentValue=t,this.firstChange=i}isFirstChange(){return this.firstChange}}function Hg(e,n,t,i){null!==n?n.applyValueToInputSignal(n,i):e[t]=i}function gn(){return Bg}function Bg(e){return e.type.prototype.ngOnChanges&&(e.setInput=hS),fS}function fS(){const e=Ug(this),n=e?.current;if(n){const t=e.previous;if(t===dn)e.previous=n;else for(let i in n)t[i]=n[i];e.current=null,this.ngOnChanges(n)}}function hS(e,n,t,i,r){const o=this.declaredInputs[i],s=Ug(e)||function pS(e,n){return e[jg]=n}(e,{previous:dn,current:null}),a=s.current||(s.current={}),l=s.previous,c=l[o];a[o]=new dS(c&&c.currentValue,t,l===dn),Hg(e,n,r,t)}gn.ngInherit=!0;const jg="__ngSimpleChanges__";function Ug(e){return e[jg]||null}const mn=function(e,n,t){};function le(e){for(;Array.isArray(e);)e=e[Se];return e}function yo(e,n){return le(n[e])}function ct(e,n){return le(n[e.index])}function Co(e,n){return e.data[n]}function Lt(e,n){const t=n[e];return Ke(t)?t:t[Se]}function Tu(e){return!(128&~e[V])}function Ut(e,n){return null==n?null:e[n]}function Gg(e){e[sr]=0}function qg(e){1024&e[V]||(e[V]|=1024,Tu(e)&&_a(e))}function wo(e){return!!(9216&e[V]||e[jt]?.dirty)}function Ou(e){e[hn].changeDetectionScheduler?.notify(7),64&e[V]&&(e[V]|=1024),wo(e)&&_a(e)}function _a(e){e[hn].changeDetectionScheduler?.notify(0);let n=xn(e);for(;null!==n&&!(8192&n[V])&&(n[V]|=8192,Tu(n));)n=xn(n)}function ya(e,n){if(!(256&~e[V]))throw new T(911,!1);null===e[Qn]&&(e[Qn]=[]),e[Qn].push(n)}function xn(e){const n=e[He];return it(n)?n[He]:n}const $={lFrame:om(null),bindingsEnabled:!0,skipHydrationRootTNode:null};let Zg=!1;function Yg(){return $.bindingsEnabled}function w(){return $.lFrame.lView}function X(){return $.lFrame.tView}function G(e){return $.lFrame.contextLView=e,e[Ce]}function q(e){return $.lFrame.contextLView=null,e}function ge(){let e=Qg();for(;null!==e&&64===e.type;)e=e.parent;return e}function Qg(){return $.lFrame.currentTNode}function tn(e,n){const t=$.lFrame;t.currentTNode=e,t.isParent=n}function xu(){return $.lFrame.isParent}function Ru(){$.lFrame.isParent=!1}function Xg(){return Zg}function em(e){Zg=e}function ut(){const e=$.lFrame;let n=e.bindingRootIndex;return-1===n&&(n=e.bindingRootIndex=e.tView.bindingStartIndex),n}function nn(){return $.lFrame.bindingIndex++}function Ln(e){const n=$.lFrame,t=n.bindingIndex;return n.bindingIndex=n.bindingIndex+e,t}function TS(e,n){const t=$.lFrame;t.bindingIndex=t.bindingRootIndex=e,Lu(n)}function Lu(e){$.lFrame.currentDirectiveIndex=e}function ku(){return $.lFrame.currentQueryIndex}function wa(e){$.lFrame.currentQueryIndex=e}function NS(e){const n=e[O];return 2===n.type?n.declTNode:1===n.type?e[Xe]:null}function im(e,n,t){if(t&re.SkipSelf){let r=n,o=e;for(;!(r=r.parent,null!==r||t&re.Host||(r=NS(o),null===r||(o=o[or],10&r.type))););if(null===r)return!1;n=r,e=o}const i=$.lFrame=rm();return i.currentTNode=n,i.lView=e,!0}function Fu(e){const n=rm(),t=e[O];$.lFrame=n,n.currentTNode=t.firstChild,n.lView=e,n.tView=t,n.contextLView=e,n.bindingIndex=t.bindingStartIndex,n.inI18n=!1}function rm(){const e=$.lFrame,n=null===e?null:e.child;return null===n?om(e):n}function om(e){const n={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=n),n}function sm(){const e=$.lFrame;return $.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const am=sm;function Vu(){const e=sm();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function et(){return $.lFrame.selectedIndex}function bi(e){$.lFrame.selectedIndex=e}function we(){const e=$.lFrame;return Co(e.tView,e.selectedIndex)}let um=!0;function Do(){return um}function vn(e){um=e}function Ea(e,n){for(let t=n.directiveStart,i=n.directiveEnd;t=i)break}else n[l]<0&&(e[sr]+=65536),(a>14>16&&(3&e[V])===n&&(e[V]+=16384,fm(a,o)):fm(a,o)}const cr=-1;class bo{constructor(n,t,i){this.factory=n,this.resolving=!1,this.canSeeViewProviders=t,this.injectImpl=i}}const ju={};class Ii{constructor(n,t){this.injector=n,this.parentInjector=t}get(n,t,i){i=na(i);const r=this.injector.get(n,ju,i);return r!==ju||t===ju?r:this.parentInjector.get(n,t,i)}}function Uu(e){return e!==cr}function Io(e){return 32767&e}function Mo(e,n){let t=function BS(e){return e>>16}(e),i=n;for(;t>0;)i=i[or],t--;return i}let $u=!0;function Ia(e){const n=$u;return $u=e,n}const pm=255,gm=5;let US=0;const _n={};function Ma(e,n){const t=mm(e,n);if(-1!==t)return t;const i=n[O];i.firstCreatePass&&(e.injectorIndex=n.length,zu(i.data,e),zu(n,null),zu(i.blueprint,null));const r=Sa(e,n),o=e.injectorIndex;if(Uu(r)){const s=Io(r),a=Mo(r,n),l=a[O].data;for(let c=0;c<8;c++)n[o+c]=a[s+c]|l[s+c]}return n[o+8]=r,o}function zu(e,n){e.push(0,0,0,0,0,0,0,0,n)}function mm(e,n){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===n[e.injectorIndex+8]?-1:e.injectorIndex}function Sa(e,n){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;let t=0,i=null,r=n;for(;null!==r;){if(i=Dm(r),null===i)return cr;if(t++,r=r[or],-1!==i.injectorIndex)return i.injectorIndex|t<<16}return cr}function Gu(e,n,t){!function $S(e,n,t){let i;"string"==typeof t?i=t.charCodeAt(0)||0:t.hasOwnProperty(uo)&&(i=t[uo]),null==i&&(i=t[uo]=US++);const r=i±n.data[e+(r>>gm)]|=1<=0?n&pm:WS:n}(t);if("function"==typeof o){if(!im(n,e,i))return i&re.Host?vm(r,0,i):_m(n,t,i,r);try{let s;if(s=o(i),null!=s||i&re.Optional)return s;iu()}finally{am()}}else if("number"==typeof o){let s=null,a=mm(e,n),l=cr,c=i&re.Host?n[Te][Xe]:null;for((-1===a||i&re.SkipSelf)&&(l=-1===a?Sa(e,n):n[a+8],l!==cr&&Em(i,!1)?(s=n[O],a=Io(l),n=Mo(l,n)):a=-1);-1!==a;){const u=n[O];if(wm(o,a,u.data)){const d=GS(a,n,t,s,i,c);if(d!==_n)return d}l=n[a+8],l!==cr&&Em(i,n[O].data[a+8]===c)&&wm(o,a,n)?(s=u,a=Io(l),n=Mo(l,n)):a=-1}}return r}function GS(e,n,t,i,r,o){const s=n[O],a=s.data[e+8],u=Ta(a,s,t,null==i?wi(a)&&$u:i!=s&&!!(3&a.type),r&re.Host&&o===a);return null!==u?Mi(n,s,u,a):_n}function Ta(e,n,t,i,r){const o=e.providerIndexes,s=n.data,a=1048575&o,l=e.directiveStart,u=o>>20,p=r?a+u:e.directiveEnd;for(let h=i?a:a+u;h=l&&g.type===t)return h}if(r){const h=s[l];if(h&&en(h)&&h.type===t)return l}return null}function Mi(e,n,t,i){let r=e[t];const o=n.data;if(function FS(e){return e instanceof bo}(r)){const s=r;s.resolving&&function h0(e,n){throw n&&n.join(" > "),new T(-200,e)}(function ce(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():Z(e)}(o[t]));const a=Ia(s.canSeeViewProviders);s.resolving=!0;const c=s.injectImpl?yt(s.injectImpl):null;im(e,i,re.Default);try{r=e[t]=s.factory(void 0,o,e,i),n.firstCreatePass&&t>=i.directiveStart&&function PS(e,n,t){const{ngOnChanges:i,ngOnInit:r,ngDoCheck:o}=n.type.prototype;if(i){const s=Bg(n);(t.preOrderHooks??=[]).push(e,s),(t.preOrderCheckHooks??=[]).push(e,s)}r&&(t.preOrderHooks??=[]).push(0-e,r),o&&((t.preOrderHooks??=[]).push(e,o),(t.preOrderCheckHooks??=[]).push(e,o))}(t,o[t],n)}finally{null!==c&&yt(c),Ia(a),s.resolving=!1,am()}}return r}function wm(e,n,t){return!!(t[n+(e>>gm)]&1<{const n=e.prototype.constructor,t=n[Nn]||qu(n),i=Object.prototype;let r=Object.getPrototypeOf(e.prototype).constructor;for(;r&&r!==i;){const o=r[Nn]||qu(r);if(o&&o!==t)return o;r=Object.getPrototypeOf(r)}return o=>new o})}function qu(e){return Ks(e)?()=>{const n=qu(j(e));return n&&n()}:vi(e)}function Dm(e){const n=e[O],t=n.type;return 2===t?n.declTNode:1===t?e[Xe]:null}function Tm(e,n=null,t=null,i){const r=Om(e,n,t,i);return r.resolveInjectorInitializers(),r}function Om(e,n=null,t=null,i,r=new Set){const o=[t||ae,$0(e)];return i=i||("object"==typeof e?void 0:$e(e)),new tr(o,n||da(),i||null,r)}class We{static#e=this.THROW_IF_NOT_FOUND=fo;static#t=this.NULL=new oa;static create(n,t){if(Array.isArray(n))return Tm({name:""},t,n,"");{const i=n.name??"";return Tm({name:i},n.parent,n.providers,i)}}static#n=this.\u0275prov=ie({token:We,providedIn:"any",factory:()=>oe(_g)});static#i=this.__NG_ELEMENT_ID__=-1}new R("").__NG_ELEMENT_ID__=e=>{const n=ge();if(null===n)throw new T(204,!1);if(2&n.type)return n.value;if(e&re.Optional)return null;throw new T(204,!1)};function Zu(e){return e.ngOriginalError}class $t{constructor(){this._console=console}handleError(n){const t=this._findOriginalError(n);this._console.error("ERROR",n),t&&this._console.error("ORIGINAL ERROR",t)}_findOriginalError(n){let t=n&&Zu(n);for(;t&&Zu(t);)t=Zu(t);return t||null}}const Am=new R("",{providedIn:"root",factory:()=>L($t).handleError.bind(void 0)});let So=(()=>{class e{static#e=this.__NG_ELEMENT_ID__=rT;static#t=this.__NG_ENV_ID__=t=>t}return e})();class iT extends So{constructor(n){super(),this._lView=n}onDestroy(n){return ya(this._lView,n),()=>function Nu(e,n){if(null===e[Qn])return;const t=e[Qn].indexOf(n);-1!==t&&e[Qn].splice(t,1)}(this._lView,n)}}function rT(){return new iT(w())}function oT(){return fr(ge(),w())}function fr(e,n){return new dt(ct(e,n))}let dt=(()=>{class e{constructor(t){this.nativeElement=t}static#e=this.__NG_ELEMENT_ID__=oT}return e})();function Rm(e){return e instanceof dt?e.nativeElement:e}let hr=(()=>{class e{constructor(){this.taskId=0,this.pendingTasks=new Set,this.hasPendingTasks=new eM(!1)}get _hasPendingTasks(){return this.hasPendingTasks.value}add(){this._hasPendingTasks||this.hasPendingTasks.next(!0);const t=this.taskId++;return this.pendingTasks.add(t),t}remove(t){this.pendingTasks.delete(t),0===this.pendingTasks.size&&this._hasPendingTasks&&this.hasPendingTasks.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this._hasPendingTasks&&this.hasPendingTasks.next(!1)}static#e=this.\u0275prov=ie({token:e,providedIn:"root",factory:()=>new e})}return e})();const Ee=class sT extends un{constructor(n=!1){super(),this.destroyRef=void 0,this.pendingTasks=void 0,this.__isAsync=n,function xg(){return void 0!==dg()||null!=function _0(){return Ji}()}()&&(this.destroyRef=L(So,{optional:!0})??void 0,this.pendingTasks=L(hr,{optional:!0})??void 0)}emit(n){const t=J(null);try{super.next(n)}finally{J(t)}}subscribe(n,t,i){let r=n,o=t||(()=>null),s=i;if(n&&"object"==typeof n){const l=n;r=l.next?.bind(l),o=l.error?.bind(l),s=l.complete?.bind(l)}this.__isAsync&&(o=this.wrapInTimeout(o),r&&(r=this.wrapInTimeout(r)),s&&(s=this.wrapInTimeout(s)));const a=super.subscribe({next:r,error:o,complete:s});return n instanceof Ot&&n.add(a),a}wrapInTimeout(n){return t=>{const i=this.pendingTasks?.add();setTimeout(()=>{n(t),void 0!==i&&this.pendingTasks?.remove(i)})}}};function aT(){return this._results[Symbol.iterator]()}class Yu{static#e=Symbol.iterator;get changes(){return this._changes??=new Ee}constructor(n=!1){this._emitDistinctChangesOnly=n,this.dirty=!0,this._onDirty=void 0,this._results=[],this._changesDetected=!1,this._changes=void 0,this.length=0,this.first=void 0,this.last=void 0;const t=Yu.prototype;t[Symbol.iterator]||(t[Symbol.iterator]=aT)}get(n){return this._results[n]}map(n){return this._results.map(n)}filter(n){return this._results.filter(n)}find(n){return this._results.find(n)}reduce(n,t){return this._results.reduce(n,t)}forEach(n){this._results.forEach(n)}some(n){return this._results.some(n)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(n,t){this.dirty=!1;const i=function Ct(e){return e.flat(Number.POSITIVE_INFINITY)}(n);(this._changesDetected=!function M0(e,n,t){if(e.length!==n.length)return!1;for(let i=0;iOT}),OT="ng",Xm=new R(""),mr=new R("",{providedIn:"platform",factory:()=>"unknown"}),ev=new R("",{providedIn:"root",factory:()=>Kn().body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});let tv=()=>null;function od(e,n,t=!1){return tv(e,n,t)}const cv=new R("",{providedIn:"root",factory:()=>!1});let Ua,$a;function yr(e){return function ud(){if(void 0===Ua&&(Ua=null,me.trustedTypes))try{Ua=me.trustedTypes.createPolicy("angular",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch{}return Ua}()?.createHTML(e)||e}function fv(e){return function dd(){if(void 0===$a&&($a=null,me.trustedTypes))try{$a=me.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch{}return $a}()?.createHTML(e)||e}class gv{constructor(n){this.changingThisBreaksApplicationSecurity=n}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${ng})`}}function Jn(e){return e instanceof gv?e.changingThisBreaksApplicationSecurity:e}function Po(e,n){const t=function ZT(e){return e instanceof gv&&e.getTypeName()||null}(e);if(null!=t&&t!==n){if("ResourceURL"===t&&"URL"===n)return!0;throw new Error(`Required a safe ${n}, got a ${t} (see ${ng})`)}return t===n}class YT{constructor(n){this.inertDocumentHelper=n}getInertBodyElement(n){n=""+n;try{const t=(new window.DOMParser).parseFromString(yr(n),"text/html").body;return null===t?this.inertDocumentHelper.getInertBodyElement(n):(t.removeChild(t.firstChild),t)}catch{return null}}}class QT{constructor(n){this.defaultDoc=n,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert")}getInertBodyElement(n){const t=this.inertDocument.createElement("template");return t.innerHTML=yr(n),t}}const JT=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;function fd(e){return(e=String(e)).match(JT)?e:"unsafe:"+e}function Pn(e){const n={};for(const t of e.split(","))n[t]=!0;return n}function ko(...e){const n={};for(const t of e)for(const i in t)t.hasOwnProperty(i)&&(n[i]=!0);return n}const vv=Pn("area,br,col,hr,img,wbr"),_v=Pn("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),yv=Pn("rp,rt"),hd=ko(vv,ko(_v,Pn("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),ko(yv,Pn("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),ko(yv,_v)),pd=Pn("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),Cv=ko(pd,Pn("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),Pn("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext")),XT=Pn("script,style,template");class eO{constructor(){this.sanitizedSomething=!1,this.buf=[]}sanitizeChildren(n){let t=n.firstChild,i=!0,r=[];for(;t;)if(t.nodeType===Node.ELEMENT_NODE?i=this.startElement(t):t.nodeType===Node.TEXT_NODE?this.chars(t.nodeValue):this.sanitizedSomething=!0,i&&t.firstChild)r.push(t),t=iO(t);else for(;t;){t.nodeType===Node.ELEMENT_NODE&&this.endElement(t);let o=nO(t);if(o){t=o;break}t=r.pop()}return this.buf.join("")}startElement(n){const t=wv(n).toLowerCase();if(!hd.hasOwnProperty(t))return this.sanitizedSomething=!0,!XT.hasOwnProperty(t);this.buf.push("<"),this.buf.push(t);const i=n.attributes;for(let r=0;r"),!0}endElement(n){const t=wv(n).toLowerCase();hd.hasOwnProperty(t)&&!vv.hasOwnProperty(t)&&(this.buf.push(""))}chars(n){this.buf.push(Dv(n))}}function nO(e){const n=e.nextSibling;if(n&&e!==n.previousSibling)throw Ev(n);return n}function iO(e){const n=e.firstChild;if(n&&function tO(e,n){return(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}(e,n))throw Ev(n);return n}function wv(e){const n=e.nodeName;return"string"==typeof n?n:"FORM"}function Ev(e){return new Error(`Failed to sanitize html because the element is clobbered: ${e.outerHTML}`)}const rO=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,oO=/([^\#-~ |!])/g;function Dv(e){return e.replace(/&/g,"&").replace(rO,function(n){return"&#"+(1024*(n.charCodeAt(0)-55296)+(n.charCodeAt(1)-56320)+65536)+";"}).replace(oO,function(n){return"&#"+n.charCodeAt(0)+";"}).replace(//g,">")}let za;function gd(e){return"content"in e&&function aO(e){return e.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===e.nodeName}(e)?e.content:null}var Cr=function(e){return e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL",e}(Cr||{});function bv(e){const n=Fo();return n?fv(n.sanitize(Cr.HTML,e)||""):Po(e,"HTML")?fv(Jn(e)):function sO(e,n){let t=null;try{za=za||function mv(e){const n=new QT(e);return function KT(){try{return!!(new window.DOMParser).parseFromString(yr(""),"text/html")}catch{return!1}}()?new YT(n):n}(e);let i=n?String(n):"";t=za.getInertBodyElement(i);let r=5,o=i;do{if(0===r)throw new Error("Failed to sanitize html because the input is unstable");r--,i=o,o=t.innerHTML,t=za.getInertBodyElement(i)}while(i!==o);return yr((new eO).sanitizeChildren(gd(t)||t))}finally{if(t){const i=gd(t)||t;for(;i.firstChild;)i.removeChild(i.firstChild)}}}(Kn(),Z(e))}function Xn(e){const n=Fo();return n?n.sanitize(Cr.URL,e)||"":Po(e,"URL")?Jn(e):fd(Z(e))}function Fo(){const e=w();return e&&e[hn].sanitizer}const pO=/^>|^->||--!>|)/g,mO="\u200b$1\u200b";function Wa(e){return e.ownerDocument.defaultView}var ei=function(e){return e[e.Important=1]="Important",e[e.DashCase=2]="DashCase",e}(ei||{});let _d;function yd(e,n){return _d(e,n)}function Er(e,n,t,i,r){if(null!=i){let o,s=!1;it(i)?o=i:Ke(i)&&(s=!0,i=i[Se]);const a=le(i);0===e&&null!==t?null==r?Vv(n,t,a):Si(n,t,a,r||null,!0):1===e&&null!==t?Si(n,t,a,r||null,!0):2===e?function Ho(e,n,t){const i=Qa(e,n);i&&function RO(e,n,t,i){e.removeChild(n,t,i)}(e,i,n,t)}(n,a,s):3===e&&n.destroyNode(a),null!=o&&function kO(e,n,t,i,r){const o=t[pn];o!==le(t)&&Er(n,e,i,o,r);for(let a=xe;an.replace(gO,mO))}(n))}function Za(e,n,t){return e.createElement(n,t)}function Pv(e,n){n[hn].changeDetectionScheduler?.notify(8),Ja(e,n,n[U],2,null,null)}function kv(e,n){const t=e[lr],i=n[He];(Ke(i)||n[Te]!==i[He][Te])&&(e[V]|=ma.HasTransplantedViews),null===t?e[lr]=[n]:t.push(n)}function Ed(e,n){const t=e[lr],i=t.indexOf(n);t.splice(i,1)}function Vo(e,n){if(e.length<=xe)return;const t=xe+n,i=e[t];if(i){const r=i[Ci];null!==r&&r!==e&&Ed(r,i),n>0&&(e[t-1][Xt]=i[Xt]);const o=ia(e,xe+n);!function SO(e,n){Pv(e,n),n[Se]=null,n[Xe]=null}(i[O],i);const s=o[An];null!==s&&s.detachView(o[O]),i[He]=null,i[Xt]=null,i[V]&=-129}return i}function Ya(e,n){if(!(256&n[V])){const t=n[U];t.destroyNode&&Ja(e,n,t,3,null,null),function OO(e){let n=e[mo];if(!n)return Dd(e[O],e);for(;n;){let t=null;if(Ke(n))t=n[mo];else{const i=n[xe];i&&(t=i)}if(!t){for(;n&&!n[Xt]&&n!==e;)Ke(n)&&Dd(n[O],n),n=n[He];null===n&&(n=e),Ke(n)&&Dd(n[O],n),t=n&&n[Xt]}n=t}}(n)}}function Dd(e,n){if(256&n[V])return;const t=J(null);try{n[V]&=-129,n[V]|=256,n[jt]&&Tc(n[jt]),function xO(e,n){let t;if(null!=e&&null!=(t=e.destroyHooks))for(let i=0;i=0?i[s]():i[-s].unsubscribe(),o+=2}else t[o].call(i[t[o+1]]);null!==i&&(n[rr]=null);const r=n[Qn];if(null!==r){n[Qn]=null;for(let o=0;o-1){const{encapsulation:o}=e.data[i.directiveStart+r];if(o===Yt.None||o===Yt.Emulated)return null}return ct(i,t)}}(e,n.parent,t)}function Si(e,n,t,i,r){e.insertBefore(n,t,i,r)}function Vv(e,n,t){e.appendChild(n,t)}function Hv(e,n,t,i,r){null!==i?Si(e,n,t,i,r):Vv(e,n,t)}function Qa(e,n){return e.parentNode(n)}let Id,Uv=function jv(e,n,t){return 40&e.type?ct(e,t):null};function Ka(e,n,t,i){const r=bd(e,i,n),o=n[U],a=function Bv(e,n,t){return Uv(e,n,t)}(i.parent||n[Xe],i,n);if(null!=r)if(Array.isArray(t))for(let l=0;lP&&Yv(e,n,P,!1),mn(s?2:0,r),t(i,r)}finally{bi(o),mn(s?3:1,r)}}function Od(e,n,t){if(Du(n)){const i=J(null);try{const o=n.directiveEnd;for(let s=n.directiveStart;snull;function e_(e,n,t,i,r){for(let o in n){if(!n.hasOwnProperty(o))continue;const s=n[o];if(void 0===s)continue;i??={};let a,l=Zn.None;Array.isArray(s)?(a=s[0],l=s[1]):a=s;let c=o;if(null!==r){if(!r.hasOwnProperty(o))continue;c=r[o]}0===e?t_(i,t,c,a,l):t_(i,t,c,a)}return i}function t_(e,n,t,i,r){let o;e.hasOwnProperty(t)?(o=e[t]).push(n,i):o=e[t]=[n,i],void 0!==r&&o.push(r)}function bt(e,n,t,i,r,o,s,a){const l=ct(n,t);let u,c=n.inputs;!a&&null!=c&&(u=c[i])?(Fd(e,t,u,i,r),wi(n)&&function QO(e,n){const t=Lt(n,e);16&t[V]||(t[V]|=64)}(t,n.index)):3&n.type&&(i=function YO(e){return"class"===e?"className":"for"===e?"htmlFor":"formaction"===e?"formAction":"innerHtml"===e?"innerHTML":"readonly"===e?"readOnly":"tabindex"===e?"tabIndex":e}(i),r=null!=s?s(r,n.value||"",i):r,o.setProperty(l,i,r))}function Rd(e,n,t,i){if(Yg()){const r=null===i?null:{"":-1},o=function nN(e,n){const t=e.directiveRegistry;let i=null,r=null;if(t)for(let o=0;o0;){const t=e[--n];if("number"==typeof t&&t<0)return t}return 0})(s)!=a&&s.push(a),s.push(t,i,o)}}(e,n,i,Bo(e,t,r.hostVars,Y),r)}function yn(e,n,t,i,r,o){const s=ct(e,n);!function Pd(e,n,t,i,r,o,s){if(null==o)e.removeAttribute(n,r,t);else{const a=null==s?Z(o):s(o,i||"",r);e.setAttribute(n,r,a,t)}}(n[U],s,o,e.value,t,i,r)}function lN(e,n,t,i,r,o){const s=o[n];if(null!==s)for(let a=0;a{_a(e.lView)},consumerOnSignalRead(){this.lView[jt]=this}},_N={...Fs,consumerIsAlwaysLive:!0,consumerMarkedDirty:e=>{let n=xn(e.lView);for(;n&&!f_(n[O]);)n=xn(n);n&&qg(n)},consumerOnSignalRead(){this.lView[jt]=this}};function f_(e){return 2!==e.type}const yN=100;function nl(e,n=!0,t=0){const i=e[hn],r=i.rendererFactory;r.begin?.();try{!function CN(e,n){const t=Xg();try{em(!0),Bd(e,n);let i=0;for(;wo(e);){if(i===yN)throw new T(103,!1);i++,Bd(e,1)}}finally{em(t)}}(e,t)}catch(s){throw n&&tl(e,s),s}finally{r.end?.(),i.inlineEffectRunner?.flush()}}function wN(e,n,t,i){const r=n[V];if(!(256&~r))return;n[hn].inlineEffectRunner?.flush(),Fu(n);let a=!0,l=null,c=null;f_(e)?(c=function hN(e){return e[jt]??function pN(e){const n=d_.pop()??Object.create(mN);return n.lView=e,n}(e)}(n),l=Vs(c)):null===function Ep(){return Ae}()?(a=!1,c=function vN(e){const n=e[jt]??Object.create(_N);return n.lView=e,n}(n),l=Vs(c)):n[jt]&&(Tc(n[jt]),n[jt]=null);try{Gg(n),function tm(e){return $.lFrame.bindingIndex=e}(e.bindingStartIndex),null!==t&&Kv(e,n,t,2,i);const u=!(3&~r);if(u){const h=e.preOrderCheckHooks;null!==h&&Da(n,h,null)}else{const h=e.preOrderHooks;null!==h&&ba(n,h,0,null),Hu(n,0)}if(function EN(e){for(let n=$m(e);null!==n;n=zm(n)){if(!(n[V]&ma.HasTransplantedViews))continue;const t=n[lr];for(let i=0;i-1&&(Vo(n,i),ia(t,i))}this._attachedToViewContainer=!1}Ya(this._lView[O],this._lView)}onDestroy(n){ya(this._lView,n)}markForCheck(){Uo(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[V]&=-129}reattach(){Ou(this._lView),this._lView[V]|=128}detectChanges(){this._lView[V]|=1024,nl(this._lView,this.notifyErrorHandler)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new T(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;const n=_o(this._lView),t=this._lView[Ci];null!==t&&!n&&Ed(t,this._lView),Pv(this._lView[O],this._lView)}attachToAppRef(n){if(this._attachedToViewContainer)throw new T(902,!1);this._appRef=n;const t=_o(this._lView),i=this._lView[Ci];null!==i&&!t&&kv(i,this._lView),Ou(this._lView)}}let Fn=(()=>{class e{static#e=this.__NG_ELEMENT_ID__=MN}return e})();const bN=Fn,IN=class extends bN{constructor(n,t,i){super(),this._declarationLView=n,this._declarationTContainer=t,this.elementRef=i}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(n,t){return this.createEmbeddedViewImpl(n,t)}createEmbeddedViewImpl(n,t,i){const r=function br(e,n,t,i){const r=J(null);try{const o=n.tView,l=Xa(e,o,t,4096&e[V]?4096:16,null,n,null,null,i?.injector??null,i?.embeddedViewInjector??null,i?.dehydratedView??null);l[Ci]=e[n.index];const u=e[An];return null!==u&&(l[An]=u.createEmbeddedView(o)),Vd(o,l,t),l}finally{J(r)}}(this._declarationLView,this._declarationTContainer,n,{embeddedViewInjector:t,dehydratedView:i});return new $o(r)}};function MN(){return il(ge(),w())}function il(e,n){return 4&e.type?new IN(n,e,fr(e,n)):null}class Sr{}const Ko=new R("",{providedIn:"root",factory:()=>!1}),V_=new R("");class _A{}class H_{}class CA{resolveComponentFactory(n){throw function yA(e){const n=Error(`No component factory found for ${$e(e)}.`);return n.ngComponent=e,n}(n)}}class cl{static#e=this.NULL=new CA}class Kd{}let rn=(()=>{class e{constructor(){this.destroyNode=null}static#e=this.__NG_ELEMENT_ID__=()=>function wA(){const e=w(),t=Lt(ge().index,e);return(Ke(t)?t:e)[U]}()}return e})(),EA=(()=>{class e{static#e=this.\u0275prov=ie({token:e,providedIn:"root",factory:()=>null})}return e})();const j_=new Set;function ft(e){j_.has(e)||(j_.add(e),performance?.mark?.("mark_feature_usage",{detail:{feature:e}}))}function U_(e){let n=!0;return setTimeout(()=>{n&&(n=!1,e())}),"function"==typeof me.requestAnimationFrame&&me.requestAnimationFrame(()=>{n&&(n=!1,e())}),()=>{n=!1}}function $_(e){let n=!0;return queueMicrotask(()=>{n&&e()}),()=>{n=!1}}function z_(...e){}class he{constructor({enableLongStackTrace:n=!1,shouldCoalesceEventChangeDetection:t=!1,shouldCoalesceRunChangeDetection:i=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new Ee(!1),this.onMicrotaskEmpty=new Ee(!1),this.onStable=new Ee(!1),this.onError=new Ee(!1),typeof Zone>"u")throw new T(908,!1);Zone.assertZonePatched();const r=this;r._nesting=0,r._outer=r._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(r._inner=r._inner.fork(new Zone.TaskTrackingZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(r._inner=r._inner.fork(Zone.longStackTraceZoneSpec)),r.shouldCoalesceEventChangeDetection=!i&&t,r.shouldCoalesceRunChangeDetection=i,r.callbackScheduled=!1,function IA(e){const n=()=>{!function bA(e){e.isCheckStableRunning||e.callbackScheduled||(e.callbackScheduled=!0,Zone.root.run(()=>{U_(()=>{e.callbackScheduled=!1,Xd(e),e.isCheckStableRunning=!0,Jd(e),e.isCheckStableRunning=!1})}),Xd(e))}(e)};e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(t,i,r,o,s,a)=>{if(function MA(e){return W_(e,"__ignore_ng_zone__")}(a))return t.invokeTask(r,o,s,a);try{return G_(e),t.invokeTask(r,o,s,a)}finally{(e.shouldCoalesceEventChangeDetection&&"eventTask"===o.type||e.shouldCoalesceRunChangeDetection)&&n(),q_(e)}},onInvoke:(t,i,r,o,s,a,l)=>{try{return G_(e),t.invoke(r,o,s,a,l)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!function SA(e){return W_(e,"__scheduler_tick__")}(a)&&n(),q_(e)}},onHasTask:(t,i,r,o)=>{t.hasTask(r,o),i===r&&("microTask"==o.change?(e._hasPendingMicrotasks=o.microTask,Xd(e),Jd(e)):"macroTask"==o.change&&(e.hasPendingMacrotasks=o.macroTask))},onHandleError:(t,i,r,o)=>(t.handleError(r,o),e.runOutsideAngular(()=>e.onError.emit(o)),!1)})}(r)}static isInAngularZone(){return typeof Zone<"u"&&!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!he.isInAngularZone())throw new T(909,!1)}static assertNotInAngularZone(){if(he.isInAngularZone())throw new T(909,!1)}run(n,t,i){return this._inner.run(n,t,i)}runTask(n,t,i,r){const o=this._inner,s=o.scheduleEventTask("NgZoneEvent: "+r,n,DA,z_,z_);try{return o.runTask(s,t,i)}finally{o.cancelTask(s)}}runGuarded(n,t,i){return this._inner.runGuarded(n,t,i)}runOutsideAngular(n){return this._outer.run(n)}}const DA={};function Jd(e){if(0==e._nesting&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Xd(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&!0===e.callbackScheduled)}function G_(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function q_(e){e._nesting--,Jd(e)}class ef{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new Ee,this.onMicrotaskEmpty=new Ee,this.onStable=new Ee,this.onError=new Ee}run(n,t,i){return n.apply(t,i)}runGuarded(n,t,i){return n.apply(t,i)}runOutsideAngular(n){return n()}runTask(n,t,i,r){return n.apply(t,i)}}function W_(e,n){return!(!Array.isArray(e)||1!==e.length)&&!0===e[0]?.data?.[n]}let ul=(()=>{class e{constructor(){this.handler=null,this.internalCallbacks=[]}execute(){this.executeInternalCallbacks(),this.handler?.execute()}executeInternalCallbacks(){const t=[...this.internalCallbacks];this.internalCallbacks.length=0;for(const i of t)i()}ngOnDestroy(){this.handler?.destroy(),this.handler=null,this.internalCallbacks.length=0}static#e=this.\u0275prov=ie({token:e,providedIn:"root",factory:()=>new e})}return e})();function fl(e,n,t){let i=t?e.styles:null,r=t?e.classes:null,o=0;if(null!==n)for(let s=0;s0&&Wv(e,t,o.join(" "))}}(h,Oe,_,i),void 0!==t&&function $A(e,n,t){const i=e.projection=[];for(let r=0;r{class e{static#e=this.__NG_ELEMENT_ID__=GA}return e})();function GA(){return ny(ge(),w())}const qA=Cn,ey=class extends qA{constructor(n,t,i){super(),this._lContainer=n,this._hostTNode=t,this._hostLView=i}get element(){return fr(this._hostTNode,this._hostLView)}get injector(){return new qe(this._hostTNode,this._hostLView)}get parentInjector(){const n=Sa(this._hostTNode,this._hostLView);if(Uu(n)){const t=Mo(n,this._hostLView),i=Io(n);return new qe(t[O].data[i+8],t)}return new qe(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(n){const t=ty(this._lContainer);return null!==t&&t[n]||null}get length(){return this._lContainer.length-xe}createEmbeddedView(n,t,i){let r,o;"number"==typeof i?r=i:null!=i&&(r=i.index,o=i.injector);const a=n.createEmbeddedViewImpl(t||{},o,null);return this.insertImpl(a,r,Oi(this._hostTNode,null)),a}createComponent(n,t,i,r,o){const s=n&&!function go(e){return"function"==typeof e}(n);let a;if(s)a=t;else{const g=t||{};a=g.index,i=g.injector,r=g.projectableNodes,o=g.environmentInjector||g.ngModuleRef}const l=s?n:new es(ee(n)),c=i||this.parentInjector;if(!o&&null==l.ngModule){const _=(s?c:this.parentInjector).get(Jt,null);_&&(o=_)}ee(l.componentType??{});const h=l.create(c,r,null,o);return this.insertImpl(h.hostView,a,Oi(this._hostTNode,null)),h}insert(n,t){return this.insertImpl(n,t,!0)}insertImpl(n,t,i){const r=n._lView;if(function _S(e){return it(e[He])}(r)){const a=this.indexOf(n);if(-1!==a)this.detach(a);else{const l=r[He],c=new ey(l,l[Xe],l[He]);c.detach(c.indexOf(n))}}const o=this._adjustIndex(t),s=this._lContainer;return function Ir(e,n,t,i=!0){const r=n[O];if(function NO(e,n,t,i){const r=xe+i,o=t.length;i>0&&(t[r-1][Xt]=n),i!1;class af{constructor(n){this.queryList=n,this.matches=null}clone(){return new af(this.queryList)}setDirty(){this.queryList.setDirty()}}class lf{constructor(n=[]){this.queries=n}createEmbeddedView(n){const t=n.queries;if(null!==t){const i=null!==n.contentQueries?n.contentQueries[0]:t.length,r=[];for(let o=0;on.trim())}(n):n}}class cf{constructor(n=[]){this.queries=n}elementStart(n,t){for(let i=0;i0)i.push(s[a/2]);else{const c=o[a+1],u=n[-l];for(let d=xe;d(Ic(n),n.value);return t[Zt]=n,t}(e),i=t[Zt];return n?.equal&&(i.equal=n.equal),t.set=r=>xp(i,r),t.update=r=>function HI(e,n){Ip()||Ap(),xp(e,n(e.value))}(i,r),t.asReadonly=py.bind(t),t}function py(){const e=this[Zt];if(void 0===e.readonlyFn){const n=()=>this();n[Zt]=e,e.readonlyFn=n}return e.readonlyFn}function gy(e){return function hy(e){return"function"==typeof e&&void 0!==e[Zt]}(e)&&"function"==typeof e.set}function ue(e){let n=function My(e){return Object.getPrototypeOf(e.prototype).constructor}(e.type),t=!0;const i=[e];for(;n;){let r;if(en(e))r=n.\u0275cmp||n.\u0275dir;else{if(n.\u0275cmp)throw new T(903,!1);r=n.\u0275dir}if(r){if(t){i.push(r);const s=e;s.inputs=pl(e.inputs),s.inputTransforms=pl(e.inputTransforms),s.declaredInputs=pl(e.declaredInputs),s.outputs=pl(e.outputs);const a=r.hostBindings;a&&mx(e,a);const l=r.viewQuery,c=r.contentQueries;if(l&&px(e,l),c&&gx(e,c),fx(e,r),r0(e.outputs,r.outputs),en(r)&&r.data.animation){const u=e.data;u.animation=(u.animation||[]).concat(r.data.animation)}}const o=r.features;if(o)for(let s=0;s=0;i--){const r=e[i];r.hostVars=n+=r.hostVars,r.hostAttrs=po(r.hostAttrs,t=po(t,r.hostAttrs))}}(i)}function fx(e,n){for(const t in n.inputs){if(!n.inputs.hasOwnProperty(t)||e.inputs.hasOwnProperty(t))continue;const i=n.inputs[t];if(void 0!==i&&(e.inputs[t]=i,e.declaredInputs[t]=n.declaredInputs[t],null!==n.inputTransforms)){const r=Array.isArray(i)?i[0]:i;if(!n.inputTransforms.hasOwnProperty(r))continue;e.inputTransforms??={},e.inputTransforms[r]=n.inputTransforms[r]}}}function pl(e){return e===dn?{}:e===ae?[]:e}function px(e,n){const t=e.viewQuery;e.viewQuery=t?(i,r)=>{n(i,r),t(i,r)}:n}function gx(e,n){const t=e.contentQueries;e.contentQueries=t?(i,r,o)=>{n(i,r,o),t(i,r,o)}:n}function mx(e,n){const t=e.hostBindings;e.hostBindings=t?(i,r)=>{n(i,r),t(i,r)}:n}class Ri{}class Dx{}class gf extends Ri{constructor(n,t,i){super(),this._parent=t,this._bootstrapComponents=[],this.destroyCbs=[],this.componentFactoryResolver=new J_(this);const r=function nt(e,n){const t=e[cg]||null;if(!t&&!0===n)throw new Error(`Type ${$e(e)} does not have '\u0275mod' property.`);return t}(n);this._bootstrapComponents=function Pt(e){return e instanceof Function?e():e}(r.bootstrap),this._r3Injector=Om(n,t,[{provide:Ri,useValue:this},{provide:cl,useValue:this.componentFactoryResolver},...i],$e(n),new Set(["environment"])),this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(n)}get injector(){return this._r3Injector}destroy(){const n=this._r3Injector;!n.destroyed&&n.destroy(),this.destroyCbs.forEach(t=>t()),this.destroyCbs=null}onDestroy(n){this.destroyCbs.push(n)}}class mf extends Dx{constructor(n){super(),this.moduleType=n}create(n){return new gf(this.moduleType,n,[])}}function gl(e){return!!vf(e)&&(Array.isArray(e)||!(e instanceof Map)&&Symbol.iterator in e)}function vf(e){return null!==e&&("function"==typeof e||"object"==typeof e)}function wn(e,n,t){return e[n]=t}function Re(e,n,t){return!Object.is(e[n],t)&&(e[n]=t,!0)}function Li(e,n,t,i){const r=Re(e,n,t);return Re(e,n+1,i)||r}function is(e,n,t,i,r,o,s,a,l,c){const u=t+P,d=n.firstCreatePass?function Nx(e,n,t,i,r,o,s,a,l){const c=n.consts,u=Ti(n,e,4,s||null,a||null);Rd(n,t,u,Ut(c,l)),Ea(n,u);const d=u.tView=xd(2,u,i,r,o,n.directiveRegistry,n.pipeRegistry,null,n.schemas,c,null);return null!==n.queries&&(n.queries.template(n,u),d.queries=n.queries.embeddedTView(u)),u}(u,n,e,i,r,o,s,a,l):n.data[u];tn(d,!1);const p=xy(n,e,d,t);Do()&&Ka(n,e,p,d),ot(p,e);const h=r_(p,e,p,d);return e[u]=h,el(e,h),function ry(e,n,t){return sf(e,n,t)}(h,d,e),va(d)&&Nd(n,e,d),null!=l&&Ad(e,d,c),d}function H(e,n,t,i,r,o,s,a){const l=w(),c=X();return is(l,c,e,n,t,i,r,Ut(c.consts,o),s,a),H}let xy=function Ry(e,n,t,i){return vn(!0),n[U].createComment("")};function pt(e,n,t,i){const r=w();return Re(r,nn(),n)&&(X(),yn(we(),r,e,n,t,i)),pt}function Vr(e,n,t,i){return Re(e,nn(),t)?n+Z(t)+i:Y}function El(e,n){return e<<17|n<<2}function ii(e){return e>>17&32767}function Tf(e){return 2|e}function ki(e){return(131068&e)>>2}function Of(e,n){return-131069&e|n<<2}function Nf(e){return 1|e}function uC(e,n,t,i){const r=e[t+1],o=null===n;let s=i?ii(r):ki(r),a=!1;for(;0!==s&&(!1===a||o);){const c=e[s+1];g1(e[s],n)&&(a=!0,e[s+1]=i?Nf(c):Tf(c)),s=i?ii(c):ki(c)}a&&(e[t+1]=i?Tf(r):Nf(r))}function g1(e,n){return null===e||null==n||(Array.isArray(e)?e[1]:e)===n||!(!Array.isArray(e)||"string"!=typeof n)&&er(e,n)>=0}const Ze={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function dC(e){return e.substring(Ze.key,Ze.keyEnd)}function fC(e,n){const t=Ze.textEnd;return t===n?-1:(n=Ze.keyEnd=function y1(e,n,t){for(;n32;)n++;return n}(e,Ze.key=n,t),qr(e,n,t))}function qr(e,n,t){for(;n=0;t=fC(n,t))Rt(e,dC(n),!0)}function on(e,n,t,i){const r=w(),o=X(),s=Ln(2);o.firstUpdatePass&&_C(o,e,s,i),n!==Y&&Re(r,s,n)&&CC(o,o.data[et()],r,r[U],e,r[s+1]=function A1(e,n){return null==e||""===e||("string"==typeof n?e+=n:"object"==typeof e&&(e=$e(Jn(e)))),e}(n,t),i,s)}function vC(e,n){return n>=e.expandoStartIndex}function _C(e,n,t,i){const r=e.data;if(null===r[t+1]){const o=r[et()],s=vC(e,t);EC(o,i)&&null===n&&!s&&(n=!1),n=function b1(e,n,t,i){const r=function Pu(e){const n=$.lFrame.currentDirectiveIndex;return-1===n?null:e[n]}(e);let o=i?n.residualClasses:n.residualStyles;if(null===r)0===(i?n.classBindings:n.styleBindings)&&(t=as(t=xf(null,e,n,t,i),n.attrs,i),o=null);else{const s=n.directiveStylingLast;if(-1===s||e[s]!==r)if(t=xf(r,e,n,t,i),null===o){let l=function I1(e,n,t){const i=t?n.classBindings:n.styleBindings;if(0!==ki(i))return e[ii(i)]}(e,n,i);void 0!==l&&Array.isArray(l)&&(l=xf(null,e,n,l[1],i),l=as(l,n.attrs,i),function M1(e,n,t,i){e[ii(t?n.classBindings:n.styleBindings)]=i}(e,n,i,l))}else o=function S1(e,n,t){let i;const r=n.directiveEnd;for(let o=1+n.directiveStylingLast;o0)&&(c=!0)):u=t,r)if(0!==l){const p=ii(e[a+1]);e[i+1]=El(p,a),0!==p&&(e[p+1]=Of(e[p+1],i)),e[a+1]=function d1(e,n){return 131071&e|n<<17}(e[a+1],i)}else e[i+1]=El(a,0),0!==a&&(e[a+1]=Of(e[a+1],i)),a=i;else e[i+1]=El(l,0),0===a?a=i:e[l+1]=Of(e[l+1],i),l=i;c&&(e[i+1]=Tf(e[i+1])),uC(e,u,i,!0),uC(e,u,i,!1),function p1(e,n,t,i,r){const o=r?e.residualClasses:e.residualStyles;null!=o&&"string"==typeof n&&er(o,n)>=0&&(t[i+1]=Nf(t[i+1]))}(n,u,e,i,o),s=El(a,l),o?n.classBindings=s:n.styleBindings=s}(r,o,n,t,s,i)}}function xf(e,n,t,i,r){let o=null;const s=t.directiveEnd;let a=t.directiveStylingLast;for(-1===a?a=t.directiveStart:a++;a0;){const l=e[r],c=Array.isArray(l),u=c?l[1]:l,d=null===u;let p=t[r+1];p===Y&&(p=d?ae:void 0);let h=d?uu(p,i):u===i?p:void 0;if(c&&!bl(h)&&(h=uu(l,i)),bl(h)&&(a=h,s))return a;const g=e[r+1];r=s?ii(g):ki(g)}if(null!==n){let l=o?n.residualClasses:n.residualStyles;null!=l&&(a=uu(l,i))}return a}function bl(e){return void 0!==e}function EC(e,n){return!!(e.flags&(n?8:16))}function bn(e,n,t){!function sn(e,n,t,i){const r=X(),o=Ln(2);r.firstUpdatePass&&_C(r,null,o,i);const s=w();if(t!==Y&&Re(s,o,t)){const a=r.data[et()];if(EC(a,i)&&!vC(r,o)){let l=i?a.classesWithoutHost:a.stylesWithoutHost;null!==l&&(t=Zc(l,t||"")),Af(r,a,s,t,i)}else!function N1(e,n,t,i,r,o,s,a){r===Y&&(r=ae);let l=0,c=0,u=0(vn(!0),Za(i,r,function cm(){return $.lFrame.currentNamespace}()));function te(e,n,t){const i=w(),r=X(),o=e+P,s=r.firstCreatePass?function nR(e,n,t,i,r){const o=n.consts,s=Ut(o,i),a=Ti(n,e,8,"ng-container",s);return null!==s&&fl(a,s,!0),Rd(n,t,a,Ut(o,r)),null!==n.queries&&n.queries.elementStart(n,a),a}(o,r,i,n,t):r.data[o];tn(s,!0);const a=TC(r,i,s,e);return i[o]=a,Do()&&Ka(r,i,a,s),ot(a,i),va(s)&&(Nd(r,i,s),Od(r,s,i)),null!=t&&Ad(i,s),te}function ne(){let e=ge();const n=X();return xu()?Ru():(e=e.parent,tn(e,!1)),n.firstCreatePass&&(Ea(n,e),Du(e)&&n.queries.elementEnd(e)),ne}let TC=(e,n,t,i)=>(vn(!0),wd(n[U],""));function Ie(){return w()}const Zr="en-US";let RC=Zr;let JC=(e,n,t)=>{};function W(e,n,t,i){const r=w(),o=X(),s=ge();return Hf(o,r,r[U],s,e,n,i),W}function Hf(e,n,t,i,r,o,s){const a=va(i),c=e.firstCreatePass&&a_(e),u=n[Ce],d=s_(n);let p=!0;if(3&i.type||s){const _=ct(i,n),D=s?s(_):_,S=d.length,E=s?Q=>s(le(Q[i.index])):i.index;let F=null;if(!s&&a&&(F=function ZR(e,n,t,i){const r=e.cleanup;if(null!=r)for(let o=0;ol?a[l]:null}"string"==typeof s&&(o+=2)}return null}(e,n,r,i.index)),null!==F)(F.__ngLastListenerFn__||F).__ngNextListenerFn__=o,F.__ngLastListenerFn__=o,p=!1;else{o=tw(i,n,u,o),JC(_,r,o);const Q=t.listen(D,r,o);d.push(o,Q),c&&c.push(r,E,S,S+1)}}else o=tw(i,n,u,o);const h=i.outputs;let g;if(p&&null!==h&&(g=h[r])){const _=g.length;if(_)for(let D=0;D<_;D+=2){const se=n[g[D]][g[D+1]].subscribe(o),Oe=d.length;d.push(o,se),c&&c.push(r,i.index,Oe,-(Oe+1))}}}function ew(e,n,t,i){const r=J(null);try{return mn(6,n,t),!1!==t(i)}catch(o){return tl(e,o),!1}finally{mn(7,n,t),J(r)}}function tw(e,n,t,i){return function r(o){if(o===Function)return i;Uo(e.componentOffset>-1?Lt(e.index,n):n,5);let a=ew(n,t,i,o),l=r.__ngNextListenerFn__;for(;l;)a=ew(n,t,l,o)&&a,l=l.__ngNextListenerFn__;return a}}function v(e=1){return function AS(e){return($.lFrame.contextLView=function Wg(e,n){for(;e>0;)n=n[or],e--;return n}(e,$.lFrame.contextLView))[Ce]}(e)}function Hn(e,n,t){return Bf(e,"",n,"",t),Hn}function Bf(e,n,t,i,r){const o=w(),s=Vr(o,n,t,i);return s!==Y&&bt(X(),we(),o,e,s,o[U],r,!1),Bf}function uw(e,n,t,i){!function uy(e,n,t,i){const r=X();if(r.firstCreatePass){const o=ge();dy(r,new sy(n,t,i),o.index),function nx(e,n){const t=e.contentQueries||(e.contentQueries=[]);n!==(t.length?t[t.length-1]:-1)&&t.push(e.queries.length-1,n)}(r,e),!(2&~t)&&(r.staticContentQueries=!0)}return ly(r,w(),t)}(e,n,t,i)}function Ft(e,n,t){!function cy(e,n,t){const i=X();return i.firstCreatePass&&(dy(i,new sy(e,n,t),-1),!(2&~n)&&(i.staticViewQueries=!0)),ly(i,w(),n)}(e,n,t)}function Mt(e){const n=w(),t=X(),i=ku();wa(i+1);const r=hf(t,i);if(e.dirty&&function vS(e){return!(4&~e[V])}(n)===!(2&~r.metadata.flags)){if(null===r.matches)e.reset([]);else{const o=fy(n,i);e.reset(o,Rm),e.notifyOnChanges()}return!0}return!1}function St(){return function ff(e,n){return e[An].queries[n].queryList}(w(),ku())}function b(e,n=""){const t=w(),i=X(),r=e+P,o=i.firstCreatePass?Ti(i,r,1,n,null):i.data[r],s=Cw(i,t,o,n,e);t[r]=s,Do()&&Ka(i,t,s,o),tn(o,!1)}let Cw=(e,n,t,i,r)=>(vn(!0),function Cd(e,n){return e.createText(n)}(n[U],i));function A(e){return K("",e,""),A}function K(e,n,t){const i=w(),r=Vr(i,e,n,t);return r!==Y&&function kn(e,n,t){const i=yo(n,e);!function Lv(e,n,t){e.setValue(n,t)}(e[U],i,t)}(i,et(),r),K}function tt(e,n,t){gy(n)&&(n=n());const i=w();return Re(i,nn(),n)&&bt(X(),we(),i,e,n,i[U],t,!1),tt}function Ne(e,n){const t=gy(e);return t&&e.set(n),t}function st(e,n){const t=w(),i=X(),r=ge();return Hf(i,t,t[U],r,e,n),st}function Uf(e,n,t,i,r){if(e=j(e),Array.isArray(e))for(let o=0;o>20;if(yi(e)||!e.multi){const h=new bo(c,r,M),g=zf(l,n,r?u:u+p,d);-1===g?(Gu(Ma(a,s),o,l),$f(o,e,n.length),n.push(l),a.directiveStart++,a.directiveEnd++,r&&(a.providerIndexes+=1048576),t.push(h),s.push(h)):(t[g]=h,s[g]=h)}else{const h=zf(l,n,u+p,d),g=zf(l,n,u,u+p),D=g>=0&&t[g];if(r&&!D||!r&&!(h>=0&&t[h])){Gu(Ma(a,s),o,l);const S=function yL(e,n,t,i,r){const o=new bo(e,t,M);return o.multi=[],o.index=n,o.componentProviders=0,Aw(o,r,i&&!t),o}(r?_L:vL,t.length,r,i,c);!r&&D&&(t[g].providerFactory=S),$f(o,e,n.length,0),n.push(l),a.directiveStart++,a.directiveEnd++,r&&(a.providerIndexes+=1048576),t.push(S),s.push(S)}else $f(o,e,h>-1?h:g,Aw(t[r?g:h],c,!r&&i));!r&&i&&D&&t[g].componentProviders++}}}function $f(e,n,t,i){const r=yi(n),o=function G0(e){return!!e.useClass}(n);if(r||o){const l=(o?j(n.useClass):n).prototype.ngOnDestroy;if(l){const c=e.destroyHooks||(e.destroyHooks=[]);if(!r&&n.multi){const u=c.indexOf(t);-1===u?c.push(t,[i,l]):c[u+1].push(i,l)}else c.push(t,l)}}}function Aw(e,n,t){return t&&e.componentProviders++,e.multi.push(n)-1}function zf(e,n,t,i){for(let r=t;r{t.providersResolver=(i,r)=>function mL(e,n,t){const i=X();if(i.firstCreatePass){const r=en(e);Uf(t,i.data,i.blueprint,r,!0),Uf(n,i.data,i.blueprint,r,!1)}}(i,r?r(e):e,n)}}function hs(e,n,t,i){return function Lw(e,n,t,i,r,o){const s=n+t;return Re(e,s,r)?wn(e,s+1,o?i.call(o,r):i(r)):ps(e,s+1)}(w(),ut(),e,n,t,i)}function qf(e,n,t,i,r){return function Pw(e,n,t,i,r,o,s){const a=n+t;return Li(e,a,r,o)?wn(e,a+2,s?i.call(s,r,o):i(r,o)):ps(e,a+2)}(w(),ut(),e,n,t,i,r)}function Ye(e,n,t,i,r,o){return kw(w(),ut(),e,n,t,i,r,o)}function ps(e,n){const t=e[n];return t===Y?void 0:t}function kw(e,n,t,i,r,o,s,a){const l=n+t;return function ml(e,n,t,i,r){const o=Li(e,n,t,i);return Re(e,n+2,r)||o}(e,l,r,o,s)?wn(e,l+3,a?i.call(a,r,o,s):i(r,o,s)):ps(e,l+3)}function Bw(e,n,t,i,r){const o=e+P,s=w(),a=function Ei(e,n){return e[n]}(s,o);return function gs(e,n){return e[O].data[n].pure}(s,o)?kw(s,ut(),n,a.transform,t,i,r,a):a.transform(t,i,r)}const sE=new R(""),Ll=new R("");let eh,Jf=(()=>{class e{constructor(t,i,r){this._ngZone=t,this.registry=i,this._isZoneStable=!0,this._callbacks=[],this.taskTrackingZone=null,eh||(function AP(e){eh=e}(r),r.addToWindow(i)),this._watchAngularEvents(),t.run(()=>{this.taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{he.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;0!==this._callbacks.length;){let t=this._callbacks.pop();clearTimeout(t.timeoutId),t.doneCb()}});else{let t=this.getPendingTasks();this._callbacks=this._callbacks.filter(i=>!i.updateCb||!i.updateCb(t)||(clearTimeout(i.timeoutId),!1))}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(t=>({source:t.source,creationLocation:t.creationLocation,data:t.data})):[]}addCallback(t,i,r){let o=-1;i&&i>0&&(o=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==o),t()},i)),this._callbacks.push({doneCb:t,timeoutId:o,updateCb:r})}whenStable(t,i,r){if(r&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(t,i,r),this._runCallbacksIfReady()}registerApplication(t){this.registry.registerApplication(t,this)}unregisterApplication(t){this.registry.unregisterApplication(t)}findProviders(t,i,r){return[]}static#e=this.\u0275fac=function(i){return new(i||e)(oe(he),oe(Xf),oe(Ll))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})(),Xf=(()=>{class e{constructor(){this._applications=new Map}registerApplication(t,i){this._applications.set(t,i)}unregisterApplication(t){this._applications.delete(t)}unregisterAllApplications(){this._applications.clear()}getTestability(t){return this._applications.get(t)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(t,i=!0){return eh?.findTestabilityInTree(this,t,i)??null}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function Pl(e){return!!e&&"function"==typeof e.then}function aE(e){return!!e&&"function"==typeof e.subscribe}const xP=new R("");let th=(()=>{class e{constructor(){this.initialized=!1,this.done=!1,this.donePromise=new Promise((t,i)=>{this.resolve=t,this.reject=i}),this.appInits=L(xP,{optional:!0})??[]}runInitializers(){if(this.initialized)return;const t=[];for(const r of this.appInits){const o=r();if(Pl(o))t.push(o);else if(aE(o)){const s=new Promise((a,l)=>{o.subscribe({complete:a,error:l})});t.push(s)}}const i=()=>{this.done=!0,this.resolve()};Promise.all(t).then(()=>{i()}).catch(r=>{this.reject(r)}),0===t.length&&i(),this.initialized=!0}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();const nh=new R("");function uE(e,n){return Array.isArray(n)?n.reduce(uE,e):{...e,...n}}let In=(()=>{class e{constructor(){this._bootstrapListeners=[],this._runningTick=!1,this._destroyed=!1,this._destroyListeners=[],this._views=[],this.internalErrorHandler=L(Am),this.afterRenderEffectManager=L(ul),this.zonelessEnabled=L(Ko),this.externalTestViews=new Set,this.beforeRender=new un,this.afterTick=new un,this.componentTypes=[],this.components=[],this.isStable=L(hr).hasPendingTasks.pipe(Hc(t=>!t)),this._injector=L(Jt)}get allViews(){return[...this.externalTestViews.keys(),...this._views]}get destroyed(){return this._destroyed}get injector(){return this._injector}bootstrap(t,i){const r=t instanceof H_;if(!this._injector.get(th).done)throw!r&&function _i(e){const n=ee(e)||ze(e)||Je(e);return null!==n&&n.standalone}(t),new T(405,!1);let s;s=r?t:this._injector.get(cl).resolveComponentFactory(t),this.componentTypes.push(s.componentType);const a=function RP(e){return e.isBoundToModule}(s)?void 0:this._injector.get(Ri),c=s.create(We.NULL,[],i||s.selector,a),u=c.location.nativeElement,d=c.injector.get(sE,null);return d?.registerApplication(u),c.onDestroy(()=>{this.detachView(c.hostView),kl(this.components,c),d?.unregisterApplication(u)}),this._loadComponent(c),c}tick(){this._tick(!0)}_tick(t){if(this._runningTick)throw new T(101,!1);const i=J(null);try{this._runningTick=!0,this.detectChangesInAttachedViews(t)}catch(r){this.internalErrorHandler(r)}finally{this._runningTick=!1,J(i),this.afterTick.next()}}detectChangesInAttachedViews(t){let i=null;this._injector.destroyed||(i=this._injector.get(Kd,null,{optional:!0}));let r=0;const o=this.afterRenderEffectManager;for(;r<10;){const s=0===r;if(t||!s){this.beforeRender.next(s);for(let{_lView:a,notifyErrorHandler:l}of this._views)PP(a,l,s,this.zonelessEnabled)}else i?.begin?.(),i?.end?.();if(r++,o.executeInternalCallbacks(),!this.allViews.some(({_lView:a})=>wo(a))&&(o.execute(),!this.allViews.some(({_lView:a})=>wo(a))))break}}attachView(t){const i=t;this._views.push(i),i.attachToAppRef(this)}detachView(t){const i=t;kl(this._views,i),i.detachFromAppRef()}_loadComponent(t){this.attachView(t.hostView),this.tick(),this.components.push(t);const i=this._injector.get(nh,[]);[...this._bootstrapListeners,...i].forEach(r=>r(t))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(t=>t()),this._views.slice().forEach(t=>t.destroy())}finally{this._destroyed=!0,this._views=[],this._bootstrapListeners=[],this._destroyListeners=[]}}onDestroy(t){return this._destroyListeners.push(t),()=>kl(this._destroyListeners,t)}destroy(){if(this._destroyed)throw new T(406,!1);const t=this._injector;t.destroy&&!t.destroyed&&t.destroy()}get viewCount(){return this._views.length}warnIfDestroyed(){}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function kl(e,n){const t=e.indexOf(n);t>-1&&e.splice(t,1)}function PP(e,n,t,i){(t||wo(e))&&nl(e,n,t&&!i?0:1)}let HP=(()=>{class e{constructor(){this.zone=L(he),this.changeDetectionScheduler=L(Sr),this.applicationRef=L(In)}initialize(){this._onMicrotaskEmptySubscription||(this._onMicrotaskEmptySubscription=this.zone.onMicrotaskEmpty.subscribe({next:()=>{this.changeDetectionScheduler.runningTick||this.zone.run(()=>{this.applicationRef.tick()})}}))}ngOnDestroy(){this._onMicrotaskEmptySubscription?.unsubscribe()}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function ih({ngZoneFactory:e,ignoreChangesOutsideZone:n}){return e??=()=>new he(rh()),[{provide:he,useFactory:e},{provide:fn,multi:!0,useFactory:()=>{const t=L(HP,{optional:!0});return()=>t.initialize()}},{provide:fn,multi:!0,useFactory:()=>{const t=L(UP);return()=>{t.initialize()}}},{provide:Am,useFactory:jP},!0===n?{provide:V_,useValue:!0}:[]]}function jP(){const e=L(he),n=L($t);return t=>e.runOutsideAngular(()=>n.handleError(t))}function rh(e){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:e?.eventCoalescing??!1,shouldCoalesceRunChangeDetection:e?.runCoalescing??!1}}let UP=(()=>{class e{constructor(){this.subscription=new Ot,this.initialized=!1,this.zone=L(he),this.pendingTasks=L(hr)}initialize(){if(this.initialized)return;this.initialized=!0;let t=null;!this.zone.isStable&&!this.zone.hasPendingMacrotasks&&!this.zone.hasPendingMicrotasks&&(t=this.pendingTasks.add()),this.zone.runOutsideAngular(()=>{this.subscription.add(this.zone.onStable.subscribe(()=>{he.assertNotInAngularZone(),queueMicrotask(()=>{null!==t&&!this.zone.hasPendingMacrotasks&&!this.zone.hasPendingMicrotasks&&(this.pendingTasks.remove(t),t=null)})}))}),this.subscription.add(this.zone.onUnstable.subscribe(()=>{he.assertInAngularZone(),t??=this.pendingTasks.add()}))}ngOnDestroy(){this.subscription.unsubscribe()}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),_s=(()=>{class e{constructor(){this.appRef=L(In),this.taskService=L(hr),this.ngZone=L(he),this.zonelessEnabled=L(Ko),this.disableScheduling=L(V_,{optional:!0})??!1,this.zoneIsDefined=typeof Zone<"u"&&!!Zone.root.run,this.schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}],this.subscriptions=new Ot,this.cancelScheduledCallback=null,this.shouldRefreshViews=!1,this.useMicrotaskScheduler=!1,this.runningTick=!1,this.pendingRenderTaskId=null,this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{this.runningTick||this.cleanup()})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()})),this.disableScheduling||=!this.zonelessEnabled&&(this.ngZone instanceof ef||!this.zoneIsDefined)}notify(t){if(!this.zonelessEnabled&&5===t)return;switch(t){case 3:case 2:case 0:case 4:case 5:case 1:this.shouldRefreshViews=!0}if(!this.shouldScheduleTick())return;const i=this.useMicrotaskScheduler?$_:U_;this.pendingRenderTaskId=this.taskService.add(),this.zoneIsDefined?Zone.root.run(()=>{this.cancelScheduledCallback=i(()=>{this.tick(this.shouldRefreshViews)})}):this.cancelScheduledCallback=i(()=>{this.tick(this.shouldRefreshViews)})}shouldScheduleTick(){return!(this.disableScheduling||null!==this.pendingRenderTaskId||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&he.isInAngularZone())}tick(t){if(this.runningTick||this.appRef.destroyed)return;const i=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick(t)},void 0,this.schedulerTickApplyArgs)}catch(r){throw this.taskService.remove(i),r}finally{this.cleanup()}this.useMicrotaskScheduler=!0,$_(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(i)})}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.shouldRefreshViews=!1,this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,null!==this.pendingRenderTaskId){const t=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(t)}}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();const Bn=new R("",{providedIn:"root",factory:()=>L(Bn,re.Optional|re.SkipSelf)||function $P(){return typeof $localize<"u"&&$localize.locale||Zr}()}),sh=new R("");let gE=(()=>{class e{constructor(t){this._injector=t,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(t,i){const r=function TA(e="zone.js",n){return"noop"===e?new ef:"zone.js"===e?new he(n):e}(i?.ngZone,rh({eventCoalescing:i?.ngZoneEventCoalescing,runCoalescing:i?.ngZoneRunCoalescing}));return r.run(()=>{const o=i?.ignoreChangesOutsideZone,s=function Ix(e,n,t){return new gf(e,n,t)}(t.moduleType,this.injector,[...ih({ngZoneFactory:()=>r,ignoreChangesOutsideZone:o}),{provide:Sr,useExisting:_s}]),a=s.injector.get($t,null);return r.runOutsideAngular(()=>{const l=r.onError.subscribe({next:c=>{a.handleError(c)}});s.onDestroy(()=>{kl(this._modules,s),l.unsubscribe()})}),function cE(e,n,t){try{const i=t();return Pl(i)?i.catch(r=>{throw n.runOutsideAngular(()=>e.handleError(r)),r}):i}catch(i){throw n.runOutsideAngular(()=>e.handleError(i)),i}}(a,r,()=>{const l=s.injector.get(th);return l.runInitializers(),l.donePromise.then(()=>(function LC(e){"string"==typeof e&&(RC=e.toLowerCase().replace(/_/g,"-"))}(s.injector.get(Bn,Zr)||Zr),this._moduleDoBootstrap(s),s))})})}bootstrapModule(t,i=[]){const r=uE({},i);return function VP(e,n,t){const i=new mf(t);return Promise.resolve(i)}(0,0,t).then(o=>this.bootstrapModuleFactory(o,r))}_moduleDoBootstrap(t){const i=t.injector.get(In);if(t._bootstrapComponents.length>0)t._bootstrapComponents.forEach(r=>i.bootstrap(r));else{if(!t.instance.ngDoBootstrap)throw new T(-403,!1);t.instance.ngDoBootstrap(i)}this._modules.push(t)}onDestroy(t){this._destroyListeners.push(t)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new T(404,!1);this._modules.slice().forEach(i=>i.destroy()),this._destroyListeners.forEach(i=>i());const t=this._injector.get(sh,null);t&&(t.forEach(i=>i()),t.clear()),this._destroyed=!0}get destroyed(){return this._destroyed}static#e=this.\u0275fac=function(i){return new(i||e)(oe(We))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})(),ri=null;const mE=new R("");function vE(e,n,t=[]){const i=`Platform: ${n}`,r=new R(i);return(o=[])=>{let s=ah();if(!s||s.injector.get(mE,!1)){const a=[...t,...o,{provide:r,useValue:!0}];e?e(a):function qP(e){if(ri&&!ri.get(mE,!1))throw new T(400,!1);(function lE(){!function FI(e){Np=e}(()=>{throw new T(600,!1)})})(),ri=e;const n=e.get(gE);(function yE(e){e.get(Xm,null)?.forEach(t=>t())})(e)}(function _E(e=[],n){return We.create({name:n,providers:[{provide:vu,useValue:"platform"},{provide:sh,useValue:new Set([()=>ri=null])},...e]})}(a,i))}return function WP(e){const n=ah();if(!n)throw new T(401,!1);return n}()}}function ah(){return ri?.get(gE)??null}let Vi=(()=>{class e{static#e=this.__NG_ELEMENT_ID__=YP}return e})();function YP(e){return function QP(e,n,t){if(wi(e)&&!t){const i=Lt(e.index,n);return new $o(i,i)}return 175&e.type?new $o(n[Te],n):null}(ge(),w(),!(16&~e))}class bE{constructor(){}supports(n){return gl(n)}create(n){return new tk(n)}}const ek=(e,n)=>n;class tk{constructor(n){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=n||ek}forEachItem(n){let t;for(t=this._itHead;null!==t;t=t._next)n(t)}forEachOperation(n){let t=this._itHead,i=this._removalsHead,r=0,o=null;for(;t||i;){const s=!i||t&&t.currentIndex{s=this._trackByFn(r,a),null!==t&&Object.is(t.trackById,s)?(i&&(t=this._verifyReinsertion(t,a,s,r)),Object.is(t.item,a)||this._addIdentityChange(t,a)):(t=this._mismatch(t,a,s,r),i=!0),t=t._next,r++}),this.length=r;return this._truncate(t),this.collection=n,this.isDirty}get isDirty(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead}_reset(){if(this.isDirty){let n;for(n=this._previousItHead=this._itHead;null!==n;n=n._next)n._nextPrevious=n._next;for(n=this._additionsHead;null!==n;n=n._nextAdded)n.previousIndex=n.currentIndex;for(this._additionsHead=this._additionsTail=null,n=this._movesHead;null!==n;n=n._nextMoved)n.previousIndex=n.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(n,t,i,r){let o;return null===n?o=this._itTail:(o=n._prev,this._remove(n)),null!==(n=null===this._unlinkedRecords?null:this._unlinkedRecords.get(i,null))?(Object.is(n.item,t)||this._addIdentityChange(n,t),this._reinsertAfter(n,o,r)):null!==(n=null===this._linkedRecords?null:this._linkedRecords.get(i,r))?(Object.is(n.item,t)||this._addIdentityChange(n,t),this._moveAfter(n,o,r)):n=this._addAfter(new nk(t,i),o,r),n}_verifyReinsertion(n,t,i,r){let o=null===this._unlinkedRecords?null:this._unlinkedRecords.get(i,null);return null!==o?n=this._reinsertAfter(o,n._prev,r):n.currentIndex!=r&&(n.currentIndex=r,this._addToMoves(n,r)),n}_truncate(n){for(;null!==n;){const t=n._next;this._addToRemovals(this._unlink(n)),n=t}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(n,t,i){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(n);const r=n._prevRemoved,o=n._nextRemoved;return null===r?this._removalsHead=o:r._nextRemoved=o,null===o?this._removalsTail=r:o._prevRemoved=r,this._insertAfter(n,t,i),this._addToMoves(n,i),n}_moveAfter(n,t,i){return this._unlink(n),this._insertAfter(n,t,i),this._addToMoves(n,i),n}_addAfter(n,t,i){return this._insertAfter(n,t,i),this._additionsTail=null===this._additionsTail?this._additionsHead=n:this._additionsTail._nextAdded=n,n}_insertAfter(n,t,i){const r=null===t?this._itHead:t._next;return n._next=r,n._prev=t,null===r?this._itTail=n:r._prev=n,null===t?this._itHead=n:t._next=n,null===this._linkedRecords&&(this._linkedRecords=new IE),this._linkedRecords.put(n),n.currentIndex=i,n}_remove(n){return this._addToRemovals(this._unlink(n))}_unlink(n){null!==this._linkedRecords&&this._linkedRecords.remove(n);const t=n._prev,i=n._next;return null===t?this._itHead=i:t._next=i,null===i?this._itTail=t:i._prev=t,n}_addToMoves(n,t){return n.previousIndex===t||(this._movesTail=null===this._movesTail?this._movesHead=n:this._movesTail._nextMoved=n),n}_addToRemovals(n){return null===this._unlinkedRecords&&(this._unlinkedRecords=new IE),this._unlinkedRecords.put(n),n.currentIndex=null,n._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=n,n._prevRemoved=null):(n._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=n),n}_addIdentityChange(n,t){return n.item=t,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=n:this._identityChangesTail._nextIdentityChange=n,n}}class nk{constructor(n,t){this.item=n,this.trackById=t,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null}}class ik{constructor(){this._head=null,this._tail=null}add(n){null===this._head?(this._head=this._tail=n,n._nextDup=null,n._prevDup=null):(this._tail._nextDup=n,n._prevDup=this._tail,n._nextDup=null,this._tail=n)}get(n,t){let i;for(i=this._head;null!==i;i=i._nextDup)if((null===t||t<=i.currentIndex)&&Object.is(i.trackById,n))return i;return null}remove(n){const t=n._prevDup,i=n._nextDup;return null===t?this._head=i:t._nextDup=i,null===i?this._tail=t:i._prevDup=t,null===this._head}}class IE{constructor(){this.map=new Map}put(n){const t=n.trackById;let i=this.map.get(t);i||(i=new ik,this.map.set(t,i)),i.add(n)}get(n,t){const r=this.map.get(n);return r?r.get(n,t):null}remove(n){const t=n.trackById;return this.map.get(t).remove(n)&&this.map.delete(t),n}get isEmpty(){return 0===this.map.size}clear(){this.map.clear()}}function ME(e,n,t){const i=e.previousIndex;if(null===i)return i;let r=0;return t&&i{if(t&&t.key===r)this._maybeAddToChanges(t,i),this._appendAfter=t,t=t._next;else{const o=this._getOrCreateRecordForKey(r,i);t=this._insertBeforeOrAppend(t,o)}}),t){t._prev&&(t._prev._next=null),this._removalsHead=t;for(let i=t;null!==i;i=i._nextRemoved)i===this._mapHead&&(this._mapHead=null),this._records.delete(i.key),i._nextRemoved=i._next,i.previousValue=i.currentValue,i.currentValue=null,i._prev=null,i._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(n,t){if(n){const i=n._prev;return t._next=n,t._prev=i,n._prev=t,i&&(i._next=t),n===this._mapHead&&(this._mapHead=t),this._appendAfter=n,n}return this._appendAfter?(this._appendAfter._next=t,t._prev=this._appendAfter):this._mapHead=t,this._appendAfter=t,null}_getOrCreateRecordForKey(n,t){if(this._records.has(n)){const r=this._records.get(n);this._maybeAddToChanges(r,t);const o=r._prev,s=r._next;return o&&(o._next=s),s&&(s._prev=o),r._next=null,r._prev=null,r}const i=new ok(n);return this._records.set(n,i),i.currentValue=t,this._addToAdditions(i),i}_reset(){if(this.isDirty){let n;for(this._previousMapHead=this._mapHead,n=this._previousMapHead;null!==n;n=n._next)n._nextPrevious=n._next;for(n=this._changesHead;null!==n;n=n._nextChanged)n.previousValue=n.currentValue;for(n=this._additionsHead;null!=n;n=n._nextAdded)n.previousValue=n.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(n,t){Object.is(t,n.currentValue)||(n.previousValue=n.currentValue,n.currentValue=t,this._addToChanges(n))}_addToAdditions(n){null===this._additionsHead?this._additionsHead=this._additionsTail=n:(this._additionsTail._nextAdded=n,this._additionsTail=n)}_addToChanges(n){null===this._changesHead?this._changesHead=this._changesTail=n:(this._changesTail._nextChanged=n,this._changesTail=n)}_forEach(n,t){n instanceof Map?n.forEach(t):Object.keys(n).forEach(i=>t(n[i],i))}}class ok{constructor(n){this.key=n,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null}}function TE(){return new fh([new bE])}let fh=(()=>{class e{static#e=this.\u0275prov=ie({token:e,providedIn:"root",factory:TE});constructor(t){this.factories=t}static create(t,i){if(null!=i){const r=i.factories.slice();t=t.concat(r)}return new e(t)}static extend(t){return{provide:e,useFactory:i=>e.create(t,i||TE()),deps:[[e,new lu,new au]]}}find(t){const i=this.factories.find(r=>r.supports(t));if(null!=i)return i;throw new T(901,!1)}}return e})();function OE(){return new Bl([new SE])}let Bl=(()=>{class e{static#e=this.\u0275prov=ie({token:e,providedIn:"root",factory:OE});constructor(t){this.factories=t}static create(t,i){if(i){const r=i.factories.slice();t=t.concat(r)}return new e(t)}static extend(t){return{provide:e,useFactory:i=>e.create(t,i||OE()),deps:[[e,new lu,new au]]}}find(t){const i=this.factories.find(r=>r.supports(t));if(i)return i;throw new T(901,!1)}}return e})();const lk=vE(null,"core",[]);let ck=(()=>{class e{constructor(t){}static#e=this.\u0275fac=function(i){return new(i||e)(oe(In))};static#t=this.\u0275mod=Yn({type:e});static#n=this.\u0275inj=On({})}return e})();const qE=new R("");function Es(e,n){ft("NgSignals");const t=function LI(e){const n=Object.create(PI);n.computation=e;const t=()=>{if(Dp(n),Ic(n),n.value===js)throw n.error;return n.value};return t[Zt]=n,t}(e);return n?.equal&&(t[Zt].equal=n.equal),t}function Mn(e){const n=J(null);try{return e()}finally{J(n)}}let iD=null;function Ds(){return iD}class Jk{}const oi=new R(""),Mh=/\s+/,fD=[];let Jr=(()=>{class e{constructor(t,i){this._ngEl=t,this._renderer=i,this.initialClasses=fD,this.stateMap=new Map}set klass(t){this.initialClasses=null!=t?t.trim().split(Mh):fD}set ngClass(t){this.rawClass="string"==typeof t?t.trim().split(Mh):t}ngDoCheck(){for(const i of this.initialClasses)this._updateState(i,!0);const t=this.rawClass;if(Array.isArray(t)||t instanceof Set)for(const i of t)this._updateState(i,!0);else if(null!=t)for(const i of Object.keys(t))this._updateState(i,!!t[i]);this._applyStateDiff()}_updateState(t,i){const r=this.stateMap.get(t);void 0!==r?(r.enabled!==i&&(r.changed=!0,r.enabled=i),r.touched=!0):this.stateMap.set(t,{enabled:i,changed:!0,touched:!0})}_applyStateDiff(){for(const t of this.stateMap){const i=t[0],r=t[1];r.changed?(this._toggleClass(i,r.enabled),r.changed=!1):r.touched||(r.enabled&&this._toggleClass(i,!1),this.stateMap.delete(i)),r.touched=!1}}_toggleClass(t,i){(t=t.trim()).length>0&&t.split(Mh).forEach(r=>{i?this._renderer.addClass(this._ngEl.nativeElement,r):this._renderer.removeClass(this._ngEl.nativeElement,r)})}static#e=this.\u0275fac=function(i){return new(i||e)(M(dt),M(rn))};static#t=this.\u0275dir=z({type:e,selectors:[["","ngClass",""]],inputs:{klass:[0,"class","klass"],ngClass:"ngClass"},standalone:!0})}return e})();class BF{constructor(n,t,i,r){this.$implicit=n,this.ngForOf=t,this.index=i,this.count=r}get first(){return 0===this.index}get last(){return this.index===this.count-1}get even(){return this.index%2==0}get odd(){return!this.even}}let Bi=(()=>{class e{set ngForOf(t){this._ngForOf=t,this._ngForOfDirty=!0}set ngForTrackBy(t){this._trackByFn=t}get ngForTrackBy(){return this._trackByFn}constructor(t,i,r){this._viewContainer=t,this._template=i,this._differs=r,this._ngForOf=null,this._ngForOfDirty=!0,this._differ=null}set ngForTemplate(t){t&&(this._template=t)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;const t=this._ngForOf;!this._differ&&t&&(this._differ=this._differs.find(t).create(this.ngForTrackBy))}if(this._differ){const t=this._differ.diff(this._ngForOf);t&&this._applyChanges(t)}}_applyChanges(t){const i=this._viewContainer;t.forEachOperation((r,o,s)=>{if(null==r.previousIndex)i.createEmbeddedView(this._template,new BF(r.item,this._ngForOf,-1,-1),null===s?void 0:s);else if(null==s)i.remove(null===o?void 0:o);else if(null!==o){const a=i.get(o);i.move(a,s),pD(a,r)}});for(let r=0,o=i.length;r{pD(i.get(r.currentIndex),r)})}static ngTemplateContextGuard(t,i){return!0}static#e=this.\u0275fac=function(i){return new(i||e)(M(Cn),M(Fn),M(fh))};static#t=this.\u0275dir=z({type:e,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"},standalone:!0})}return e})();function pD(e,n){e.context.$implicit=n.item}let $n=(()=>{class e{constructor(t,i){this._viewContainer=t,this._context=new jF,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=i}set ngIf(t){this._context.$implicit=this._context.ngIf=t,this._updateView()}set ngIfThen(t){gD("ngIfThen",t),this._thenTemplateRef=t,this._thenViewRef=null,this._updateView()}set ngIfElse(t){gD("ngIfElse",t),this._elseTemplateRef=t,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(t,i){return!0}static#e=this.\u0275fac=function(i){return new(i||e)(M(Cn),M(Fn))};static#t=this.\u0275dir=z({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"},standalone:!0})}return e})();class jF{constructor(){this.$implicit=null,this.ngIf=null}}function gD(e,n){if(n&&!n.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${$e(n)}'.`)}let vD=(()=>{class e{constructor(t,i,r){this._ngEl=t,this._differs=i,this._renderer=r,this._ngStyle=null,this._differ=null}set ngStyle(t){this._ngStyle=t,!this._differ&&t&&(this._differ=this._differs.find(t).create())}ngDoCheck(){if(this._differ){const t=this._differ.diff(this._ngStyle);t&&this._applyChanges(t)}}_setStyle(t,i){const[r,o]=t.split("."),s=-1===r.indexOf("-")?void 0:ei.DashCase;null!=i?this._renderer.setStyle(this._ngEl.nativeElement,r,o?`${i}${o}`:i,s):this._renderer.removeStyle(this._ngEl.nativeElement,r,s)}_applyChanges(t){t.forEachRemovedItem(i=>this._setStyle(i.key,null)),t.forEachAddedItem(i=>this._setStyle(i.key,i.currentValue)),t.forEachChangedItem(i=>this._setStyle(i.key,i.currentValue))}static#e=this.\u0275fac=function(i){return new(i||e)(M(dt),M(Bl),M(rn))};static#t=this.\u0275dir=z({type:e,selectors:[["","ngStyle",""]],inputs:{ngStyle:"ngStyle"},standalone:!0})}return e})(),_D=(()=>{class e{constructor(t){this._viewContainerRef=t,this._viewRef=null,this.ngTemplateOutletContext=null,this.ngTemplateOutlet=null,this.ngTemplateOutletInjector=null}ngOnChanges(t){if(this._shouldRecreateView(t)){const i=this._viewContainerRef;if(this._viewRef&&i.remove(i.indexOf(this._viewRef)),!this.ngTemplateOutlet)return void(this._viewRef=null);const r=this._createContextForwardProxy();this._viewRef=i.createEmbeddedView(this.ngTemplateOutlet,r,{injector:this.ngTemplateOutletInjector??void 0})}}_shouldRecreateView(t){return!!t.ngTemplateOutlet||!!t.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(t,i,r)=>!!this.ngTemplateOutletContext&&Reflect.set(this.ngTemplateOutletContext,i,r),get:(t,i,r)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,i,r)}})}static#e=this.\u0275fac=function(i){return new(i||e)(M(Cn))};static#t=this.\u0275dir=z({type:e,selectors:[["","ngTemplateOutlet",""]],inputs:{ngTemplateOutletContext:"ngTemplateOutletContext",ngTemplateOutlet:"ngTemplateOutlet",ngTemplateOutletInjector:"ngTemplateOutletInjector"},standalone:!0,features:[gn]})}return e})();let CD=(()=>{class e{transform(t,i,r){if(null==t)return null;if(!this.supports(t))throw function ln(e,n){return new T(2100,!1)}();return t.slice(i,r)}supports(t){return"string"==typeof t||Array.isArray(t)}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275pipe=wt({name:"slice",type:e,pure:!1,standalone:!0})}return e})(),wD=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=Yn({type:e});static#n=this.\u0275inj=On({})}return e})();function DD(e){return"server"===e}class $V extends Jk{constructor(){super(...arguments),this.supportsDOMEvents=!0}}class Lh extends $V{static makeCurrent(){!function Kk(e){iD??=e}(new Lh)}onAndCancel(n,t,i){return n.addEventListener(t,i),()=>{n.removeEventListener(t,i)}}dispatchEvent(n,t){n.dispatchEvent(t)}remove(n){n.parentNode&&n.parentNode.removeChild(n)}createElement(n,t){return(t=t||this.getDefaultDocument()).createElement(n)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(n){return n.nodeType===Node.ELEMENT_NODE}isShadowRoot(n){return n instanceof DocumentFragment}getGlobalEventTarget(n,t){return"window"===t?window:"document"===t?n:"body"===t?n.body:null}getBaseHref(n){const t=function zV(){return Ss=Ss||document.querySelector("base"),Ss?Ss.getAttribute("href"):null}();return null==t?null:function GV(e){return new URL(e,document.baseURI).pathname}(t)}resetBaseElement(){Ss=null}getUserAgent(){return window.navigator.userAgent}getCookie(n){return function VF(e,n){n=encodeURIComponent(n);for(const t of e.split(";")){const i=t.indexOf("="),[r,o]=-1==i?[t,""]:[t.slice(0,i),t.slice(i+1)];if(r.trim()===n)return decodeURIComponent(o)}return null}(document.cookie,n)}}let Ss=null,WV=(()=>{class e{build(){return new XMLHttpRequest}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})();const ac=new R("");let RD=(()=>{class e{constructor(t,i){this._zone=i,this._eventNameToPlugin=new Map,t.forEach(r=>{r.manager=this}),this._plugins=t.slice().reverse()}addEventListener(t,i,r){return this._findPluginFor(i).addEventListener(t,i,r)}getZone(){return this._zone}_findPluginFor(t){let i=this._eventNameToPlugin.get(t);if(i)return i;if(i=this._plugins.find(o=>o.supports(t)),!i)throw new T(5101,!1);return this._eventNameToPlugin.set(t,i),i}static#e=this.\u0275fac=function(i){return new(i||e)(oe(ac),oe(he))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})();class Ph{constructor(n){this._doc=n}}const kh="ng-app-id";let LD=(()=>{class e{constructor(t,i,r,o={}){this.doc=t,this.appId=i,this.nonce=r,this.platformId=o,this.styleRef=new Map,this.hostNodes=new Set,this.styleNodesInDOM=this.collectServerRenderedStyles(),this.platformIsServer=DD(o),this.resetHostNodes()}addStyles(t){for(const i of t)1===this.changeUsageCount(i,1)&&this.onStyleAdded(i)}removeStyles(t){for(const i of t)this.changeUsageCount(i,-1)<=0&&this.onStyleRemoved(i)}ngOnDestroy(){const t=this.styleNodesInDOM;t&&(t.forEach(i=>i.remove()),t.clear());for(const i of this.getAllStyles())this.onStyleRemoved(i);this.resetHostNodes()}addHost(t){this.hostNodes.add(t);for(const i of this.getAllStyles())this.addStyleToHost(t,i)}removeHost(t){this.hostNodes.delete(t)}getAllStyles(){return this.styleRef.keys()}onStyleAdded(t){for(const i of this.hostNodes)this.addStyleToHost(i,t)}onStyleRemoved(t){const i=this.styleRef;i.get(t)?.elements?.forEach(r=>r.remove()),i.delete(t)}collectServerRenderedStyles(){const t=this.doc.head?.querySelectorAll(`style[${kh}="${this.appId}"]`);if(t?.length){const i=new Map;return t.forEach(r=>{null!=r.textContent&&i.set(r.textContent,r)}),i}return null}changeUsageCount(t,i){const r=this.styleRef;if(r.has(t)){const o=r.get(t);return o.usage+=i,o.usage}return r.set(t,{usage:i,elements:[]}),i}getStyleElement(t,i){const r=this.styleNodesInDOM,o=r?.get(i);if(o?.parentNode===t)return r.delete(i),o.removeAttribute(kh),o;{const s=this.doc.createElement("style");return this.nonce&&s.setAttribute("nonce",this.nonce),s.textContent=i,this.platformIsServer&&s.setAttribute(kh,this.appId),t.appendChild(s),s}}addStyleToHost(t,i){const r=this.getStyleElement(t,i),o=this.styleRef,s=o.get(i)?.elements;s?s.push(r):o.set(i,{elements:[r],usage:1})}resetHostNodes(){const t=this.hostNodes;t.clear(),t.add(this.doc.head)}static#e=this.\u0275fac=function(i){return new(i||e)(oe(oi),oe(gr),oe(ev,8),oe(mr))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})();const Fh={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/Math/MathML"},Vh=/%COMP%/g,KV=new R("",{providedIn:"root",factory:()=>!0});function kD(e,n){return n.map(t=>t.replace(Vh,e))}let FD=(()=>{class e{constructor(t,i,r,o,s,a,l,c=null){this.eventManager=t,this.sharedStylesHost=i,this.appId=r,this.removeStylesOnCompDestroy=o,this.doc=s,this.platformId=a,this.ngZone=l,this.nonce=c,this.rendererByCompId=new Map,this.platformIsServer=DD(a),this.defaultRenderer=new Hh(t,s,l,this.platformIsServer)}createRenderer(t,i){if(!t||!i)return this.defaultRenderer;this.platformIsServer&&i.encapsulation===Yt.ShadowDom&&(i={...i,encapsulation:Yt.Emulated});const r=this.getOrCreateRenderer(t,i);return r instanceof HD?r.applyToHost(t):r instanceof Bh&&r.applyStyles(),r}getOrCreateRenderer(t,i){const r=this.rendererByCompId;let o=r.get(i.id);if(!o){const s=this.doc,a=this.ngZone,l=this.eventManager,c=this.sharedStylesHost,u=this.removeStylesOnCompDestroy,d=this.platformIsServer;switch(i.encapsulation){case Yt.Emulated:o=new HD(l,c,i,this.appId,u,s,a,d);break;case Yt.ShadowDom:return new t2(l,c,t,i,s,a,this.nonce,d);default:o=new Bh(l,c,i,u,s,a,d)}r.set(i.id,o)}return o}ngOnDestroy(){this.rendererByCompId.clear()}static#e=this.\u0275fac=function(i){return new(i||e)(oe(RD),oe(LD),oe(gr),oe(KV),oe(oi),oe(mr),oe(he),oe(ev))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})();class Hh{constructor(n,t,i,r){this.eventManager=n,this.doc=t,this.ngZone=i,this.platformIsServer=r,this.data=Object.create(null),this.throwOnSyntheticProps=!0,this.destroyNode=null}destroy(){}createElement(n,t){return t?this.doc.createElementNS(Fh[t]||t,n):this.doc.createElement(n)}createComment(n){return this.doc.createComment(n)}createText(n){return this.doc.createTextNode(n)}appendChild(n,t){(VD(n)?n.content:n).appendChild(t)}insertBefore(n,t,i){n&&(VD(n)?n.content:n).insertBefore(t,i)}removeChild(n,t){n&&n.removeChild(t)}selectRootElement(n,t){let i="string"==typeof n?this.doc.querySelector(n):n;if(!i)throw new T(-5104,!1);return t||(i.textContent=""),i}parentNode(n){return n.parentNode}nextSibling(n){return n.nextSibling}setAttribute(n,t,i,r){if(r){t=r+":"+t;const o=Fh[r];o?n.setAttributeNS(o,t,i):n.setAttribute(t,i)}else n.setAttribute(t,i)}removeAttribute(n,t,i){if(i){const r=Fh[i];r?n.removeAttributeNS(r,t):n.removeAttribute(`${i}:${t}`)}else n.removeAttribute(t)}addClass(n,t){n.classList.add(t)}removeClass(n,t){n.classList.remove(t)}setStyle(n,t,i,r){r&(ei.DashCase|ei.Important)?n.style.setProperty(t,i,r&ei.Important?"important":""):n.style[t]=i}removeStyle(n,t,i){i&ei.DashCase?n.style.removeProperty(t):n.style[t]=""}setProperty(n,t,i){null!=n&&(n[t]=i)}setValue(n,t){n.nodeValue=t}listen(n,t,i){if("string"==typeof n&&!(n=Ds().getGlobalEventTarget(this.doc,n)))throw new Error(`Unsupported event target ${n} for event ${t}`);return this.eventManager.addEventListener(n,t,this.decoratePreventDefault(i))}decoratePreventDefault(n){return t=>{if("__ngUnwrap__"===t)return n;!1===(this.platformIsServer?this.ngZone.runGuarded(()=>n(t)):n(t))&&t.preventDefault()}}}function VD(e){return"TEMPLATE"===e.tagName&&void 0!==e.content}class t2 extends Hh{constructor(n,t,i,r,o,s,a,l){super(n,o,s,l),this.sharedStylesHost=t,this.hostEl=i,this.shadowRoot=i.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const c=kD(r.id,r.styles);for(const u of c){const d=document.createElement("style");a&&d.setAttribute("nonce",a),d.textContent=u,this.shadowRoot.appendChild(d)}}nodeOrShadowRoot(n){return n===this.hostEl?this.shadowRoot:n}appendChild(n,t){return super.appendChild(this.nodeOrShadowRoot(n),t)}insertBefore(n,t,i){return super.insertBefore(this.nodeOrShadowRoot(n),t,i)}removeChild(n,t){return super.removeChild(this.nodeOrShadowRoot(n),t)}parentNode(n){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(n)))}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}}class Bh extends Hh{constructor(n,t,i,r,o,s,a,l){super(n,o,s,a),this.sharedStylesHost=t,this.removeStylesOnCompDestroy=r,this.styles=l?kD(l,i.styles):i.styles}applyStyles(){this.sharedStylesHost.addStyles(this.styles)}destroy(){this.removeStylesOnCompDestroy&&this.sharedStylesHost.removeStyles(this.styles)}}class HD extends Bh{constructor(n,t,i,r,o,s,a,l){const c=r+"-"+i.id;super(n,t,i,o,s,a,l,c),this.contentAttr=function JV(e){return"_ngcontent-%COMP%".replace(Vh,e)}(c),this.hostAttr=function XV(e){return"_nghost-%COMP%".replace(Vh,e)}(c)}applyToHost(n){this.applyStyles(),this.setAttribute(n,this.hostAttr,"")}createElement(n,t){const i=super.createElement(n,t);return super.setAttribute(i,this.contentAttr,""),i}}let n2=(()=>{class e extends Ph{constructor(t){super(t)}supports(t){return!0}addEventListener(t,i,r){return t.addEventListener(i,r,!1),()=>this.removeEventListener(t,i,r)}removeEventListener(t,i,r){return t.removeEventListener(i,r)}static#e=this.\u0275fac=function(i){return new(i||e)(oe(oi))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})(),i2=(()=>{class e extends Ph{constructor(t){super(t),this.delegate=L(qE,{optional:!0})}supports(t){return!!this.delegate&&this.delegate.supports(t)}addEventListener(t,i,r){return this.delegate.addEventListener(t,i,r)}removeEventListener(t,i,r){return this.delegate.removeEventListener(t,i,r)}static#e=this.\u0275fac=function(i){return new(i||e)(oe(oi))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})();const BD=["alt","control","meta","shift"],r2={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},o2={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let s2=(()=>{class e extends Ph{constructor(t){super(t)}supports(t){return null!=e.parseEventName(t)}addEventListener(t,i,r){const o=e.parseEventName(i),s=e.eventCallback(o.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>Ds().onAndCancel(t,o.domEventName,s))}static parseEventName(t){const i=t.toLowerCase().split("."),r=i.shift();if(0===i.length||"keydown"!==r&&"keyup"!==r)return null;const o=e._normalizeKey(i.pop());let s="",a=i.indexOf("code");if(a>-1&&(i.splice(a,1),s="code."),BD.forEach(c=>{const u=i.indexOf(c);u>-1&&(i.splice(u,1),s+=c+".")}),s+=o,0!=i.length||0===o.length)return null;const l={};return l.domEventName=r,l.fullKey=s,l}static matchEventFullKeyCode(t,i){let r=r2[t.key]||t.key,o="";return i.indexOf("code.")>-1&&(r=t.code,o="code."),!(null==r||!r)&&(r=r.toLowerCase()," "===r?r="space":"."===r&&(r="dot"),BD.forEach(s=>{s!==r&&(0,o2[s])(t)&&(o+=s+".")}),o+=r,o===i)}static eventCallback(t,i,r){return o=>{e.matchEventFullKeyCode(o,t)&&r.runGuarded(()=>i(o))}}static _normalizeKey(t){return"esc"===t?"escape":t}static#e=this.\u0275fac=function(i){return new(i||e)(oe(oi))};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})();const u2=vE(lk,"browser",[{provide:mr,useValue:"browser"},{provide:Xm,useValue:function a2(){Lh.makeCurrent()},multi:!0},{provide:oi,useFactory:function c2(){return function TT(e){Ju=e}(document),document},deps:[]}]),d2=new R(""),$D=[{provide:Ll,useClass:class qV{addToWindow(n){me.getAngularTestability=(i,r=!0)=>{const o=n.findTestabilityInTree(i,r);if(null==o)throw new T(5103,!1);return o},me.getAllAngularTestabilities=()=>n.getAllTestabilities(),me.getAllAngularRootElements=()=>n.getAllRootElements(),me.frameworkStabilizers||(me.frameworkStabilizers=[]),me.frameworkStabilizers.push(i=>{const r=me.getAllAngularTestabilities();let o=r.length;const s=function(){o--,0==o&&i()};r.forEach(a=>{a.whenStable(s)})})}findTestabilityInTree(n,t,i){return null==t?null:n.getTestability(t)??(i?Ds().isShadowRoot(t)?this.findTestabilityInTree(n,t.host,!0):this.findTestabilityInTree(n,t.parentElement,!0):null)}},deps:[]},{provide:sE,useClass:Jf,deps:[he,Xf,Ll]},{provide:Jf,useClass:Jf,deps:[he,Xf,Ll]}],zD=[{provide:vu,useValue:"root"},{provide:$t,useFactory:function l2(){return new $t},deps:[]},{provide:ac,useClass:n2,multi:!0,deps:[oi,he,mr]},{provide:ac,useClass:s2,multi:!0,deps:[oi]},{provide:ac,useClass:i2,multi:!0},FD,LD,RD,{provide:Kd,useExisting:FD},{provide:class gV{},useClass:WV,deps:[]},[]];let f2=(()=>{class e{constructor(t){}static withServerTransition(t){return{ngModule:e,providers:[{provide:gr,useValue:t.appId}]}}static#e=this.\u0275fac=function(i){return new(i||e)(oe(d2,12))};static#t=this.\u0275mod=Yn({type:e});static#n=this.\u0275inj=On({providers:[...zD,...$D],imports:[wD,ck]})}return e})();function si(e){return this instanceof si?(this.v=e,this):new si(e)}function QD(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=function zh(e){var n="function"==typeof Symbol&&Symbol.iterator,t=n&&e[n],i=0;if(t)return t.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")}(e),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(o){t[o]=e[o]&&function(s){return new Promise(function(a,l){!function r(o,s,a,l){Promise.resolve(l).then(function(c){o({value:c,done:a})},s)}(a,l,(s=e[o](s)).done,s.value)})}}}"function"==typeof SuppressedError&&SuppressedError;const KD=e=>e&&"number"==typeof e.length&&"function"!=typeof e;function JD(e){return Fe(e?.then)}function XD(e){return Fe(e[Fc])}function eb(e){return Symbol.asyncIterator&&Fe(e?.[Symbol.asyncIterator])}function tb(e){return new TypeError(`You provided ${null!==e&&"object"==typeof e?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}const nb=function F2(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}();function ib(e){return Fe(e?.[nb])}function rb(e){return function YD(e,n,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,i=t.apply(e,n||[]),o=[];return r={},a("next"),a("throw"),a("return",function s(h){return function(g){return Promise.resolve(g).then(h,d)}}),r[Symbol.asyncIterator]=function(){return this},r;function a(h,g){i[h]&&(r[h]=function(_){return new Promise(function(D,S){o.push([h,_,D,S])>1||l(h,_)})},g&&(r[h]=g(r[h])))}function l(h,g){try{!function c(h){h.value instanceof si?Promise.resolve(h.value.v).then(u,d):p(o[0][2],h)}(i[h](g))}catch(_){p(o[0][3],_)}}function u(h){l("next",h)}function d(h){l("throw",h)}function p(h,g){h(g),o.shift(),o.length&&l(o[0][0],o[0][1])}}(this,arguments,function*(){const t=e.getReader();try{for(;;){const{value:i,done:r}=yield si(t.read());if(r)return yield si(void 0);yield yield si(i)}}finally{t.releaseLock()}})}function ob(e){return Fe(e?.getReader)}function Ts(e){if(e instanceof Nt)return e;if(null!=e){if(XD(e))return function V2(e){return new Nt(n=>{const t=e[Fc]();if(Fe(t.subscribe))return t.subscribe(n);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}(e);if(KD(e))return function H2(e){return new Nt(n=>{for(let t=0;t{e.then(t=>{n.closed||(n.next(t),n.complete())},t=>n.error(t)).then(null,Vp)})}(e);if(eb(e))return sb(e);if(ib(e))return function j2(e){return new Nt(n=>{for(const t of e)if(n.next(t),n.closed)return;n.complete()})}(e);if(ob(e))return function U2(e){return sb(rb(e))}(e)}throw tb(e)}function sb(e){return new Nt(n=>{(function $2(e,n){var t,i,r,o;return function WD(e,n,t,i){return new(t||(t=Promise))(function(o,s){function a(u){try{c(i.next(u))}catch(d){s(d)}}function l(u){try{c(i.throw(u))}catch(d){s(d)}}function c(u){u.done?o(u.value):function r(o){return o instanceof t?o:new t(function(s){s(o)})}(u.value).then(a,l)}c((i=i.apply(e,n||[])).next())})}(this,void 0,void 0,function*(){try{for(t=QD(e);!(i=yield t.next()).done;)if(n.next(i.value),n.closed)return}catch(s){r={error:s}}finally{try{i&&!i.done&&(o=t.return)&&(yield o.call(t))}finally{if(r)throw r.error}}n.complete()})})(e,n).catch(t=>n.error(t))})}function Ui(e,n,t,i=0,r=!1){const o=n.schedule(function(){t(),r?e.add(this.schedule(null,i)):this.unsubscribe()},i);if(e.add(o),!r)return o}function ab(e,n=0){return gi((t,i)=>{t.subscribe(zn(i,r=>Ui(i,e,()=>i.next(r),n),()=>Ui(i,e,()=>i.complete(),n),r=>Ui(i,e,()=>i.error(r),n)))})}function lb(e,n=0){return gi((t,i)=>{i.add(e.schedule(()=>t.subscribe(i),n))})}function cb(e,n){if(!e)throw new Error("Iterable cannot be null");return new Nt(t=>{Ui(t,n,()=>{const i=e[Symbol.asyncIterator]();Ui(t,n,()=>{i.next().then(r=>{r.done?t.complete():t.next(r.value)})},0,!0)})})}const{isArray:K2}=Array,{getPrototypeOf:J2,prototype:X2,keys:eH}=Object;const{isArray:rH}=Array;function aH(e,n){return e.reduce((t,i,r)=>(t[i]=n[r],t),{})}function lH(...e){const n=function iH(e){return Fe(function Gh(e){return e[e.length-1]}(e))?e.pop():void 0}(e),{args:t,keys:i}=function tH(e){if(1===e.length){const n=e[0];if(K2(n))return{args:n,keys:null};if(function nH(e){return e&&"object"==typeof e&&J2(e)===X2}(n)){const t=eH(n);return{args:t.map(i=>n[i]),keys:t}}}return{args:e,keys:null}}(e),r=new Nt(o=>{const{length:s}=t;if(!s)return void o.complete();const a=new Array(s);let l=s,c=s;for(let u=0;u{d||(d=!0,c--),a[u]=p},()=>l--,void 0,()=>{(!l||!d)&&(c||o.next(i?aH(i,a):a),o.complete())}))}});return n?r.pipe(function sH(e){return Hc(n=>function oH(e,n){return rH(n)?e(...n):e(n)}(e,n))}(n)):r}let ub=(()=>{class e{constructor(t,i){this._renderer=t,this._elementRef=i,this.onChange=r=>{},this.onTouched=()=>{}}setProperty(t,i){this._renderer.setProperty(this._elementRef.nativeElement,t,i)}registerOnTouched(t){this.onTouched=t}registerOnChange(t){this.onChange=t}setDisabledState(t){this.setProperty("disabled",t)}static#e=this.\u0275fac=function(i){return new(i||e)(M(rn),M(dt))};static#t=this.\u0275dir=z({type:e})}return e})(),$i=(()=>{class e extends ub{static#e=this.\u0275fac=(()=>{let t;return function(r){return(t||(t=rt(e)))(r||e)}})();static#t=this.\u0275dir=z({type:e,features:[ue]})}return e})();const cn=new R(""),cH={provide:cn,useExisting:ve(()=>qh),multi:!0};let qh=(()=>{class e extends $i{writeValue(t){this.setProperty("checked",t)}static#e=this.\u0275fac=(()=>{let t;return function(r){return(t||(t=rt(e)))(r||e)}})();static#t=this.\u0275dir=z({type:e,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(i,r){1&i&&W("change",function(s){return r.onChange(s.target.checked)})("blur",function(){return r.onTouched()})},features:[Me([cH]),ue]})}return e})();const uH={provide:cn,useExisting:ve(()=>Os),multi:!0},fH=new R("");let Os=(()=>{class e extends ub{constructor(t,i,r){super(t,i),this._compositionMode=r,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function dH(){const e=Ds()?Ds().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}writeValue(t){this.setProperty("value",t??"")}_handleInput(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)}_compositionStart(){this._composing=!0}_compositionEnd(t){this._composing=!1,this._compositionMode&&this.onChange(t)}static#e=this.\u0275fac=function(i){return new(i||e)(M(rn),M(dt),M(fH,8))};static#t=this.\u0275dir=z({type:e,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,r){1&i&&W("input",function(s){return r._handleInput(s.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(s){return r._compositionEnd(s.target.value)})},features:[Me([uH]),ue]})}return e})();const at=new R(""),li=new R("");function Cb(e){return null!=e}function wb(e){return Pl(e)?function Q2(e,n){return n?function Y2(e,n){if(null!=e){if(XD(e))return function z2(e,n){return Ts(e).pipe(lb(n),ab(n))}(e,n);if(KD(e))return function q2(e,n){return new Nt(t=>{let i=0;return n.schedule(function(){i===e.length?t.complete():(t.next(e[i++]),t.closed||this.schedule())})})}(e,n);if(JD(e))return function G2(e,n){return Ts(e).pipe(lb(n),ab(n))}(e,n);if(eb(e))return cb(e,n);if(ib(e))return function W2(e,n){return new Nt(t=>{let i;return Ui(t,n,()=>{i=e[nb](),Ui(t,n,()=>{let r,o;try{({value:r,done:o}=i.next())}catch(s){return void t.error(s)}o?t.complete():t.next(r)},0,!0)}),()=>Fe(i?.return)&&i.return()})}(e,n);if(ob(e))return function Z2(e,n){return cb(rb(e),n)}(e,n)}throw tb(e)}(e,n):Ts(e)}(e):e}function Eb(e){let n={};return e.forEach(t=>{n=null!=t?{...n,...t}:n}),0===Object.keys(n).length?null:n}function Db(e,n){return n.map(t=>t(e))}function bb(e){return e.map(n=>function pH(e){return!e.validate}(n)?n:t=>n.validate(t))}function Wh(e){return null!=e?function Ib(e){if(!e)return null;const n=e.filter(Cb);return 0==n.length?null:function(t){return Eb(Db(t,n))}}(bb(e)):null}function Zh(e){return null!=e?function Mb(e){if(!e)return null;const n=e.filter(Cb);return 0==n.length?null:function(t){return lH(Db(t,n).map(wb)).pipe(Hc(Eb))}}(bb(e)):null}function Sb(e,n){return null===e?[n]:Array.isArray(e)?[...e,n]:[e,n]}function Yh(e){return e?Array.isArray(e)?e:[e]:[]}function uc(e,n){return Array.isArray(e)?e.includes(n):e===n}function Nb(e,n){const t=Yh(n);return Yh(e).forEach(r=>{uc(t,r)||t.push(r)}),t}function Ab(e,n){return Yh(n).filter(t=>!uc(e,t))}class xb{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(n){this._rawValidators=n||[],this._composedValidatorFn=Wh(this._rawValidators)}_setAsyncValidators(n){this._rawAsyncValidators=n||[],this._composedAsyncValidatorFn=Zh(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(n){this._onDestroyCallbacks.push(n)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(n=>n()),this._onDestroyCallbacks=[]}reset(n=void 0){this.control&&this.control.reset(n)}hasError(n,t){return!!this.control&&this.control.hasError(n,t)}getError(n,t){return this.control?this.control.getError(n,t):null}}class _t extends xb{get formDirective(){return null}get path(){return null}}class ci extends xb{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class Rb{constructor(n){this._cd=n}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}}let dc=(()=>{class e extends Rb{constructor(t){super(t)}static#e=this.\u0275fac=function(i){return new(i||e)(M(ci,2))};static#t=this.\u0275dir=z({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,r){2&i&&Vn("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},features:[ue]})}return e})();const Ns="VALID",hc="INVALID",eo="PENDING",As="DISABLED";class to{}class Pb extends to{constructor(n,t){super(),this.value=n,this.source=t}}class Jh extends to{constructor(n,t){super(),this.pristine=n,this.source=t}}class Xh extends to{constructor(n,t){super(),this.touched=n,this.source=t}}class pc extends to{constructor(n,t){super(),this.status=n,this.source=t}}function gc(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class np{constructor(n,t){this._pendingDirty=!1,this._hasOwnPendingAsyncValidator=null,this._pendingTouched=!1,this._onCollectionChange=()=>{},this._parent=null,this._status=Es(()=>this.statusReactive()),this.statusReactive=Tr(void 0),this._pristine=Es(()=>this.pristineReactive()),this.pristineReactive=Tr(!0),this._touched=Es(()=>this.touchedReactive()),this.touchedReactive=Tr(!1),this._events=new un,this.events=this._events.asObservable(),this._onDisabledChange=[],this._assignValidators(n),this._assignAsyncValidators(t)}get validator(){return this._composedValidatorFn}set validator(n){this._rawValidators=this._composedValidatorFn=n}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(n){this._rawAsyncValidators=this._composedAsyncValidatorFn=n}get parent(){return this._parent}get status(){return Mn(this.statusReactive)}set status(n){Mn(()=>this.statusReactive.set(n))}get valid(){return this.status===Ns}get invalid(){return this.status===hc}get pending(){return this.status==eo}get disabled(){return this.status===As}get enabled(){return this.status!==As}get pristine(){return Mn(this.pristineReactive)}set pristine(n){Mn(()=>this.pristineReactive.set(n))}get dirty(){return!this.pristine}get touched(){return Mn(this.touchedReactive)}set touched(n){Mn(()=>this.touchedReactive.set(n))}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(n){this._assignValidators(n)}setAsyncValidators(n){this._assignAsyncValidators(n)}addValidators(n){this.setValidators(Nb(n,this._rawValidators))}addAsyncValidators(n){this.setAsyncValidators(Nb(n,this._rawAsyncValidators))}removeValidators(n){this.setValidators(Ab(n,this._rawValidators))}removeAsyncValidators(n){this.setAsyncValidators(Ab(n,this._rawAsyncValidators))}hasValidator(n){return uc(this._rawValidators,n)}hasAsyncValidator(n){return uc(this._rawAsyncValidators,n)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(n={}){const t=!1===this.touched;this.touched=!0;const i=n.sourceControl??this;this._parent&&!n.onlySelf&&this._parent.markAsTouched({...n,sourceControl:i}),t&&!1!==n.emitEvent&&this._events.next(new Xh(!0,i))}markAllAsTouched(n={}){this.markAsTouched({onlySelf:!0,emitEvent:n.emitEvent,sourceControl:this}),this._forEachChild(t=>t.markAllAsTouched(n))}markAsUntouched(n={}){const t=!0===this.touched;this.touched=!1,this._pendingTouched=!1;const i=n.sourceControl??this;this._forEachChild(r=>{r.markAsUntouched({onlySelf:!0,emitEvent:n.emitEvent,sourceControl:i})}),this._parent&&!n.onlySelf&&this._parent._updateTouched(n,i),t&&!1!==n.emitEvent&&this._events.next(new Xh(!1,i))}markAsDirty(n={}){const t=!0===this.pristine;this.pristine=!1;const i=n.sourceControl??this;this._parent&&!n.onlySelf&&this._parent.markAsDirty({...n,sourceControl:i}),t&&!1!==n.emitEvent&&this._events.next(new Jh(!1,i))}markAsPristine(n={}){const t=!1===this.pristine;this.pristine=!0,this._pendingDirty=!1;const i=n.sourceControl??this;this._forEachChild(r=>{r.markAsPristine({onlySelf:!0,emitEvent:n.emitEvent})}),this._parent&&!n.onlySelf&&this._parent._updatePristine(n,i),t&&!1!==n.emitEvent&&this._events.next(new Jh(!0,i))}markAsPending(n={}){this.status=eo;const t=n.sourceControl??this;!1!==n.emitEvent&&(this._events.next(new pc(this.status,t)),this.statusChanges.emit(this.status)),this._parent&&!n.onlySelf&&this._parent.markAsPending({...n,sourceControl:t})}disable(n={}){const t=this._parentMarkedDirty(n.onlySelf);this.status=As,this.errors=null,this._forEachChild(r=>{r.disable({...n,onlySelf:!0})}),this._updateValue();const i=n.sourceControl??this;!1!==n.emitEvent&&(this._events.next(new Pb(this.value,i)),this._events.next(new pc(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors({...n,skipPristineCheck:t},this),this._onDisabledChange.forEach(r=>r(!0))}enable(n={}){const t=this._parentMarkedDirty(n.onlySelf);this.status=Ns,this._forEachChild(i=>{i.enable({...n,onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent}),this._updateAncestors({...n,skipPristineCheck:t},this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(n,t){this._parent&&!n.onlySelf&&(this._parent.updateValueAndValidity(n),n.skipPristineCheck||this._parent._updatePristine({},t),this._parent._updateTouched({},t))}setParent(n){this._parent=n}getRawValue(){return this.value}updateValueAndValidity(n={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){const i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===Ns||this.status===eo)&&this._runAsyncValidator(i,n.emitEvent)}const t=n.sourceControl??this;!1!==n.emitEvent&&(this._events.next(new Pb(this.value,t)),this._events.next(new pc(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!n.onlySelf&&this._parent.updateValueAndValidity({...n,sourceControl:t})}_updateTreeValidity(n={emitEvent:!0}){this._forEachChild(t=>t._updateTreeValidity(n)),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?As:Ns}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(n,t){if(this.asyncValidator){this.status=eo,this._hasOwnPendingAsyncValidator={emitEvent:!1!==t};const i=wb(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(r=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(r,{emitEvent:t,shouldHaveEmitted:n})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();const n=this._hasOwnPendingAsyncValidator?.emitEvent??!1;return this._hasOwnPendingAsyncValidator=null,n}return!1}setErrors(n,t={}){this.errors=n,this._updateControlsErrors(!1!==t.emitEvent,this,t.shouldHaveEmitted)}get(n){let t=n;return null==t||(Array.isArray(t)||(t=t.split(".")),0===t.length)?null:t.reduce((i,r)=>i&&i._find(r),this)}getError(n,t){const i=t?this.get(t):this;return i&&i.errors?i.errors[n]:null}hasError(n,t){return!!this.getError(n,t)}get root(){let n=this;for(;n._parent;)n=n._parent;return n}_updateControlsErrors(n,t,i){this.status=this._calculateStatus(),n&&this.statusChanges.emit(this.status),(n||i)&&this._events.next(new pc(this.status,t)),this._parent&&this._parent._updateControlsErrors(n,t,i)}_initObservables(){this.valueChanges=new Ee,this.statusChanges=new Ee}_calculateStatus(){return this._allControlsDisabled()?As:this.errors?hc:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(eo)?eo:this._anyControlsHaveStatus(hc)?hc:Ns}_anyControlsHaveStatus(n){return this._anyControls(t=>t.status===n)}_anyControlsDirty(){return this._anyControls(n=>n.dirty)}_anyControlsTouched(){return this._anyControls(n=>n.touched)}_updatePristine(n,t){const i=!this._anyControlsDirty(),r=this.pristine!==i;this.pristine=i,this._parent&&!n.onlySelf&&this._parent._updatePristine(n,t),r&&this._events.next(new Jh(this.pristine,t))}_updateTouched(n={},t){this.touched=this._anyControlsTouched(),this._events.next(new Xh(this.touched,t)),this._parent&&!n.onlySelf&&this._parent._updateTouched(n,t)}_registerOnCollectionChange(n){this._onCollectionChange=n}_setUpdateStrategy(n){gc(n)&&null!=n.updateOn&&(this._updateOn=n.updateOn)}_parentMarkedDirty(n){return!n&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}_find(n){return null}_assignValidators(n){this._rawValidators=Array.isArray(n)?n.slice():n,this._composedValidatorFn=function EH(e){return Array.isArray(e)?Wh(e):e||null}(this._rawValidators)}_assignAsyncValidators(n){this._rawAsyncValidators=Array.isArray(n)?n.slice():n,this._composedAsyncValidatorFn=function DH(e){return Array.isArray(e)?Zh(e):e||null}(this._rawAsyncValidators)}}const no=new R("CallSetDisabledState",{providedIn:"root",factory:()=>mc}),mc="always";function xs(e,n,t=mc){(function rp(e,n){const t=function Tb(e){return e._rawValidators}(e);null!==n.validator?e.setValidators(Sb(t,n.validator)):"function"==typeof t&&e.setValidators([t]);const i=function Ob(e){return e._rawAsyncValidators}(e);null!==n.asyncValidator?e.setAsyncValidators(Sb(i,n.asyncValidator)):"function"==typeof i&&e.setAsyncValidators([i]);const r=()=>e.updateValueAndValidity();yc(n._rawValidators,r),yc(n._rawAsyncValidators,r)})(e,n),n.valueAccessor.writeValue(e.value),(e.disabled||"always"===t)&&n.valueAccessor.setDisabledState?.(e.disabled),function MH(e,n){n.valueAccessor.registerOnChange(t=>{e._pendingValue=t,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&Vb(e,n)})}(e,n),function TH(e,n){const t=(i,r)=>{n.valueAccessor.writeValue(i),r&&n.viewToModelUpdate(i)};e.registerOnChange(t),n._registerOnDestroy(()=>{e._unregisterOnChange(t)})}(e,n),function SH(e,n){n.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&Vb(e,n),"submit"!==e.updateOn&&e.markAsTouched()})}(e,n),function IH(e,n){if(n.valueAccessor.setDisabledState){const t=i=>{n.valueAccessor.setDisabledState(i)};e.registerOnDisabledChange(t),n._registerOnDestroy(()=>{e._unregisterOnDisabledChange(t)})}}(e,n)}function yc(e,n){e.forEach(t=>{t.registerOnValidatorChange&&t.registerOnValidatorChange(n)})}function Vb(e,n){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),n.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}function jb(e,n){const t=e.indexOf(n);t>-1&&e.splice(t,1)}function Ub(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}Promise.resolve();const $b=class extends np{constructor(n=null,t,i){super(function ep(e){return(gc(e)?e.validators:e)||null}(t),function tp(e,n){return(gc(n)?n.asyncValidators:e)||null}(i,t)),this.defaultValue=null,this._onChange=[],this._pendingChange=!1,this._applyFormState(n),this._setUpdateStrategy(t),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),gc(t)&&(t.nonNullable||t.initialValueIsDefault)&&(this.defaultValue=Ub(n)?n.value:n)}setValue(n,t={}){this.value=this._pendingValue=n,this._onChange.length&&!1!==t.emitModelToViewChange&&this._onChange.forEach(i=>i(this.value,!1!==t.emitViewToModelChange)),this.updateValueAndValidity(t)}patchValue(n,t={}){this.setValue(n,t)}reset(n=this.defaultValue,t={}){this._applyFormState(n),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1}_updateValue(){}_anyControls(n){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(n){this._onChange.push(n)}_unregisterOnChange(n){jb(this._onChange,n)}registerOnDisabledChange(n){this._onDisabledChange.push(n)}_unregisterOnDisabledChange(n){jb(this._onDisabledChange,n)}_forEachChild(n){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(n){Ub(n)?(this.value=this._pendingValue=n.value,n.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=n}},kH={provide:ci,useExisting:ve(()=>Ls)},qb=Promise.resolve();let Ls=(()=>{class e extends ci{constructor(t,i,r,o,s,a){super(),this._changeDetectorRef=s,this.callSetDisabledState=a,this.control=new $b,this._registered=!1,this.name="",this.update=new Ee,this._parent=t,this._setValidators(i),this._setAsyncValidators(r),this.valueAccessor=function ap(e,n){if(!n)return null;let t,i,r;return Array.isArray(n),n.forEach(o=>{o.constructor===Os?t=o:function AH(e){return Object.getPrototypeOf(e.constructor)===$i}(o)?i=o:r=o}),r||i||t||null}(0,o)}ngOnChanges(t){if(this._checkForErrors(),!this._registered||"name"in t){if(this._registered&&(this._checkName(),this.formDirective)){const i=t.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in t&&this._updateDisabled(t),function sp(e,n){if(!e.hasOwnProperty("model"))return!1;const t=e.model;return!!t.isFirstChange()||!Object.is(n,t.currentValue)}(t,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(t){this.viewModel=t,this.update.emit(t)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){xs(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(t){qb.then(()=>{this.control.setValue(t,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(t){const i=t.isDisabled.currentValue,r=0!==i&&function mh(e){return"boolean"==typeof e?e:null!=e&&"false"!==e}(i);qb.then(()=>{r&&!this.control.disabled?this.control.disable():!r&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(t){return this._parent?function vc(e,n){return[...n.path,e]}(t,this._parent):[t]}static#e=this.\u0275fac=function(i){return new(i||e)(M(_t,9),M(at,10),M(li,10),M(cn,10),M(Vi,8),M(no,8))};static#t=this.\u0275dir=z({type:e,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[Me([kH]),ue,gn]})}return e})();const jH={provide:cn,useExisting:ve(()=>cp),multi:!0};let cp=(()=>{class e extends $i{writeValue(t){this.setProperty("value",parseFloat(t))}registerOnChange(t){this.onChange=i=>{t(""==i?null:parseFloat(i))}}static#e=this.\u0275fac=(()=>{let t;return function(r){return(t||(t=rt(e)))(r||e)}})();static#t=this.\u0275dir=z({type:e,selectors:[["input","type","range","formControlName",""],["input","type","range","formControl",""],["input","type","range","ngModel",""]],hostBindings:function(i,r){1&i&&W("change",function(s){return r.onChange(s.target.value)})("input",function(s){return r.onChange(s.target.value)})("blur",function(){return r.onTouched()})},features:[Me([jH]),ue]})}return e})();const WH={provide:cn,useExisting:ve(()=>Ps),multi:!0};function Xb(e,n){return null==e?`${n}`:(n&&"object"==typeof n&&(n="Object"),`${e}: ${n}`.slice(0,50))}let Ps=(()=>{class e extends $i{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(t){this._compareWith=t}writeValue(t){this.value=t;const r=Xb(this._getOptionId(t),t);this.setProperty("value",r)}registerOnChange(t){this.onChange=i=>{this.value=this._getOptionValue(i),t(this.value)}}_registerOption(){return(this._idCounter++).toString()}_getOptionId(t){for(const i of this._optionMap.keys())if(this._compareWith(this._optionMap.get(i),t))return i;return null}_getOptionValue(t){const i=function ZH(e){return e.split(":")[0]}(t);return this._optionMap.has(i)?this._optionMap.get(i):t}static#e=this.\u0275fac=(()=>{let t;return function(r){return(t||(t=rt(e)))(r||e)}})();static#t=this.\u0275dir=z({type:e,selectors:[["select","formControlName","",3,"multiple",""],["select","formControl","",3,"multiple",""],["select","ngModel","",3,"multiple",""]],hostBindings:function(i,r){1&i&&W("change",function(s){return r.onChange(s.target.value)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},features:[Me([WH]),ue]})}return e})(),hp=(()=>{class e{constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption())}set ngValue(t){null!=this._select&&(this._select._optionMap.set(this.id,t),this._setElementValue(Xb(this.id,t)),this._select.writeValue(this._select.value))}set value(t){this._setElementValue(t),this._select&&this._select.writeValue(this._select.value)}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}static#e=this.\u0275fac=function(i){return new(i||e)(M(dt),M(rn),M(Ps,9))};static#t=this.\u0275dir=z({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}})}return e})();const YH={provide:cn,useExisting:ve(()=>pp),multi:!0};function eI(e,n){return null==e?`${n}`:("string"==typeof n&&(n=`'${n}'`),n&&"object"==typeof n&&(n="Object"),`${e}: ${n}`.slice(0,50))}let pp=(()=>{class e extends $i{constructor(){super(...arguments),this._optionMap=new Map,this._idCounter=0,this._compareWith=Object.is}set compareWith(t){this._compareWith=t}writeValue(t){let i;if(this.value=t,Array.isArray(t)){const r=t.map(o=>this._getOptionId(o));i=(o,s)=>{o._setSelected(r.indexOf(s.toString())>-1)}}else i=(r,o)=>{r._setSelected(!1)};this._optionMap.forEach(i)}registerOnChange(t){this.onChange=i=>{const r=[],o=i.selectedOptions;if(void 0!==o){const s=o;for(let a=0;a{let t;return function(r){return(t||(t=rt(e)))(r||e)}})();static#t=this.\u0275dir=z({type:e,selectors:[["select","multiple","","formControlName",""],["select","multiple","","formControl",""],["select","multiple","","ngModel",""]],hostBindings:function(i,r){1&i&&W("change",function(s){return r.onChange(s.target)})("blur",function(){return r.onTouched()})},inputs:{compareWith:"compareWith"},features:[Me([YH]),ue]})}return e})(),gp=(()=>{class e{constructor(t,i,r){this._element=t,this._renderer=i,this._select=r,this._select&&(this.id=this._select._registerOption(this))}set ngValue(t){null!=this._select&&(this._value=t,this._setElementValue(eI(this.id,t)),this._select.writeValue(this._select.value))}set value(t){this._select?(this._value=t,this._setElementValue(eI(this.id,t)),this._select.writeValue(this._select.value)):this._setElementValue(t)}_setElementValue(t){this._renderer.setProperty(this._element.nativeElement,"value",t)}_setSelected(t){this._renderer.setProperty(this._element.nativeElement,"selected",t)}ngOnDestroy(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))}static#e=this.\u0275fac=function(i){return new(i||e)(M(dt),M(rn),M(pp,9))};static#t=this.\u0275dir=z({type:e,selectors:[["option"]],inputs:{ngValue:"ngValue",value:"value"}})}return e})(),oB=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=Yn({type:e});static#n=this.\u0275inj=On({})}return e})(),aB=(()=>{class e{static withConfig(t){return{ngModule:e,providers:[{provide:no,useValue:t.callSetDisabledState??mc}]}}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=Yn({type:e});static#n=this.\u0275inj=On({imports:[oB]})}return e})();class lB extends Ot{constructor(n,t){super()}schedule(n,t=0){return this}}const wc={setInterval(e,n,...t){const{delegate:i}=wc;return i?.setInterval?i.setInterval(e,n,...t):setInterval(e,n,...t)},clearInterval(e){const{delegate:n}=wc;return(n?.clearInterval||clearInterval)(e)},delegate:void 0},uI={now:()=>(uI.delegate||Date).now(),delegate:void 0};class ks{constructor(n,t=ks.now){this.schedulerActionCtor=n,this.now=t}schedule(n,t=0,i){return new this.schedulerActionCtor(this,n).schedule(i,t)}}ks.now=uI.now;const dI=new class uB extends ks{constructor(n,t=ks.now){super(n,t),this.actions=[],this._active=!1}flush(n){const{actions:t}=this;if(this._active)return void t.push(n);let i;this._active=!0;do{if(i=n.execute(n.state,n.delay))break}while(n=t.shift());if(this._active=!1,i){for(;n=t.shift();)n.unsubscribe();throw i}}}(class cB extends lB{constructor(n,t){super(n,t),this.scheduler=n,this.work=t,this.pending=!1}schedule(n,t=0){var i;if(this.closed)return this;this.state=n;const r=this.id,o=this.scheduler;return null!=r&&(this.id=this.recycleAsyncId(o,r,t)),this.pending=!0,this.delay=t,this.id=null!==(i=this.id)&&void 0!==i?i:this.requestAsyncId(o,this.id,t),this}requestAsyncId(n,t,i=0){return wc.setInterval(n.flush.bind(n,this),i)}recycleAsyncId(n,t,i=0){if(null!=i&&this.delay===i&&!1===this.pending)return t;null!=t&&wc.clearInterval(t)}execute(n,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;const i=this._execute(n,t);if(i)return i;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))}_execute(n,t){let r,i=!1;try{this.work(n)}catch(o){i=!0,r=o||new Error("Scheduled action threw falsy error")}if(i)return this.unsubscribe(),r}unsubscribe(){if(!this.closed){const{id:n,scheduler:t}=this,{actions:i}=t;this.work=this.state=this.scheduler=null,this.pending=!1,$s(i,this),null!=n&&(this.id=this.recycleAsyncId(t,n,null)),this.delay=null,super.unsubscribe()}}}),dB=dI;function fI(e,n=dI,t){const i=function gB(e=0,n,t=dB){let i=-1;return null!=n&&(function hB(e){return e&&Fe(e.schedule)}(n)?t=n:i=n),new Nt(r=>{let o=function pB(e){return e instanceof Date&&!isNaN(e)}(e)?+e-t.now():e;o<0&&(o=0);let s=0;return t.schedule(function(){r.closed||(r.next(s++),0<=i?this.schedule(void 0,i):r.complete())},o)})}(e,n);return function fB(e,n){return gi((t,i)=>{const{leading:r=!0,trailing:o=!1}=n??{};let s=!1,a=null,l=null,c=!1;const u=()=>{l?.unsubscribe(),l=null,o&&(h(),c&&i.complete())},d=()=>{l=null,c&&i.complete()},p=g=>l=Ts(e(g)).subscribe(zn(i,u,d)),h=()=>{if(s){s=!1;const g=a;a=null,i.next(g),!c&&p(g)}};t.subscribe(zn(i,g=>{s=!0,a=g,(!l||l.closed)&&(r?h():p(g))},()=>{c=!0,(!(o&&s&&l)||l.closed)&&i.complete()}))})}(()=>i,t)}function hI(e,n,t){const i=Fe(e)||n||t?{next:e,error:n,complete:t}:e;return i?gi((r,o)=>{var s;null===(s=i.subscribe)||void 0===s||s.call(i);let a=!0;r.subscribe(zn(o,l=>{var c;null===(c=i.next)||void 0===c||c.call(i,l),o.next(l)},()=>{var l;a=!1,null===(l=i.complete)||void 0===l||l.call(i),o.complete()},l=>{var c;a=!1,null===(c=i.error)||void 0===c||c.call(i,l),o.error(l)},()=>{var l,c;a&&(null===(l=i.unsubscribe)||void 0===l||l.call(i)),null===(c=i.finalize)||void 0===c||c.call(i)}))}):Vc}function pI(e,n=Vc){return e=e??mB,gi((t,i)=>{let r,o=!0;t.subscribe(zn(i,s=>{const a=n(s);(o||!e(r,a))&&(o=!1,r=a,i.next(s))}))})}function mB(e,n){return e===n}var Ht=typeof window<"u"?window:{screen:{},navigator:{}},io=(Ht.matchMedia||function(){return{matches:!1}}).bind(Ht),gI=!1,mI=function(){};Ht.addEventListener&&Ht.addEventListener("p",mI,{get passive(){return gI=!0}}),Ht.removeEventListener&&Ht.removeEventListener("p",mI,!1);var vI=gI,vp="ontouchstart"in Ht,yI=(vp||"TouchEvent"in Ht&&io("(any-pointer: coarse)"),Ht.navigator.userAgent||"");io("(pointer: coarse)").matches&&/iPad|Macintosh/.test(yI)&&Math.min(Ht.screen.width||0,Ht.screen.height||0);(io("(pointer: coarse)").matches||!io("(pointer: fine)").matches&&vp)&&/Windows.*Firefox/.test(yI),io("(any-pointer: fine)").matches||io("(any-hover: hover)");const DB=(e,n,t)=>({tooltip:e,placement:n,content:t});function bB(e,n){}function IB(e,n){1&e&&H(0,bB,0,0,"ng-template")}function MB(e,n){if(1&e&&(te(0),H(1,IB,1,0,null,1),ne()),2&e){const t=v();f(),m("ngTemplateOutlet",t.template)("ngTemplateOutletContext",Ye(2,DB,t.tooltip,t.placement,t.content))}}function SB(e,n){if(1&e&&(te(0),C(1,"div",2),b(2),y(),ne()),2&e){const t=v();f(),pt("title",t.tooltip)("data-tooltip-placement",t.placement),f(),K(" ",t.content," ")}}const TB=["tooltipTemplate"],OB=["leftOuterSelectionBar"],NB=["rightOuterSelectionBar"],AB=["fullBar"],xB=["selectionBar"],RB=["minHandle"],LB=["maxHandle"],PB=["floorLabel"],kB=["ceilLabel"],FB=["minHandleLabel"],VB=["maxHandleLabel"],HB=["combinedLabel"],BB=["ticksElement"],jB=e=>({"ngx-slider-selected":e});function UB(e,n){if(1&e&&N(0,"ngx-slider-tooltip-wrapper",32),2&e){const t=v().$implicit;m("template",v().tooltipTemplate)("tooltip",t.valueTooltip)("placement",t.valueTooltipPlacement)("content",t.value)}}function $B(e,n){1&e&&N(0,"span",33),2&e&&m("innerText",v().$implicit.legend)}function zB(e,n){1&e&&N(0,"span",34),2&e&&m("innerHTML",v().$implicit.legend,bv)}function GB(e,n){if(1&e&&(C(0,"span",27),N(1,"ngx-slider-tooltip-wrapper",28),H(2,UB,1,4,"ngx-slider-tooltip-wrapper",29)(3,$B,1,1,"span",30)(4,zB,1,1,"span",31),y()),2&e){const t=n.$implicit,i=v();m("ngClass",hs(8,jB,t.selected))("ngStyle",t.style),f(),m("template",i.tooltipTemplate)("tooltip",t.tooltip)("placement",t.tooltipPlacement),f(),m("ngIf",null!=t.value),f(),m("ngIf",null!=t.legend&&!1===i.allowUnsafeHtmlInSlider),f(),m("ngIf",null!=t.legend&&(null==i.allowUnsafeHtmlInSlider||i.allowUnsafeHtmlInSlider))}}var Sn=function(e){return e[e.Low=0]="Low",e[e.High=1]="High",e[e.Floor=2]="Floor",e[e.Ceil=3]="Ceil",e[e.TickValue=4]="TickValue",e}(Sn||{});class Ec{floor=0;ceil=null;step=1;minRange=null;maxRange=null;pushRange=!1;minLimit=null;maxLimit=null;translate=null;combineLabels=null;getLegend=null;getStepLegend=null;stepsArray=null;bindIndexForStepsArray=!1;draggableRange=!1;draggableRangeOnly=!1;showSelectionBar=!1;showSelectionBarEnd=!1;showSelectionBarFromValue=null;showOuterSelectionBars=!1;hidePointerLabels=!1;hideLimitLabels=!1;autoHideLimitLabels=!0;readOnly=!1;disabled=!1;showTicks=!1;showTicksValues=!1;tickStep=null;tickValueStep=null;ticksArray=null;ticksTooltip=null;ticksValuesTooltip=null;vertical=!1;getSelectionBarColor=null;getTickColor=null;getPointerColor=null;keyboardSupport=!0;scale=1;rotate=0;enforceStep=!0;enforceRange=!0;enforceStepsArray=!0;noSwitching=!1;onlyBindHandles=!1;rightToLeft=!1;reversedControls=!1;boundPointerLabels=!0;logScale=!1;customValueToPosition=null;customPositionToValue=null;precisionLimit=12;selectionBarGradient=null;ariaLabel="ngx-slider";ariaLabelledBy=null;ariaLabelHigh="ngx-slider-max";ariaLabelledByHigh=null;handleDimension=null;barDimension=null;animate=!0;animateOnMove=!1}const EI=new R("AllowUnsafeHtmlInSlider");var x=function(e){return e[e.Min=0]="Min",e[e.Max=1]="Max",e}(x||{});class qB{value;highValue;pointerType}class I{static isNullOrUndefined(n){return null==n}static areArraysEqual(n,t){if(n.length!==t.length)return!1;for(let i=0;iMath.abs(n-o.value));let r=0;for(let o=0;o{o.events.next(a)};return n.addEventListener(t,s,{passive:!0,capture:!1}),o.teardownCallback=()=>{n.removeEventListener(t,s,{passive:!0,capture:!1})},o.eventsSubscription=o.events.pipe(I.isNullOrUndefined(r)?hI(()=>{}):fI(r,void 0,{leading:!0,trailing:!0})).subscribe(a=>{i(a)}),o}detachEventListener(n){I.isNullOrUndefined(n.eventsSubscription)||(n.eventsSubscription.unsubscribe(),n.eventsSubscription=null),I.isNullOrUndefined(n.events)||(n.events.complete(),n.events=null),I.isNullOrUndefined(n.teardownCallback)||(n.teardownCallback(),n.teardownCallback=null)}attachEventListener(n,t,i,r){const o=new DI;return o.eventName=t,o.events=new un,o.teardownCallback=this.renderer.listen(n,t,a=>{o.events.next(a)}),o.eventsSubscription=o.events.pipe(I.isNullOrUndefined(r)?hI(()=>{}):fI(r,void 0,{leading:!0,trailing:!0})).subscribe(a=>{i(a)}),o}}let di=(()=>{class e{elemRef;renderer;changeDetectionRef;_position=0;get position(){return this._position}_dimension=0;get dimension(){return this._dimension}_alwaysHide=!1;get alwaysHide(){return this._alwaysHide}_vertical=!1;get vertical(){return this._vertical}_scale=1;get scale(){return this._scale}_rotate=0;get rotate(){return this._rotate}opacity=1;visibility="visible";left="";bottom="";height="";width="";transform="";eventListenerHelper;eventListeners=[];constructor(t,i,r){this.elemRef=t,this.renderer=i,this.changeDetectionRef=r,this.eventListenerHelper=new bI(this.renderer)}setAlwaysHide(t){this._alwaysHide=t,this.visibility=t?"hidden":"visible"}hide(){this.opacity=0}show(){this.alwaysHide||(this.opacity=1)}isVisible(){return!this.alwaysHide&&0!==this.opacity}setVertical(t){this._vertical=t,this._vertical?(this.left="",this.width=""):(this.bottom="",this.height="")}setScale(t){this._scale=t}setRotate(t){this._rotate=t,this.transform="rotate("+t+"deg)"}getRotate(){return this._rotate}setPosition(t){this._position!==t&&!this.isRefDestroyed()&&this.changeDetectionRef.markForCheck(),this._position=t,this._vertical?this.bottom=Math.round(t)+"px":this.left=Math.round(t)+"px"}calculateDimension(){const t=this.getBoundingClientRect();this._dimension=this.vertical?(t.bottom-t.top)*this.scale:(t.right-t.left)*this.scale}setDimension(t){this._dimension!==t&&!this.isRefDestroyed()&&this.changeDetectionRef.markForCheck(),this._dimension=t,this._vertical?this.height=Math.round(t)+"px":this.width=Math.round(t)+"px"}getBoundingClientRect(){return this.elemRef.nativeElement.getBoundingClientRect()}on(t,i,r){const o=this.eventListenerHelper.attachEventListener(this.elemRef.nativeElement,t,i,r);this.eventListeners.push(o)}onPassive(t,i,r){const o=this.eventListenerHelper.attachPassiveEventListener(this.elemRef.nativeElement,t,i,r);this.eventListeners.push(o)}off(t){let i,r;I.isNullOrUndefined(t)?(i=[],r=this.eventListeners):(i=this.eventListeners.filter(o=>o.eventName!==t),r=this.eventListeners.filter(o=>o.eventName===t));for(const o of r)this.eventListenerHelper.detachEventListener(o);this.eventListeners=i}isRefDestroyed(){return I.isNullOrUndefined(this.changeDetectionRef)||this.changeDetectionRef.destroyed}static \u0275fac=function(i){return new(i||e)(M(dt),M(rn),M(Vi))};static \u0275dir=z({type:e,selectors:[["","ngxSliderElement",""]],hostVars:14,hostBindings:function(i,r){2&i&&Dl("opacity",r.opacity)("visibility",r.visibility)("left",r.left)("bottom",r.bottom)("height",r.height)("width",r.width)("transform",r.transform)}})}return e})(),_p=(()=>{class e extends di{active=!1;role="";tabindex="";ariaOrientation="";ariaLabel="";ariaLabelledBy="";ariaValueNow="";ariaValueText="";ariaValueMin="";ariaValueMax="";focus(){this.elemRef.nativeElement.focus()}focusIfNeeded(){document.activeElement!==this.elemRef.nativeElement&&this.elemRef.nativeElement.focus()}constructor(t,i,r){super(t,i,r)}static \u0275fac=function(i){return new(i||e)(M(dt),M(rn),M(Vi))};static \u0275dir=z({type:e,selectors:[["","ngxSliderHandle",""]],hostVars:11,hostBindings:function(i,r){2&i&&(pt("role",r.role)("tabindex",r.tabindex)("aria-orientation",r.ariaOrientation)("aria-label",r.ariaLabel)("aria-labelledby",r.ariaLabelledBy)("aria-valuenow",r.ariaValueNow)("aria-valuetext",r.ariaValueText)("aria-valuemin",r.ariaValueMin)("aria-valuemax",r.ariaValueMax),Vn("ngx-slider-active",r.active))},features:[ue]})}return e})(),ro=(()=>{class e extends di{allowUnsafeHtmlInSlider;_value=null;get value(){return this._value}constructor(t,i,r,o){super(t,i,r),this.allowUnsafeHtmlInSlider=o}setValue(t){let i=!1;!this.alwaysHide&&(I.isNullOrUndefined(this.value)||this.value.length!==t.length||this.value.length>0&&0===this.dimension)&&(i=!0),this._value=t,!1===this.allowUnsafeHtmlInSlider?this.elemRef.nativeElement.innerText=t:this.elemRef.nativeElement.innerHTML=t,i&&this.calculateDimension()}static \u0275fac=function(i){return new(i||e)(M(dt),M(rn),M(Vi),M(EI,8))};static \u0275dir=z({type:e,selectors:[["","ngxSliderLabel",""]],features:[ue]})}return e})(),WB=(()=>{class e{template;tooltip;placement;content;static \u0275fac=function(i){return new(i||e)};static \u0275cmp=Kt({type:e,selectors:[["ngx-slider-tooltip-wrapper"]],inputs:{template:"template",tooltip:"tooltip",placement:"placement",content:"content"},decls:2,vars:2,consts:[[4,"ngIf"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"ngx-slider-inner-tooltip"]],template:function(i,r){1&i&&H(0,MB,2,6,"ng-container",0)(1,SB,3,3,"ng-container",0),2&i&&(m("ngIf",r.template),f(),m("ngIf",!r.template))},dependencies:[$n,_D],styles:[".ngx-slider-inner-tooltip[_ngcontent-%COMP%]{height:100%}"]})}return e})();class ZB{selected=!1;style={};tooltip=null;tooltipPlacement=null;value=null;valueTooltip=null;valueTooltipPlacement=null;legend=null}class II{active=!1;value=0;difference=0;position=0;lowLimit=0;highLimit=0}class Dc{value;highValue;static compare(n,t){return!(I.isNullOrUndefined(n)&&I.isNullOrUndefined(t)||I.isNullOrUndefined(n)!==I.isNullOrUndefined(t))&&n.value===t.value&&n.highValue===t.highValue}}class MI extends Dc{forceChange;static compare(n,t){return!(I.isNullOrUndefined(n)&&I.isNullOrUndefined(t)||I.isNullOrUndefined(n)!==I.isNullOrUndefined(t))&&n.value===t.value&&n.highValue===t.highValue&&n.forceChange===t.forceChange}}const YB={provide:cn,useExisting:ve(()=>SI),multi:!0};let SI=(()=>{class e{renderer;elementRef;changeDetectionRef;zone;allowUnsafeHtmlInSlider;sliderElementNgxSliderClass=!0;value=null;valueChange=new Ee;highValue=null;highValueChange=new Ee;options=new Ec;userChangeStart=new Ee;userChange=new Ee;userChangeEnd=new Ee;manualRefreshSubscription;set manualRefresh(t){this.unsubscribeManualRefresh(),this.manualRefreshSubscription=t.subscribe(()=>{setTimeout(()=>this.calculateViewDimensionsAndDetectChanges())})}triggerFocusSubscription;set triggerFocus(t){this.unsubscribeTriggerFocus(),this.triggerFocusSubscription=t.subscribe(i=>{this.focusPointer(i)})}get range(){return!I.isNullOrUndefined(this.value)&&!I.isNullOrUndefined(this.highValue)}initHasRun=!1;inputModelChangeSubject=new un;inputModelChangeSubscription=null;outputModelChangeSubject=new un;outputModelChangeSubscription=null;viewLowValue=null;viewHighValue=null;viewOptions=new Ec;handleHalfDimension=0;maxHandlePosition=0;currentTrackingPointer=null;currentFocusPointer=null;firstKeyDown=!1;touchId=null;dragging=new II;leftOuterSelectionBarElement;rightOuterSelectionBarElement;fullBarElement;selectionBarElement;minHandleElement;maxHandleElement;floorLabelElement;ceilLabelElement;minHandleLabelElement;maxHandleLabelElement;combinedLabelElement;ticksElement;tooltipTemplate;sliderElementVerticalClass=!1;sliderElementAnimateClass=!1;sliderElementWithLegendClass=!1;sliderElementDisabledAttr=null;sliderElementAriaLabel="ngx-slider";barStyle={};minPointerStyle={};maxPointerStyle={};fullBarTransparentClass=!1;selectionBarDraggableClass=!1;ticksUnderValuesClass=!1;get showTicks(){return this.viewOptions.showTicks}intermediateTicks=!1;ticks=[];eventListenerHelper=null;onMoveEventListener=null;onEndEventListener=null;moving=!1;resizeObserver=null;onTouchedCallback=null;onChangeCallback=null;constructor(t,i,r,o,s){this.renderer=t,this.elementRef=i,this.changeDetectionRef=r,this.zone=o,this.allowUnsafeHtmlInSlider=s,this.eventListenerHelper=new bI(this.renderer)}ngOnInit(){this.viewOptions=new Ec,Object.assign(this.viewOptions,this.options),this.updateDisabledState(),this.updateVerticalState(),this.updateAriaLabel()}ngAfterViewInit(){this.applyOptions(),this.subscribeInputModelChangeSubject(),this.subscribeOutputModelChangeSubject(),this.renormaliseModelValues(),this.viewLowValue=this.modelValueToViewValue(this.value),this.viewHighValue=this.range?this.modelValueToViewValue(this.highValue):null,this.updateVerticalState(),this.manageElementsStyle(),this.updateDisabledState(),this.calculateViewDimensions(),this.addAccessibility(),this.updateCeilLabel(),this.updateFloorLabel(),this.initHandles(),this.manageEventsBindings(),this.updateAriaLabel(),this.subscribeResizeObserver(),this.initHasRun=!0,this.isRefDestroyed()||this.changeDetectionRef.detectChanges()}ngOnChanges(t){!I.isNullOrUndefined(t.options)&&JSON.stringify(t.options.previousValue)!==JSON.stringify(t.options.currentValue)&&this.onChangeOptions(),(!I.isNullOrUndefined(t.value)||!I.isNullOrUndefined(t.highValue))&&this.inputModelChangeSubject.next({value:this.value,highValue:this.highValue,forceChange:!1,internalChange:!1})}ngOnDestroy(){this.unbindEvents(),this.unsubscribeResizeObserver(),this.unsubscribeInputModelChangeSubject(),this.unsubscribeOutputModelChangeSubject(),this.unsubscribeManualRefresh(),this.unsubscribeTriggerFocus()}writeValue(t){t instanceof Array?(this.value=t[0],this.highValue=t[1]):this.value=t,this.inputModelChangeSubject.next({value:this.value,highValue:this.highValue,forceChange:!1,internalChange:!1})}registerOnChange(t){this.onChangeCallback=t}registerOnTouched(t){this.onTouchedCallback=t}setDisabledState(t){this.viewOptions.disabled=t,this.updateDisabledState()}setAriaLabel(t){this.viewOptions.ariaLabel=t,this.updateAriaLabel()}onResize(t){this.calculateViewDimensionsAndDetectChanges()}subscribeInputModelChangeSubject(){this.inputModelChangeSubscription=this.inputModelChangeSubject.pipe(pI(MI.compare),function vB(e,n){return gi((t,i)=>{let r=0;t.subscribe(zn(i,o=>e.call(n,o,r++)&&i.next(o)))})}(t=>!t.forceChange&&!t.internalChange)).subscribe(t=>this.applyInputModelChange(t))}subscribeOutputModelChangeSubject(){this.outputModelChangeSubscription=this.outputModelChangeSubject.pipe(pI(MI.compare)).subscribe(t=>this.publishOutputModelChange(t))}subscribeResizeObserver(){ui.isResizeObserverAvailable()&&(this.resizeObserver=new ResizeObserver(()=>this.calculateViewDimensionsAndDetectChanges()),this.resizeObserver.observe(this.elementRef.nativeElement))}unsubscribeResizeObserver(){ui.isResizeObserverAvailable()&&null!==this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}unsubscribeOnMove(){I.isNullOrUndefined(this.onMoveEventListener)||(this.eventListenerHelper.detachEventListener(this.onMoveEventListener),this.onMoveEventListener=null)}unsubscribeOnEnd(){I.isNullOrUndefined(this.onEndEventListener)||(this.eventListenerHelper.detachEventListener(this.onEndEventListener),this.onEndEventListener=null)}unsubscribeInputModelChangeSubject(){I.isNullOrUndefined(this.inputModelChangeSubscription)||(this.inputModelChangeSubscription.unsubscribe(),this.inputModelChangeSubscription=null)}unsubscribeOutputModelChangeSubject(){I.isNullOrUndefined(this.outputModelChangeSubscription)||(this.outputModelChangeSubscription.unsubscribe(),this.outputModelChangeSubscription=null)}unsubscribeManualRefresh(){I.isNullOrUndefined(this.manualRefreshSubscription)||(this.manualRefreshSubscription.unsubscribe(),this.manualRefreshSubscription=null)}unsubscribeTriggerFocus(){I.isNullOrUndefined(this.triggerFocusSubscription)||(this.triggerFocusSubscription.unsubscribe(),this.triggerFocusSubscription=null)}getPointerElement(t){return t===x.Min?this.minHandleElement:t===x.Max?this.maxHandleElement:null}getCurrentTrackingValue(){return this.currentTrackingPointer===x.Min?this.viewLowValue:this.currentTrackingPointer===x.Max?this.viewHighValue:null}modelValueToViewValue(t){return I.isNullOrUndefined(t)?NaN:I.isNullOrUndefined(this.viewOptions.stepsArray)||this.viewOptions.bindIndexForStepsArray?+t:I.findStepIndex(+t,this.viewOptions.stepsArray)}viewValueToModelValue(t){return I.isNullOrUndefined(this.viewOptions.stepsArray)||this.viewOptions.bindIndexForStepsArray?t:this.getStepValue(t)}getStepValue(t){const i=this.viewOptions.stepsArray[t];return I.isNullOrUndefined(i)?NaN:i.value}applyViewChange(){this.value=this.viewValueToModelValue(this.viewLowValue),this.range&&(this.highValue=this.viewValueToModelValue(this.viewHighValue)),this.outputModelChangeSubject.next({value:this.value,highValue:this.highValue,userEventInitiated:!0,forceChange:!1}),this.inputModelChangeSubject.next({value:this.value,highValue:this.highValue,forceChange:!1,internalChange:!0})}applyInputModelChange(t){const i=this.normaliseModelValues(t),r=!Dc.compare(t,i);r&&(this.value=i.value,this.highValue=i.highValue),this.viewLowValue=this.modelValueToViewValue(i.value),this.viewHighValue=this.range?this.modelValueToViewValue(i.highValue):null,this.updateLowHandle(this.valueToPosition(this.viewLowValue)),this.range&&this.updateHighHandle(this.valueToPosition(this.viewHighValue)),this.updateSelectionBar(),this.updateTicksScale(),this.updateAriaAttributes(),this.range&&this.updateCombinedLabel(),this.outputModelChangeSubject.next({value:i.value,highValue:i.highValue,forceChange:r,userEventInitiated:!1})}publishOutputModelChange(t){const i=()=>{this.valueChange.emit(t.value),this.range&&this.highValueChange.emit(t.highValue),I.isNullOrUndefined(this.onChangeCallback)||this.onChangeCallback(this.range?[t.value,t.highValue]:t.value),I.isNullOrUndefined(this.onTouchedCallback)||this.onTouchedCallback(this.range?[t.value,t.highValue]:t.value)};t.userEventInitiated?(i(),this.userChange.emit(this.getChangeContext())):setTimeout(()=>{i()})}normaliseModelValues(t){const i=new Dc;if(i.value=t.value,i.highValue=t.highValue,!I.isNullOrUndefined(this.viewOptions.stepsArray)){if(this.viewOptions.enforceStepsArray){const r=I.findStepIndex(i.value,this.viewOptions.stepsArray);if(i.value=this.viewOptions.stepsArray[r].value,this.range){const o=I.findStepIndex(i.highValue,this.viewOptions.stepsArray);i.highValue=this.viewOptions.stepsArray[o].value}}return i}if(this.viewOptions.enforceStep&&(i.value=this.roundStep(i.value),this.range&&(i.highValue=this.roundStep(i.highValue))),this.viewOptions.enforceRange&&(i.value=ke.clampToRange(i.value,this.viewOptions.floor,this.viewOptions.ceil),this.range&&(i.highValue=ke.clampToRange(i.highValue,this.viewOptions.floor,this.viewOptions.ceil)),this.range&&t.value>t.highValue))if(this.viewOptions.noSwitching)i.value=i.highValue;else{const r=t.value;i.value=t.highValue,i.highValue=r}return i}renormaliseModelValues(){const t={value:this.value,highValue:this.highValue},i=this.normaliseModelValues(t);Dc.compare(i,t)||(this.value=i.value,this.highValue=i.highValue,this.outputModelChangeSubject.next({value:this.value,highValue:this.highValue,forceChange:!0,userEventInitiated:!1}))}onChangeOptions(){if(!this.initHasRun)return;const t=this.getOptionsInfluencingEventBindings(this.viewOptions);this.applyOptions();const i=this.getOptionsInfluencingEventBindings(this.viewOptions),r=!I.areArraysEqual(t,i);this.renormaliseModelValues(),this.viewLowValue=this.modelValueToViewValue(this.value),this.viewHighValue=this.range?this.modelValueToViewValue(this.highValue):null,this.resetSlider(r)}applyOptions(){if(this.viewOptions=new Ec,Object.assign(this.viewOptions,this.options),this.viewOptions.draggableRange=this.range&&this.viewOptions.draggableRange,this.viewOptions.draggableRangeOnly=this.range&&this.viewOptions.draggableRangeOnly,this.viewOptions.draggableRangeOnly&&(this.viewOptions.draggableRange=!0),this.viewOptions.showTicks=this.viewOptions.showTicks||this.viewOptions.showTicksValues||!I.isNullOrUndefined(this.viewOptions.ticksArray),this.viewOptions.showTicks&&(!I.isNullOrUndefined(this.viewOptions.tickStep)||!I.isNullOrUndefined(this.viewOptions.ticksArray))&&(this.intermediateTicks=!0),this.viewOptions.showSelectionBar=this.viewOptions.showSelectionBar||this.viewOptions.showSelectionBarEnd||!I.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue),I.isNullOrUndefined(this.viewOptions.stepsArray)?this.applyFloorCeilOptions():this.applyStepsArrayOptions(),I.isNullOrUndefined(this.viewOptions.combineLabels)&&(this.viewOptions.combineLabels=(t,i)=>t+" - "+i),this.viewOptions.logScale&&0===this.viewOptions.floor)throw Error("Can't use floor=0 with logarithmic scale")}applyStepsArrayOptions(){this.viewOptions.floor=0,this.viewOptions.ceil=this.viewOptions.stepsArray.length-1,this.viewOptions.step=1,I.isNullOrUndefined(this.viewOptions.translate)&&(this.viewOptions.translate=t=>String(this.viewOptions.bindIndexForStepsArray?this.getStepValue(t):t))}applyFloorCeilOptions(){if(I.isNullOrUndefined(this.viewOptions.step)?this.viewOptions.step=1:(this.viewOptions.step=+this.viewOptions.step,this.viewOptions.step<=0&&(this.viewOptions.step=1)),I.isNullOrUndefined(this.viewOptions.ceil)||I.isNullOrUndefined(this.viewOptions.floor))throw Error("floor and ceil options must be supplied");this.viewOptions.ceil=+this.viewOptions.ceil,this.viewOptions.floor=+this.viewOptions.floor,I.isNullOrUndefined(this.viewOptions.translate)&&(this.viewOptions.translate=t=>String(t))}resetSlider(t=!0){this.manageElementsStyle(),this.addAccessibility(),this.updateCeilLabel(),this.updateFloorLabel(),t&&(this.unbindEvents(),this.manageEventsBindings()),this.updateDisabledState(),this.updateAriaLabel(),this.calculateViewDimensions(),this.refocusPointerIfNeeded()}focusPointer(t){t!==x.Min&&t!==x.Max&&(t=x.Min),t===x.Min?this.minHandleElement.focus():this.range&&t===x.Max&&this.maxHandleElement.focus()}refocusPointerIfNeeded(){I.isNullOrUndefined(this.currentFocusPointer)||this.getPointerElement(this.currentFocusPointer).focusIfNeeded()}manageElementsStyle(){this.updateScale(),this.floorLabelElement.setAlwaysHide(this.viewOptions.showTicksValues||this.viewOptions.hideLimitLabels),this.ceilLabelElement.setAlwaysHide(this.viewOptions.showTicksValues||this.viewOptions.hideLimitLabels);const t=this.viewOptions.showTicksValues&&!this.intermediateTicks;this.minHandleLabelElement.setAlwaysHide(t||this.viewOptions.hidePointerLabels),this.maxHandleLabelElement.setAlwaysHide(t||!this.range||this.viewOptions.hidePointerLabels),this.combinedLabelElement.setAlwaysHide(t||!this.range||this.viewOptions.hidePointerLabels),this.selectionBarElement.setAlwaysHide(!this.range&&!this.viewOptions.showSelectionBar),this.leftOuterSelectionBarElement.setAlwaysHide(!this.range||!this.viewOptions.showOuterSelectionBars),this.rightOuterSelectionBarElement.setAlwaysHide(!this.range||!this.viewOptions.showOuterSelectionBars),this.fullBarTransparentClass=this.range&&this.viewOptions.showOuterSelectionBars,this.selectionBarDraggableClass=this.viewOptions.draggableRange&&!this.viewOptions.onlyBindHandles,this.ticksUnderValuesClass=this.intermediateTicks&&this.options.showTicksValues,this.sliderElementVerticalClass!==this.viewOptions.vertical&&(this.updateVerticalState(),setTimeout(()=>{this.resetSlider()})),this.sliderElementAnimateClass!==this.viewOptions.animate&&setTimeout(()=>{this.sliderElementAnimateClass=this.viewOptions.animate}),this.updateRotate()}manageEventsBindings(){this.viewOptions.disabled||this.viewOptions.readOnly?this.unbindEvents():this.bindEvents()}updateDisabledState(){this.sliderElementDisabledAttr=this.viewOptions.disabled?"disabled":null}updateAriaLabel(){this.sliderElementAriaLabel=this.viewOptions.ariaLabel||"nxg-slider"}updateVerticalState(){this.sliderElementVerticalClass=this.viewOptions.vertical;for(const t of this.getAllSliderElements())I.isNullOrUndefined(t)||t.setVertical(this.viewOptions.vertical)}updateScale(){for(const t of this.getAllSliderElements())t.setScale(this.viewOptions.scale)}updateRotate(){for(const t of this.getAllSliderElements())t.setRotate(this.viewOptions.rotate)}getAllSliderElements(){return[this.leftOuterSelectionBarElement,this.rightOuterSelectionBarElement,this.fullBarElement,this.selectionBarElement,this.minHandleElement,this.maxHandleElement,this.floorLabelElement,this.ceilLabelElement,this.minHandleLabelElement,this.maxHandleLabelElement,this.combinedLabelElement,this.ticksElement]}initHandles(){this.updateLowHandle(this.valueToPosition(this.viewLowValue)),this.range&&this.updateHighHandle(this.valueToPosition(this.viewHighValue)),this.updateSelectionBar(),this.range&&this.updateCombinedLabel(),this.updateTicksScale()}addAccessibility(){this.updateAriaAttributes(),this.minHandleElement.role="slider",this.minHandleElement.tabindex=!this.viewOptions.keyboardSupport||this.viewOptions.readOnly||this.viewOptions.disabled?"":"0",this.minHandleElement.ariaOrientation=this.viewOptions.vertical||0!==this.viewOptions.rotate?"vertical":"horizontal",I.isNullOrUndefined(this.viewOptions.ariaLabel)?I.isNullOrUndefined(this.viewOptions.ariaLabelledBy)||(this.minHandleElement.ariaLabelledBy=this.viewOptions.ariaLabelledBy):this.minHandleElement.ariaLabel=this.viewOptions.ariaLabel,this.range&&(this.maxHandleElement.role="slider",this.maxHandleElement.tabindex=!this.viewOptions.keyboardSupport||this.viewOptions.readOnly||this.viewOptions.disabled?"":"0",this.maxHandleElement.ariaOrientation=this.viewOptions.vertical||0!==this.viewOptions.rotate?"vertical":"horizontal",I.isNullOrUndefined(this.viewOptions.ariaLabelHigh)?I.isNullOrUndefined(this.viewOptions.ariaLabelledByHigh)||(this.maxHandleElement.ariaLabelledBy=this.viewOptions.ariaLabelledByHigh):this.maxHandleElement.ariaLabel=this.viewOptions.ariaLabelHigh)}updateAriaAttributes(){this.minHandleElement.ariaValueNow=(+this.value).toString(),this.minHandleElement.ariaValueText=this.viewOptions.translate(+this.value,Sn.Low),this.minHandleElement.ariaValueMin=this.viewOptions.floor.toString(),this.minHandleElement.ariaValueMax=this.viewOptions.ceil.toString(),this.range&&(this.maxHandleElement.ariaValueNow=(+this.highValue).toString(),this.maxHandleElement.ariaValueText=this.viewOptions.translate(+this.highValue,Sn.High),this.maxHandleElement.ariaValueMin=this.viewOptions.floor.toString(),this.maxHandleElement.ariaValueMax=this.viewOptions.ceil.toString())}calculateViewDimensions(){I.isNullOrUndefined(this.viewOptions.handleDimension)?this.minHandleElement.calculateDimension():this.minHandleElement.setDimension(this.viewOptions.handleDimension);const t=this.minHandleElement.dimension;this.handleHalfDimension=t/2,I.isNullOrUndefined(this.viewOptions.barDimension)?this.fullBarElement.calculateDimension():this.fullBarElement.setDimension(this.viewOptions.barDimension),this.maxHandlePosition=this.fullBarElement.dimension-t,this.initHasRun&&(this.updateFloorLabel(),this.updateCeilLabel(),this.initHandles())}calculateViewDimensionsAndDetectChanges(){this.calculateViewDimensions(),this.isRefDestroyed()||this.changeDetectionRef.detectChanges()}isRefDestroyed(){return this.changeDetectionRef.destroyed}updateTicksScale(){if(!this.viewOptions.showTicks&&this.sliderElementWithLegendClass)return void setTimeout(()=>{this.sliderElementWithLegendClass=!1});const t=I.isNullOrUndefined(this.viewOptions.ticksArray)?this.getTicksArray():this.viewOptions.ticksArray,i=this.viewOptions.vertical?"translateY":"translateX";this.viewOptions.rightToLeft&&t.reverse();const r=I.isNullOrUndefined(this.viewOptions.tickValueStep)?I.isNullOrUndefined(this.viewOptions.tickStep)?this.viewOptions.step:this.viewOptions.tickStep:this.viewOptions.tickValueStep;let o=!1;const s=t.map(a=>{let l=this.valueToPosition(a);this.viewOptions.vertical&&(l=this.maxHandlePosition-l);const c=i+"("+Math.round(l)+"px)",u=new ZB;u.selected=this.isTickSelected(a),u.style={"-webkit-transform":c,"-moz-transform":c,"-o-transform":c,"-ms-transform":c,transform:c},u.selected&&!I.isNullOrUndefined(this.viewOptions.getSelectionBarColor)&&(u.style["background-color"]=this.getSelectionBarColor()),!u.selected&&!I.isNullOrUndefined(this.viewOptions.getTickColor)&&(u.style["background-color"]=this.getTickColor(a)),I.isNullOrUndefined(this.viewOptions.ticksTooltip)||(u.tooltip=this.viewOptions.ticksTooltip(a),u.tooltipPlacement=this.viewOptions.vertical?"right":"top"),this.viewOptions.showTicksValues&&!I.isNullOrUndefined(r)&&ke.isModuloWithinPrecisionLimit(a,r,this.viewOptions.precisionLimit)&&(u.value=this.getDisplayValue(a,Sn.TickValue),I.isNullOrUndefined(this.viewOptions.ticksValuesTooltip)||(u.valueTooltip=this.viewOptions.ticksValuesTooltip(a),u.valueTooltipPlacement=this.viewOptions.vertical?"right":"top"));let d=null;if(I.isNullOrUndefined(this.viewOptions.stepsArray))I.isNullOrUndefined(this.viewOptions.getLegend)||(d=this.viewOptions.getLegend(a));else{const p=this.viewOptions.stepsArray[a];I.isNullOrUndefined(this.viewOptions.getStepLegend)?I.isNullOrUndefined(p)||(d=p.legend):d=this.viewOptions.getStepLegend(p)}return I.isNullOrUndefined(d)||(u.legend=d,o=!0),u});if(this.sliderElementWithLegendClass!==o&&setTimeout(()=>{this.sliderElementWithLegendClass=o}),I.isNullOrUndefined(this.ticks)||this.ticks.length!==s.length)this.ticks=s,this.isRefDestroyed()||this.changeDetectionRef.detectChanges();else for(let a=0;a=this.viewLowValue)return!0}else if(this.viewOptions.showSelectionBar&&t<=this.viewLowValue)return!0}else{const i=this.viewOptions.showSelectionBarFromValue;if(this.viewLowValue>i&&t>=i&&t<=this.viewLowValue)return!0;if(this.viewLowValue=this.viewLowValue)return!0}return!!(this.range&&t>=this.viewLowValue&&t<=this.viewHighValue)}updateFloorLabel(){this.floorLabelElement.alwaysHide||(this.floorLabelElement.setValue(this.getDisplayValue(this.viewOptions.floor,Sn.Floor)),this.floorLabelElement.calculateDimension(),this.floorLabelElement.setPosition(this.viewOptions.rightToLeft?this.fullBarElement.dimension-this.floorLabelElement.dimension:0))}updateCeilLabel(){this.ceilLabelElement.alwaysHide||(this.ceilLabelElement.setValue(this.getDisplayValue(this.viewOptions.ceil,Sn.Ceil)),this.ceilLabelElement.calculateDimension(),this.ceilLabelElement.setPosition(this.viewOptions.rightToLeft?0:this.fullBarElement.dimension-this.ceilLabelElement.dimension))}updateHandles(t,i){t===x.Min?this.updateLowHandle(i):t===x.Max&&this.updateHighHandle(i),this.updateSelectionBar(),this.updateTicksScale(),this.range&&this.updateCombinedLabel()}getHandleLabelPos(t,i){const r=t===x.Min?this.minHandleLabelElement.dimension:this.maxHandleLabelElement.dimension,o=i-r/2+this.handleHalfDimension,s=this.fullBarElement.dimension-r;return this.viewOptions.boundPointerLabels?this.viewOptions.rightToLeft&&t===x.Min||!this.viewOptions.rightToLeft&&t===x.Max?Math.min(o,s):Math.min(Math.max(o,0),s):o}updateLowHandle(t){this.minHandleElement.setPosition(t),this.minHandleLabelElement.setValue(this.getDisplayValue(this.viewLowValue,Sn.Low)),this.minHandleLabelElement.setPosition(this.getHandleLabelPos(x.Min,t)),I.isNullOrUndefined(this.viewOptions.getPointerColor)||(this.minPointerStyle={backgroundColor:this.getPointerColor(x.Min)}),this.viewOptions.autoHideLimitLabels&&this.updateFloorAndCeilLabelsVisibility()}updateHighHandle(t){this.maxHandleElement.setPosition(t),this.maxHandleLabelElement.setValue(this.getDisplayValue(this.viewHighValue,Sn.High)),this.maxHandleLabelElement.setPosition(this.getHandleLabelPos(x.Max,t)),I.isNullOrUndefined(this.viewOptions.getPointerColor)||(this.maxPointerStyle={backgroundColor:this.getPointerColor(x.Max)}),this.viewOptions.autoHideLimitLabels&&this.updateFloorAndCeilLabelsVisibility()}updateFloorAndCeilLabelsVisibility(){if(this.viewOptions.hidePointerLabels)return;let t=!1,i=!1;const r=this.isLabelBelowFloorLabel(this.minHandleLabelElement),o=this.isLabelAboveCeilLabel(this.minHandleLabelElement),s=this.isLabelAboveCeilLabel(this.maxHandleLabelElement),a=this.isLabelBelowFloorLabel(this.combinedLabelElement),l=this.isLabelAboveCeilLabel(this.combinedLabelElement);if(r?(t=!0,this.floorLabelElement.hide()):(t=!1,this.floorLabelElement.show()),o?(i=!0,this.ceilLabelElement.hide()):(i=!1,this.ceilLabelElement.show()),this.range){const c=this.combinedLabelElement.isVisible()?l:s,u=this.combinedLabelElement.isVisible()?a:r;c?this.ceilLabelElement.hide():i||this.ceilLabelElement.show(),u?this.floorLabelElement.hide():t||this.floorLabelElement.show()}}isLabelBelowFloorLabel(t){const i=t.position,o=this.floorLabelElement.position;return this.viewOptions.rightToLeft?i+t.dimension>=o-2:i<=o+this.floorLabelElement.dimension+2}isLabelAboveCeilLabel(t){const i=t.position,o=this.ceilLabelElement.position;return this.viewOptions.rightToLeft?i<=o+this.ceilLabelElement.dimension+2:i+t.dimension>=o-2}updateSelectionBar(){let t=0,i=0;const r=this.viewOptions.rightToLeft?!this.viewOptions.showSelectionBarEnd:this.viewOptions.showSelectionBarEnd,o=this.viewOptions.rightToLeft?this.maxHandleElement.position+this.handleHalfDimension:this.minHandleElement.position+this.handleHalfDimension;if(this.range)i=Math.abs(this.maxHandleElement.position-this.minHandleElement.position),t=o;else if(I.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue))r?(i=Math.ceil(Math.abs(this.maxHandlePosition-this.minHandleElement.position)+this.handleHalfDimension),t=Math.floor(this.minHandleElement.position+this.handleHalfDimension)):(i=this.minHandleElement.position+this.handleHalfDimension,t=0);else{const s=this.viewOptions.showSelectionBarFromValue,a=this.valueToPosition(s);(this.viewOptions.rightToLeft?this.viewLowValue<=s:this.viewLowValue>s)?(i=this.minHandleElement.position-a,t=a+this.handleHalfDimension):(i=a-this.minHandleElement.position,t=this.minHandleElement.position+this.handleHalfDimension)}if(this.selectionBarElement.setDimension(i),this.selectionBarElement.setPosition(t),this.range&&this.viewOptions.showOuterSelectionBars&&(this.viewOptions.rightToLeft?(this.rightOuterSelectionBarElement.setDimension(t),this.rightOuterSelectionBarElement.setPosition(0),this.fullBarElement.calculateDimension(),this.leftOuterSelectionBarElement.setDimension(this.fullBarElement.dimension-(t+i)),this.leftOuterSelectionBarElement.setPosition(t+i)):(this.leftOuterSelectionBarElement.setDimension(t),this.leftOuterSelectionBarElement.setPosition(0),this.fullBarElement.calculateDimension(),this.rightOuterSelectionBarElement.setDimension(this.fullBarElement.dimension-(t+i)),this.rightOuterSelectionBarElement.setPosition(t+i))),I.isNullOrUndefined(this.viewOptions.getSelectionBarColor)){if(!I.isNullOrUndefined(this.viewOptions.selectionBarGradient)){const s=I.isNullOrUndefined(this.viewOptions.showSelectionBarFromValue)?0:this.valueToPosition(this.viewOptions.showSelectionBarFromValue),a=s-t>0&&!r||s-t<=0&&r;this.barStyle={backgroundImage:"linear-gradient(to "+(this.viewOptions.vertical?a?"bottom":"top":a?"left":"right")+", "+this.viewOptions.selectionBarGradient.from+" 0%,"+this.viewOptions.selectionBarGradient.to+" 100%)"},this.viewOptions.vertical?(this.barStyle.backgroundPosition="center "+(s+i+t+(a?-this.handleHalfDimension:0))+"px",this.barStyle.backgroundSize="100% "+(this.fullBarElement.dimension-this.handleHalfDimension)+"px"):(this.barStyle.backgroundPosition=s-t+(a?this.handleHalfDimension:0)+"px center",this.barStyle.backgroundSize=this.fullBarElement.dimension-this.handleHalfDimension+"px 100%")}}else{const s=this.getSelectionBarColor();this.barStyle={backgroundColor:s}}}getSelectionBarColor(){return this.range?this.viewOptions.getSelectionBarColor(this.value,this.highValue):this.viewOptions.getSelectionBarColor(this.value)}getPointerColor(t){return this.viewOptions.getPointerColor(t===x.Max?this.highValue:this.value,t)}getTickColor(t){return this.viewOptions.getTickColor(t)}updateCombinedLabel(){let t=null;if(t=this.viewOptions.rightToLeft?this.minHandleLabelElement.position-this.minHandleLabelElement.dimension-10<=this.maxHandleLabelElement.position:this.minHandleLabelElement.position+this.minHandleLabelElement.dimension+10>=this.maxHandleLabelElement.position,t){const i=this.getDisplayValue(this.viewLowValue,Sn.Low),r=this.getDisplayValue(this.viewHighValue,Sn.High),o=this.viewOptions.rightToLeft?this.viewOptions.combineLabels(r,i):this.viewOptions.combineLabels(i,r);this.combinedLabelElement.setValue(o);const s=this.viewOptions.boundPointerLabels?Math.min(Math.max(this.selectionBarElement.position+this.selectionBarElement.dimension/2-this.combinedLabelElement.dimension/2,0),this.fullBarElement.dimension-this.combinedLabelElement.dimension):this.selectionBarElement.position+this.selectionBarElement.dimension/2-this.combinedLabelElement.dimension/2;this.combinedLabelElement.setPosition(s),this.minHandleLabelElement.hide(),this.maxHandleLabelElement.hide(),this.combinedLabelElement.show()}else this.updateHighHandle(this.valueToPosition(this.viewHighValue)),this.updateLowHandle(this.valueToPosition(this.viewLowValue)),this.maxHandleLabelElement.show(),this.minHandleLabelElement.show(),this.combinedLabelElement.hide();this.viewOptions.autoHideLimitLabels&&this.updateFloorAndCeilLabelsVisibility()}getDisplayValue(t,i){return!I.isNullOrUndefined(this.viewOptions.stepsArray)&&!this.viewOptions.bindIndexForStepsArray&&(t=this.getStepValue(t)),this.viewOptions.translate(t,i)}roundStep(t,i){const r=I.isNullOrUndefined(i)?this.viewOptions.step:i;let o=ke.roundToPrecisionLimit((t-this.viewOptions.floor)/r,this.viewOptions.precisionLimit);return o=Math.round(o)*r,ke.roundToPrecisionLimit(this.viewOptions.floor+o,this.viewOptions.precisionLimit)}valueToPosition(t){let i=I.linearValueToPosition;I.isNullOrUndefined(this.viewOptions.customValueToPosition)?this.viewOptions.logScale&&(i=I.logValueToPosition):i=this.viewOptions.customValueToPosition;let r=i(t=ke.clampToRange(t,this.viewOptions.floor,this.viewOptions.ceil),this.viewOptions.floor,this.viewOptions.ceil);return I.isNullOrUndefined(r)&&(r=0),this.viewOptions.rightToLeft&&(r=1-r),r*this.maxHandlePosition}positionToValue(t){let i=t/this.maxHandlePosition;this.viewOptions.rightToLeft&&(i=1-i);let r=I.linearPositionToValue;I.isNullOrUndefined(this.viewOptions.customPositionToValue)?this.viewOptions.logScale&&(r=I.logPositionToValue):r=this.viewOptions.customPositionToValue;const o=r(i,this.viewOptions.floor,this.viewOptions.ceil);return I.isNullOrUndefined(o)?0:o}getEventXY(t,i){if(t instanceof MouseEvent)return this.viewOptions.vertical||0!==this.viewOptions.rotate?t.clientY:t.clientX;let r=0;const o=t.touches;if(!I.isNullOrUndefined(i))for(let s=0;so?x.Max:this.viewOptions.rightToLeft?i>this.minHandleElement.position?x.Min:x.Max:ithis.onBarStart(null,t,i,!0,!0,!0)),this.viewOptions.draggableRangeOnly?(this.minHandleElement.on("mousedown",i=>this.onBarStart(x.Min,t,i,!0,!0)),this.maxHandleElement.on("mousedown",i=>this.onBarStart(x.Max,t,i,!0,!0))):(this.minHandleElement.on("mousedown",i=>this.onStart(x.Min,i,!0,!0)),this.range&&this.maxHandleElement.on("mousedown",i=>this.onStart(x.Max,i,!0,!0)),this.viewOptions.onlyBindHandles||(this.fullBarElement.on("mousedown",i=>this.onStart(null,i,!0,!0,!0)),this.ticksElement.on("mousedown",i=>this.onStart(null,i,!0,!0,!0,!0)))),this.viewOptions.onlyBindHandles||this.selectionBarElement.onPassive("touchstart",i=>this.onBarStart(null,t,i,!0,!0,!0)),this.viewOptions.draggableRangeOnly?(this.minHandleElement.onPassive("touchstart",i=>this.onBarStart(x.Min,t,i,!0,!0)),this.maxHandleElement.onPassive("touchstart",i=>this.onBarStart(x.Max,t,i,!0,!0))):(this.minHandleElement.onPassive("touchstart",i=>this.onStart(x.Min,i,!0,!0)),this.range&&this.maxHandleElement.onPassive("touchstart",i=>this.onStart(x.Max,i,!0,!0)),this.viewOptions.onlyBindHandles||(this.fullBarElement.onPassive("touchstart",i=>this.onStart(null,i,!0,!0,!0)),this.ticksElement.onPassive("touchstart",i=>this.onStart(null,i,!1,!1,!0,!0)))),this.viewOptions.keyboardSupport&&(this.minHandleElement.on("focus",()=>this.onPointerFocus(x.Min)),this.range&&this.maxHandleElement.on("focus",()=>this.onPointerFocus(x.Max)))}getOptionsInfluencingEventBindings(t){return[t.disabled,t.readOnly,t.draggableRange,t.draggableRangeOnly,t.onlyBindHandles,t.keyboardSupport]}unbindEvents(){this.unsubscribeOnMove(),this.unsubscribeOnEnd();for(const t of this.getAllSliderElements())I.isNullOrUndefined(t)||t.off()}onBarStart(t,i,r,o,s,a,l){i?this.onDragStart(t,r,o,s):this.onStart(t,r,o,s,a,l)}onStart(t,i,r,o,s,a){i.stopPropagation(),!ui.isTouchEvent(i)&&!vI&&i.preventDefault(),this.moving=!1,this.calculateViewDimensions(),I.isNullOrUndefined(t)&&(t=this.getNearestHandle(i)),this.currentTrackingPointer=t;const l=this.getPointerElement(t);if(l.active=!0,this.viewOptions.keyboardSupport&&l.focus(),r){this.unsubscribeOnMove();const c=u=>this.dragging.active?this.onDragMove(u):this.onMove(u);this.onMoveEventListener=ui.isTouchEvent(i)?this.eventListenerHelper.attachPassiveEventListener(document,"touchmove",c):this.eventListenerHelper.attachEventListener(document,"mousemove",c)}if(o){this.unsubscribeOnEnd();const c=u=>this.onEnd(u);this.onEndEventListener=ui.isTouchEvent(i)?this.eventListenerHelper.attachPassiveEventListener(document,"touchend",c):this.eventListenerHelper.attachEventListener(document,"mouseup",c)}this.userChangeStart.emit(this.getChangeContext()),ui.isTouchEvent(i)&&!I.isNullOrUndefined(i.changedTouches)&&I.isNullOrUndefined(this.touchId)&&(this.touchId=i.changedTouches[0].identifier),s&&this.onMove(i,!0),a&&this.onEnd(i)}onMove(t,i){let r=null;if(ui.isTouchEvent(t)){const c=t.changedTouches;for(let u=0;u=this.maxHandlePosition?s=this.viewOptions.rightToLeft?this.viewOptions.floor:this.viewOptions.ceil:(s=this.positionToValue(o),s=i&&!I.isNullOrUndefined(this.viewOptions.tickStep)?this.roundStep(s,this.viewOptions.tickStep):this.roundStep(s)),this.positionTrackingHandle(s)}onEnd(t){ui.isTouchEvent(t)&&t.changedTouches[0].identifier!==this.touchId||(this.moving=!1,this.viewOptions.animate&&(this.sliderElementAnimateClass=!0),this.touchId=null,this.viewOptions.keyboardSupport||(this.minHandleElement.active=!1,this.maxHandleElement.active=!1,this.currentTrackingPointer=null),this.dragging.active=!1,this.unsubscribeOnMove(),this.unsubscribeOnEnd(),this.userChangeEnd.emit(this.getChangeContext()))}onPointerFocus(t){const i=this.getPointerElement(t);i.on("blur",()=>this.onPointerBlur(i)),i.on("keydown",r=>this.onKeyboardEvent(r)),i.on("keyup",()=>this.onKeyUp()),i.active=!0,this.currentTrackingPointer=t,this.currentFocusPointer=t,this.firstKeyDown=!0}onKeyUp(){this.firstKeyDown=!0,this.userChangeEnd.emit(this.getChangeContext())}onPointerBlur(t){t.off("blur"),t.off("keydown"),t.off("keyup"),t.active=!1,I.isNullOrUndefined(this.touchId)&&(this.currentTrackingPointer=null,this.currentFocusPointer=null)}getKeyActions(t){const i=this.viewOptions.ceil-this.viewOptions.floor;let r=t+this.viewOptions.step,o=t-this.viewOptions.step,s=t+i/10,a=t-i/10;this.viewOptions.reversedControls&&(r=t-this.viewOptions.step,o=t+this.viewOptions.step,s=t-i/10,a=t+i/10);const l={UP:r,DOWN:o,LEFT:o,RIGHT:r,PAGEUP:s,PAGEDOWN:a,HOME:this.viewOptions.reversedControls?this.viewOptions.ceil:this.viewOptions.floor,END:this.viewOptions.reversedControls?this.viewOptions.floor:this.viewOptions.ceil};return this.viewOptions.rightToLeft&&(l.LEFT=r,l.RIGHT=o,(this.viewOptions.vertical||0!==this.viewOptions.rotate)&&(l.UP=o,l.DOWN=r)),l}onKeyboardEvent(t){const i=this.getCurrentTrackingValue(),r=I.isNullOrUndefined(t.keyCode)?t.which:t.keyCode,l=this.getKeyActions(i)[{38:"UP",40:"DOWN",37:"LEFT",39:"RIGHT",33:"PAGEUP",34:"PAGEDOWN",36:"HOME",35:"END"}[r]];if(I.isNullOrUndefined(l)||I.isNullOrUndefined(this.currentTrackingPointer))return;t.preventDefault(),this.firstKeyDown&&(this.firstKeyDown=!1,this.userChangeStart.emit(this.getChangeContext()));const c=ke.clampToRange(l,this.viewOptions.floor,this.viewOptions.ceil),u=this.roundStep(c);if(this.viewOptions.draggableRangeOnly){const d=this.viewHighValue-this.viewLowValue;let p,h;this.currentTrackingPointer===x.Min?(p=u,h=u+d,h>this.viewOptions.ceil&&(h=this.viewOptions.ceil,p=h-d)):this.currentTrackingPointer===x.Max&&(h=u,p=u-d,p=this.maxHandlePosition-r;let u,d;if(i<=o){if(0===s.position)return;u=this.getMinValue(i,!0,!1),d=this.getMaxValue(i,!0,!1)}else if(c){if(a.position===this.maxHandlePosition)return;d=this.getMaxValue(i,!0,!0),u=this.getMinValue(i,!0,!0)}else u=this.getMinValue(i,!1,!1),d=this.getMaxValue(i,!1,!1);this.positionTrackingBar(u,d)}positionTrackingBar(t,i){!I.isNullOrUndefined(this.viewOptions.minLimit)&&tthis.viewOptions.maxLimit&&(t=ke.roundToPrecisionLimit((i=this.viewOptions.maxLimit)-this.dragging.difference,this.viewOptions.precisionLimit)),this.viewLowValue=t,this.viewHighValue=i,this.applyViewChange(),this.updateHandles(x.Min,this.valueToPosition(t)),this.updateHandles(x.Max,this.valueToPosition(i))}positionTrackingHandle(t){t=this.applyMinMaxLimit(t),this.range&&(this.viewOptions.pushRange?t=this.applyPushRange(t):(this.viewOptions.noSwitching&&(this.currentTrackingPointer===x.Min&&t>this.viewHighValue?t=this.applyMinMaxRange(this.viewHighValue):this.currentTrackingPointer===x.Max&&tthis.viewHighValue?(this.viewLowValue=this.viewHighValue,this.applyViewChange(),this.updateHandles(x.Min,this.maxHandleElement.position),this.updateAriaAttributes(),this.currentTrackingPointer=x.Max,this.minHandleElement.active=!1,this.maxHandleElement.active=!0,this.viewOptions.keyboardSupport&&this.maxHandleElement.focus()):this.currentTrackingPointer===x.Max&&tthis.viewOptions.maxLimit?this.viewOptions.maxLimit:t}applyMinMaxRange(t){const r=Math.abs(t-(this.currentTrackingPointer===x.Min?this.viewHighValue:this.viewLowValue));if(!I.isNullOrUndefined(this.viewOptions.minRange)&&rthis.viewOptions.maxRange){if(this.currentTrackingPointer===x.Min)return ke.roundToPrecisionLimit(this.viewHighValue-this.viewOptions.maxRange,this.viewOptions.precisionLimit);if(this.currentTrackingPointer===x.Max)return ke.roundToPrecisionLimit(this.viewLowValue+this.viewOptions.maxRange,this.viewOptions.precisionLimit)}return t}applyPushRange(t){const i=this.currentTrackingPointer===x.Min?this.viewHighValue-t:t-this.viewLowValue,r=I.isNullOrUndefined(this.viewOptions.minRange)?this.viewOptions.step:this.viewOptions.minRange,o=this.viewOptions.maxRange;return io&&(this.currentTrackingPointer===x.Min?(this.viewHighValue=ke.roundToPrecisionLimit(t+o,this.viewOptions.precisionLimit),this.applyViewChange(),this.updateHandles(x.Max,this.valueToPosition(this.viewHighValue))):this.currentTrackingPointer===x.Max&&(this.viewLowValue=ke.roundToPrecisionLimit(t-o,this.viewOptions.precisionLimit),this.applyViewChange(),this.updateHandles(x.Min,this.valueToPosition(this.viewLowValue))),this.updateAriaAttributes()),t}getChangeContext(){const t=new qB;return t.pointerType=this.currentTrackingPointer,t.value=+this.value,this.range&&(t.highValue=+this.highValue),t}static \u0275fac=function(i){return new(i||e)(M(rn),M(dt),M(Vi),M(he),M(EI,8))};static \u0275cmp=Kt({type:e,selectors:[["ngx-slider"]],contentQueries:function(i,r,o){if(1&i&&uw(o,TB,5),2&i){let s;Mt(s=St())&&(r.tooltipTemplate=s.first)}},viewQuery:function(i,r){if(1&i&&(Ft(OB,5,di),Ft(NB,5,di),Ft(AB,5,di),Ft(xB,5,di),Ft(RB,5,_p),Ft(LB,5,_p),Ft(PB,5,ro),Ft(kB,5,ro),Ft(FB,5,ro),Ft(VB,5,ro),Ft(HB,5,ro),Ft(BB,5,di)),2&i){let o;Mt(o=St())&&(r.leftOuterSelectionBarElement=o.first),Mt(o=St())&&(r.rightOuterSelectionBarElement=o.first),Mt(o=St())&&(r.fullBarElement=o.first),Mt(o=St())&&(r.selectionBarElement=o.first),Mt(o=St())&&(r.minHandleElement=o.first),Mt(o=St())&&(r.maxHandleElement=o.first),Mt(o=St())&&(r.floorLabelElement=o.first),Mt(o=St())&&(r.ceilLabelElement=o.first),Mt(o=St())&&(r.minHandleLabelElement=o.first),Mt(o=St())&&(r.maxHandleLabelElement=o.first),Mt(o=St())&&(r.combinedLabelElement=o.first),Mt(o=St())&&(r.ticksElement=o.first)}},hostVars:10,hostBindings:function(i,r){1&i&&W("resize",function(s){return r.onResize(s)},0,Wa),2&i&&(pt("disabled",r.sliderElementDisabledAttr)("aria-label",r.sliderElementAriaLabel),Vn("ngx-slider",r.sliderElementNgxSliderClass)("vertical",r.sliderElementVerticalClass)("animate",r.sliderElementAnimateClass)("with-legend",r.sliderElementWithLegendClass))},inputs:{value:"value",highValue:"highValue",options:"options",manualRefresh:"manualRefresh",triggerFocus:"triggerFocus"},outputs:{valueChange:"valueChange",highValueChange:"highValueChange",userChangeStart:"userChangeStart",userChange:"userChange",userChangeEnd:"userChangeEnd"},features:[Me([YB]),gn],decls:29,vars:13,consts:[["leftOuterSelectionBar",""],["rightOuterSelectionBar",""],["fullBar",""],["selectionBar",""],["minHandle",""],["maxHandle",""],["floorLabel",""],["ceilLabel",""],["minHandleLabel",""],["maxHandleLabel",""],["combinedLabel",""],["ticksElement",""],["ngxSliderElement","",1,"ngx-slider-span","ngx-slider-bar-wrapper","ngx-slider-left-out-selection"],[1,"ngx-slider-span","ngx-slider-bar"],["ngxSliderElement","",1,"ngx-slider-span","ngx-slider-bar-wrapper","ngx-slider-right-out-selection"],["ngxSliderElement","",1,"ngx-slider-span","ngx-slider-bar-wrapper","ngx-slider-full-bar"],["ngxSliderElement","",1,"ngx-slider-span","ngx-slider-bar-wrapper","ngx-slider-selection-bar"],[1,"ngx-slider-span","ngx-slider-bar","ngx-slider-selection",3,"ngStyle"],["ngxSliderHandle","",1,"ngx-slider-span","ngx-slider-pointer","ngx-slider-pointer-min",3,"ngStyle"],["ngxSliderHandle","",1,"ngx-slider-span","ngx-slider-pointer","ngx-slider-pointer-max",3,"ngStyle"],["ngxSliderLabel","",1,"ngx-slider-span","ngx-slider-bubble","ngx-slider-limit","ngx-slider-floor"],["ngxSliderLabel","",1,"ngx-slider-span","ngx-slider-bubble","ngx-slider-limit","ngx-slider-ceil"],["ngxSliderLabel","",1,"ngx-slider-span","ngx-slider-bubble","ngx-slider-model-value"],["ngxSliderLabel","",1,"ngx-slider-span","ngx-slider-bubble","ngx-slider-model-high"],["ngxSliderLabel","",1,"ngx-slider-span","ngx-slider-bubble","ngx-slider-combined"],["ngxSliderElement","",1,"ngx-slider-ticks",3,"hidden"],["class","ngx-slider-tick",3,"ngClass","ngStyle",4,"ngFor","ngForOf"],[1,"ngx-slider-tick",3,"ngClass","ngStyle"],[3,"template","tooltip","placement"],["class","ngx-slider-span ngx-slider-tick-value",3,"template","tooltip","placement","content",4,"ngIf"],["class","ngx-slider-span ngx-slider-tick-legend",3,"innerText",4,"ngIf"],["class","ngx-slider-span ngx-slider-tick-legend",3,"innerHTML",4,"ngIf"],[1,"ngx-slider-span","ngx-slider-tick-value",3,"template","tooltip","placement","content"],[1,"ngx-slider-span","ngx-slider-tick-legend",3,"innerText"],[1,"ngx-slider-span","ngx-slider-tick-legend",3,"innerHTML"]],template:function(i,r){1&i&&(C(0,"span",12,0),N(2,"span",13),y(),C(3,"span",14,1),N(5,"span",13),y(),C(6,"span",15,2),N(8,"span",13),y(),C(9,"span",16,3),N(11,"span",17),y(),N(12,"span",18,4)(14,"span",19,5)(16,"span",20,6)(18,"span",21,7)(20,"span",22,8)(22,"span",23,9)(24,"span",24,10),C(26,"span",25,11),H(28,GB,5,10,"span",26),y()),2&i&&(f(6),Vn("ngx-slider-transparent",r.fullBarTransparentClass),f(3),Vn("ngx-slider-draggable",r.selectionBarDraggableClass),f(2),m("ngStyle",r.barStyle),f(),m("ngStyle",r.minPointerStyle),f(2),Dl("display",r.range?"inherit":"none"),m("ngStyle",r.maxPointerStyle),f(12),Vn("ngx-slider-ticks-values-under",r.ticksUnderValuesClass),m("hidden",!r.showTicks),f(2),m("ngForOf",r.ticks))},dependencies:[Jr,Bi,$n,vD,di,_p,ro,WB],styles:['.ngx-slider{display:inline-block;position:relative;height:4px;width:100%;margin:35px 0 15px;vertical-align:middle;-webkit-user-select:none;user-select:none;touch-action:pan-y} .ngx-slider.with-legend{margin-bottom:40px} .ngx-slider[disabled]{cursor:not-allowed} .ngx-slider[disabled] .ngx-slider-pointer{cursor:not-allowed;background-color:#d8e0f3} .ngx-slider[disabled] .ngx-slider-draggable{cursor:not-allowed} .ngx-slider[disabled] .ngx-slider-selection{background:#8b91a2} .ngx-slider[disabled] .ngx-slider-tick{cursor:not-allowed} .ngx-slider[disabled] .ngx-slider-tick.ngx-slider-selected{background:#8b91a2} .ngx-slider .ngx-slider-span{white-space:nowrap;position:absolute;display:inline-block} .ngx-slider .ngx-slider-base{width:100%;height:100%;padding:0} .ngx-slider .ngx-slider-bar-wrapper{left:0;box-sizing:border-box;margin-top:-16px;padding-top:16px;width:100%;height:32px;z-index:1} .ngx-slider .ngx-slider-draggable{cursor:move} .ngx-slider .ngx-slider-bar{left:0;width:100%;height:4px;z-index:1;background:#d8e0f3;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px} .ngx-slider .ngx-slider-bar-wrapper.ngx-slider-transparent .ngx-slider-bar{background:transparent} .ngx-slider .ngx-slider-bar-wrapper.ngx-slider-left-out-selection .ngx-slider-bar{background:#df002d} .ngx-slider .ngx-slider-bar-wrapper.ngx-slider-right-out-selection .ngx-slider-bar{background:#03a688} .ngx-slider .ngx-slider-selection{z-index:2;background:#0db9f0;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px} .ngx-slider .ngx-slider-pointer{cursor:pointer;width:32px;height:32px;top:-14px;background-color:#0db9f0;z-index:3;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px} .ngx-slider .ngx-slider-pointer:after{content:"";width:8px;height:8px;position:absolute;top:12px;left:12px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff} .ngx-slider .ngx-slider-pointer:hover:after{background-color:#fff} .ngx-slider .ngx-slider-pointer.ngx-slider-active{z-index:4} .ngx-slider .ngx-slider-pointer.ngx-slider-active:after{background-color:#451aff} .ngx-slider .ngx-slider-bubble{cursor:default;bottom:16px;padding:1px 3px;color:#55637d;font-size:16px} .ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:#55637d} .ngx-slider .ngx-slider-ticks{box-sizing:border-box;width:100%;height:0;position:absolute;left:0;top:-3px;margin:0;z-index:1;list-style:none} .ngx-slider .ngx-slider-ticks-values-under .ngx-slider-tick-value{top:auto;bottom:-36px} .ngx-slider .ngx-slider-tick{text-align:center;cursor:pointer;width:10px;height:10px;background:#d8e0f3;border-radius:50%;position:absolute;top:0;left:0;margin-left:11px} .ngx-slider .ngx-slider-tick.ngx-slider-selected{background:#0db9f0} .ngx-slider .ngx-slider-tick-value{position:absolute;top:-34px;transform:translate(-50%)} .ngx-slider .ngx-slider-tick-legend{position:absolute;top:24px;transform:translate(-50%);max-width:50px;white-space:normal} .ngx-slider.vertical{position:relative;width:4px;height:100%;margin:0 20px;padding:0;vertical-align:baseline;touch-action:pan-x} .ngx-slider.vertical .ngx-slider-base{width:100%;height:100%;padding:0} .ngx-slider.vertical .ngx-slider-bar-wrapper{top:auto;left:0;margin:0 0 0 -16px;padding:0 0 0 16px;height:100%;width:32px} .ngx-slider.vertical .ngx-slider-bar{bottom:0;left:auto;width:4px;height:100%} .ngx-slider.vertical .ngx-slider-pointer{left:-14px!important;top:auto;bottom:0} .ngx-slider.vertical .ngx-slider-bubble{left:16px!important;bottom:0} .ngx-slider.vertical .ngx-slider-ticks{height:100%;width:0;left:-3px;top:0;z-index:1} .ngx-slider.vertical .ngx-slider-tick{vertical-align:middle;margin-left:auto;margin-top:11px} .ngx-slider.vertical .ngx-slider-tick-value{left:24px;top:auto;transform:translateY(-28%)} .ngx-slider.vertical .ngx-slider-tick-legend{top:auto;right:24px;transform:translateY(-28%);max-width:none;white-space:nowrap} .ngx-slider.vertical .ngx-slider-ticks-values-under .ngx-slider-tick-value{bottom:auto;left:auto;right:24px} .ngx-slider *{transition:none} .ngx-slider.animate .ngx-slider-bar-wrapper{transition:all linear .3s} .ngx-slider.animate .ngx-slider-selection{transition:background-color linear .3s} .ngx-slider.animate .ngx-slider-pointer{transition:all linear .3s} .ngx-slider.animate .ngx-slider-pointer:after{transition:all linear .3s} .ngx-slider.animate .ngx-slider-bubble{transition:all linear .3s} .ngx-slider.animate .ngx-slider-bubble.ngx-slider-limit{transition:opacity linear .3s} .ngx-slider.animate .ngx-slider-bubble.ngx-slider-combined{transition:opacity linear .3s} .ngx-slider.animate .ngx-slider-tick{transition:background-color linear .3s}']})}return e})(),QB=(()=>{class e{static \u0275fac=function(i){return new(i||e)};static \u0275mod=Yn({type:e});static \u0275inj=On({imports:[wD]})}return e})();class TI{constructor(){this.riskHotspotsSettings=null,this.coverageInfoSettings=null}}class KB{constructor(){this.showLineCoverage=!0,this.showBranchCoverage=!0,this.showMethodCoverage=!0,this.visibleMetrics=[],this.groupingMaximum=0,this.grouping=0,this.historyComparisionDate="",this.historyComparisionType="",this.filter="",this.lineCoverageMin=0,this.lineCoverageMax=100,this.branchCoverageMin=0,this.branchCoverageMax=100,this.methodCoverageMin=0,this.methodCoverageMax=100,this.sortBy="name",this.sortOrder="asc",this.collapseStates=[]}}class JB{constructor(n){this.et="",this.et=n.et,this.cl=n.cl,this.ucl=n.ucl,this.cal=n.cal,this.tl=n.tl,this.lcq=n.lcq,this.cb=n.cb,this.tb=n.tb,this.bcq=n.bcq,this.cm=n.cm,this.tm=n.tm,this.mcq=n.mcq}get coverageRatioText(){return 0===this.tl?"-":this.cl+"/"+this.cal}get branchCoverageRatioText(){return 0===this.tb?"-":this.cb+"/"+this.tb}get methodCoverageRatioText(){return 0===this.tm?"-":this.cm+"/"+this.tm}}class Wt{static roundNumber(n){return Math.floor(n*Math.pow(10,Wt.maximumDecimalPlacesForCoverageQuotas))/Math.pow(10,Wt.maximumDecimalPlacesForCoverageQuotas)}static getNthOrLastIndexOf(n,t,i){let r=0,o=-1,s=-1;for(;r{this.historicCoverages.push(new JB(i))}),this.metrics=n.metrics}get coverage(){return 0===this.coverableLines?NaN:Wt.roundNumber(100*this.coveredLines/this.coverableLines)}visible(n){if(""!==n.filter&&-1===this.name.toLowerCase().indexOf(n.filter.toLowerCase()))return!1;let t=this.coverage,i=t;if(t=Number.isNaN(t)?0:t,i=Number.isNaN(i)?100:i,n.lineCoverageMin>t||n.lineCoverageMaxr||n.branchCoverageMaxs||n.methodCoverageMax=this.currentHistoricCoverage.lcq)return!1}else if("branchCoverageIncreaseOnly"===n.historyComparisionType){let l=this.branchCoverage;if(isNaN(l)||l<=this.currentHistoricCoverage.bcq)return!1}else if("branchCoverageDecreaseOnly"===n.historyComparisionType){let l=this.branchCoverage;if(isNaN(l)||l>=this.currentHistoricCoverage.bcq)return!1}else if("methodCoverageIncreaseOnly"===n.historyComparisionType){let l=this.methodCoverage;if(isNaN(l)||l<=this.currentHistoricCoverage.mcq)return!1}else if("methodCoverageDecreaseOnly"===n.historyComparisionType){let l=this.methodCoverage;if(isNaN(l)||l>=this.currentHistoricCoverage.mcq)return!1}return!0}updateCurrentHistoricCoverage(n){if(this.currentHistoricCoverage=null,""!==n)for(let t=0;t-1&&null===t}visible(n){if(""!==n.filter&&this.name.toLowerCase().indexOf(n.filter.toLowerCase())>-1)return!0;for(let t=0;t{class e{get nativeWindow(){return function XB(){return window}()}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275prov=ie({token:e,factory:e.\u0275fac})}return e})(),ej=(()=>{class e{constructor(){this.translations={}}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275cmp=Kt({type:e,selectors:[["pro-button"]],inputs:{translations:"translations"},decls:3,vars:1,consts:[["href","https://reportgenerator.io/pro","target","_blank",1,"pro-button","pro-button-tiny",3,"title"]],template:function(i,r){1&i&&(b(0,"\xa0"),C(1,"a",0),b(2,"PRO"),y()),2&i&&(f(),Hn("title",r.translations.methodCoverageProVersion))},encapsulation:2})}return e})();function tj(e,n){if(1&e){const t=Ie();C(0,"div",3)(1,"label")(2,"input",4),st("ngModelChange",function(r){G(t);const o=v();return Ne(o.showBranchCoverage,r)||(o.showBranchCoverage=r),q(r)}),W("change",function(){G(t);const r=v();return q(r.showBranchCoverageChange.emit(r.showBranchCoverage))}),y(),b(3),y()()}if(2&e){const t=v();f(2),tt("ngModel",t.showBranchCoverage),f(),K(" ",t.translations.branchCoverage,"")}}function nj(e,n){1&e&&N(0,"pro-button",9),2&e&&m("translations",v().translations)}function ij(e,n){1&e&&N(0,"pro-button",9),2&e&&m("translations",v(2).translations)}function rj(e,n){1&e&&(C(0,"a",13),N(1,"i",14),y()),2&e&&m("href",v().$implicit.explanationUrl,Xn)}function oj(e,n){if(1&e){const t=Ie();C(0,"div",3)(1,"label")(2,"input",11),W("change",function(){const r=G(t).$implicit;return q(v(2).toggleMetric(r))}),y(),b(3),y(),b(4,"\xa0"),H(5,rj,2,1,"a",12),y()}if(2&e){const t=n.$implicit,i=v(2);f(2),m("checked",i.isMetricSelected(t))("disabled",!i.methodCoverageAvailable),f(),K(" ",t.name,""),f(2),m("ngIf",t.explanationUrl)}}function sj(e,n){if(1&e&&(te(0),N(1,"br")(2,"br"),C(3,"b"),b(4),y(),H(5,ij,1,1,"pro-button",7)(6,oj,6,4,"div",10),ne()),2&e){const t=v();f(4),A(t.translations.metrics),f(),m("ngIf",!t.methodCoverageAvailable),f(),m("ngForOf",t.metrics)}}let aj=(()=>{class e{constructor(){this.visible=!1,this.visibleChange=new Ee,this.translations={},this.branchCoverageAvailable=!1,this.methodCoverageAvailable=!1,this.metrics=[],this.showLineCoverage=!1,this.showLineCoverageChange=new Ee,this.showBranchCoverage=!1,this.showBranchCoverageChange=new Ee,this.showMethodCoverage=!1,this.showMethodCoverageChange=new Ee,this.visibleMetrics=[],this.visibleMetricsChange=new Ee}isMetricSelected(t){return void 0!==this.visibleMetrics.find(i=>i.name===t.name)}toggleMetric(t){let i=this.visibleMetrics.find(r=>r.name===t.name);i?this.visibleMetrics.splice(this.visibleMetrics.indexOf(i),1):this.visibleMetrics.push(t),this.visibleMetrics=[...this.visibleMetrics],this.visibleMetricsChange.emit(this.visibleMetrics)}close(){this.visible=!1,this.visibleChange.emit(this.visible)}cancelEvent(t){t.stopPropagation()}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275cmp=Kt({type:e,selectors:[["popup"]],inputs:{visible:"visible",translations:"translations",branchCoverageAvailable:"branchCoverageAvailable",methodCoverageAvailable:"methodCoverageAvailable",metrics:"metrics",showLineCoverage:"showLineCoverage",showBranchCoverage:"showBranchCoverage",showMethodCoverage:"showMethodCoverage",visibleMetrics:"visibleMetrics"},outputs:{visibleChange:"visibleChange",showLineCoverageChange:"showLineCoverageChange",showBranchCoverageChange:"showBranchCoverageChange",showMethodCoverageChange:"showMethodCoverageChange",visibleMetricsChange:"visibleMetricsChange"},decls:17,vars:9,consts:[[1,"popup-container",3,"click"],[1,"popup",3,"click"],[1,"close",3,"click"],[1,"mt-1"],["type","checkbox",3,"ngModelChange","change","ngModel"],["class","mt-1",4,"ngIf"],["type","checkbox",3,"ngModelChange","change","ngModel","disabled"],[3,"translations",4,"ngIf"],[4,"ngIf"],[3,"translations"],["class","mt-1",4,"ngFor","ngForOf"],["type","checkbox",3,"change","checked","disabled"],["target","_blank",3,"href",4,"ngIf"],["target","_blank",3,"href"],[1,"icon-info-circled"]],template:function(i,r){1&i&&(C(0,"div",0),W("click",function(){return r.close()}),C(1,"div",1),W("click",function(s){return r.cancelEvent(s)}),C(2,"div",2),W("click",function(){return r.close()}),b(3,"X"),y(),C(4,"b"),b(5),y(),C(6,"div",3)(7,"label")(8,"input",4),st("ngModelChange",function(s){return Ne(r.showLineCoverage,s)||(r.showLineCoverage=s),s}),W("change",function(){return r.showLineCoverageChange.emit(r.showLineCoverage)}),y(),b(9),y()(),H(10,tj,4,2,"div",5),C(11,"div",3)(12,"label")(13,"input",6),st("ngModelChange",function(s){return Ne(r.showMethodCoverage,s)||(r.showMethodCoverage=s),s}),W("change",function(){return r.showMethodCoverageChange.emit(r.showMethodCoverage)}),y(),b(14),y(),H(15,nj,1,1,"pro-button",7),y(),H(16,sj,7,3,"ng-container",8),y()()),2&i&&(f(5),A(r.translations.coverageTypes),f(3),tt("ngModel",r.showLineCoverage),f(),K(" ",r.translations.coverage,""),f(),m("ngIf",r.branchCoverageAvailable),f(3),tt("ngModel",r.showMethodCoverage),m("disabled",!r.methodCoverageAvailable),f(),K(" ",r.translations.methodCoverage,""),f(),m("ngIf",!r.methodCoverageAvailable),f(),m("ngIf",r.metrics.length>0))},dependencies:[Bi,$n,qh,dc,Ls,ej],encapsulation:2})}return e})();function lj(e,n){1&e&&N(0,"td",3)}function cj(e,n){1&e&&N(0,"td"),2&e&&bn("green ",v().greenClass,"")}function uj(e,n){1&e&&N(0,"td"),2&e&&bn("red ",v().redClass,"")}let NI=(()=>{class e{constructor(){this.grayVisible=!0,this.greenVisible=!1,this.redVisible=!1,this.greenClass="",this.redClass="",this._percentage=NaN}get percentage(){return this._percentage}set percentage(t){this._percentage=t,this.grayVisible=isNaN(t),this.greenVisible=!isNaN(t)&&Math.round(t)>0,this.redVisible=!isNaN(t)&&100-Math.round(t)>0,this.greenClass="covered"+Math.round(t),this.redClass="covered"+(100-Math.round(t))}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275cmp=Kt({type:e,selectors:[["coverage-bar"]],inputs:{percentage:"percentage"},decls:4,vars:3,consts:[[1,"coverage"],["class","gray covered100",4,"ngIf"],[3,"class",4,"ngIf"],[1,"gray","covered100"]],template:function(i,r){1&i&&(C(0,"table",0),H(1,lj,1,0,"td",1)(2,cj,1,3,"td",2)(3,uj,1,3,"td",2),y()),2&i&&(f(),m("ngIf",r.grayVisible),f(),m("ngIf",r.greenVisible),f(),m("ngIf",r.redVisible))},dependencies:[$n],encapsulation:2,changeDetection:0})}return e})();const dj=["codeelement-row",""],fj=(e,n)=>({"icon-plus":e,"icon-minus":n});function hj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.coveredLines)}}function pj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.uncoveredLines)}}function gj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.coverableLines)}}function mj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.totalLines)}}function vj(e,n){if(1&e&&(C(0,"th",6),b(1),y()),2&e){const t=v();m("title",t.element.coverageRatioText),f(),A(t.element.coveragePercentage)}}function _j(e,n){if(1&e&&(C(0,"th",5),N(1,"coverage-bar",7),y()),2&e){const t=v();f(),m("percentage",t.element.coverage)}}function yj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.coveredBranches)}}function Cj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.totalBranches)}}function wj(e,n){if(1&e&&(C(0,"th",6),b(1),y()),2&e){const t=v();m("title",t.element.branchCoverageRatioText),f(),A(t.element.branchCoveragePercentage)}}function Ej(e,n){if(1&e&&(C(0,"th",5),N(1,"coverage-bar",7),y()),2&e){const t=v();f(),m("percentage",t.element.branchCoverage)}}function Dj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.coveredMethods)}}function bj(e,n){if(1&e&&(C(0,"th",5),b(1),y()),2&e){const t=v();f(),A(t.element.totalMethods)}}function Ij(e,n){if(1&e&&(C(0,"th",6),b(1),y()),2&e){const t=v();m("title",t.element.methodCoverageRatioText),f(),A(t.element.methodCoveragePercentage)}}function Mj(e,n){if(1&e&&(C(0,"th",5),N(1,"coverage-bar",7),y()),2&e){const t=v();f(),m("percentage",t.element.methodCoverage)}}function Sj(e,n){1&e&&N(0,"th",5)}let Tj=(()=>{class e{constructor(){this.collapsed=!1,this.lineCoverageAvailable=!1,this.branchCoverageAvailable=!1,this.methodCoverageAvailable=!1,this.visibleMetrics=[]}static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275cmp=Kt({type:e,selectors:[["","codeelement-row",""]],inputs:{element:"element",collapsed:"collapsed",lineCoverageAvailable:"lineCoverageAvailable",branchCoverageAvailable:"branchCoverageAvailable",methodCoverageAvailable:"methodCoverageAvailable",visibleMetrics:"visibleMetrics"},attrs:dj,decls:19,vars:20,consts:[["href","#",3,"click"],[3,"ngClass"],["class","right",4,"ngIf"],["class","right",3,"title",4,"ngIf"],["class","right",4,"ngFor","ngForOf"],[1,"right"],[1,"right",3,"title"],[3,"percentage"]],template:function(i,r){1&i&&(C(0,"th")(1,"a",0),W("click",function(s){return r.element.toggleCollapse(s)}),N(2,"i",1),b(3),y()(),H(4,hj,2,1,"th",2)(5,pj,2,1,"th",2)(6,gj,2,1,"th",2)(7,mj,2,1,"th",2)(8,vj,2,2,"th",3)(9,_j,2,1,"th",2)(10,yj,2,1,"th",2)(11,Cj,2,1,"th",2)(12,wj,2,2,"th",3)(13,Ej,2,1,"th",2)(14,Dj,2,1,"th",2)(15,bj,2,1,"th",2)(16,Ij,2,2,"th",3)(17,Mj,2,1,"th",2)(18,Sj,1,0,"th",4)),2&i&&(f(2),m("ngClass",qf(17,fj,r.element.collapsed,!r.element.collapsed)),f(),K(" ",r.element.name,""),f(),m("ngIf",r.lineCoverageAvailable),f(),m("ngIf",r.lineCoverageAvailable),f(),m("ngIf",r.lineCoverageAvailable),f(),m("ngIf",r.lineCoverageAvailable),f(),m("ngIf",r.lineCoverageAvailable),f(),m("ngIf",r.lineCoverageAvailable),f(),m("ngIf",r.branchCoverageAvailable),f(),m("ngIf",r.branchCoverageAvailable),f(),m("ngIf",r.branchCoverageAvailable),f(),m("ngIf",r.branchCoverageAvailable),f(),m("ngIf",r.methodCoverageAvailable),f(),m("ngIf",r.methodCoverageAvailable),f(),m("ngIf",r.methodCoverageAvailable),f(),m("ngIf",r.methodCoverageAvailable),f(),m("ngForOf",r.visibleMetrics))},dependencies:[Jr,Bi,$n,NI],encapsulation:2,changeDetection:0})}return e})();const Oj=["coverage-history-chart",""];let Nj=(()=>{class e{constructor(){this.path=null,this._historicCoverages=[]}get historicCoverages(){return this._historicCoverages}set historicCoverages(t){if(this._historicCoverages=t,t.length>1){let i="";for(let r=0;r({historiccoverageoffset:e});function xj(e,n){if(1&e&&(C(0,"a",5),b(1),y()),2&e){const t=v();m("href",t.clazz.reportPath,Xn),f(),A(t.clazz.name)}}function Rj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v();f(),A(t.clazz.name)}}function Lj(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.coveredLines,t.clazz.currentHistoricCoverage.cl),""),f(),K(" ",t.clazz.coveredLines," "),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),K(" ",t.clazz.currentHistoricCoverage.cl," ")}}function Pj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.coveredLines," ")}}function kj(e,n){if(1&e&&(C(0,"td",6),H(1,Lj,5,6,"ng-container",1)(2,Pj,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function Fj(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.currentHistoricCoverage.ucl,t.clazz.uncoveredLines),""),f(),K(" ",t.clazz.uncoveredLines," "),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),K(" ",t.clazz.currentHistoricCoverage.ucl," ")}}function Vj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.uncoveredLines," ")}}function Hj(e,n){if(1&e&&(C(0,"td",6),H(1,Fj,5,6,"ng-container",1)(2,Vj,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function Bj(e,n){if(1&e&&(te(0),C(1,"div",8),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(2),A(t.clazz.coverableLines),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),A(t.clazz.currentHistoricCoverage.cal)}}function jj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.coverableLines," ")}}function Uj(e,n){if(1&e&&(C(0,"td",6),H(1,Bj,5,3,"ng-container",1)(2,jj,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function $j(e,n){if(1&e&&(te(0),C(1,"div",8),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(2),A(t.clazz.totalLines),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),A(t.clazz.currentHistoricCoverage.tl)}}function zj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.totalLines," ")}}function Gj(e,n){if(1&e&&(C(0,"td",6),H(1,$j,5,3,"ng-container",1)(2,zj,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function qj(e,n){if(1&e&&N(0,"div",11),2&e){const t=v(2);Hn("title",t.translations.history+": "+t.translations.coverage),m("historicCoverages",t.clazz.lineCoverageHistory)("ngClass",hs(3,wp,null!==t.clazz.currentHistoricCoverage))}}function Wj(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.coverage,t.clazz.currentHistoricCoverage.lcq),""),f(),K(" ",t.clazz.coveragePercentage," "),f(),m("title",t.clazz.currentHistoricCoverage.et+": "+t.clazz.currentHistoricCoverage.coverageRatioText),f(),K("",t.clazz.currentHistoricCoverage.lcq,"%")}}function Zj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.coveragePercentage," ")}}function Yj(e,n){if(1&e&&(C(0,"td",9),H(1,qj,1,5,"div",10)(2,Wj,5,6,"ng-container",1)(3,Zj,2,1,"ng-container",1),y()),2&e){const t=v();m("title",t.clazz.coverageRatioText),f(),m("ngIf",t.clazz.lineCoverageHistory.length>1),f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function Qj(e,n){if(1&e&&(C(0,"td",6),N(1,"coverage-bar",12),y()),2&e){const t=v();f(),m("percentage",t.clazz.coverage)}}function Kj(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.coveredBranches,t.clazz.currentHistoricCoverage.cb),""),f(),K(" ",t.clazz.coveredBranches," "),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),K(" ",t.clazz.currentHistoricCoverage.cb," ")}}function Jj(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.coveredBranches," ")}}function Xj(e,n){if(1&e&&(C(0,"td",6),H(1,Kj,5,6,"ng-container",1)(2,Jj,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function eU(e,n){if(1&e&&(te(0),C(1,"div",8),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(2),A(t.clazz.totalBranches),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),A(t.clazz.currentHistoricCoverage.tb)}}function tU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.totalBranches," ")}}function nU(e,n){if(1&e&&(C(0,"td",6),H(1,eU,5,3,"ng-container",1)(2,tU,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function iU(e,n){if(1&e&&N(0,"div",14),2&e){const t=v(2);Hn("title",t.translations.history+": "+t.translations.branchCoverage),m("historicCoverages",t.clazz.branchCoverageHistory)("ngClass",hs(3,wp,null!==t.clazz.currentHistoricCoverage))}}function rU(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.branchCoverage,t.clazz.currentHistoricCoverage.bcq),""),f(),K(" ",t.clazz.branchCoveragePercentage," "),f(),m("title",t.clazz.currentHistoricCoverage.et+": "+t.clazz.currentHistoricCoverage.branchCoverageRatioText),f(),K("",t.clazz.currentHistoricCoverage.bcq,"%")}}function oU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.branchCoveragePercentage," ")}}function sU(e,n){if(1&e&&(C(0,"td",9),H(1,iU,1,5,"div",13)(2,rU,5,6,"ng-container",1)(3,oU,2,1,"ng-container",1),y()),2&e){const t=v();m("title",t.clazz.branchCoverageRatioText),f(),m("ngIf",t.clazz.branchCoverageHistory.length>1),f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function aU(e,n){if(1&e&&(C(0,"td",6),N(1,"coverage-bar",12),y()),2&e){const t=v();f(),m("percentage",t.clazz.branchCoverage)}}function lU(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.coveredMethods,t.clazz.currentHistoricCoverage.cm),""),f(),K(" ",t.clazz.coveredMethods," "),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),K(" ",t.clazz.currentHistoricCoverage.cm," ")}}function cU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.coveredMethods," ")}}function uU(e,n){if(1&e&&(C(0,"td",6),H(1,lU,5,6,"ng-container",1)(2,cU,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function dU(e,n){if(1&e&&(te(0),C(1,"div",8),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(2),A(t.clazz.totalMethods),f(),m("title",t.clazz.currentHistoricCoverage.et),f(),A(t.clazz.currentHistoricCoverage.tm)}}function fU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.totalMethods," ")}}function hU(e,n){if(1&e&&(C(0,"td",6),H(1,dU,5,3,"ng-container",1)(2,fU,2,1,"ng-container",1),y()),2&e){const t=v();f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function pU(e,n){if(1&e&&N(0,"div",16),2&e){const t=v(2);Hn("title",t.translations.history+": "+t.translations.methodCoverage),m("historicCoverages",t.clazz.methodCoverageHistory)("ngClass",hs(3,wp,null!==t.clazz.currentHistoricCoverage))}}function gU(e,n){if(1&e&&(te(0),C(1,"div"),b(2),y(),C(3,"div",7),b(4),y(),ne()),2&e){const t=v(2);f(),bn("currenthistory ",t.getClassName(t.clazz.methodCoverage,t.clazz.currentHistoricCoverage.mcq),""),f(),K(" ",t.clazz.methodCoveragePercentage," "),f(),m("title",t.clazz.currentHistoricCoverage.et+": "+t.clazz.currentHistoricCoverage.methodCoverageRatioText),f(),K("",t.clazz.currentHistoricCoverage.mcq,"%")}}function mU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),K(" ",t.clazz.methodCoveragePercentage," ")}}function vU(e,n){if(1&e&&(C(0,"td",9),H(1,pU,1,5,"div",15)(2,gU,5,6,"ng-container",1)(3,mU,2,1,"ng-container",1),y()),2&e){const t=v();m("title",t.clazz.methodCoverageRatioText),f(),m("ngIf",t.clazz.methodCoverageHistory.length>1),f(),m("ngIf",null!==t.clazz.currentHistoricCoverage),f(),m("ngIf",null===t.clazz.currentHistoricCoverage)}}function _U(e,n){if(1&e&&(C(0,"td",6),N(1,"coverage-bar",12),y()),2&e){const t=v();f(),m("percentage",t.clazz.methodCoverage)}}function yU(e,n){if(1&e&&(C(0,"td",6),b(1),y()),2&e){const t=n.$implicit,i=v();f(),A(i.clazz.metrics[t.abbreviation])}}let CU=(()=>{class e{constructor(){this.translations={},this.lineCoverageAvailable=!1,this.branchCoverageAvailable=!1,this.methodCoverageAvailable=!1,this.visibleMetrics=[],this.historyComparisionDate=""}getClassName(t,i){return t>i?"lightgreen":t({"icon-up-dir_active":e,"icon-down-dir_active":n,"icon-up-down-dir":t});function wU(e,n){if(1&e){const t=Ie();C(0,"popup",30),st("visibleChange",function(r){G(t);const o=v(2);return Ne(o.popupVisible,r)||(o.popupVisible=r),q(r)})("showLineCoverageChange",function(r){G(t);const o=v(2);return Ne(o.settings.showLineCoverage,r)||(o.settings.showLineCoverage=r),q(r)})("showBranchCoverageChange",function(r){G(t);const o=v(2);return Ne(o.settings.showBranchCoverage,r)||(o.settings.showBranchCoverage=r),q(r)})("showMethodCoverageChange",function(r){G(t);const o=v(2);return Ne(o.settings.showMethodCoverage,r)||(o.settings.showMethodCoverage=r),q(r)})("visibleMetricsChange",function(r){G(t);const o=v(2);return Ne(o.settings.visibleMetrics,r)||(o.settings.visibleMetrics=r),q(r)}),y()}if(2&e){const t=v(2);tt("visible",t.popupVisible),m("translations",t.translations)("branchCoverageAvailable",t.branchCoverageAvailable)("methodCoverageAvailable",t.methodCoverageAvailable)("metrics",t.metrics),tt("showLineCoverage",t.settings.showLineCoverage)("showBranchCoverage",t.settings.showBranchCoverage)("showMethodCoverage",t.settings.showMethodCoverage)("visibleMetrics",t.settings.visibleMetrics)}}function EU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),A(t.translations.noGrouping)}}function DU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),A(t.translations.byAssembly)}}function bU(e,n){if(1&e&&(te(0),b(1),ne()),2&e){const t=v(2);f(),A(t.translations.byNamespace+" "+t.settings.grouping)}}function IU(e,n){if(1&e&&(C(0,"option",34),b(1),y()),2&e){const t=n.$implicit;m("value",t),f(),A(t)}}function MU(e,n){1&e&&N(0,"br")}function SU(e,n){if(1&e&&(C(0,"option",42),b(1),y()),2&e){const t=v(4);f(),K(" ",t.translations.branchCoverageIncreaseOnly," ")}}function TU(e,n){if(1&e&&(C(0,"option",43),b(1),y()),2&e){const t=v(4);f(),K(" ",t.translations.branchCoverageDecreaseOnly," ")}}function OU(e,n){if(1&e&&(C(0,"option",44),b(1),y()),2&e){const t=v(4);f(),K(" ",t.translations.methodCoverageIncreaseOnly," ")}}function NU(e,n){if(1&e&&(C(0,"option",45),b(1),y()),2&e){const t=v(4);f(),K(" ",t.translations.methodCoverageDecreaseOnly," ")}}function AU(e,n){if(1&e){const t=Ie();C(0,"div")(1,"select",31),st("ngModelChange",function(r){G(t);const o=v(3);return Ne(o.settings.historyComparisionType,r)||(o.settings.historyComparisionType=r),q(r)}),C(2,"option",32),b(3),y(),C(4,"option",35),b(5),y(),C(6,"option",36),b(7),y(),C(8,"option",37),b(9),y(),H(10,SU,2,1,"option",38)(11,TU,2,1,"option",39)(12,OU,2,1,"option",40)(13,NU,2,1,"option",41),y()()}if(2&e){const t=v(3);f(),tt("ngModel",t.settings.historyComparisionType),f(2),A(t.translations.filter),f(2),A(t.translations.allChanges),f(2),A(t.translations.lineCoverageIncreaseOnly),f(2),A(t.translations.lineCoverageDecreaseOnly),f(),m("ngIf",t.branchCoverageAvailable),f(),m("ngIf",t.branchCoverageAvailable),f(),m("ngIf",t.methodCoverageAvailable),f(),m("ngIf",t.methodCoverageAvailable)}}function xU(e,n){if(1&e){const t=Ie();te(0),C(1,"div"),b(2),C(3,"select",31),st("ngModelChange",function(r){G(t);const o=v(2);return Ne(o.settings.historyComparisionDate,r)||(o.settings.historyComparisionDate=r),q(r)}),W("ngModelChange",function(){return G(t),q(v(2).updateCurrentHistoricCoverage())}),C(4,"option",32),b(5),y(),H(6,IU,2,2,"option",33),y()(),H(7,MU,1,0,"br",0)(8,AU,14,9,"div",0),ne()}if(2&e){const t=v(2);f(2),K(" ",t.translations.compareHistory," "),f(),tt("ngModel",t.settings.historyComparisionDate),f(2),A(t.translations.date),f(),m("ngForOf",t.historicCoverageExecutionTimes),f(),m("ngIf",""!==t.settings.historyComparisionDate),f(),m("ngIf",""!==t.settings.historyComparisionDate)}}function RU(e,n){1&e&&N(0,"col",46)}function LU(e,n){1&e&&N(0,"col",47)}function PU(e,n){1&e&&N(0,"col",48)}function kU(e,n){1&e&&N(0,"col",49)}function FU(e,n){1&e&&N(0,"col",50)}function VU(e,n){1&e&&N(0,"col",51)}function HU(e,n){1&e&&N(0,"col",46)}function BU(e,n){1&e&&N(0,"col",49)}function jU(e,n){1&e&&N(0,"col",50)}function UU(e,n){1&e&&N(0,"col",51)}function $U(e,n){1&e&&N(0,"col",46)}function zU(e,n){1&e&&N(0,"col",49)}function GU(e,n){1&e&&N(0,"col",50)}function qU(e,n){1&e&&N(0,"col",51)}function WU(e,n){1&e&&N(0,"col",51)}function ZU(e,n){if(1&e&&(C(0,"th",52),b(1),y()),2&e){const t=v(2);f(),A(t.translations.coverage)}}function YU(e,n){if(1&e&&(C(0,"th",53),b(1),y()),2&e){const t=v(2);f(),A(t.translations.branchCoverage)}}function QU(e,n){if(1&e&&(C(0,"th",53),b(1),y()),2&e){const t=v(2);f(),A(t.translations.methodCoverage)}}function KU(e,n){if(1&e&&(C(0,"th",54),b(1),y()),2&e){const t=v(2);pt("colspan",t.settings.visibleMetrics.length),f(),A(t.translations.metrics)}}function JU(e,n){if(1&e){const t=Ie();C(0,"td",52)(1,"ngx-slider",55),st("valueChange",function(r){G(t);const o=v(2);return Ne(o.settings.lineCoverageMin,r)||(o.settings.lineCoverageMin=r),q(r)})("highValueChange",function(r){G(t);const o=v(2);return Ne(o.settings.lineCoverageMax,r)||(o.settings.lineCoverageMax=r),q(r)}),y()()}if(2&e){const t=v(2);f(),tt("value",t.settings.lineCoverageMin)("highValue",t.settings.lineCoverageMax),m("options",t.sliderOptions)}}function XU(e,n){if(1&e){const t=Ie();C(0,"td",53)(1,"ngx-slider",55),st("valueChange",function(r){G(t);const o=v(2);return Ne(o.settings.branchCoverageMin,r)||(o.settings.branchCoverageMin=r),q(r)})("highValueChange",function(r){G(t);const o=v(2);return Ne(o.settings.branchCoverageMax,r)||(o.settings.branchCoverageMax=r),q(r)}),y()()}if(2&e){const t=v(2);f(),tt("value",t.settings.branchCoverageMin)("highValue",t.settings.branchCoverageMax),m("options",t.sliderOptions)}}function e3(e,n){if(1&e){const t=Ie();C(0,"td",53)(1,"ngx-slider",55),st("valueChange",function(r){G(t);const o=v(2);return Ne(o.settings.methodCoverageMin,r)||(o.settings.methodCoverageMin=r),q(r)})("highValueChange",function(r){G(t);const o=v(2);return Ne(o.settings.methodCoverageMax,r)||(o.settings.methodCoverageMax=r),q(r)}),y()()}if(2&e){const t=v(2);f(),tt("value",t.settings.methodCoverageMin)("highValue",t.settings.methodCoverageMax),m("options",t.sliderOptions)}}function t3(e,n){1&e&&N(0,"td",54),2&e&&pt("colspan",v(2).settings.visibleMetrics.length)}function n3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("covered",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"covered"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"covered"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"covered"!==t.settings.sortBy)),f(),A(t.translations.covered)}}function i3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("uncovered",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"uncovered"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"uncovered"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"uncovered"!==t.settings.sortBy)),f(),A(t.translations.uncovered)}}function r3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("coverable",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"coverable"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"coverable"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"coverable"!==t.settings.sortBy)),f(),A(t.translations.coverable)}}function o3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("total",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"total"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"total"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"total"!==t.settings.sortBy)),f(),A(t.translations.total)}}function s3(e,n){if(1&e){const t=Ie();C(0,"th",57)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("coverage",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"coverage"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"coverage"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"coverage"!==t.settings.sortBy)),f(),A(t.translations.percentage)}}function a3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("covered_branches",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"covered_branches"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"covered_branches"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"covered_branches"!==t.settings.sortBy)),f(),A(t.translations.covered)}}function l3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("total_branches",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"total_branches"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"total_branches"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"total_branches"!==t.settings.sortBy)),f(),A(t.translations.total)}}function c3(e,n){if(1&e){const t=Ie();C(0,"th",57)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("branchcoverage",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"branchcoverage"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"branchcoverage"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"branchcoverage"!==t.settings.sortBy)),f(),A(t.translations.percentage)}}function u3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("covered_methods",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"covered_methods"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"covered_methods"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"covered_methods"!==t.settings.sortBy)),f(),A(t.translations.covered)}}function d3(e,n){if(1&e){const t=Ie();C(0,"th",56)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("total_methods",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"total_methods"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"total_methods"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"total_methods"!==t.settings.sortBy)),f(),A(t.translations.total)}}function f3(e,n){if(1&e){const t=Ie();C(0,"th",57)(1,"a",3),W("click",function(r){return G(t),q(v(2).updateSorting("methodcoverage",r))}),N(2,"i",26),b(3),y()()}if(2&e){const t=v(2);f(2),m("ngClass",Ye(2,Bt,"methodcoverage"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"methodcoverage"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"methodcoverage"!==t.settings.sortBy)),f(),A(t.translations.percentage)}}function h3(e,n){if(1&e){const t=Ie();C(0,"th")(1,"a",3),W("click",function(r){const o=G(t).$implicit;return q(v(2).updateSorting(o.abbreviation,r))}),N(2,"i",26),b(3),y(),C(4,"a",58),N(5,"i",59),y()()}if(2&e){const t=n.$implicit,i=v(2);f(2),m("ngClass",Ye(3,Bt,i.settings.sortBy===t.abbreviation&&"asc"===i.settings.sortOrder,i.settings.sortBy===t.abbreviation&&"desc"===i.settings.sortOrder,i.settings.sortBy!==t.abbreviation)),f(),A(t.name),f(),Hn("href",t.explanationUrl,Xn)}}function p3(e,n){if(1&e&&N(0,"tr",61),2&e){const t=v().$implicit,i=v(2);m("element",t)("collapsed",t.collapsed)("lineCoverageAvailable",i.settings.showLineCoverage)("branchCoverageAvailable",i.branchCoverageAvailable&&i.settings.showBranchCoverage)("methodCoverageAvailable",i.methodCoverageAvailable&&i.settings.showMethodCoverage)("visibleMetrics",i.settings.visibleMetrics)}}function g3(e,n){if(1&e&&N(0,"tr",63),2&e){const t=v().$implicit,i=v(3);m("clazz",t)("translations",i.translations)("lineCoverageAvailable",i.settings.showLineCoverage)("branchCoverageAvailable",i.branchCoverageAvailable&&i.settings.showBranchCoverage)("methodCoverageAvailable",i.methodCoverageAvailable&&i.settings.showMethodCoverage)("visibleMetrics",i.settings.visibleMetrics)("historyComparisionDate",i.settings.historyComparisionDate)}}function m3(e,n){if(1&e&&(te(0),H(1,g3,1,7,"tr",62),ne()),2&e){const t=n.$implicit,i=v().$implicit,r=v(2);f(),m("ngIf",!i.collapsed&&t.visible(r.settings))}}function v3(e,n){if(1&e&&N(0,"tr",66),2&e){const t=v().$implicit,i=v(5);m("clazz",t)("translations",i.translations)("lineCoverageAvailable",i.settings.showLineCoverage)("branchCoverageAvailable",i.branchCoverageAvailable&&i.settings.showBranchCoverage)("methodCoverageAvailable",i.methodCoverageAvailable&&i.settings.showMethodCoverage)("visibleMetrics",i.settings.visibleMetrics)("historyComparisionDate",i.settings.historyComparisionDate)}}function _3(e,n){if(1&e&&(te(0),H(1,v3,1,7,"tr",65),ne()),2&e){const t=n.$implicit,i=v(2).$implicit,r=v(3);f(),m("ngIf",!i.collapsed&&t.visible(r.settings))}}function y3(e,n){if(1&e&&(te(0),N(1,"tr",64),H(2,_3,2,1,"ng-container",29),ne()),2&e){const t=v().$implicit,i=v(3);f(),m("element",t)("collapsed",t.collapsed)("lineCoverageAvailable",i.settings.showLineCoverage)("branchCoverageAvailable",i.branchCoverageAvailable&&i.settings.showBranchCoverage)("methodCoverageAvailable",i.methodCoverageAvailable&&i.settings.showMethodCoverage)("visibleMetrics",i.settings.visibleMetrics),f(),m("ngForOf",t.classes)}}function C3(e,n){if(1&e&&(te(0),H(1,y3,3,7,"ng-container",0),ne()),2&e){const t=n.$implicit,i=v().$implicit,r=v(2);f(),m("ngIf",!i.collapsed&&t.visible(r.settings))}}function w3(e,n){if(1&e&&(te(0),H(1,p3,1,6,"tr",60)(2,m3,2,1,"ng-container",29)(3,C3,2,1,"ng-container",29),ne()),2&e){const t=n.$implicit,i=v(2);f(),m("ngIf",t.visible(i.settings)),f(),m("ngForOf",t.classes),f(),m("ngForOf",t.subElements)}}function E3(e,n){if(1&e){const t=Ie();C(0,"div"),H(1,wU,1,9,"popup",1),C(2,"div",2)(3,"div")(4,"a",3),W("click",function(r){return G(t),q(v().collapseAll(r))}),b(5),y(),b(6," | "),C(7,"a",3),W("click",function(r){return G(t),q(v().expandAll(r))}),b(8),y()(),C(9,"div",4)(10,"span",5),H(11,EU,2,1,"ng-container",0)(12,DU,2,1,"ng-container",0)(13,bU,2,1,"ng-container",0),y(),N(14,"br"),b(15),C(16,"input",6),st("ngModelChange",function(r){G(t);const o=v();return Ne(o.settings.grouping,r)||(o.settings.grouping=r),q(r)}),W("ngModelChange",function(){return G(t),q(v().updateCoverageInfo())}),y()(),C(17,"div",4),H(18,xU,9,6,"ng-container",0),y(),C(19,"div",7)(20,"button",8),W("click",function(){return G(t),q(v().popupVisible=!0)}),N(21,"i",9),b(22),y()()(),C(23,"div",10)(24,"table",11)(25,"colgroup"),N(26,"col",12),H(27,RU,1,0,"col",13)(28,LU,1,0,"col",14)(29,PU,1,0,"col",15)(30,kU,1,0,"col",16)(31,FU,1,0,"col",17)(32,VU,1,0,"col",18)(33,HU,1,0,"col",13)(34,BU,1,0,"col",16)(35,jU,1,0,"col",17)(36,UU,1,0,"col",18)(37,$U,1,0,"col",13)(38,zU,1,0,"col",16)(39,GU,1,0,"col",17)(40,qU,1,0,"col",18)(41,WU,1,0,"col",19),y(),C(42,"thead")(43,"tr",20),N(44,"th"),H(45,ZU,2,1,"th",21)(46,YU,2,1,"th",22)(47,QU,2,1,"th",22)(48,KU,2,2,"th",23),y(),C(49,"tr",24)(50,"td")(51,"input",25),st("ngModelChange",function(r){G(t);const o=v();return Ne(o.settings.filter,r)||(o.settings.filter=r),q(r)}),y()(),H(52,JU,2,3,"td",21)(53,XU,2,3,"td",22)(54,e3,2,3,"td",22)(55,t3,1,1,"td",23),y(),C(56,"tr")(57,"th")(58,"a",3),W("click",function(r){return G(t),q(v().updateSorting("name",r))}),N(59,"i",26),b(60),y()(),H(61,n3,4,6,"th",27)(62,i3,4,6,"th",27)(63,r3,4,6,"th",27)(64,o3,4,6,"th",27)(65,s3,4,6,"th",28)(66,a3,4,6,"th",27)(67,l3,4,6,"th",27)(68,c3,4,6,"th",28)(69,u3,4,6,"th",27)(70,d3,4,6,"th",27)(71,f3,4,6,"th",28)(72,h3,6,7,"th",29),y()(),C(73,"tbody"),H(74,w3,4,3,"ng-container",29),y()()()()}if(2&e){const t=v();f(),m("ngIf",t.popupVisible),f(4),A(t.translations.collapseAll),f(3),A(t.translations.expandAll),f(3),m("ngIf",-1===t.settings.grouping),f(),m("ngIf",0===t.settings.grouping),f(),m("ngIf",t.settings.grouping>0),f(2),K(" ",t.translations.grouping," "),f(),m("max",t.settings.groupingMaximum),tt("ngModel",t.settings.grouping),f(2),m("ngIf",t.historicCoverageExecutionTimes.length>0),f(4),A(t.metrics.length>0?t.translations.selectCoverageTypesAndMetrics:t.translations.selectCoverageTypes),f(5),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngForOf",t.settings.visibleMetrics),f(4),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.settings.visibleMetrics.length>0),f(3),Hn("placeholder",t.translations.filter),tt("ngModel",t.settings.filter),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.settings.visibleMetrics.length>0),f(4),m("ngClass",Ye(51,Bt,"name"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"name"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"name"!==t.settings.sortBy)),f(),A(t.translations.name),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.settings.showLineCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.branchCoverageAvailable&&t.settings.showBranchCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngIf",t.methodCoverageAvailable&&t.settings.showMethodCoverage),f(),m("ngForOf",t.settings.visibleMetrics),f(2),m("ngForOf",t.codeElements)}}let D3=(()=>{class e{constructor(t){this.queryString="",this.historicCoverageExecutionTimes=[],this.branchCoverageAvailable=!1,this.methodCoverageAvailable=!1,this.metrics=[],this.codeElements=[],this.translations={},this.popupVisible=!1,this.settings=new KB,this.sliderOptions={floor:0,ceil:100,step:1,ticksArray:[0,10,20,30,40,50,60,70,80,90,100],showTicks:!0},this.window=t.nativeWindow}ngOnInit(){this.historicCoverageExecutionTimes=this.window.historicCoverageExecutionTimes,this.branchCoverageAvailable=this.window.branchCoverageAvailable,this.methodCoverageAvailable=this.window.methodCoverageAvailable,this.metrics=this.window.metrics,this.translations=this.window.translations,Wt.maximumDecimalPlacesForCoverageQuotas=this.window.maximumDecimalPlacesForCoverageQuotas;let t=!1;if(void 0!==this.window.history&&void 0!==this.window.history.replaceState&&null!==this.window.history.state&&null!=this.window.history.state.coverageInfoSettings)console.log("Coverage info: Restoring from history",this.window.history.state.coverageInfoSettings),t=!0,this.settings=JSON.parse(JSON.stringify(this.window.history.state.coverageInfoSettings));else{let r=0,o=this.window.assemblies;for(let s=0;s-1&&(this.queryString=window.location.href.substring(i)),this.updateCoverageInfo(),t&&this.restoreCollapseState()}onBeforeUnload(){if(this.saveCollapseState(),void 0!==this.window.history&&void 0!==this.window.history.replaceState){console.log("Coverage info: Updating history",this.settings);let t=new TI;null!==window.history.state&&(t=JSON.parse(JSON.stringify(this.window.history.state))),t.coverageInfoSettings=JSON.parse(JSON.stringify(this.settings)),window.history.replaceState(t,"")}}updateCoverageInfo(){let t=(new Date).getTime(),i=this.window.assemblies,r=[],o=0;if(0===this.settings.grouping)for(let l=0;l{for(let r=0;r{for(let o=0;ot&&(r[o].collapsed=this.settings.collapseStates[t]),t++,i(r[o].subElements)};i(this.codeElements)}static#e=this.\u0275fac=function(i){return new(i||e)(M(Cp))};static#t=this.\u0275cmp=Kt({type:e,selectors:[["coverage-info"]],hostBindings:function(i,r){1&i&&W("beforeunload",function(){return r.onBeforeUnload()},0,Wa)},decls:1,vars:1,consts:[[4,"ngIf"],[3,"visible","translations","branchCoverageAvailable","methodCoverageAvailable","metrics","showLineCoverage","showBranchCoverage","showMethodCoverage","visibleMetrics","visibleChange","showLineCoverageChange","showBranchCoverageChange","showMethodCoverageChange","visibleMetricsChange",4,"ngIf"],[1,"customizebox"],["href","#",3,"click"],[1,"col-center"],[1,"slider-label"],["type","range","step","1","min","-1",3,"ngModelChange","max","ngModel"],[1,"col-right","right"],["type","button",3,"click"],[1,"icon-cog"],[1,"table-responsive"],[1,"overview","table-fixed","stripped"],[1,"column-min-200"],["class","column90",4,"ngIf"],["class","column105",4,"ngIf"],["class","column100",4,"ngIf"],["class","column70",4,"ngIf"],["class","column98",4,"ngIf"],["class","column112",4,"ngIf"],["class","column112",4,"ngFor","ngForOf"],[1,"header"],["class","center","colspan","6",4,"ngIf"],["class","center","colspan","4",4,"ngIf"],["class","center",4,"ngIf"],[1,"filterbar"],["type","text",3,"ngModelChange","ngModel","placeholder"],[3,"ngClass"],["class","right",4,"ngIf"],["class","center","colspan","2",4,"ngIf"],[4,"ngFor","ngForOf"],[3,"visibleChange","showLineCoverageChange","showBranchCoverageChange","showMethodCoverageChange","visibleMetricsChange","visible","translations","branchCoverageAvailable","methodCoverageAvailable","metrics","showLineCoverage","showBranchCoverage","showMethodCoverage","visibleMetrics"],[3,"ngModelChange","ngModel"],["value",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],["value","allChanges"],["value","lineCoverageIncreaseOnly"],["value","lineCoverageDecreaseOnly"],["value","branchCoverageIncreaseOnly",4,"ngIf"],["value","branchCoverageDecreaseOnly",4,"ngIf"],["value","methodCoverageIncreaseOnly",4,"ngIf"],["value","methodCoverageDecreaseOnly",4,"ngIf"],["value","branchCoverageIncreaseOnly"],["value","branchCoverageDecreaseOnly"],["value","methodCoverageIncreaseOnly"],["value","methodCoverageDecreaseOnly"],[1,"column90"],[1,"column105"],[1,"column100"],[1,"column70"],[1,"column98"],[1,"column112"],["colspan","6",1,"center"],["colspan","4",1,"center"],[1,"center"],[3,"valueChange","highValueChange","value","highValue","options"],[1,"right"],["colspan","2",1,"center"],["target","_blank",3,"href"],[1,"icon-info-circled"],["codeelement-row","",3,"element","collapsed","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics",4,"ngIf"],["codeelement-row","",3,"element","collapsed","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics"],["class-row","",3,"clazz","translations","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics","historyComparisionDate",4,"ngIf"],["class-row","",3,"clazz","translations","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics","historyComparisionDate"],["codeelement-row","",1,"namespace",3,"element","collapsed","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics"],["class","namespace","class-row","",3,"clazz","translations","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics","historyComparisionDate",4,"ngIf"],["class-row","",1,"namespace",3,"clazz","translations","lineCoverageAvailable","branchCoverageAvailable","methodCoverageAvailable","visibleMetrics","historyComparisionDate"]],template:function(i,r){1&i&&H(0,E3,75,55,"div",0),2&i&&m("ngIf",r.codeElements.length>0)},dependencies:[Jr,Bi,$n,hp,gp,Os,cp,Ps,dc,Ls,SI,aj,Tj,CU],encapsulation:2})}return e})();class b3{constructor(){this.assembly="",this.numberOfRiskHotspots=10,this.filter="",this.sortBy="",this.sortOrder="asc"}}const bc=(e,n,t)=>({"icon-up-dir_active":e,"icon-down-dir_active":n,"icon-up-down-dir":t}),I3=(e,n)=>({lightred:e,lightgreen:n});function M3(e,n){if(1&e&&(C(0,"option",16),b(1),y()),2&e){const t=n.$implicit;m("value",t),f(),A(t)}}function S3(e,n){if(1&e&&(C(0,"span"),b(1),y()),2&e){const t=v(2);f(),A(t.translations.top)}}function T3(e,n){1&e&&(C(0,"option",23),b(1,"20"),y())}function O3(e,n){1&e&&(C(0,"option",24),b(1,"50"),y())}function N3(e,n){1&e&&(C(0,"option",25),b(1,"100"),y())}function A3(e,n){if(1&e&&(C(0,"option",16),b(1),y()),2&e){const t=v(3);m("value",t.totalNumberOfRiskHotspots),f(),A(t.translations.all)}}function x3(e,n){if(1&e){const t=Ie();C(0,"select",17),st("ngModelChange",function(r){G(t);const o=v(2);return Ne(o.settings.numberOfRiskHotspots,r)||(o.settings.numberOfRiskHotspots=r),q(r)}),C(1,"option",18),b(2,"10"),y(),H(3,T3,2,0,"option",19)(4,O3,2,0,"option",20)(5,N3,2,0,"option",21)(6,A3,2,2,"option",22),y()}if(2&e){const t=v(2);tt("ngModel",t.settings.numberOfRiskHotspots),f(3),m("ngIf",t.totalNumberOfRiskHotspots>10),f(),m("ngIf",t.totalNumberOfRiskHotspots>20),f(),m("ngIf",t.totalNumberOfRiskHotspots>50),f(),m("ngIf",t.totalNumberOfRiskHotspots>100)}}function R3(e,n){1&e&&N(0,"col",26)}function L3(e,n){if(1&e){const t=Ie();C(0,"th")(1,"a",13),W("click",function(r){const o=G(t).index;return q(v(2).updateSorting(""+o,r))}),N(2,"i",14),b(3),y(),C(4,"a",27),N(5,"i",28),y()()}if(2&e){const t=n.$implicit,i=n.index,r=v(2);f(2),m("ngClass",Ye(3,bc,r.settings.sortBy===""+i&&"asc"===r.settings.sortOrder,r.settings.sortBy===""+i&&"desc"===r.settings.sortOrder,r.settings.sortBy!==""+i)),f(),A(t.name),f(),Hn("href",t.explanationUrl,Xn)}}function P3(e,n){if(1&e&&(C(0,"td",32),b(1),y()),2&e){const t=n.$implicit;m("ngClass",qf(2,I3,t.exceeded,!t.exceeded)),f(),A(t.value)}}function k3(e,n){if(1&e&&(C(0,"tr")(1,"td"),b(2),y(),C(3,"td")(4,"a",29),b(5),y()(),C(6,"td",30)(7,"a",29),b(8),y()(),H(9,P3,2,5,"td",31),y()),2&e){const t=n.$implicit,i=v(2);f(2),A(t.assembly),f(2),m("href",t.reportPath+i.queryString,Xn),f(),A(t.class),f(),m("title",t.methodName),f(),m("href",t.reportPath+i.queryString+"#file"+t.fileIndex+"_line"+t.line,Xn),f(),K(" ",t.methodShortName," "),f(),m("ngForOf",t.metrics)}}function F3(e,n){if(1&e){const t=Ie();C(0,"div")(1,"div",1)(2,"div")(3,"select",2),st("ngModelChange",function(r){G(t);const o=v();return Ne(o.settings.assembly,r)||(o.settings.assembly=r),q(r)}),W("ngModelChange",function(){return G(t),q(v().updateRiskHotpots())}),C(4,"option",3),b(5),y(),H(6,M3,2,2,"option",4),y()(),C(7,"div",5),H(8,S3,2,1,"span",0)(9,x3,7,5,"select",6),y(),N(10,"div",5),C(11,"div",7)(12,"span"),b(13),y(),C(14,"input",8),st("ngModelChange",function(r){G(t);const o=v();return Ne(o.settings.filter,r)||(o.settings.filter=r),q(r)}),W("ngModelChange",function(){return G(t),q(v().updateRiskHotpots())}),y()()(),C(15,"div",9)(16,"table",10)(17,"colgroup"),N(18,"col",11)(19,"col",11)(20,"col",11),H(21,R3,1,0,"col",12),y(),C(22,"thead")(23,"tr")(24,"th")(25,"a",13),W("click",function(r){return G(t),q(v().updateSorting("assembly",r))}),N(26,"i",14),b(27),y()(),C(28,"th")(29,"a",13),W("click",function(r){return G(t),q(v().updateSorting("class",r))}),N(30,"i",14),b(31),y()(),C(32,"th")(33,"a",13),W("click",function(r){return G(t),q(v().updateSorting("method",r))}),N(34,"i",14),b(35),y()(),H(36,L3,6,7,"th",15),y()(),C(37,"tbody"),H(38,k3,10,7,"tr",15),function Hw(e,n){const t=X();let i;const r=e+P;t.firstCreatePass?(i=function xL(e,n){if(n)for(let t=n.length-1;t>=0;t--){const i=n[t];if(e===i.name)return i}}(n,t.pipeRegistry),t.data[r]=i,i.onDestroy&&(t.destroyHooks??=[]).push(r,i.onDestroy)):i=t.data[r];const o=i.factory||(i.factory=vi(i.type)),a=yt(M);try{const l=Ia(!1),c=o();return Ia(l),function jf(e,n,t,i){t>=e.data.length&&(e.data[t]=null,e.blueprint[t]=null),n[t]=i}(t,w(),r,c),c}finally{yt(a)}}(39,"slice"),y()()()()}if(2&e){const t=v();f(3),tt("ngModel",t.settings.assembly),f(2),A(t.translations.assembly),f(),m("ngForOf",t.assemblies),f(2),m("ngIf",t.totalNumberOfRiskHotspots>10),f(),m("ngIf",t.totalNumberOfRiskHotspots>10),f(4),K("",t.translations.filter," "),f(),tt("ngModel",t.settings.filter),f(7),m("ngForOf",t.riskHotspotMetrics),f(5),m("ngClass",Ye(20,bc,"assembly"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"assembly"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"assembly"!==t.settings.sortBy)),f(),A(t.translations.assembly),f(3),m("ngClass",Ye(24,bc,"class"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"class"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"class"!==t.settings.sortBy)),f(),A(t.translations.class),f(3),m("ngClass",Ye(28,bc,"method"===t.settings.sortBy&&"asc"===t.settings.sortOrder,"method"===t.settings.sortBy&&"desc"===t.settings.sortOrder,"method"!==t.settings.sortBy)),f(),A(t.translations.method),f(),m("ngForOf",t.riskHotspotMetrics),f(2),m("ngForOf",Bw(39,16,t.riskHotspots,0,t.settings.numberOfRiskHotspots))}}let V3=(()=>{class e{constructor(t){this.queryString="",this.riskHotspotMetrics=[],this.riskHotspots=[],this.totalNumberOfRiskHotspots=0,this.assemblies=[],this.translations={},this.settings=new b3,this.window=t.nativeWindow}ngOnInit(){this.riskHotspotMetrics=this.window.riskHotspotMetrics,this.translations=this.window.translations,void 0!==this.window.history&&void 0!==this.window.history.replaceState&&null!==this.window.history.state&&null!=this.window.history.state.riskHotspotsSettings&&(console.log("Risk hotspots: Restoring from history",this.window.history.state.riskHotspotsSettings),this.settings=JSON.parse(JSON.stringify(this.window.history.state.riskHotspotsSettings)));const t=window.location.href.indexOf("?");t>-1&&(this.queryString=window.location.href.substring(t)),this.updateRiskHotpots()}onDonBeforeUnlodad(){if(void 0!==this.window.history&&void 0!==this.window.history.replaceState){console.log("Risk hotspots: Updating history",this.settings);let t=new TI;null!==window.history.state&&(t=JSON.parse(JSON.stringify(this.window.history.state))),t.riskHotspotsSettings=JSON.parse(JSON.stringify(this.settings)),window.history.replaceState(t,"")}}updateRiskHotpots(){const t=this.window.riskHotspots;if(this.totalNumberOfRiskHotspots=t.length,0===this.assemblies.length){let s=[];for(let a=0;a0)},dependencies:[Jr,Bi,$n,hp,gp,Os,Ps,dc,Ls,CD],encapsulation:2})}return e})(),H3=(()=>{class e{static#e=this.\u0275fac=function(i){return new(i||e)};static#t=this.\u0275mod=Yn({type:e,bootstrap:[V3,D3]});static#n=this.\u0275inj=On({providers:[Cp],imports:[f2,aB,QB]})}return e})();u2().bootstrapModule(H3).catch(e=>console.error(e))}},so=>{so(so.s=736)}]); \ No newline at end of file diff --git a/coveragereport/report.css b/coveragereport/report.css new file mode 100644 index 0000000..6d1f766 --- /dev/null +++ b/coveragereport/report.css @@ -0,0 +1,819 @@ +:root { + --green: #0aad0a; + --lightgreen: #dcf4dc; +} + +html { font-family: sans-serif; margin: 0; padding: 0; font-size: 0.9em; background-color: #d6d6d6; height: 100%; } +body { margin: 0; padding: 0; height: 100%; color: #000; } +h1 { font-family: 'Century Gothic', sans-serif; font-size: 1.2em; font-weight: normal; color: #fff; background-color: #6f6f6f; padding: 10px; margin: 20px -20px 20px -20px; } +h1:first-of-type { margin-top: 0; } +h2 { font-size: 1.0em; font-weight: bold; margin: 10px 0 15px 0; padding: 0; } +h3 { font-size: 1.0em; font-weight: bold; margin: 0 0 10px 0; padding: 0; display: inline-block; } +input, select, button { border: 1px solid #767676; border-radius: 0; } +button { background-color: #ddd; cursor: pointer; } +a { color: #c00; text-decoration: none; } +a:hover { color: #000; text-decoration: none; } +h1 a.back { color: #fff; background-color: #949494; display: inline-block; margin: -12px 5px -10px -10px; padding: 10px; border-right: 1px solid #fff; } +h1 a.back:hover { background-color: #ccc; } +h1 a.button { color: #000; background-color: #bebebe; margin: -5px 0 0 10px; padding: 5px 8px 5px 8px; border: 1px solid #fff; font-size: 0.9em; border-radius: 3px; float:right; } +h1 a.button:hover { background-color: #ccc; } +h1 a.button i { position: relative; top: 1px; } + +.container { margin: auto; max-width: 1650px; width: 90%; background-color: #fff; display: flex; box-shadow: 0 0 60px #7d7d7d; min-height: 100%; } +.containerleft { padding: 0 20px 20px 20px; flex: 1; min-width: 1%; } +.containerright { width: 340px; min-width: 340px; background-color: #e5e5e5; height: 100%; } +.containerrightfixed { position: fixed; padding: 0 20px 20px 20px; border-left: 1px solid #6f6f6f; width: 300px; overflow-y: auto; height: 100%; top: 0; bottom: 0; } +.containerrightfixed h1 { background-color: #c00; } +.containerrightfixed label, .containerright a { white-space: nowrap; overflow: hidden; display: inline-block; width: 100%; max-width: 300px; text-overflow: ellipsis; } +.containerright a { margin-bottom: 3px; } + +@media screen and (max-width:1200px){ + .container { box-shadow: none; width: 100%; } + .containerright { display: none; } +} + +.popup-container { position: fixed; left: 0; right: 0; top: 0; bottom: 0; background-color: rgb(0, 0, 0, 0.6); z-index: 100; } +.popup { position: absolute; top: 50%; right: 50%; transform: translate(50%,-50%); background-color: #fff; padding: 25px; border-radius: 15px; min-width: 300px; } +.popup .close { text-align: right; color: #979797; font-size: 25px;position: relative; left: 10px; bottom: 10px; cursor: pointer; } + +.footer { font-size: 0.7em; text-align: center; margin-top: 35px; } + +.card-group { display: flex; flex-wrap: wrap; margin-top: -15px; margin-left: -15px; } +.card-group + .card-group { margin-top: 0; } +.card-group .card { margin-top: 15px; margin-left: 15px; display: flex; flex-direction: column; background-color: #e4e4e4; background: radial-gradient(circle, #fefefe 0%, #f6f6f6 100%); border: 1px solid #c1c1c1; padding: 15px; color: #6f6f6f; max-width: 100% } +.card-group .card .card-header { font-size: 1.5rem; font-family: 'Century Gothic', sans-serif; margin-bottom: 15px; flex-grow: 1; } +.card-group .card .card-body { display: flex; flex-direction: row; gap: 15px; flex-grow: 1; } +.card-group .card .card-body div.table { display: flex; flex-direction: column; } +.card-group .card .large { font-size: 5rem; line-height: 5rem; font-weight: bold; align-self: flex-end; border-left-width: 4px; padding-left: 10px; } +.card-group .card table { align-self: flex-end; border-collapse: collapse; } +.card-group .card table tr { border-bottom: 1px solid #c1c1c1; } +.card-group .card table tr:hover { background-color: #c1c1c1; } +.card-group .card table tr:last-child { border-bottom: none; } +.card-group .card table th, .card-group .card table td { padding: 2px; } +.card-group td.limit-width { max-width: 200px; text-overflow: ellipsis; overflow: hidden; } +.card-group td.overflow-wrap { overflow-wrap: anywhere; } + +.pro-button { color: #fff; background-color: #20A0D2; background-image: linear-gradient(50deg, #1c7ed6 0%, #23b8cf 100%); padding: 10px; border-radius: 3px; font-weight: bold; display: inline-block; } +.pro-button:hover { color: #fff; background-color: #1C8EB7; background-image: linear-gradient(50deg, #1A6FBA 0%, #1EA1B5 100%); } +.pro-button-tiny { border-radius: 10px; padding: 3px 8px; } + +th { text-align: left; } +.table-fixed { table-layout: fixed; } +.table-responsive { overflow-x: auto; } +.table-responsive::-webkit-scrollbar { height: 20px; } +.table-responsive::-webkit-scrollbar-thumb { background-color: #6f6f6f; border-radius: 20px; border: 5px solid #fff; } +.overview { border: 1px solid #c1c1c1; border-collapse: collapse; width: 100%; word-wrap: break-word; } +.overview th { border: 1px solid #c1c1c1; border-collapse: collapse; padding: 2px 4px 2px 4px; background-color: #ddd; } +.overview tr.namespace th { background-color: #dcdcdc; } +.overview thead th { background-color: #d1d1d1; } +.overview th a { color: #000; } +.overview tr.namespace a { margin-left: 15px; display: block; } +.overview td { border: 1px solid #c1c1c1; border-collapse: collapse; padding: 2px 5px 2px 5px; } +.overview tr.filterbar td { height: 60px; } +.overview tr.header th { background-color: #d1d1d1; } +.overview tr.header th:nth-child(2n+1) { background-color: #ddd; } +.overview tr.header th:first-child { border-left: 1px solid #fff; border-top: 1px solid #fff; background-color: #fff; } +.overview tbody tr:hover>td { background-color: #b0b0b0; } + +div.currenthistory { margin: -2px -5px 0 -5px; padding: 2px 5px 2px 5px; height: 16px; } +.coverage { border-collapse: collapse; font-size: 5px; height: 10px; } +.coverage td { padding: 0; border: none; } +.stripped tr:nth-child(2n+1) { background-color: #F3F3F3; } + +.customizebox { font-size: 0.75em; margin-bottom: 7px; display: grid; grid-template-columns: 1fr; grid-template-rows: auto auto auto auto; grid-column-gap: 10px; grid-row-gap: 10px; } +.customizebox>div { align-self: end; } +.customizebox div.col-right input { width: 150px; } + +@media screen and (min-width: 1000px) { + .customizebox { grid-template-columns: repeat(4, 1fr); grid-template-rows: 1fr; } + .customizebox div.col-center { justify-self: center; } + .customizebox div.col-right { justify-self: end; } +} +.slider-label { position: relative; left: 85px; } + +.percentagebar { + padding-left: 3px; +} +a.percentagebar { + padding-left: 6px; +} +.percentagebarundefined { + border-left: 2px solid #fff; +} +.percentagebar0 { + border-left: 2px solid #c10909; +} +.percentagebar10 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 90%, var(--green) 90%, var(--green) 100%) 1; +} +.percentagebar20 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 80%, var(--green) 80%, var(--green) 100%) 1; +} +.percentagebar30 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 70%, var(--green) 70%, var(--green) 100%) 1; +} +.percentagebar40 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 60%, var(--green) 60%, var(--green) 100%) 1; +} +.percentagebar50 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 50%, var(--green) 50%, var(--green) 100%) 1; +} +.percentagebar60 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 40%, var(--green) 40%, var(--green) 100%) 1; +} +.percentagebar70 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 30%, var(--green) 30%, var(--green) 100%) 1; +} +.percentagebar80 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 20%, var(--green) 20%, var(--green) 100%) 1; +} +.percentagebar90 { + border-left: 2px solid; + border-image: linear-gradient(to bottom, #c10909 10%, var(--green) 10%, var(--green) 100%) 1; +} +.percentagebar100 { + border-left: 2px solid var(--green); +} + +.mt-1 { margin-top: 4px; } +.hidden, .ng-hide { display: none; } +.right { text-align: right; } +.center { text-align: center; } +.rightmargin { padding-right: 8px; } +.leftmargin { padding-left: 5px; } +.green { background-color: var(--green); } +.lightgreen { background-color: var(--lightgreen); } +.red { background-color: #c10909; } +.lightred { background-color: #f7dede; } +.orange { background-color: #FFA500; } +.lightorange { background-color: #FFEFD5; } +.gray { background-color: #dcdcdc; } +.lightgray { color: #888888; } +.lightgraybg { background-color: #dadada; } + +code { font-family: Consolas, monospace; font-size: 0.9em; } + +.toggleZoom { text-align:right; } + +.historychart svg { max-width: 100%; } +.ct-chart { position: relative; } +.ct-chart .ct-line { stroke-width: 2px !important; } +.ct-chart .ct-point { stroke-width: 6px !important; transition: stroke-width .2s; } +.ct-chart .ct-point:hover { stroke-width: 10px !important; } +.ct-chart .ct-series.ct-series-a .ct-line, .ct-chart .ct-series.ct-series-a .ct-point { stroke: #c00 !important;} +.ct-chart .ct-series.ct-series-b .ct-line, .ct-chart .ct-series.ct-series-b .ct-point { stroke: #1c2298 !important;} +.ct-chart .ct-series.ct-series-c .ct-line, .ct-chart .ct-series.ct-series-c .ct-point { stroke: #0aad0a !important;} + +.tinylinecoveragechart, .tinybranchcoveragechart, .tinymethodcoveragechart { background-color: #fff; margin-left: -3px; float: left; border: 1px solid #c1c1c1; width: 30px; height: 18px; } +.historiccoverageoffset { margin-top: 7px; } + +.tinylinecoveragechart .ct-line, .tinybranchcoveragechart .ct-line, .tinymethodcoveragechart .ct-line { stroke-width: 1px !important; } +.tinybranchcoveragechart .ct-series.ct-series-a .ct-line { stroke: #1c2298 !important; } +.tinymethodcoveragechart .ct-series.ct-series-a .ct-line { stroke: #0aad0a !important; } + +.linecoverage { background-color: #c00; width: 10px; height: 8px; border: 1px solid #000; display: inline-block; } +.branchcoverage { background-color: #1c2298; width: 10px; height: 8px; border: 1px solid #000; display: inline-block; } +.codeelementcoverage { background-color: #0aad0a; width: 10px; height: 8px; border: 1px solid #000; display: inline-block; } + +.tooltip { position: absolute; display: none; padding: 5px; background: #F4C63D; color: #453D3F; pointer-events: none; z-index: 1; min-width: 250px; } + +.column-min-200 { min-width: 200px; } +.column60 { width: 60px; } +.column70 { width: 70px; } +.column90 { width: 90px; } +.column98 { width: 98px; } +.column100 { width: 100px; } +.column105 { width: 105px; } +.column112 { width: 112px; } + +.cardpercentagebar { border-left-style: solid; } +.cardpercentagebar0 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 0%, var(--green) 0%) 1; } +.cardpercentagebar1 { border-image: linear-gradient(to bottom, #c10909 1%, #c10909 1%, var(--green) 1%) 1; } +.cardpercentagebar2 { border-image: linear-gradient(to bottom, #c10909 2%, #c10909 2%, var(--green) 2%) 1; } +.cardpercentagebar3 { border-image: linear-gradient(to bottom, #c10909 3%, #c10909 3%, var(--green) 3%) 1; } +.cardpercentagebar4 { border-image: linear-gradient(to bottom, #c10909 4%, #c10909 4%, var(--green) 4%) 1; } +.cardpercentagebar5 { border-image: linear-gradient(to bottom, #c10909 5%, #c10909 5%, var(--green) 5%) 1; } +.cardpercentagebar6 { border-image: linear-gradient(to bottom, #c10909 6%, #c10909 6%, var(--green) 6%) 1; } +.cardpercentagebar7 { border-image: linear-gradient(to bottom, #c10909 7%, #c10909 7%, var(--green) 7%) 1; } +.cardpercentagebar8 { border-image: linear-gradient(to bottom, #c10909 8%, #c10909 8%, var(--green) 8%) 1; } +.cardpercentagebar9 { border-image: linear-gradient(to bottom, #c10909 9%, #c10909 9%, var(--green) 9%) 1; } +.cardpercentagebar10 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 10%, var(--green) 10%) 1; } +.cardpercentagebar11 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 11%, var(--green) 11%) 1; } +.cardpercentagebar12 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 12%, var(--green) 12%) 1; } +.cardpercentagebar13 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 13%, var(--green) 13%) 1; } +.cardpercentagebar14 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 14%, var(--green) 14%) 1; } +.cardpercentagebar15 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 15%, var(--green) 15%) 1; } +.cardpercentagebar16 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 16%, var(--green) 16%) 1; } +.cardpercentagebar17 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 17%, var(--green) 17%) 1; } +.cardpercentagebar18 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 18%, var(--green) 18%) 1; } +.cardpercentagebar19 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 19%, var(--green) 19%) 1; } +.cardpercentagebar20 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 20%, var(--green) 20%) 1; } +.cardpercentagebar21 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 21%, var(--green) 21%) 1; } +.cardpercentagebar22 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 22%, var(--green) 22%) 1; } +.cardpercentagebar23 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 23%, var(--green) 23%) 1; } +.cardpercentagebar24 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 24%, var(--green) 24%) 1; } +.cardpercentagebar25 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 25%, var(--green) 25%) 1; } +.cardpercentagebar26 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 26%, var(--green) 26%) 1; } +.cardpercentagebar27 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 27%, var(--green) 27%) 1; } +.cardpercentagebar28 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 28%, var(--green) 28%) 1; } +.cardpercentagebar29 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 29%, var(--green) 29%) 1; } +.cardpercentagebar30 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 30%, var(--green) 30%) 1; } +.cardpercentagebar31 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 31%, var(--green) 31%) 1; } +.cardpercentagebar32 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 32%, var(--green) 32%) 1; } +.cardpercentagebar33 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 33%, var(--green) 33%) 1; } +.cardpercentagebar34 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 34%, var(--green) 34%) 1; } +.cardpercentagebar35 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 35%, var(--green) 35%) 1; } +.cardpercentagebar36 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 36%, var(--green) 36%) 1; } +.cardpercentagebar37 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 37%, var(--green) 37%) 1; } +.cardpercentagebar38 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 38%, var(--green) 38%) 1; } +.cardpercentagebar39 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 39%, var(--green) 39%) 1; } +.cardpercentagebar40 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 40%, var(--green) 40%) 1; } +.cardpercentagebar41 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 41%, var(--green) 41%) 1; } +.cardpercentagebar42 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 42%, var(--green) 42%) 1; } +.cardpercentagebar43 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 43%, var(--green) 43%) 1; } +.cardpercentagebar44 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 44%, var(--green) 44%) 1; } +.cardpercentagebar45 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 45%, var(--green) 45%) 1; } +.cardpercentagebar46 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 46%, var(--green) 46%) 1; } +.cardpercentagebar47 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 47%, var(--green) 47%) 1; } +.cardpercentagebar48 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 48%, var(--green) 48%) 1; } +.cardpercentagebar49 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 49%, var(--green) 49%) 1; } +.cardpercentagebar50 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 50%, var(--green) 50%) 1; } +.cardpercentagebar51 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 51%, var(--green) 51%) 1; } +.cardpercentagebar52 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 52%, var(--green) 52%) 1; } +.cardpercentagebar53 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 53%, var(--green) 53%) 1; } +.cardpercentagebar54 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 54%, var(--green) 54%) 1; } +.cardpercentagebar55 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 55%, var(--green) 55%) 1; } +.cardpercentagebar56 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 56%, var(--green) 56%) 1; } +.cardpercentagebar57 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 57%, var(--green) 57%) 1; } +.cardpercentagebar58 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 58%, var(--green) 58%) 1; } +.cardpercentagebar59 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 59%, var(--green) 59%) 1; } +.cardpercentagebar60 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 60%, var(--green) 60%) 1; } +.cardpercentagebar61 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 61%, var(--green) 61%) 1; } +.cardpercentagebar62 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 62%, var(--green) 62%) 1; } +.cardpercentagebar63 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 63%, var(--green) 63%) 1; } +.cardpercentagebar64 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 64%, var(--green) 64%) 1; } +.cardpercentagebar65 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 65%, var(--green) 65%) 1; } +.cardpercentagebar66 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 66%, var(--green) 66%) 1; } +.cardpercentagebar67 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 67%, var(--green) 67%) 1; } +.cardpercentagebar68 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 68%, var(--green) 68%) 1; } +.cardpercentagebar69 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 69%, var(--green) 69%) 1; } +.cardpercentagebar70 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 70%, var(--green) 70%) 1; } +.cardpercentagebar71 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 71%, var(--green) 71%) 1; } +.cardpercentagebar72 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 72%, var(--green) 72%) 1; } +.cardpercentagebar73 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 73%, var(--green) 73%) 1; } +.cardpercentagebar74 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 74%, var(--green) 74%) 1; } +.cardpercentagebar75 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 75%, var(--green) 75%) 1; } +.cardpercentagebar76 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 76%, var(--green) 76%) 1; } +.cardpercentagebar77 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 77%, var(--green) 77%) 1; } +.cardpercentagebar78 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 78%, var(--green) 78%) 1; } +.cardpercentagebar79 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 79%, var(--green) 79%) 1; } +.cardpercentagebar80 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 80%, var(--green) 80%) 1; } +.cardpercentagebar81 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 81%, var(--green) 81%) 1; } +.cardpercentagebar82 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 82%, var(--green) 82%) 1; } +.cardpercentagebar83 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 83%, var(--green) 83%) 1; } +.cardpercentagebar84 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 84%, var(--green) 84%) 1; } +.cardpercentagebar85 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 85%, var(--green) 85%) 1; } +.cardpercentagebar86 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 86%, var(--green) 86%) 1; } +.cardpercentagebar87 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 87%, var(--green) 87%) 1; } +.cardpercentagebar88 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 88%, var(--green) 88%) 1; } +.cardpercentagebar89 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 89%, var(--green) 89%) 1; } +.cardpercentagebar90 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 90%, var(--green) 90%) 1; } +.cardpercentagebar91 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 91%, var(--green) 91%) 1; } +.cardpercentagebar92 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 92%, var(--green) 92%) 1; } +.cardpercentagebar93 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 93%, var(--green) 93%) 1; } +.cardpercentagebar94 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 94%, var(--green) 94%) 1; } +.cardpercentagebar95 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 95%, var(--green) 95%) 1; } +.cardpercentagebar96 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 96%, var(--green) 96%) 1; } +.cardpercentagebar97 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 97%, var(--green) 97%) 1; } +.cardpercentagebar98 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 98%, var(--green) 98%) 1; } +.cardpercentagebar99 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 99%, var(--green) 99%) 1; } +.cardpercentagebar100 { border-image: linear-gradient(to bottom, #c10909 0%, #c10909 100%, var(--green) 100%) 1; } + +.covered0 { width: 0px; } +.covered1 { width: 1px; } +.covered2 { width: 2px; } +.covered3 { width: 3px; } +.covered4 { width: 4px; } +.covered5 { width: 5px; } +.covered6 { width: 6px; } +.covered7 { width: 7px; } +.covered8 { width: 8px; } +.covered9 { width: 9px; } +.covered10 { width: 10px; } +.covered11 { width: 11px; } +.covered12 { width: 12px; } +.covered13 { width: 13px; } +.covered14 { width: 14px; } +.covered15 { width: 15px; } +.covered16 { width: 16px; } +.covered17 { width: 17px; } +.covered18 { width: 18px; } +.covered19 { width: 19px; } +.covered20 { width: 20px; } +.covered21 { width: 21px; } +.covered22 { width: 22px; } +.covered23 { width: 23px; } +.covered24 { width: 24px; } +.covered25 { width: 25px; } +.covered26 { width: 26px; } +.covered27 { width: 27px; } +.covered28 { width: 28px; } +.covered29 { width: 29px; } +.covered30 { width: 30px; } +.covered31 { width: 31px; } +.covered32 { width: 32px; } +.covered33 { width: 33px; } +.covered34 { width: 34px; } +.covered35 { width: 35px; } +.covered36 { width: 36px; } +.covered37 { width: 37px; } +.covered38 { width: 38px; } +.covered39 { width: 39px; } +.covered40 { width: 40px; } +.covered41 { width: 41px; } +.covered42 { width: 42px; } +.covered43 { width: 43px; } +.covered44 { width: 44px; } +.covered45 { width: 45px; } +.covered46 { width: 46px; } +.covered47 { width: 47px; } +.covered48 { width: 48px; } +.covered49 { width: 49px; } +.covered50 { width: 50px; } +.covered51 { width: 51px; } +.covered52 { width: 52px; } +.covered53 { width: 53px; } +.covered54 { width: 54px; } +.covered55 { width: 55px; } +.covered56 { width: 56px; } +.covered57 { width: 57px; } +.covered58 { width: 58px; } +.covered59 { width: 59px; } +.covered60 { width: 60px; } +.covered61 { width: 61px; } +.covered62 { width: 62px; } +.covered63 { width: 63px; } +.covered64 { width: 64px; } +.covered65 { width: 65px; } +.covered66 { width: 66px; } +.covered67 { width: 67px; } +.covered68 { width: 68px; } +.covered69 { width: 69px; } +.covered70 { width: 70px; } +.covered71 { width: 71px; } +.covered72 { width: 72px; } +.covered73 { width: 73px; } +.covered74 { width: 74px; } +.covered75 { width: 75px; } +.covered76 { width: 76px; } +.covered77 { width: 77px; } +.covered78 { width: 78px; } +.covered79 { width: 79px; } +.covered80 { width: 80px; } +.covered81 { width: 81px; } +.covered82 { width: 82px; } +.covered83 { width: 83px; } +.covered84 { width: 84px; } +.covered85 { width: 85px; } +.covered86 { width: 86px; } +.covered87 { width: 87px; } +.covered88 { width: 88px; } +.covered89 { width: 89px; } +.covered90 { width: 90px; } +.covered91 { width: 91px; } +.covered92 { width: 92px; } +.covered93 { width: 93px; } +.covered94 { width: 94px; } +.covered95 { width: 95px; } +.covered96 { width: 96px; } +.covered97 { width: 97px; } +.covered98 { width: 98px; } +.covered99 { width: 99px; } +.covered100 { width: 100px; } + + @media print { + html, body { background-color: #fff; } + .container { max-width: 100%; width: 100%; padding: 0; } + .overview colgroup col:first-child { width: 300px; } +} + +.icon-up-down-dir { + background-image: url(icon_up-down-dir.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0gMTQwOCw3NDIgcSAwLDI2IC0xOSw0NSAtMTksMTkgLTQ1LDE5IEggNDQ4IHEgLTI2LDAgLTQ1LC0xOSAtMTksLTE5IC0xOSwtNDUgMCwtMjYgMTksLTQ1IEwgODUxLDI0OSBxIDE5LC0xOSA0NSwtMTkgMjYsMCA0NSwxOSBsIDQ0OCw0NDggcSAxOSwxOSAxOSw0NSB6IiAvPjxwYXRoIGQ9Im0gMTQwOCwxMDUwIHEgMCwyNiAtMTksNDUgbCAtNDQ4LDQ0OCBxIC0xOSwxOSAtNDUsMTkgLTI2LDAgLTQ1LC0xOSBMIDQwMywxMDk1IHEgLTE5LC0xOSAtMTksLTQ1IDAsLTI2IDE5LC00NSAxOSwtMTkgNDUsLTE5IGggODk2IHEgMjYsMCA0NSwxOSAxOSwxOSAxOSw0NSB6IiAvPjwvc3ZnPg==); + background-repeat: no-repeat; + background-size: contain; + padding-left: 15px; + height: 0.9em; + display: inline-block; + position: relative; + top: 3px; +} +.icon-up-dir_active { + background-image: url(icon_up-dir.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNjMDAiIGQ9Ik0xNDA4IDEyMTZxMCAyNi0xOSA0NXQtNDUgMTloLTg5NnEtMjYgMC00NS0xOXQtMTktNDUgMTktNDVsNDQ4LTQ0OHExOS0xOSA0NS0xOXQ0NSAxOWw0NDggNDQ4cTE5IDE5IDE5IDQ1eiIvPjwvc3ZnPg==); + background-repeat: no-repeat; + background-size: contain; + padding-left: 15px; + height: 0.9em; + display: inline-block; + position: relative; + top: 3px; +} +.icon-down-dir_active { + background-image: url(icon_up-dir_active.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNjMDAiIGQ9Ik0xNDA4IDcwNHEwIDI2LTE5IDQ1bC00NDggNDQ4cS0xOSAxOS00NSAxOXQtNDUtMTlsLTQ0OC00NDhxLTE5LTE5LTE5LTQ1dDE5LTQ1IDQ1LTE5aDg5NnEyNiAwIDQ1IDE5dDE5IDQ1eiIvPjwvc3ZnPg==); + background-repeat: no-repeat; + background-size: contain; + padding-left: 15px; + height: 0.9em; + display: inline-block; + position: relative; + top: 3px; +} +.icon-info-circled { + background-image: url(icon_info-circled.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9Ijg5NiIgY3k9Ijg5NiIgcj0iNzUwIiBmaWxsPSIjZmZmIiAvPjxwYXRoIGZpbGw9IiMyOEE1RkYiIGQ9Ik0xMTUyIDEzNzZ2LTE2MHEwLTE0LTktMjN0LTIzLTloLTk2di01MTJxMC0xNC05LTIzdC0yMy05aC0zMjBxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloOTZ2MzIwaC05NnEtMTQgMC0yMyA5dC05IDIzdjE2MHEwIDE0IDkgMjN0MjMgOWg0NDhxMTQgMCAyMy05dDktMjN6bS0xMjgtODk2di0xNjBxMC0xNC05LTIzdC0yMy05aC0xOTJxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloMTkycTE0IDAgMjMtOXQ5LTIzem02NDAgNDE2cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPjwvc3ZnPg==); + background-repeat: no-repeat; + background-size: contain; + padding-left: 15px; + height: 0.9em; + display: inline-block; +} +.icon-plus { + background-image: url(icon_plus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjAwIDczNnYxOTJxMCA0MC0yOCA2OHQtNjggMjhoLTQxNnY0MTZxMCA0MC0yOCA2OHQtNjggMjhoLTE5MnEtNDAgMC02OC0yOHQtMjgtNjh2LTQxNmgtNDE2cS00MCAwLTY4LTI4dC0yOC02OHYtMTkycTAtNDAgMjgtNjh0NjgtMjhoNDE2di00MTZxMC00MCAyOC02OHQ2OC0yOGgxOTJxNDAgMCA2OCAyOHQyOCA2OHY0MTZoNDE2cTQwIDAgNjggMjh0MjggNjh6Ii8+PC9zdmc+); + background-repeat: no-repeat; + background-size: contain; + padding-left: 15px; + height: 0.9em; + display: inline-block; + position: relative; + top: 3px; +} +.icon-minus { + background-image: url(icon_minus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNjMDAiIGQ9Ik0xNjAwIDczNnYxOTJxMCA0MC0yOCA2OHQtNjggMjhoLTEyMTZxLTQwIDAtNjgtMjh0LTI4LTY4di0xOTJxMC00MCAyOC02OHQ2OC0yOGgxMjE2cTQwIDAgNjggMjh0MjggNjh6Ii8+PC9zdmc+); + background-repeat: no-repeat; + background-size: contain; + padding-left: 15px; + height: 0.9em; + display: inline-block; + position: relative; + top: 3px; +} +.icon-wrench { + background-image: url(icon_wrench.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik00NDggMTQ3MnEwLTI2LTE5LTQ1dC00NS0xOS00NSAxOS0xOSA0NSAxOSA0NSA0NSAxOSA0NS0xOSAxOS00NXptNjQ0LTQyMGwtNjgyIDY4MnEtMzcgMzctOTAgMzctNTIgMC05MS0zN2wtMTA2LTEwOHEtMzgtMzYtMzgtOTAgMC01MyAzOC05MWw2ODEtNjgxcTM5IDk4IDExNC41IDE3My41dDE3My41IDExNC41em02MzQtNDM1cTAgMzktMjMgMTA2LTQ3IDEzNC0xNjQuNSAyMTcuNXQtMjU4LjUgODMuNXEtMTg1IDAtMzE2LjUtMTMxLjV0LTEzMS41LTMxNi41IDEzMS41LTMxNi41IDMxNi41LTEzMS41cTU4IDAgMTIxLjUgMTYuNXQxMDcuNSA0Ni41cTE2IDExIDE2IDI4dC0xNiAyOGwtMjkzIDE2OXYyMjRsMTkzIDEwN3E1LTMgNzktNDguNXQxMzUuNS04MSA3MC41LTM1LjVxMTUgMCAyMy41IDEwdDguNSAyNXoiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} +.icon-cog { + background-image: url(icon_cog.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNDQ0Ljc4OCAyOTEuMWw0Mi42MTYgMjQuNTk5YzQuODY3IDIuODA5IDcuMTI2IDguNjE4IDUuNDU5IDEzLjk4NS0xMS4wNyAzNS42NDItMjkuOTcgNjcuODQyLTU0LjY4OSA5NC41ODZhMTIuMDE2IDEyLjAxNiAwIDAgMS0xNC44MzIgMi4yNTRsLTQyLjU4NC0yNC41OTVhMTkxLjU3NyAxOTEuNTc3IDAgMCAxLTYwLjc1OSAzNS4xM3Y0OS4xODJhMTIuMDEgMTIuMDEgMCAwIDEtOS4zNzcgMTEuNzE4Yy0zNC45NTYgNy44NS03Mi40OTkgOC4yNTYtMTA5LjIxOS4wMDctNS40OS0xLjIzMy05LjQwMy02LjA5Ni05LjQwMy0xMS43MjN2LTQ5LjE4NGExOTEuNTU1IDE5MS41NTUgMCAwIDEtNjAuNzU5LTM1LjEzbC00Mi41ODQgMjQuNTk1YTEyLjAxNiAxMi4wMTYgMCAwIDEtMTQuODMyLTIuMjU0Yy0yNC43MTgtMjYuNzQ0LTQzLjYxOS01OC45NDQtNTQuNjg5LTk0LjU4Ni0xLjY2Ny01LjM2Ni41OTItMTEuMTc1IDUuNDU5LTEzLjk4NUw2Ny4yMTIgMjkxLjFhMTkzLjQ4IDE5My40OCAwIDAgMSAwLTcwLjE5OWwtNDIuNjE2LTI0LjU5OWMtNC44NjctMi44MDktNy4xMjYtOC42MTgtNS40NTktMTMuOTg1IDExLjA3LTM1LjY0MiAyOS45Ny02Ny44NDIgNTQuNjg5LTk0LjU4NmExMi4wMTYgMTIuMDE2IDAgMCAxIDE0LjgzMi0yLjI1NGw0Mi41ODQgMjQuNTk1YTE5MS41NzcgMTkxLjU3NyAwIDAgMSA2MC43NTktMzUuMTNWMjUuNzU5YTEyLjAxIDEyLjAxIDAgMCAxIDkuMzc3LTExLjcxOGMzNC45NTYtNy44NSA3Mi40OTktOC4yNTYgMTA5LjIxOS0uMDA3IDUuNDkgMS4yMzMgOS40MDMgNi4wOTYgOS40MDMgMTEuNzIzdjQ5LjE4NGExOTEuNTU1IDE5MS41NTUgMCAwIDEgNjAuNzU5IDM1LjEzbDQyLjU4NC0yNC41OTVhMTIuMDE2IDEyLjAxNiAwIDAgMSAxNC44MzIgMi4yNTRjMjQuNzE4IDI2Ljc0NCA0My42MTkgNTguOTQ0IDU0LjY4OSA5NC41ODYgMS42NjcgNS4zNjYtLjU5MiAxMS4xNzUtNS40NTkgMTMuOTg1TDQ0NC43ODggMjIwLjlhMTkzLjQ4NSAxOTMuNDg1IDAgMCAxIDAgNzAuMnpNMzM2IDI1NmMwLTQ0LjExMi0zNS44ODgtODAtODAtODBzLTgwIDM1Ljg4OC04MCA4MCAzNS44ODggODAgODAgODAgODAtMzUuODg4IDgwLTgweiIvPjwvc3ZnPg==); + background-repeat: no-repeat; + background-size: contain; + padding-left: 16px; + height: 0.8em; + display: inline-block; +} +.icon-fork { + background-image: url(icon_fork.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHN0eWxlPSJmaWxsOiNmZmYiIC8+PHBhdGggZD0iTTY3MiAxNDcycTAtNDAtMjgtNjh0LTY4LTI4LTY4IDI4LTI4IDY4IDI4IDY4IDY4IDI4IDY4LTI4IDI4LTY4em0wLTExNTJxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTY0MCAxMjhxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTk2IDBxMCA1Mi0yNiA5Ni41dC03MCA2OS41cS0yIDI4Ny0yMjYgNDE0LTY3IDM4LTIwMyA4MS0xMjggNDAtMTY5LjUgNzF0LTQxLjUgMTAwdjI2cTQ0IDI1IDcwIDY5LjV0MjYgOTYuNXEwIDgwLTU2IDEzNnQtMTM2IDU2LTEzNi01Ni01Ni0xMzZxMC01MiAyNi05Ni41dDcwLTY5LjV2LTgyMHEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnEwIDUyLTI2IDk2LjV0LTcwIDY5LjV2NDk3cTU0LTI2IDE1NC01NyA1NS0xNyA4Ny41LTI5LjV0NzAuNS0zMSA1OS0zOS41IDQwLjUtNTEgMjgtNjkuNSA4LjUtOTEuNXEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnoiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} +.icon-cube { + background-image: url(icon_cube.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik04OTYgMTYyOWw2NDAtMzQ5di02MzZsLTY0MCAyMzN2NzUyem0tNjQtODY1bDY5OC0yNTQtNjk4LTI1NC02OTggMjU0em04MzItMjUydjc2OHEwIDM1LTE4IDY1dC00OSA0N2wtNzA0IDM4NHEtMjggMTYtNjEgMTZ0LTYxLTE2bC03MDQtMzg0cS0zMS0xNy00OS00N3QtMTgtNjV2LTc2OHEwLTQwIDIzLTczdDYxLTQ3bDcwNC0yNTZxMjItOCA0NC04dDQ0IDhsNzA0IDI1NnEzOCAxNCA2MSA0N3QyMyA3M3oiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} +.icon-search-plus { + background-image: url(icon_search-plus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiM2ZjZmNmYiIGQ9Ik0xMDg4IDgwMHY2NHEwIDEzLTkuNSAyMi41dC0yMi41IDkuNWgtMjI0djIyNHEwIDEzLTkuNSAyMi41dC0yMi41IDkuNWgtNjRxLTEzIDAtMjIuNS05LjV0LTkuNS0yMi41di0yMjRoLTIyNHEtMTMgMC0yMi41LTkuNXQtOS41LTIyLjV2LTY0cTAtMTMgOS41LTIyLjV0MjIuNS05LjVoMjI0di0yMjRxMC0xMyA5LjUtMjIuNXQyMi41LTkuNWg2NHExMyAwIDIyLjUgOS41dDkuNSAyMi41djIyNGgyMjRxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXptMTI4IDMycTAtMTg1LTEzMS41LTMxNi41dC0zMTYuNS0xMzEuNS0zMTYuNSAxMzEuNS0xMzEuNSAzMTYuNSAxMzEuNSAzMTYuNSAzMTYuNSAxMzEuNSAzMTYuNS0xMzEuNSAxMzEuNS0zMTYuNXptNTEyIDgzMnEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41cS01NCAwLTkwLTM4bC0zNDMtMzQycS0xNzkgMTI0LTM5OSAxMjQtMTQzIDAtMjczLjUtNTUuNXQtMjI1LTE1MC0xNTAtMjI1LTU1LjUtMjczLjUgNTUuNS0yNzMuNSAxNTAtMjI1IDIyNS0xNTAgMjczLjUtNTUuNSAyNzMuNSA1NS41IDIyNSAxNTAgMTUwIDIyNSA1NS41IDI3My41cTAgMjIwLTEyNCAzOTlsMzQzIDM0M3EzNyAzNyAzNyA5MHoiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} +.icon-search-minus { + background-image: url(icon_search-minus.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiM2ZjZmNmYiIGQ9Ik0xMDg4IDgwMHY2NHEwIDEzLTkuNSAyMi41dC0yMi41IDkuNWgtNTc2cS0xMyAwLTIyLjUtOS41dC05LjUtMjIuNXYtNjRxMC0xMyA5LjUtMjIuNXQyMi41LTkuNWg1NzZxMTMgMCAyMi41IDkuNXQ5LjUgMjIuNXptMTI4IDMycTAtMTg1LTEzMS41LTMxNi41dC0zMTYuNS0xMzEuNS0zMTYuNSAxMzEuNS0xMzEuNSAzMTYuNSAxMzEuNSAzMTYuNSAzMTYuNSAxMzEuNSAzMTYuNS0xMzEuNSAxMzEuNS0zMTYuNXptNTEyIDgzMnEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41cS01NCAwLTkwLTM4bC0zNDMtMzQycS0xNzkgMTI0LTM5OSAxMjQtMTQzIDAtMjczLjUtNTUuNXQtMjI1LTE1MC0xNTAtMjI1LTU1LjUtMjczLjUgNTUuNS0yNzMuNSAxNTAtMjI1IDIyNS0xNTAgMjczLjUtNTUuNSAyNzMuNSA1NS41IDIyNSAxNTAgMTUwIDIyNSA1NS41IDI3My41cTAgMjIwLTEyNCAzOTlsMzQzIDM0M3EzNyAzNyAzNyA5MHoiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} +.icon-star { + background-image: url(icon_star.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzI4IDY0N3EwIDIyLTI2IDQ4bC0zNjMgMzU0IDg2IDUwMHExIDcgMSAyMCAwIDIxLTEwLjUgMzUuNXQtMzAuNSAxNC41cS0xOSAwLTQwLTEybC00NDktMjM2LTQ0OSAyMzZxLTIyIDEyLTQwIDEyLTIxIDAtMzEuNS0xNC41dC0xMC41LTM1LjVxMC02IDItMjBsODYtNTAwLTM2NC0zNTRxLTI1LTI3LTI1LTQ4IDAtMzcgNTYtNDZsNTAyLTczIDIyNS00NTVxMTktNDEgNDktNDF0NDkgNDFsMjI1IDQ1NSA1MDIgNzNxNTYgOSA1NiA0NnoiIGZpbGw9IiMwMDAiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} +.icon-sponsor { + background-image: url(icon_sponsor.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik04OTYgMTY2NHEtMjYgMC00NC0xOGwtNjI0LTYwMnEtMTAtOC0yNy41LTI2dC01NS41LTY1LjUtNjgtOTcuNS01My41LTEyMS0yMy41LTEzOHEwLTIyMCAxMjctMzQ0dDM1MS0xMjRxNjIgMCAxMjYuNSAyMS41dDEyMCA1OCA5NS41IDY4LjUgNzYgNjhxMzYtMzYgNzYtNjh0OTUuNS02OC41IDEyMC01OCAxMjYuNS0yMS41cTIyNCAwIDM1MSAxMjR0MTI3IDM0NHEwIDIyMS0yMjkgNDUwbC02MjMgNjAwcS0xOCAxOC00NCAxOHoiIGZpbGw9IiNlYTRhYWEiLz48L3N2Zz4=); + background-repeat: no-repeat; + background-size: contain; + padding-left: 20px; + height: 0.9em; + display: inline-block; +} + +.ngx-slider .ngx-slider-bar { + background: #a9a9a9 !important; +} + +.ngx-slider .ngx-slider-selection { + background: #818181 !important; +} + +.ngx-slider .ngx-slider-bubble { + padding: 3px 4px !important; + font-size: 12px !important; +} + +.ngx-slider .ngx-slider-pointer { + width: 20px !important; + height: 20px !important; + top: -8px !important; + background-color: #0075FF !important; + -webkit-border-radius: 10px !important; + -moz-border-radius: 10px !important; + border-radius: 10px !important; +} + + .ngx-slider .ngx-slider-pointer:after { + content: none !important; + } + +.ngx-slider .ngx-slider-tick.ngx-slider-selected { + background-color: #62a5f4 !important; + width: 8px !important; + height: 8px !important; + top: 1px !important; +} + + + +@media (prefers-color-scheme: dark) { + @media screen { + html { + background-color: #333; + color: #fff; + } + + body { + color: #fff; + } + + h1 { + background-color: #555453; + color: #fff; + } + + .container { + background-color: #333; + box-shadow: 0 0 60px #0c0c0c; + } + + .containerrightfixed { + background-color: #3D3C3C; + border-left: 1px solid #515050; + } + + .containerrightfixed h1 { + background-color: #484747; + } + + .popup-container { + background-color: rgb(80, 80, 80, 0.6); + } + + .popup { + background-color: #333; + } + + .card-group .card { + background-color: #333; + background: radial-gradient(circle, #444 0%, #333 100%); + border: 1px solid #545454; + color: #fff; + } + + .card-group .card table tr { + border-bottom: 1px solid #545454; + } + + .card-group .card table tr:hover { + background-color: #2E2D2C; + } + + .table-responsive::-webkit-scrollbar-thumb { + background-color: #555453; + border: 5px solid #333; + } + + .overview tr:hover > td { + background-color: #2E2D2C; + } + + .overview th { + background-color: #444; + border: 1px solid #3B3A39; + } + + .overview tr.namespace th { + background-color: #444; + } + + .overview thead th { + background-color: #444; + } + + .overview th a { + color: #fff; + color: rgba(255, 255, 255, 0.95); + } + + .overview th a:hover { + color: #0078d4; + } + + .overview td { + border: 1px solid #3B3A39; + } + + .overview .coverage td { + border: none; + } + + .overview tr.header th { + background-color: #444; + } + + .overview tr.header th:nth-child(2n+1) { + background-color: #3a3a3a; + } + + .overview tr.header th:first-child { + border-left: 1px solid #333; + border-top: 1px solid #333; + background-color: #333; + } + + .stripped tr:nth-child(2n+1) { + background-color: #3c3c3c; + } + + input, select, button { + background-color: #333; + color: #fff; + border: 1px solid #A19F9D; + } + + a { + color: #fff; + color: rgba(255, 255, 255, 0.95); + } + + a:hover { + color: #0078d4; + } + + h1 a.back { + background-color: #4a4846; + } + + h1 a.button { + color: #fff; + background-color: #565656; + border-color: #c1c1c1; + } + + h1 a.button:hover { + background-color: #8d8d8d; + } + + .gray { + background-color: #484747; + } + + .lightgray { + color: #ebebeb; + } + + .lightgraybg { + background-color: #474747; + } + + .lightgreen { + background-color: #406540; + } + + .lightorange { + background-color: #ab7f36; + } + + .lightred { + background-color: #954848; + } + + .ct-label { + color: #fff !important; + fill: #fff !important; + } + + .ct-grid { + stroke: #fff !important; + } + + .ct-chart .ct-series.ct-series-a .ct-line, .ct-chart .ct-series.ct-series-a .ct-point { + stroke: #0078D4 !important; + } + + .ct-chart .ct-series.ct-series-b .ct-line, .ct-chart .ct-series.ct-series-b .ct-point { + stroke: #6dc428 !important; + } + + .ct-chart .ct-series.ct-series-c .ct-line, .ct-chart .ct-series.ct-series-c .ct-point { + stroke: #e58f1d !important; + } + + .linecoverage { + background-color: #0078D4; + } + + .branchcoverage { + background-color: #6dc428; + } + .codeelementcoverage { + background-color: #e58f1d; + } + + .tinylinecoveragechart, .tinybranchcoveragechart, .tinymethodcoveragechart { + background-color: #333; + } + + .tinybranchcoveragechart .ct-series.ct-series-a .ct-line { + stroke: #6dc428 !important; + } + + .tinymethodcoveragechart .ct-series.ct-series-a .ct-line { + stroke: #e58f1d !important; + } + + .icon-up-down-dir { + background-image: url(icon_up-down-dir_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGZpbGw9IiNCRkJGQzAiIGQ9Im0gMTQwOCw3NDIgcSAwLDI2IC0xOSw0NSAtMTksMTkgLTQ1LDE5IEggNDQ4IHEgLTI2LDAgLTQ1LC0xOSAtMTksLTE5IC0xOSwtNDUgMCwtMjYgMTksLTQ1IEwgODUxLDI0OSBxIDE5LC0xOSA0NSwtMTkgMjYsMCA0NSwxOSBsIDQ0OCw0NDggcSAxOSwxOSAxOSw0NSB6IiAvPjxwYXRoIGZpbGw9IiNCRkJGQzAiIGQ9Im0gMTQwOCwxMDUwIHEgMCwyNiAtMTksNDUgbCAtNDQ4LDQ0OCBxIC0xOSwxOSAtNDUsMTkgLTI2LDAgLTQ1LC0xOSBMIDQwMywxMDk1IHEgLTE5LC0xOSAtMTksLTQ1IDAsLTI2IDE5LC00NSAxOSwtMTkgNDUsLTE5IGggODk2IHEgMjYsMCA0NSwxOSAxOSwxOSAxOSw0NSB6IiAvPjwvc3ZnPg==); + } + .icon-info-circled { + background-image: url(icon_info-circled_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9Ijg5NiIgY3k9Ijg5NiIgcj0iNzUwIiBmaWxsPSIjZmZmIiAvPjxwYXRoIGZpbGw9IiMyOEE1RkYiIGQ9Ik0xMTUyIDEzNzZ2LTE2MHEwLTE0LTktMjN0LTIzLTloLTk2di01MTJxMC0xNC05LTIzdC0yMy05aC0zMjBxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloOTZ2MzIwaC05NnEtMTQgMC0yMyA5dC05IDIzdjE2MHEwIDE0IDkgMjN0MjMgOWg0NDhxMTQgMCAyMy05dDktMjN6bS0xMjgtODk2di0xNjBxMC0xNC05LTIzdC0yMy05aC0xOTJxLTE0IDAtMjMgOXQtOSAyM3YxNjBxMCAxNCA5IDIzdDIzIDloMTkycTE0IDAgMjMtOXQ5LTIzem02NDAgNDE2cTAgMjA5LTEwMyAzODUuNXQtMjc5LjUgMjc5LjUtMzg1LjUgMTAzLTM4NS41LTEwMy0yNzkuNS0yNzkuNS0xMDMtMzg1LjUgMTAzLTM4NS41IDI3OS41LTI3OS41IDM4NS41LTEwMyAzODUuNSAxMDMgMjc5LjUgMjc5LjUgMTAzIDM4NS41eiIvPjwvc3ZnPg==); + } + + .icon-plus { + background-image: url(icon_plus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTE2MDAgNzM2djE5MnEwIDQwLTI4IDY4dC02OCAyOGgtNDE2djQxNnEwIDQwLTI4IDY4dC02OCAyOGgtMTkycS00MCAwLTY4LTI4dC0yOC02OHYtNDE2aC00MTZxLTQwIDAtNjgtMjh0LTI4LTY4di0xOTJxMC00MCAyOC02OHQ2OC0yOGg0MTZ2LTQxNnEwLTQwIDI4LTY4dDY4LTI4aDE5MnE0MCAwIDY4IDI4dDI4IDY4djQxNmg0MTZxNDAgMCA2OCAyOHQyOCA2OHoiLz48L3N2Zz4=); + } + + .icon-minus { + background-image: url(icon_minus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTE2MDAgNzM2djE5MnEwIDQwLTI4IDY4dC02OCAyOGgtMTIxNnEtNDAgMC02OC0yOHQtMjgtNjh2LTE5MnEwLTQwIDI4LTY4dDY4LTI4aDEyMTZxNDAgMCA2OCAyOHQyOCA2OHoiLz48L3N2Zz4=); + } + + .icon-wrench { + background-image: url(icon_wrench_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JEQkRCRiIgZD0iTTQ0OCAxNDcycTAtMjYtMTktNDV0LTQ1LTE5LTQ1IDE5LTE5IDQ1IDE5IDQ1IDQ1IDE5IDQ1LTE5IDE5LTQ1em02NDQtNDIwbC02ODIgNjgycS0zNyAzNy05MCAzNy01MiAwLTkxLTM3bC0xMDYtMTA4cS0zOC0zNi0zOC05MCAwLTUzIDM4LTkxbDY4MS02ODFxMzkgOTggMTE0LjUgMTczLjV0MTczLjUgMTE0LjV6bTYzNC00MzVxMCAzOS0yMyAxMDYtNDcgMTM0LTE2NC41IDIxNy41dC0yNTguNSA4My41cS0xODUgMC0zMTYuNS0xMzEuNXQtMTMxLjUtMzE2LjUgMTMxLjUtMzE2LjUgMzE2LjUtMTMxLjVxNTggMCAxMjEuNSAxNi41dDEwNy41IDQ2LjVxMTYgMTEgMTYgMjh0LTE2IDI4bC0yOTMgMTY5djIyNGwxOTMgMTA3cTUtMyA3OS00OC41dDEzNS41LTgxIDcwLjUtMzUuNXExNSAwIDIzLjUgMTB0OC41IDI1eiIvPjwvc3ZnPg==); + } + + .icon-cog { + background-image: url(icon_cog_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjQkRCREJGIiBkPSJNNDQ0Ljc4OCAyOTEuMWw0Mi42MTYgMjQuNTk5YzQuODY3IDIuODA5IDcuMTI2IDguNjE4IDUuNDU5IDEzLjk4NS0xMS4wNyAzNS42NDItMjkuOTcgNjcuODQyLTU0LjY4OSA5NC41ODZhMTIuMDE2IDEyLjAxNiAwIDAgMS0xNC44MzIgMi4yNTRsLTQyLjU4NC0yNC41OTVhMTkxLjU3NyAxOTEuNTc3IDAgMCAxLTYwLjc1OSAzNS4xM3Y0OS4xODJhMTIuMDEgMTIuMDEgMCAwIDEtOS4zNzcgMTEuNzE4Yy0zNC45NTYgNy44NS03Mi40OTkgOC4yNTYtMTA5LjIxOS4wMDctNS40OS0xLjIzMy05LjQwMy02LjA5Ni05LjQwMy0xMS43MjN2LTQ5LjE4NGExOTEuNTU1IDE5MS41NTUgMCAwIDEtNjAuNzU5LTM1LjEzbC00Mi41ODQgMjQuNTk1YTEyLjAxNiAxMi4wMTYgMCAwIDEtMTQuODMyLTIuMjU0Yy0yNC43MTgtMjYuNzQ0LTQzLjYxOS01OC45NDQtNTQuNjg5LTk0LjU4Ni0xLjY2Ny01LjM2Ni41OTItMTEuMTc1IDUuNDU5LTEzLjk4NUw2Ny4yMTIgMjkxLjFhMTkzLjQ4IDE5My40OCAwIDAgMSAwLTcwLjE5OWwtNDIuNjE2LTI0LjU5OWMtNC44NjctMi44MDktNy4xMjYtOC42MTgtNS40NTktMTMuOTg1IDExLjA3LTM1LjY0MiAyOS45Ny02Ny44NDIgNTQuNjg5LTk0LjU4NmExMi4wMTYgMTIuMDE2IDAgMCAxIDE0LjgzMi0yLjI1NGw0Mi41ODQgMjQuNTk1YTE5MS41NzcgMTkxLjU3NyAwIDAgMSA2MC43NTktMzUuMTNWMjUuNzU5YTEyLjAxIDEyLjAxIDAgMCAxIDkuMzc3LTExLjcxOGMzNC45NTYtNy44NSA3Mi40OTktOC4yNTYgMTA5LjIxOS0uMDA3IDUuNDkgMS4yMzMgOS40MDMgNi4wOTYgOS40MDMgMTEuNzIzdjQ5LjE4NGExOTEuNTU1IDE5MS41NTUgMCAwIDEgNjAuNzU5IDM1LjEzbDQyLjU4NC0yNC41OTVhMTIuMDE2IDEyLjAxNiAwIDAgMSAxNC44MzIgMi4yNTRjMjQuNzE4IDI2Ljc0NCA0My42MTkgNTguOTQ0IDU0LjY4OSA5NC41ODYgMS42NjcgNS4zNjYtLjU5MiAxMS4xNzUtNS40NTkgMTMuOTg1TDQ0NC43ODggMjIwLjlhMTkzLjQ4NSAxOTMuNDg1IDAgMCAxIDAgNzAuMnpNMzM2IDI1NmMwLTQ0LjExMi0zNS44ODgtODAtODAtODBzLTgwIDM1Ljg4OC04MCA4MCAzNS44ODggODAgODAgODAgODAtMzUuODg4IDgwLTgweiIvPjwvc3ZnPg==); + } + + .icon-fork { + background-image: url(icon_fork_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTY3MiAxNDcycTAtNDAtMjgtNjh0LTY4LTI4LTY4IDI4LTI4IDY4IDI4IDY4IDY4IDI4IDY4LTI4IDI4LTY4em0wLTExNTJxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTY0MCAxMjhxMC00MC0yOC02OHQtNjgtMjgtNjggMjgtMjggNjggMjggNjggNjggMjggNjgtMjggMjgtNjh6bTk2IDBxMCA1Mi0yNiA5Ni41dC03MCA2OS41cS0yIDI4Ny0yMjYgNDE0LTY3IDM4LTIwMyA4MS0xMjggNDAtMTY5LjUgNzF0LTQxLjUgMTAwdjI2cTQ0IDI1IDcwIDY5LjV0MjYgOTYuNXEwIDgwLTU2IDEzNnQtMTM2IDU2LTEzNi01Ni01Ni0xMzZxMC01MiAyNi05Ni41dDcwLTY5LjV2LTgyMHEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnEwIDUyLTI2IDk2LjV0LTcwIDY5LjV2NDk3cTU0LTI2IDE1NC01NyA1NS0xNyA4Ny41LTI5LjV0NzAuNS0zMSA1OS0zOS41IDQwLjUtNTEgMjgtNjkuNSA4LjUtOTEuNXEtNDQtMjUtNzAtNjkuNXQtMjYtOTYuNXEwLTgwIDU2LTEzNnQxMzYtNTYgMTM2IDU2IDU2IDEzNnoiLz48L3N2Zz4=); + } + + .icon-cube { + background-image: url(icon_cube_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTg5NiAxNjI5bDY0MC0zNDl2LTYzNmwtNjQwIDIzM3Y3NTJ6bS02NC04NjVsNjk4LTI1NC02OTgtMjU0LTY5OCAyNTR6bTgzMi0yNTJ2NzY4cTAgMzUtMTggNjV0LTQ5IDQ3bC03MDQgMzg0cS0yOCAxNi02MSAxNnQtNjEtMTZsLTcwNC0zODRxLTMxLTE3LTQ5LTQ3dC0xOC02NXYtNzY4cTAtNDAgMjMtNzN0NjEtNDdsNzA0LTI1NnEyMi04IDQ0LTh0NDQgOGw3MDQgMjU2cTM4IDE0IDYxIDQ3dDIzIDczeiIvPjwvc3ZnPg==); + } + + .icon-search-plus { + background-image: url(icon_search-plus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTEwODggODAwdjY0cTAgMTMtOS41IDIyLjV0LTIyLjUgOS41aC0yMjR2MjI0cTAgMTMtOS41IDIyLjV0LTIyLjUgOS41aC02NHEtMTMgMC0yMi41LTkuNXQtOS41LTIyLjV2LTIyNGgtMjI0cS0xMyAwLTIyLjUtOS41dC05LjUtMjIuNXYtNjRxMC0xMyA5LjUtMjIuNXQyMi41LTkuNWgyMjR2LTIyNHEwLTEzIDkuNS0yMi41dDIyLjUtOS41aDY0cTEzIDAgMjIuNSA5LjV0OS41IDIyLjV2MjI0aDIyNHExMyAwIDIyLjUgOS41dDkuNSAyMi41em0xMjggMzJxMC0xODUtMTMxLjUtMzE2LjV0LTMxNi41LTEzMS41LTMxNi41IDEzMS41LTEzMS41IDMxNi41IDEzMS41IDMxNi41IDMxNi41IDEzMS41IDMxNi41LTEzMS41IDEzMS41LTMxNi41em01MTIgODMycTAgNTMtMzcuNSA5MC41dC05MC41IDM3LjVxLTU0IDAtOTAtMzhsLTM0My0zNDJxLTE3OSAxMjQtMzk5IDEyNC0xNDMgMC0yNzMuNS01NS41dC0yMjUtMTUwLTE1MC0yMjUtNTUuNS0yNzMuNSA1NS41LTI3My41IDE1MC0yMjUgMjI1LTE1MCAyNzMuNS01NS41IDI3My41IDU1LjUgMjI1IDE1MCAxNTAgMjI1IDU1LjUgMjczLjVxMCAyMjAtMTI0IDM5OWwzNDMgMzQzcTM3IDM3IDM3IDkweiIvPjwvc3ZnPg==); + } + + .icon-search-minus { + background-image: url(icon_search-minus_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHdpZHRoPSIxNzkyIiBoZWlnaHQ9IjE3OTIiIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI0JGQkZDMCIgZD0iTTEwODggODAwdjY0cTAgMTMtOS41IDIyLjV0LTIyLjUgOS41aC01NzZxLTEzIDAtMjIuNS05LjV0LTkuNS0yMi41di02NHEwLTEzIDkuNS0yMi41dDIyLjUtOS41aDU3NnExMyAwIDIyLjUgOS41dDkuNSAyMi41em0xMjggMzJxMC0xODUtMTMxLjUtMzE2LjV0LTMxNi41LTEzMS41LTMxNi41IDEzMS41LTEzMS41IDMxNi41IDEzMS41IDMxNi41IDMxNi41IDEzMS41IDMxNi41LTEzMS41IDEzMS41LTMxNi41em01MTIgODMycTAgNTMtMzcuNSA5MC41dC05MC41IDM3LjVxLTU0IDAtOTAtMzhsLTM0My0zNDJxLTE3OSAxMjQtMzk5IDEyNC0xNDMgMC0yNzMuNS01NS41dC0yMjUtMTUwLTE1MC0yMjUtNTUuNS0yNzMuNSA1NS41LTI3My41IDE1MC0yMjUgMjI1LTE1MCAyNzMuNS01NS41IDI3My41IDU1LjUgMjI1IDE1MCAxNTAgMjI1IDU1LjUgMjczLjVxMCAyMjAtMTI0IDM5OWwzNDMgMzQzcTM3IDM3IDM3IDkweiIvPjwvc3ZnPg==); + } + + .icon-star { + background-image: url(icon_star_dark.svg), url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzI4IDY0N3EwIDIyLTI2IDQ4bC0zNjMgMzU0IDg2IDUwMHExIDcgMSAyMCAwIDIxLTEwLjUgMzUuNXQtMzAuNSAxNC41cS0xOSAwLTQwLTEybC00NDktMjM2LTQ0OSAyMzZxLTIyIDEyLTQwIDEyLTIxIDAtMzEuNS0xNC41dC0xMC41LTM1LjVxMC02IDItMjBsODYtNTAwLTM2NC0zNTRxLTI1LTI3LTI1LTQ4IDAtMzcgNTYtNDZsNTAyLTczIDIyNS00NTVxMTktNDEgNDktNDF0NDkgNDFsMjI1IDQ1NSA1MDIgNzNxNTYgOSA1NiA0NnoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=); + } + } +} + +.ct-double-octave:after,.ct-golden-section:after,.ct-major-eleventh:after,.ct-major-second:after,.ct-major-seventh:after,.ct-major-sixth:after,.ct-major-tenth:after,.ct-major-third:after,.ct-major-twelfth:after,.ct-minor-second:after,.ct-minor-seventh:after,.ct-minor-sixth:after,.ct-minor-third:after,.ct-octave:after,.ct-perfect-fifth:after,.ct-perfect-fourth:after,.ct-square:after{content:"";clear:both}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-donut-solid,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-donut-solid,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-donut-solid,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-donut-solid,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-donut-solid,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-donut-solid,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-donut-solid,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-donut-solid,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-donut-solid,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-donut-solid,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-donut-solid,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-donut-solid,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-donut-solid,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-donut-solid,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-donut-solid,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{display:table}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{display:table}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{display:table}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{display:table}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{display:table}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{display:table}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{display:table}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{display:table}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{display:table}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{display:table}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{display:table}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{display:table}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{display:table}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{display:table}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{display:table}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{display:table}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{display:table}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0} \ No newline at end of file diff --git a/src/TaskExtensions.cs b/src/TaskExtensions.cs index 3a19e3c..e5f6f11 100644 --- a/src/TaskExtensions.cs +++ b/src/TaskExtensions.cs @@ -14,6 +14,20 @@ private static Exception PotentiallyUnwindException(AggregateException exception ? exception.InnerException : exception; + private static Exception HandleCancellation(this Task task) + { + try + { + T result = task.Result; + + return new Exception("Expected canceled task"); + } + catch (OperationCanceledException exception) + { + return exception; + } + } + /// /// Monadic 'alt'. /// @@ -103,14 +117,7 @@ Func> onFulfilled { if (continuationTask.IsCanceled) { - try - { - T result = continuationTask.Result; - } - catch (OperationCanceledException exception) - { - return Task.FromException(exception); - } + return Task.FromException(HandleCancellation(task)); } return continuationTask.IsFaulted @@ -496,89 +503,4 @@ public static Task Retry(this Task task, Func public static Task Retry(this Task task, Func retryFunc) => task.Retry(retryFunc, RetryParams.Default); - - /// - /// Transforms the value in a fulfilled to another type. - /// - /// This method is an alias to Task.ResultMap. - /// The task's underlying type. - /// The transformed type. - /// The transformation function. - /// The transformed task. - public static Task Then(this Task task, Func onFulfilled) - => task.ResultMap(onFulfilled); - - /// - /// Transforms the value in a fulfilled to another type. - /// - /// This method is an alias to Task.Bind. - /// The task's underlying type. - /// The transformed type. - /// The transformation function. - /// The transformed task. - public static Task Then(this Task task, Func> onFulfilled) - => task.Bind(onFulfilled); - - /// - /// Transforms both sides of a . - /// - /// This method is an alias to Task.BiBind. - /// The task's underlying type. - /// The transformed type. - /// The transformation function for a fulfilled task. - /// The transformation function for a faulted task. - /// The transformed task. - public static Task Then( - this Task task, - Func onFulfilled, - Func onFaulted - ) => task.BiBind( - Pipe2(onFaulted, Task.FromResult), - Pipe2(onFulfilled, Task.FromResult) - ); - - /// - /// Transforms both sides of a . - /// - /// This method is an alias to Task.BiBind. - /// The task's underlying type. - /// The transformed type. - /// The transformation function for a fulfilled task. - /// The transformation function for a faulted task. - /// The transformed task. - public static Task Then( - this Task task, - Func onFulfilled, - Func> onFaulted - ) => task.BiBind(onFaulted, Pipe2(onFulfilled, Task.FromResult)); - - /// - /// Transforms both sides of a . - /// - /// This method is an alias to Task.BiBind. - /// The task's underlying type. - /// The transformed type. - /// The transformation function for a fulfilled task. - /// The transformation function for a faulted task. - /// The transformed task. - public static Task Then( - this Task task, - Func> onFulfilled, - Func onFaulted - ) => task.BiBind(Pipe2(onFaulted, Task.FromResult), onFulfilled); - - /// - /// Transforms both sides of a . - /// - /// This method is an alias to Task.BiBind. - /// The task's underlying type. - /// The transformed type. - /// The transformation function for a fulfilled task. - /// The transformation function for a faulted task. - /// The transformed task. - public static Task Then( - this Task task, - Func> onFulfilled, - Func> onFaulted - ) => task.BiBind(onFaulted, onFulfilled); } diff --git a/src/TaskExtensionsThen.cs b/src/TaskExtensionsThen.cs new file mode 100644 index 0000000..c74a71a --- /dev/null +++ b/src/TaskExtensionsThen.cs @@ -0,0 +1,296 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace RLC.TaskChaining; + +using static TaskStatics; + +public static partial class TaskExtensions +{ + /// + /// Transforms the value in a fulfilled to another type. + /// + /// This method is an alias to Task.ResultMap. + /// The task's underlying type. + /// The transformed type. + /// The transformation function. + /// The transformed task. + public static Task Then(this Task task, Func onFulfilled) + => task.ResultMap(onFulfilled); + + /// + /// Transforms the value in a fulfilled to another type. + /// + /// This method is an alias to Task.Bind. + /// The task's underlying type. + /// The transformed type. + /// The transformation function. + /// The transformed task. + public static Task Then(this Task task, Func> onFulfilled) + => task.Bind(onFulfilled); + + /// + /// Transforms both sides of a . + /// + /// This method is an alias to Task.BiBind. + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// The transformed task. + public static Task Then( + this Task task, + Func onFulfilled, + Func onFaulted + ) => task.BiBind( + Pipe2(onFaulted, Task.FromResult), + Pipe2(onFulfilled, Task.FromResult) + ); + + /// + /// Transforms both sides of a . + /// + /// This method is an alias to Task.BiBind. + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// The transformed task. + public static Task Then( + this Task task, + Func onFulfilled, + Func> onFaulted + ) => task.BiBind(onFaulted, Pipe2(onFulfilled, Task.FromResult)); + + /// + /// Transforms both sides of a . + /// + /// This method is an alias to Task.BiBind. + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func onFaulted + ) => task.BiBind(Pipe2(onFaulted, Task.FromResult), onFulfilled); + + /// + /// Transforms both sides of a . + /// + /// This method is an alias to Task.BiBind. + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func> onFaulted + ) => task.BiBind(onFaulted, onFulfilled); + + /// + /// Transforms the value in a fulfilled to another type. + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function. + /// A cancellation token + /// The transformed task + public static Task Then( + this Task task, + Func> onFulfilled, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(continuationTask)); + } + + return continuationTask.IsFaulted + ? Task.FromException(PotentiallyUnwindException(continuationTask.Exception)) + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } + + /// + /// Transforms both sides of a . + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// A cancellation token. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func onFaulted, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(task)); + } + + return continuationTask.IsFaulted + ? Task.FromException(onFaulted()) + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } + + /// + /// Transforms both sides of a . + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// A cancellation token. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func onFaulted, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(task)); + } + + return continuationTask.IsFaulted + ? Task.FromResult(onFaulted()) + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } + + /// + /// Transforms both sides of a . + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// A cancellation token. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func> onFaulted, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(task)); + } + + return continuationTask.IsFaulted + ? onFaulted() + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } + + /// + /// Transforms both sides of a . + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// A cancellation token. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func onFaulted, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(task)); + } + + return continuationTask.IsFaulted + ? Task.FromException(onFaulted(PotentiallyUnwindException(continuationTask.Exception))) + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } + + /// + /// Transforms both sides of a . + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// A cancellation token. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func onFaulted, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(task)); + } + + return continuationTask.IsFaulted + ? Task.FromResult(onFaulted(PotentiallyUnwindException(continuationTask.Exception))) + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } + + /// + /// Transforms both sides of a . + /// + /// The task's underlying type. + /// The transformed type. + /// The transformation function for a fulfilled task. + /// The transformation function for a faulted task. + /// A cancellation token. + /// The transformed task. + public static Task Then( + this Task task, + Func> onFulfilled, + Func> onFaulted, + CancellationToken cancellationToken = default + ) + { + return task.ContinueWith(continuationTask => + { + if (continuationTask.IsCanceled) + { + return Task.FromException(HandleCancellation(continuationTask)); + } + + return continuationTask.IsFaulted + ? onFaulted(PotentiallyUnwindException(continuationTask.Exception)) + : onFulfilled(continuationTask.Result, cancellationToken); + }).Unwrap(); + } +} diff --git a/tests/unit/TaskChainingTests.cs b/tests/unit/TaskChainingTests.cs index 0d3a8e7..2d2c864 100644 --- a/tests/unit/TaskChainingTests.cs +++ b/tests/unit/TaskChainingTests.cs @@ -754,402 +754,6 @@ public async Task ItShouldTransitionForAFailedPredicate() } } - public class Then - { - public class ForOnlyFulfilled - { - public class ForTtoTNext - { - [Fact] - public async void ItShouldTransition() - { - int expectedValue = 5; - int actualValue = await Task.FromResult("12345") - .Then(str => str.Length); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldCompleteWithoutAwaiting() - { - int expectedValue = 5; - int actualValue = 0; - - _ = Task.FromResult("12345") - .Then(str => - { - actualValue = str.Length; - - return actualValue; - }); - - await Task.Delay(2); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldFaultForThrownExceptions() - { - Func testFunc = _ => throw new Exception(); - - Task testTask = Task.FromResult("abc") - .Then(testFunc); - - try - { - await testTask; - } - catch { } - - Assert.True(testTask.IsFaulted); - } - - [Fact] - public async void ItShouldRethrowForFaults() - { - Task testTask = Task.FromException(new ArgumentNullException("abcde")) - .Then(value => value.Length); - - await Assert.ThrowsAsync(async () => await testTask); - } - - [Fact] - public async void ItShouldNotRunForAFault() - { - Exception testException = new(Guid.NewGuid().ToString()); - - await Assert.ThrowsAsync( - async () => await Task.FromException(testException) - .Then(str => str.Length) - ); - } - - [Fact] - public async void ItShouldReportFaultedForThrownException() - { - Func testFunc = _ => throw new ArgumentException(); - Task testTask = Task.FromResult("12345").Then(testFunc); - - try - { - await testTask; - } - catch { } - - Assert.True(testTask.IsFaulted); - } - - [Fact] - public async void ItShouldThrowFaultedException() - { - Func testFunc = _ => throw new ArgumentException(); - - await Assert.ThrowsAsync( - async () => await Task.FromResult("12345").Then(testFunc) - ); - } - } - - public class ForTtoTaskTNext - { - [Fact] - public async void ItShouldTransition() - { - int expectedValue = 5; - int actualValue = await Task.FromResult("12345") - .Then(str => Task.FromResult(str.Length)); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldCompleteWithoutAwaiting() - { - int expectedValue = 5; - int actualValue = 0; - - _ = Task.FromResult("12345") - .Then(str => - { - actualValue = str.Length; - - return Task.FromResult(actualValue); - }); - - await Task.Delay(2); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldNotRunForAFault() - { - Exception testException = new(Guid.NewGuid().ToString()); - - await Assert.ThrowsAsync( - async () => await Task.FromException(testException) - .Then(str => Task.FromResult(str.Length)) - ); - } - - [Fact] - public async void ItShouldContinueAsyncTasks() - { - int expectedValue = 5; - int actualValue = 0; - - _ = Task.FromResult("12345") - .Then(async str => - { - await Task.Delay(1); - - actualValue = str.Length; - - return Task.FromResult(str.Length); - }); - - await Task.Delay(5); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldContinueAsyncTasksWithoutAwaiting() - { - int expectedValue = 5; - int actualValue = 0; - - _ = Task.FromResult("12345") - .Then(async str => - { - await Task.Delay(1); - - actualValue = str.Length; - - return Task.FromResult(actualValue); - }); - - await Task.Delay(5); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldReportFaultedForThrownException() - { - Func> testFunc = _ => throw new ArgumentException(); - Task testTask = Task.FromResult("12345").Then(testFunc); - - try - { - await testTask; - } - catch { } - - Assert.True(testTask.IsFaulted); - } - - [Fact] - public async void ItShouldThrowFaultedException() - { - Func> testFunc = _ => throw new ArgumentException(); - - await Assert.ThrowsAsync( - async () => await Task.FromResult("12345").Then(testFunc) - ); - } - - [Fact] - public async void ItShouldReportFaultedForThrownExceptionFromAsync() - { - Func> testFunc = async _ => - { - await Task.Delay(1); - throw new ArgumentException(); - }; - Task testTask = Task.FromResult("12345").Then(testFunc); - - try - { - await testTask; - } - catch { } - - Assert.True(testTask.IsFaulted); - } - - [Fact] - public async void ItShouldThrowFaultedExceptionFromAsync() - { - Func> testFunc = async _ => - { - await Task.Delay(1); - throw new ArgumentException(); - }; - - await Assert.ThrowsAsync( - async () => await Task.FromResult("12345").Then(testFunc) - ); - } - - [Fact] - public async void ItShouldFaultForThrownExceptions() - { - Func> testFunc = _ => throw new Exception(); - - Task testTask = Task.FromResult("abc") - .Then(testFunc); - - try - { - await testTask; - } - catch { } - - Assert.True(testTask.IsFaulted); - } - - [Fact] - public async void ItShouldCaptureTaskCancellation() - { - HttpClient testHttpClient = new MockHttpBuilder() - .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() - .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) - ) - .BuildHttpClient(); - - CancellationTokenSource testTokenSource = new(); - testTokenSource.Cancel(); - - Task testTask = Task.FromResult("https://www.google.com") - .Then(async url => await testHttpClient.GetStringAsync(url, testTokenSource.Token)) - .Then(_ => Guid.NewGuid().ToString()); - - await Task.Delay(50); - - Assert.True(testTask.IsFaulted); - } - } - - public async void ItShouldCaptureTaskCancellationException() - { - HttpClient testHttpClient = new MockHttpBuilder() - .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() - .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) - ) - .BuildHttpClient(); - - CancellationTokenSource testTokenSource = new(); - testTokenSource.Cancel(); - - Task testTask = Task.FromResult("https://www.google.com") - .Then(async url => await testHttpClient.GetStringAsync(url, testTokenSource.Token)) - .Then(_ => Guid.NewGuid().ToString()); - - await Task.Delay(50); - - await Assert.ThrowsAsync(async () => await testTask); - } - } - - public class ForBoth - { - public class ForTtoTNext - { - [Fact] - public async void ItShouldTransitionAFulfilledTask() - { - int expectedValue = 5; - int actualValue = await Task.FromResult("12345") - .Then(str => str.Length, Constant(0)); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldTransitionAFaultBackIntoAFulfillment() - { - int expectedValue = 5; - int actualValue = await Task.FromException(new Exception()) - .Then(s => s.Length, Constant(5)); - - Assert.Equal(expectedValue, actualValue); - } - } - - public class ForTtoTaskTNext - { - [Fact] - public async void ItShouldTransitionAFulfilledTask() - { - int expectedValue = 5; - int actualValue = await Task.FromResult("12345") - .Then(str => Task.FromResult(str.Length), Constant>(Task.FromResult(0))); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldTransitionAFaultBackIntoAFulfillment() - { - int expectedValue = 5; - int actualValue = await Task.FromException(new Exception()) - .Then(s => Task.FromResult(s.Length), Constant>(Task.FromResult(5))); - - Assert.Equal(expectedValue, actualValue); - } - } - - public class ForTaskOnlyOnFulfillment - { - [Fact] - public async void ItShouldTransitionAFulfilledTask() - { - int expectedValue = 5; - int actualValue = await Task.FromResult("12345") - .Then(str => Task.FromResult(str.Length), Constant(0)); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldTransitionAFaultBackIntoAFulfillment() - { - int expectedValue = 5; - int actualValue = await Task.FromException(new Exception()) - .Then(s => Task.FromResult(s.Length), Constant(5)); - - Assert.Equal(expectedValue, actualValue); - } - } - - public class ForTaskOnlyOnFaulted - { - [Fact] - public async void ItShouldTransitionAFulfilledTask() - { - int expectedValue = 5; - int actualValue = await Task.FromResult("12345") - .Then(str => str.Length, Constant>(Task.FromResult(0))); - - Assert.Equal(expectedValue, actualValue); - } - - [Fact] - public async void ItShouldTransitionAFaultBackIntoAFulfillment() - { - int expectedValue = 5; - int actualValue = await Task.FromException(new Exception()) - .Then(s => s.Length, Constant>(Task.FromResult(5))); - - Assert.Equal(expectedValue, actualValue); - } - } - } - } - public class Retry { public static RetryParams TestRetryOptions = new(3, TimeSpan.FromMilliseconds(10), 2, (_, _, _) => { }, exception => true); diff --git a/tests/unit/TaskChainingThenTests.cs b/tests/unit/TaskChainingThenTests.cs new file mode 100644 index 0000000..3400db5 --- /dev/null +++ b/tests/unit/TaskChainingThenTests.cs @@ -0,0 +1,797 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +using Jds.TestingUtils.MockHttp; +using RLC.TaskChaining; +using Xunit; + +using static RLC.TaskChaining.TaskStatics; + +namespace RLC.TaskChainingTests; + +public class Then +{ + private static async Task TestFunc(string s, CancellationToken cancellationToken) + { + return await Task.Run(() => s.Length); + } + + public class ForOnlyFulfilled + { + public class ForTtoTNext + { + [Fact] + public async void ItShouldTransition() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(str => str.Length); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldCompleteWithoutAwaiting() + { + int expectedValue = 5; + int actualValue = 0; + + _ = Task.FromResult("12345") + .Then(str => + { + actualValue = str.Length; + + return actualValue; + }); + + await Task.Delay(2); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldFaultForThrownExceptions() + { + Func testFunc = _ => throw new Exception(); + + Task testTask = Task.FromResult("abc") + .Then(testFunc); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldRethrowForFaults() + { + Task testTask = Task.FromException(new ArgumentNullException("abcde")) + .Then(value => value.Length); + + await Assert.ThrowsAsync(async () => await testTask); + } + + [Fact] + public async void ItShouldNotRunForAFault() + { + Exception testException = new(Guid.NewGuid().ToString()); + + await Assert.ThrowsAsync( + async () => await Task.FromException(testException) + .Then(str => str.Length) + ); + } + + [Fact] + public async void ItShouldReportFaultedForThrownException() + { + Func testFunc = _ => throw new ArgumentException(); + Task testTask = Task.FromResult("12345").Then(testFunc); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldThrowFaultedException() + { + Func testFunc = _ => throw new ArgumentException(); + + await Assert.ThrowsAsync( + async () => await Task.FromResult("12345").Then(testFunc) + ); + } + } + + public class ForTtoTaskTNext + { + [Fact] + public async void ItShouldTransition() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(str => Task.FromResult(str.Length)); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldCompleteWithoutAwaiting() + { + int expectedValue = 5; + int actualValue = 0; + + _ = Task.FromResult("12345") + .Then(str => + { + actualValue = str.Length; + + return Task.FromResult(actualValue); + }); + + await Task.Delay(2); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldNotRunForAFault() + { + Exception testException = new(Guid.NewGuid().ToString()); + + await Assert.ThrowsAsync( + async () => await Task.FromException(testException) + .Then(str => Task.FromResult(str.Length)) + ); + } + + [Fact] + public async void ItShouldContinueAsyncTasks() + { + int expectedValue = 5; + int actualValue = 0; + + _ = Task.FromResult("12345") + .Then(async str => + { + await Task.Delay(1); + + actualValue = str.Length; + + return Task.FromResult(str.Length); + }); + + await Task.Delay(5); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldContinueAsyncTasksWithoutAwaiting() + { + int expectedValue = 5; + int actualValue = 0; + + _ = Task.FromResult("12345") + .Then(async str => + { + await Task.Delay(1); + + actualValue = str.Length; + + return Task.FromResult(actualValue); + }); + + await Task.Delay(5); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldReportFaultedForThrownException() + { + Func> testFunc = _ => throw new ArgumentException(); + Task testTask = Task.FromResult("12345").Then(testFunc); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldThrowFaultedException() + { + Func> testFunc = _ => throw new ArgumentException(); + + await Assert.ThrowsAsync( + async () => await Task.FromResult("12345").Then(testFunc) + ); + } + + [Fact] + public async void ItShouldReportFaultedForThrownExceptionFromAsync() + { + Func> testFunc = async _ => + { + await Task.Delay(1); + throw new ArgumentException(); + }; + Task testTask = Task.FromResult("12345").Then(testFunc); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldThrowFaultedExceptionFromAsync() + { + Func> testFunc = async _ => + { + await Task.Delay(1); + throw new ArgumentException(); + }; + + await Assert.ThrowsAsync( + async () => await Task.FromResult("12345").Then(testFunc) + ); + } + + [Fact] + public async void ItShouldFaultForThrownExceptions() + { + Func> testFunc = _ => throw new Exception(); + + Task testTask = Task.FromResult("abc") + .Then(testFunc); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.FromResult("https://www.google.com") + .Then(async url => await testHttpClient.GetStringAsync(url, testTokenSource.Token)) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(50); + + Assert.True(testTask.IsFaulted); + } + } + + public class ForCancellationTokenOnFulfilled + { + [Fact] + public async void ItShouldTransition() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldNotRunForAFault() + { + Exception testException = new(Guid.NewGuid().ToString()); + + await Assert.ThrowsAsync( + async () => await Task.FromException(testException) + .Then(TestFunc, CancellationToken.None) + ); + } + + [Fact] + public async void ItShouldReportFaultedForThrownException() + { + Func> testFunc = (_, _) => throw new ArgumentException(); + Task testTask = Task.FromResult("12345").Then(testFunc, CancellationToken.None); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldThrowFaultedException() + { + Func> testFunc = (_, _) => throw new ArgumentException(); + + await Assert.ThrowsAsync( + async () => await Task.FromResult("12345").Then(testFunc, CancellationToken.None) + ); + } + + [Fact] + public async void ItShouldReportFaultedForThrownExceptionFromAsync() + { + Func> testFunc = async (_, _) => + { + await Task.Delay(1); + throw new ArgumentException(); + }; + Task testTask = Task.FromResult("12345").Then(testFunc, CancellationToken.None); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldThrowFaultedExceptionFromAsync() + { + Func> testFunc = async (_, _) => + { + await Task.Delay(1); + throw new ArgumentException(); + }; + + await Assert.ThrowsAsync( + async () => await Task.FromResult("12345").Then(testFunc, CancellationToken.None) + ); + } + + [Fact] + public async void ItShouldFaultForThrownExceptions() + { + Func> testFunc = (_, _) => throw new Exception(); + + Task testTask = Task.FromResult("abc") + .Then(testFunc, CancellationToken.None); + + try + { + await testTask; + } + catch { } + + Assert.True(testTask.IsFaulted); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => "https://www.google.com", testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + + public async void ItShouldCaptureTaskCancellationException() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.FromResult("https://www.google.com") + .Then(testHttpClient.GetStringAsync, testTokenSource.Token) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(50); + + await Assert.ThrowsAsync(async () => await testTask); + } + } + + public class ForBoth + { + public class ForTtoTNext + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(str => str.Length, Constant(0)); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultBackIntoAFulfillment() + { + int expectedValue = 5; + int actualValue = await Task.FromException(new Exception()) + .Then(s => s.Length, Constant(5)); + + Assert.Equal(expectedValue, actualValue); + } + } + + public class ForTtoTaskTNext + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(str => Task.FromResult(str.Length), Constant>(Task.FromResult(0))); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultBackIntoAFulfillment() + { + int expectedValue = 5; + int actualValue = await Task.FromException(new Exception()) + .Then(s => Task.FromResult(s.Length), Constant>(Task.FromResult(5))); + + Assert.Equal(expectedValue, actualValue); + } + } + + public class ForTaskOnlyOnFulfillment + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(str => Task.FromResult(str.Length), Constant(0)); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultBackIntoAFulfillment() + { + int expectedValue = 5; + int actualValue = await Task.FromException(new Exception()) + .Then(s => Task.FromResult(s.Length), Constant(5)); + + Assert.Equal(expectedValue, actualValue); + } + } + + public class ForTaskOnlyOnFaulted + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(str => str.Length, Constant>(Task.FromResult(0))); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultBackIntoAFulfillment() + { + int expectedValue = 5; + int actualValue = await Task.FromException(new Exception()) + .Then(s => s.Length, Constant>(Task.FromResult(5))); + + Assert.Equal(expectedValue, actualValue); + } + } + + public class ForCancellationTokenFuncException + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, () => new NullReferenceException(), CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultToAnotherExceptionType() + { + Task testTask = Task.FromException(new ArgumentException()) + .Then(TestFunc, () => new NullReferenceException(), CancellationToken.None); + + await Assert.ThrowsAsync(async () => await testTask); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => Task.FromException(new Exception()), testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, () => new NullReferenceException(), CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + + public class ForCancellationTokenTNextOnFaulted + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, () => 100, CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultToASuccessfulValue() + { + int expectedValue = 10; + int actualValue = await Task.FromException(new ArgumentException()) + .Then(TestFunc, () => expectedValue, CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => Task.FromException(new Exception()), testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, () => string.Empty, CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + + public class ForCancellationTokenTaskTNextOnFaulted + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, () => Task.FromResult(100), CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultToASuccessfulValue() + { + int expectedValue = 10; + int actualValue = await Task.FromException(new ArgumentException()) + .Then(TestFunc, () => Task.FromResult(expectedValue), CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => Task.FromException(new Exception()), testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, () => Task.FromResult(string.Empty), CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + + public class ForCancellationTokenExceptionToExceptionOnFaulted + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, ex => new Exception("nested exception", ex), CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultToASuccessfulValue() + { + + Task testTask = Task.FromException(new ArgumentException()) + .Then(TestFunc, ex => new InvalidOperationException("nested exception", ex), CancellationToken.None); + + await Assert.ThrowsAsync(async () => await testTask); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => Task.FromException(new Exception()), testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, ex => new InvalidOperationException(), CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + + public class ForCancellationTokenExceptionToTNextOnFaulted + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, ex => 100, CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultToASuccessfulValue() + { + int expectedValue = 10; + int actualValue = await Task.FromException(new ArgumentException()) + .Then(TestFunc, ex => expectedValue, CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => Task.FromException(new Exception()), testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, ex => string.Empty, CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + + public class ForCancellationTokenExceptionToTaskTNextOnFaulted + { + [Fact] + public async void ItShouldTransitionAFulfilledTask() + { + int expectedValue = 5; + int actualValue = await Task.FromResult("12345") + .Then(TestFunc, ex => Task.FromResult(100), CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldTransitionAFaultToASuccessfulValue() + { + int expectedValue = 10; + int actualValue = await Task.FromException(new ArgumentException()) + .Then(TestFunc, ex => Task.FromResult(expectedValue), CancellationToken.None); + + Assert.Equal(expectedValue, actualValue); + } + + [Fact] + public async void ItShouldCaptureTaskCancellation() + { + HttpClient testHttpClient = new MockHttpBuilder() + .WithHandler(messageCaseBuilder => messageCaseBuilder.AcceptAll() + .RespondWith((responseBuilder, _) => responseBuilder.WithStatusCode(HttpStatusCode.OK)) + ) + .BuildHttpClient(); + + CancellationTokenSource testTokenSource = new(); + testTokenSource.Cancel(); + + Task testTask = Task.Run(() => Task.FromException(new Exception()), testTokenSource.Token) + .Then(testHttpClient.GetStringAsync, ex => Task.FromResult(string.Empty), CancellationToken.None) + .Then(_ => Guid.NewGuid().ToString()); + + await Task.Delay(5); + + Assert.True(testTask.IsFaulted); + } + } + } +} From b02d22953e3c3ab7fef94c56a52c2704c0445212 Mon Sep 17 00:00:00 2001 From: doomchild Date: Thu, 25 Jul 2024 14:38:51 -0500 Subject: [PATCH 3/4] Added TaskExtras.Partition --- src/TaskExtras.cs | 33 ++++++++++++++++++++++++++ tests/unit/TaskExtrasPartitionTests.cs | 32 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 tests/unit/TaskExtrasPartitionTests.cs diff --git a/src/TaskExtras.cs b/src/TaskExtras.cs index 5fbe4fb..d406080 100644 --- a/src/TaskExtras.cs +++ b/src/TaskExtras.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace RLC.TaskChaining; @@ -187,6 +189,37 @@ private static Task DoRetry( )); } + /// + /// Partitions a collection of into faulted and fulfilled lists. + /// + /// The underlying type of the tasks in . + /// The collection of tasks to partition. + /// A tuple of the partitioned tasks. + public static Task<(IEnumerable> Faulted, IEnumerable> Fulfilled)> Partition( + IEnumerable> tasks + ) + { + return tasks.Aggregate, Task<(IEnumerable> Faulted, IEnumerable> Fulfilled)>>( + Task.FromResult(((IEnumerable>)new List>(), (IEnumerable>)new List>())), + ZipTasksWith> Faulted, IEnumerable> Fulfilled), (IEnumerable> Faulted, IEnumerable> Fulfilled), Exception> + ( + (values, v) => (values.Faulted, values.Fulfilled.Append(Task.FromResult(v)).ToList()), + (values, v) => (values.Faulted.Append>(Task.FromException(v)).ToList(), values.Fulfilled) + ) + ); + } + + private static Func, Task, Task> ZipTasksWith( + Func f, + Func g + ) where TException : Exception + { + return (b, a) => a.Then( + valueA => b.Then(valueB => f(valueB, valueA)), + error => b.Then(valueB => g(valueB, (TException)error)) + ); + } + /// /// A function that performs retries of the if it fails. /// diff --git a/tests/unit/TaskExtrasPartitionTests.cs b/tests/unit/TaskExtrasPartitionTests.cs new file mode 100644 index 0000000..5a60c30 --- /dev/null +++ b/tests/unit/TaskExtrasPartitionTests.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using RLC.TaskChaining; +using Xunit; + +namespace RLC.TaskChainingTests; + +public class PartitionTests +{ + [Fact] + public async Task ItShouldPartition() + { + int expectedFulfills = 4; + int expectedFaults = 1; + List> tasks = new() + { + Task.FromResult("abc"), + Task.FromResult("def"), + Task.FromException(new InvalidOperationException()), + Task.FromResult("ghi"), + TaskExtras.Defer(() => Task.FromResult("jkl"), TimeSpan.FromSeconds(1)) + }; + + (IEnumerable> Faulted, IEnumerable> Fulfilled) partition = await TaskExtras.Partition(tasks); + + Assert.Equal(expectedFaults, partition.Faulted.Count()); + Assert.Equal(expectedFulfills, partition.Fulfilled.Count()); + } +} From 3f66b4554a5731021eeeaca26bd968589d247d94 Mon Sep 17 00:00:00 2001 From: doomchild Date: Thu, 25 Jul 2024 14:53:49 -0500 Subject: [PATCH 4/4] Updated package version to 2.17.0 --- project-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project-metadata.json b/project-metadata.json index 9ce81a1..c42f40f 100644 --- a/project-metadata.json +++ b/project-metadata.json @@ -2,7 +2,7 @@ "name": "task-chaining", "description": "Extension methods to System.Threading.Task to allow Promise-like chaining", "title": "TaskChaining", - "version": "2.16.1", + "version": "2.17.0", "ciEnvironment": { "variables": [ {