ngx-speculoos 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { convertToParamMap } from '@angular/router';
2
- import { map } from 'rxjs';
1
+ import { ActivatedRoute, ActivatedRouteSnapshot, convertToParamMap } from '@angular/router';
2
+ import { BehaviorSubject, map } from 'rxjs';
3
3
  /**
4
4
  * Creates a fake partial ActivatedRoute for tests.
5
5
  *
@@ -15,6 +15,7 @@ import { map } from 'rxjs';
15
15
  * `route.parent.snapshot` or `route.snapshot.parent`.
16
16
  *
17
17
  * @returns a partially populated, fake ActivatedRoute, depending on what you passed in
18
+ * @deprecated favor stubRoute, which creates an easier to use and more logical stub
18
19
  */
19
20
  export function fakeRoute(options) {
20
21
  const result = {
@@ -37,12 +38,14 @@ export function fakeRoute(options) {
37
38
  };
38
39
  for (let route = result; route; route = route.parent) {
39
40
  if (route.parent && route.parent.snapshot && !route.snapshot) {
41
+ // eslint-disable-next-line deprecation/deprecation
40
42
  route.snapshot = fakeSnapshot({});
41
43
  }
42
44
  if (route.parent && route.parent.snapshot && !route.snapshot.parent) {
43
45
  route.snapshot.parent = route.parent.snapshot;
44
46
  }
45
47
  if (route.snapshot && route.snapshot.parent && !route.parent) {
48
+ // eslint-disable-next-line deprecation/deprecation
46
49
  route.parent = fakeRoute({});
47
50
  }
48
51
  if (route.snapshot && route.snapshot.parent && route.parent && !route.parent.snapshot) {
@@ -58,6 +61,7 @@ export function fakeRoute(options) {
58
61
  * The same goes for queryParams and queryParamMap.
59
62
  *
60
63
  * @returns a partially populated, fake ActivatedRoute, depending on what you passed in
64
+ * @deprecated favor stubRoute, which creates an easier to use and more logical stub for both the route and its snapshot
61
65
  */
62
66
  export function fakeSnapshot(options) {
63
67
  return {
@@ -78,4 +82,225 @@ export function fakeSnapshot(options) {
78
82
  pathFromRoot: options.pathFromRoot
79
83
  };
80
84
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxpQkFBaUIsRUFBbUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3SCxPQUFPLEVBQWMsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3ZDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0E0QnpCO0lBQ0MsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekYsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtLQUNqQixDQUFDO0lBRXBCLEtBQUssSUFBSSxLQUFLLEdBQTBCLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDM0UsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM1RCxLQUFLLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2xFLEtBQUssQ0FBQyxRQUF3RixDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztTQUNoSTtRQUVELElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDM0QsS0FBcUUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQy9GO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNyRixLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUMvQztLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE9BMEI1QjtJQUNDLE9BQU87UUFDTCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0QsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDNUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO0tBQ1QsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGNvbnZlcnRUb1BhcmFtTWFwLCBEYXRhLCBQYXJhbXMsIFJvdXRlLCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHBhcnRpYWwgQWN0aXZhdGVkUm91dGUgZm9yIHRlc3RzLlxuICpcbiAqIElmIHlvdSBwYXNzIHBhcmFtcywgdGhlbiB0aGUgY3JlYXRlZCByb3V0ZSdzIHBhcmFtTWFwIHdpbGwgY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMuXG4gKiBUaGUgc2FtZSBnb2VzIGZvciBxdWVyeVBhcmFtcyBhbmQgcXVlcnlQYXJhbU1hcC5cbiAqXG4gKiBJZiB5b3UgcGFzcyBhIHBhcmVudCByb3V0ZSBhbmQgYSBzbmFwc2hvdCwgYW5kIHRoZSBwYXNzZWQgc25hcHNob3QgZG9lc24ndCBoYXZlIGEgcGFyZW50LCB0aGVuIHRoZSBzbmFwc2hvdCdzXG4gKiBwYXJlbnQgd2lsbCBiZSBzZXQgdG8gdGhlIHBhcmVudCByb3V0ZSBzbmFwc2hvdC4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdW5kZXIgdGVzdCB0byB1c2VcbiAqIGByb3V0ZS5wYXJlbnQuc25hcHNob3RgIG9yIGByb3V0ZS5zbmFwc2hvdC5wYXJlbnRgLlxuICpcbiAqIElmIHlvdSBwYXNzIGEgc25hcHNob3Qgd2l0aCBhIHBhcmVudCwgYnV0IGRvbid0IHBhc3MgYSBwYXJlbnQgb3IgcGFzcyBhIHBhcmVudCB3aXRob3V0IHNuYXBzaG90LCB0aGVuIHRoZSByb3V0ZSdzXG4gKiBwYXJlbnQgc25hcHNob3Qgd2lsbCBiZSBzZXQgdG8gdGhlIGdpdmVuIHNuYXBzaG90J3MgcGFyZW50LiBUaGlzIGFsbG93cyB0aGUgY29kZSB1bmRlciB0ZXN0IHRvIHVzZVxuICogYHJvdXRlLnBhcmVudC5zbmFwc2hvdGAgb3IgYHJvdXRlLnNuYXBzaG90LnBhcmVudGAuXG4gKlxuICogQHJldHVybnMgYSBwYXJ0aWFsbHkgcG9wdWxhdGVkLCBmYWtlIEFjdGl2YXRlZFJvdXRlLCBkZXBlbmRpbmcgb24gd2hhdCB5b3UgcGFzc2VkIGluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWtlUm91dGUob3B0aW9uczoge1xuICB1cmw/OiBPYnNlcnZhYmxlPFVybFNlZ21lbnRbXT47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBtYXRyaXggcGFyYW1ldGVycyBzY29wZWQgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXJhbXM/OiBPYnNlcnZhYmxlPFBhcmFtcz47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIHNoYXJlZCBieSBhbGwgdGhlIHJvdXRlcyAqL1xuICBxdWVyeVBhcmFtcz86IE9ic2VydmFibGU8UGFyYW1zPjtcbiAgLyoqIEFuIG9ic2VydmFibGUgb2YgdGhlIFVSTCBmcmFnbWVudCBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgZnJhZ21lbnQ/OiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBzdGF0aWMgYW5kIHJlc29sdmVkIGRhdGEgb2YgdGhpcyByb3V0ZS4gKi9cbiAgZGF0YT86IE9ic2VydmFibGU8RGF0YT47XG4gIC8qKiBUaGUgb3V0bGV0IG5hbWUgb2YgdGhlIHJvdXRlLiBJdCdzIGEgY29uc3RhbnQgKi9cbiAgb3V0bGV0Pzogc3RyaW5nO1xuICAvKiogVGhlIGNvbXBvbmVudCBvZiB0aGUgcm91dGUuIEl0J3MgYSBjb25zdGFudCAqL1xuICBjb21wb25lbnQ/OiBUeXBlPHVua25vd24+IHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHNuYXBzaG90IG9mIHRoaXMgcm91dGUgKi9cbiAgc25hcHNob3Q/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBtYXRjaCB0aGlzIHJvdXRlICovXG4gIHJvdXRlQ29uZmlnPzogUm91dGUgfCBudWxsO1xuICAvKiogVGhlIHJvb3Qgb2YgdGhlIHJvdXRlciBzdGF0ZSAqL1xuICByb290PzogQWN0aXZhdGVkUm91dGU7XG4gIC8qKiBUaGUgcGFyZW50IG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlICovXG4gIHBhcmVudD86IEFjdGl2YXRlZFJvdXRlIHwgbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGU7XG4gIC8qKiBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgY2hpbGRyZW4/OiBBY3RpdmF0ZWRSb3V0ZVtdO1xuICAvKiogVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXRoRnJvbVJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZVtdO1xufSk6IEFjdGl2YXRlZFJvdXRlIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICBwYXJhbU1hcDogb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXMucGlwZShtYXAocGFyYW1zID0+IGNvbnZlcnRUb1BhcmFtTWFwKHBhcmFtcykpKSxcbiAgICBxdWVyeVBhcmFtczogb3B0aW9ucy5xdWVyeVBhcmFtcyxcbiAgICBxdWVyeVBhcmFtTWFwOiBvcHRpb25zLnF1ZXJ5UGFyYW1zICYmIG9wdGlvbnMucXVlcnlQYXJhbXMucGlwZShtYXAocGFyYW1zID0+IGNvbnZlcnRUb1BhcmFtTWFwKHBhcmFtcykpKSxcbiAgICBmcmFnbWVudDogb3B0aW9ucy5mcmFnbWVudCxcbiAgICBkYXRhOiBvcHRpb25zLmRhdGEsXG4gICAgb3V0bGV0OiBvcHRpb25zLm91dGxldCxcbiAgICBjb21wb25lbnQ6IG9wdGlvbnMuY29tcG9uZW50LFxuICAgIHNuYXBzaG90OiBvcHRpb25zLnNuYXBzaG90LFxuICAgIHJvdXRlQ29uZmlnOiBvcHRpb25zLnJvdXRlQ29uZmlnLFxuICAgIHJvb3Q6IG9wdGlvbnMucm9vdCxcbiAgICBwYXJlbnQ6IG9wdGlvbnMucGFyZW50LFxuICAgIGZpcnN0Q2hpbGQ6IG9wdGlvbnMuZmlyc3RDaGlsZCxcbiAgICBjaGlsZHJlbjogb3B0aW9ucy5jaGlsZHJlbixcbiAgICBwYXRoRnJvbVJvb3Q6IG9wdGlvbnMucGF0aEZyb21Sb290XG4gIH0gYXMgQWN0aXZhdGVkUm91dGU7XG5cbiAgZm9yIChsZXQgcm91dGU6IG51bGwgfCBBY3RpdmF0ZWRSb3V0ZSA9IHJlc3VsdDsgcm91dGU7IHJvdXRlID0gcm91dGUucGFyZW50KSB7XG4gICAgaWYgKHJvdXRlLnBhcmVudCAmJiByb3V0ZS5wYXJlbnQuc25hcHNob3QgJiYgIXJvdXRlLnNuYXBzaG90KSB7XG4gICAgICByb3V0ZS5zbmFwc2hvdCA9IGZha2VTbmFwc2hvdCh7fSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5wYXJlbnQgJiYgcm91dGUucGFyZW50LnNuYXBzaG90ICYmICFyb3V0ZS5zbmFwc2hvdC5wYXJlbnQpIHtcbiAgICAgIChyb3V0ZS5zbmFwc2hvdCBhcyBPbWl0PEFjdGl2YXRlZFJvdXRlU25hcHNob3QsICdwYXJlbnQnPiAmIHsgcGFyZW50OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0pLnBhcmVudCA9IHJvdXRlLnBhcmVudC5zbmFwc2hvdDtcbiAgICB9XG5cbiAgICBpZiAocm91dGUuc25hcHNob3QgJiYgcm91dGUuc25hcHNob3QucGFyZW50ICYmICFyb3V0ZS5wYXJlbnQpIHtcbiAgICAgIChyb3V0ZSBhcyBPbWl0PEFjdGl2YXRlZFJvdXRlLCAncGFyZW50Jz4gJiB7IHBhcmVudDogQWN0aXZhdGVkUm91dGUgfSkucGFyZW50ID0gZmFrZVJvdXRlKHt9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLnNuYXBzaG90ICYmIHJvdXRlLnNuYXBzaG90LnBhcmVudCAmJiByb3V0ZS5wYXJlbnQgJiYgIXJvdXRlLnBhcmVudC5zbmFwc2hvdCkge1xuICAgICAgcm91dGUucGFyZW50LnNuYXBzaG90ID0gcm91dGUuc25hcHNob3QucGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgcGFydGlhbCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IGZvciB0ZXN0cy5cbiAqXG4gKiBJZiB5b3UgcGFzcyBwYXJhbXMsIHRoZW4gdGhlIGNyZWF0ZWQgc25hcHNob3QncyBwYXJhbU1hcCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLlxuICogVGhlIHNhbWUgZ29lcyBmb3IgcXVlcnlQYXJhbXMgYW5kIHF1ZXJ5UGFyYW1NYXAuXG4gKlxuICogQHJldHVybnMgYSBwYXJ0aWFsbHkgcG9wdWxhdGVkLCBmYWtlIEFjdGl2YXRlZFJvdXRlLCBkZXBlbmRpbmcgb24gd2hhdCB5b3UgcGFzc2VkIGluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWtlU25hcHNob3Qob3B0aW9uczoge1xuICB1cmw/OiBVcmxTZWdtZW50W107XG4gIC8qKiBUaGUgbWF0cml4IHBhcmFtZXRlcnMgc2NvcGVkIHRvIHRoaXMgcm91dGUgKi9cbiAgcGFyYW1zPzogUGFyYW1zO1xuICAvKiogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgc2hhcmVkIGJ5IGFsbCB0aGUgcm91dGVzICovXG4gIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAvKiogVGhlIFVSTCBmcmFnbWVudCBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgZnJhZ21lbnQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3RhdGljIGFuZCByZXNvbHZlZCBkYXRhIG9mIHRoaXMgcm91dGUgKi9cbiAgZGF0YT86IERhdGE7XG4gIC8qKiBUaGUgb3V0bGV0IG5hbWUgb2YgdGhlIHJvdXRlICovXG4gIG91dGxldD86IHN0cmluZztcbiAgLyoqIFRoZSBjb21wb25lbnQgb2YgdGhlIHJvdXRlICovXG4gIGNvbXBvbmVudD86IFR5cGU8dW5rbm93bj4gfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBtYXRjaCB0aGlzIHJvdXRlICovXG4gIHJvdXRlQ29uZmlnPzogUm91dGU7XG4gIC8qKiBUaGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlICovXG4gIHJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICAvKiogVGhlIHBhcmVudCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBwYXJlbnQ/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGw7XG4gIC8qKiBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgY2hpbGRyZW4/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90W107XG4gIC8qKiBUaGUgcGF0aCBmcm9tIHRoZSByb290IG9mIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSB0byB0aGlzIHJvdXRlICovXG4gIHBhdGhGcm9tUm9vdD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3RbXTtcbn0pOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcmV0dXJuIHtcbiAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgcGFyYW1NYXA6IG9wdGlvbnMucGFyYW1zICYmIGNvbnZlcnRUb1BhcmFtTWFwKG9wdGlvbnMucGFyYW1zKSxcbiAgICBxdWVyeVBhcmFtczogb3B0aW9ucy5xdWVyeVBhcmFtcyxcbiAgICBxdWVyeVBhcmFtTWFwOiBvcHRpb25zLnF1ZXJ5UGFyYW1zICYmIGNvbnZlcnRUb1BhcmFtTWFwKG9wdGlvbnMucXVlcnlQYXJhbXMpLFxuICAgIGZyYWdtZW50OiBvcHRpb25zLmZyYWdtZW50LFxuICAgIGRhdGE6IG9wdGlvbnMuZGF0YSxcbiAgICBvdXRsZXQ6IG9wdGlvbnMub3V0bGV0LFxuICAgIGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsXG4gICAgcm91dGVDb25maWc6IG9wdGlvbnMucm91dGVDb25maWcsXG4gICAgcm9vdDogb3B0aW9ucy5yb290LFxuICAgIHBhcmVudDogb3B0aW9ucy5wYXJlbnQsXG4gICAgZmlyc3RDaGlsZDogb3B0aW9ucy5maXJzdENoaWxkLFxuICAgIGNoaWxkcmVuOiBvcHRpb25zLmNoaWxkcmVuLFxuICAgIHBhdGhGcm9tUm9vdDogb3B0aW9ucy5wYXRoRnJvbVJvb3RcbiAgfSBhcyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xufVxuIl19
85
+ class ActivatedRouteSnapshotStub extends ActivatedRouteSnapshot {
86
+ constructor() {
87
+ super();
88
+ this._parent = null;
89
+ this._firstChild = null;
90
+ this._children = [];
91
+ this._pathFromRoot = [];
92
+ this._root = this;
93
+ }
94
+ get parent() {
95
+ return this._parent;
96
+ }
97
+ set parent(value) {
98
+ this._parent = value;
99
+ }
100
+ get root() {
101
+ return this._root;
102
+ }
103
+ set root(value) {
104
+ this._root = value;
105
+ }
106
+ get firstChild() {
107
+ return this._firstChild;
108
+ }
109
+ set firstChild(value) {
110
+ this._firstChild = value;
111
+ }
112
+ get children() {
113
+ return this._children;
114
+ }
115
+ set children(value) {
116
+ this._children = value;
117
+ }
118
+ get pathFromRoot() {
119
+ return this._pathFromRoot;
120
+ }
121
+ set pathFromRoot(value) {
122
+ this._pathFromRoot = value;
123
+ }
124
+ }
125
+ /**
126
+ * A stub for ActivatedRoute. It behaves almost the same way as the actual ActivatedRoute, exposing a snapshot
127
+ * and observables for the params, query params etc., which are kept in sync.
128
+ *
129
+ * In addition, this stub allows simulating a navigation by changing the params, the query params, the fragment, etc.
130
+ * When that happens, the snapshot is modified, then the relevant observables emit the new values.
131
+ *
132
+ * There are some things that don't really work the same way as the real ActivatedRoute though:
133
+ * - the handling of the firstChild and of the children is entirely under the tester's responsibility. Setting the parent
134
+ * of a route stub does not add this route to the children of its parent, for example.
135
+ * - when changing the params, query params, fragment, etc., their associated observable emits unconditionally, instead of
136
+ * first checking if the value is actually different from before. It's thus the responsibility of the tester to not
137
+ * change the values if they're the same as before.
138
+ */
139
+ export class ActivatedRouteStub extends ActivatedRoute {
140
+ /**
141
+ * Constructs a new instance, based on the given options.
142
+ * If an option is not provided (or if no option is provided at all), then the route has a default value for this option
143
+ * (empty parameters for example, null fragment, etc.)
144
+ * If no parent is passed, then this route has no parent and is thus set as the root. Otherwise, the root and the path
145
+ * from root are created based on the root and path from root of the given parent route.
146
+ */
147
+ constructor(options) {
148
+ super();
149
+ const snapshot = new ActivatedRouteSnapshotStub();
150
+ this.snapshot = snapshot;
151
+ this._firstChild = options?.firstChild ?? null;
152
+ this._children = options?.children ?? [];
153
+ this._parent = options?.parent ?? null;
154
+ this._root = this.parent?.root ?? this;
155
+ this._pathFromRoot = this.parent ? [...this.parent.pathFromRoot, this] : [this];
156
+ snapshot.params = options?.params ?? {};
157
+ snapshot.queryParams = options?.queryParams ?? {};
158
+ snapshot.data = options?.data ?? {};
159
+ snapshot.fragment = options?.fragment ?? null;
160
+ snapshot.url = options?.url ?? [];
161
+ snapshot.firstChild = this.firstChild?.snapshot ?? null;
162
+ snapshot.children = this.children?.map(route => route.snapshot) ?? [];
163
+ snapshot.parent = this.parent?.snapshot ?? null;
164
+ snapshot.root = this.root.snapshot;
165
+ snapshot.pathFromRoot = this.pathFromRoot.map(route => route.snapshot);
166
+ this.paramsSubject = new BehaviorSubject(this.snapshot.params);
167
+ this.queryParamsSubject = new BehaviorSubject(this.snapshot.queryParams);
168
+ this.dataSubject = new BehaviorSubject(this.snapshot.data);
169
+ this.fragmentSubject = new BehaviorSubject(this.snapshot.fragment);
170
+ this.urlSubject = new BehaviorSubject(this.snapshot.url);
171
+ this.params = this.paramsSubject.asObservable();
172
+ this.queryParams = this.queryParamsSubject.asObservable();
173
+ this.data = this.dataSubject.asObservable();
174
+ this.fragment = this.fragmentSubject.asObservable();
175
+ this.url = this.urlSubject.asObservable();
176
+ }
177
+ get root() {
178
+ return this._root;
179
+ }
180
+ get parent() {
181
+ return this._parent;
182
+ }
183
+ get pathFromRoot() {
184
+ return this._pathFromRoot;
185
+ }
186
+ get firstChild() {
187
+ return this._firstChild;
188
+ }
189
+ get children() {
190
+ return this._children;
191
+ }
192
+ /**
193
+ * Triggers a navigation with the given new parameters. All the other parts (query params etc.) stay as the are.
194
+ * This is a shortcut to `triggerNavigation` that can be used to only change the parameters.
195
+ */
196
+ setParams(params) {
197
+ this.triggerNavigation({ params });
198
+ }
199
+ /**
200
+ * Triggers a navigation with the given new parameter. The other parameters, as well as all the other parts (query params etc.)
201
+ * stay as the are.
202
+ * This is a shortcut to `triggerNavigation` that can be used to only change one parameter.
203
+ */
204
+ setParam(name, value) {
205
+ this.setParams({ ...this.snapshot.params, [name]: value });
206
+ }
207
+ /**
208
+ * Triggers a navigation with the given new query parameters. All the other parts (params etc.) stay as the are.
209
+ * This is a shortcut to `triggerNavigation` that can be used to only change the query parameters.
210
+ */
211
+ setQueryParams(queryParams) {
212
+ this.triggerNavigation({ queryParams });
213
+ }
214
+ /**
215
+ * Triggers a navigation with the given new parameter. The other query parameters, as well as all the other parts (params etc.)
216
+ * stay as the are.
217
+ * This is a shortcut to `triggerNavigation` that can be used to only change one query parameter.
218
+ */
219
+ setQueryParam(name, value) {
220
+ this.setQueryParams({ ...this.snapshot.queryParams, [name]: value });
221
+ }
222
+ /**
223
+ * Triggers a navigation with the given new data. The other parameters, as well as all the other parts (params etc.)
224
+ * stay as the are.
225
+ * This is a shortcut to `triggerNavigation` that can be used to only change the data.
226
+ */
227
+ setData(data) {
228
+ this.triggerNavigation({ data });
229
+ }
230
+ /**
231
+ * Triggers a navigation with the given new data item. The other data, as well as all the other parts (params etc.)
232
+ * stay as the are.
233
+ * This is a shortcut to `triggerNavigation` that can be used to only change one data item.
234
+ */
235
+ setDataItem(name, value) {
236
+ this.setData({ ...this.snapshot.data, [name]: value });
237
+ }
238
+ /**
239
+ * Triggers a navigation with the given new fragment. The other parts (params etc.) stay as the are.
240
+ * This is a shortcut to `triggerNavigation` that can be used to only change the fragment.
241
+ */
242
+ setFragment(fragment) {
243
+ this.triggerNavigation({ fragment });
244
+ }
245
+ /**
246
+ * Triggers a navigation with the given new url. The other parts (params etc.) stay as the are.
247
+ * This is a shortcut to `triggerNavigation` that can be used to only change the url.
248
+ */
249
+ setUrl(url) {
250
+ this.triggerNavigation({ url });
251
+ }
252
+ /**
253
+ * Triggers a navigation based on the given options. If an option is undefined or null, it's ignored. Except for fragment, which is only
254
+ * ignored if it's undefined, because null is a valid value for a fragment.
255
+ *
256
+ * The non-ignored values are used to change the snapshot of the route. Once the snapshot has been modified,
257
+ * the observables corresponding to the updated parts emit the new value.
258
+ *
259
+ * So, setting params and query params will make the params and queryParams observables emit, but not the fragment, data and
260
+ * url observables for example. This is consistent to how the router behaves.
261
+ */
262
+ triggerNavigation(options) {
263
+ // set the snapshot first
264
+ if (options.params) {
265
+ this.snapshot.params = options.params;
266
+ }
267
+ if (options.queryParams) {
268
+ this.snapshot.queryParams = options.queryParams;
269
+ }
270
+ if (options.fragment !== undefined) {
271
+ this.snapshot.fragment = options.fragment;
272
+ }
273
+ if (options.data) {
274
+ this.snapshot.data = options.data;
275
+ }
276
+ if (options.url) {
277
+ this.snapshot.url = options.url;
278
+ }
279
+ // then emit everything that has changed
280
+ if (options.params) {
281
+ this.paramsSubject.next(this.snapshot.params);
282
+ }
283
+ if (options.queryParams) {
284
+ this.queryParamsSubject.next(this.snapshot.queryParams);
285
+ }
286
+ if (options.fragment !== undefined) {
287
+ this.fragmentSubject.next(this.snapshot.fragment);
288
+ }
289
+ if (options.data) {
290
+ this.dataSubject.next(this.snapshot.data);
291
+ }
292
+ if (options.url) {
293
+ this.urlSubject.next(this.snapshot.url);
294
+ }
295
+ }
296
+ toString() {
297
+ return 'ActivatedRouteStub';
298
+ }
299
+ }
300
+ /**
301
+ * Creates a new ActivatedRouteStub, by calling its constructor.
302
+ */
303
+ export function stubRoute(options) {
304
+ return new ActivatedRouteStub(options);
305
+ }
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBbUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3SCxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUd4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0E0QnpCO0lBQ0MsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekYsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FB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QUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6RDtRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBbUM7SUFDM0QsT0FBTyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY29udmVydFRvUGFyYW1NYXAsIERhdGEsIFBhcmFtcywgUm91dGUsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZmFrZSBwYXJ0aWFsIEFjdGl2YXRlZFJvdXRlIGZvciB0ZXN0cy5cbiAqXG4gKiBJZiB5b3UgcGFzcyBwYXJhbXMsIHRoZW4gdGhlIGNyZWF0ZWQgcm91dGUncyBwYXJhbU1hcCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLlxuICogVGhlIHNhbWUgZ29lcyBmb3IgcXVlcnlQYXJhbXMgYW5kIHF1ZXJ5UGFyYW1NYXAuXG4gKlxuICogSWYgeW91IHBhc3MgYSBwYXJlbnQgcm91dGUgYW5kIGEgc25hcHNob3QsIGFuZCB0aGUgcGFzc2VkIHNuYXBzaG90IGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgdGhlbiB0aGUgc25hcHNob3Qnc1xuICogcGFyZW50IHdpbGwgYmUgc2V0IHRvIHRoZSBwYXJlbnQgcm91dGUgc25hcHNob3QuIFRoaXMgYWxsb3dzIHRoZSBjb2RlIHVuZGVyIHRlc3QgdG8gdXNlXG4gKiBgcm91dGUucGFyZW50LnNuYXBzaG90YCBvciBgcm91dGUuc25hcHNob3QucGFyZW50YC5cbiAqXG4gKiBJZiB5b3UgcGFzcyBhIHNuYXBzaG90IHdpdGggYSBwYXJlbnQsIGJ1dCBkb24ndCBwYXNzIGEgcGFyZW50IG9yIHBhc3MgYSBwYXJlbnQgd2l0aG91dCBzbmFwc2hvdCwgdGhlbiB0aGUgcm91dGUnc1xuICogcGFyZW50IHNuYXBzaG90IHdpbGwgYmUgc2V0IHRvIHRoZSBnaXZlbiBzbmFwc2hvdCdzIHBhcmVudC4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdW5kZXIgdGVzdCB0byB1c2VcbiAqIGByb3V0ZS5wYXJlbnQuc25hcHNob3RgIG9yIGByb3V0ZS5zbmFwc2hvdC5wYXJlbnRgLlxuICpcbiAqIEByZXR1cm5zIGEgcGFydGlhbGx5IHBvcHVsYXRlZCwgZmFrZSBBY3RpdmF0ZWRSb3V0ZSwgZGVwZW5kaW5nIG9uIHdoYXQgeW91IHBhc3NlZCBpblxuICogQGRlcHJlY2F0ZWQgZmF2b3Igc3R1YlJvdXRlLCB3aGljaCBjcmVhdGVzIGFuIGVhc2llciB0byB1c2UgYW5kIG1vcmUgbG9naWNhbCBzdHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWtlUm91dGUob3B0aW9uczoge1xuICB1cmw/OiBPYnNlcnZhYmxlPFVybFNlZ21lbnRbXT47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBtYXRyaXggcGFyYW1ldGVycyBzY29wZWQgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXJhbXM/OiBPYnNlcnZhYmxlPFBhcmFtcz47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIHNoYXJlZCBieSBhbGwgdGhlIHJvdXRlcyAqL1xuICBxdWVyeVBhcmFtcz86IE9ic2VydmFibGU8UGFyYW1zPjtcbiAgLyoqIEFuIG9ic2VydmFibGUgb2YgdGhlIFVSTCBmcmFnbWVudCBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgZnJhZ21lbnQ/OiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBzdGF0aWMgYW5kIHJlc29sdmVkIGRhdGEgb2YgdGhpcyByb3V0ZS4gKi9cbiAgZGF0YT86IE9ic2VydmFibGU8RGF0YT47XG4gIC8qKiBUaGUgb3V0bGV0IG5hbWUgb2YgdGhlIHJvdXRlLiBJdCdzIGEgY29uc3RhbnQgKi9cbiAgb3V0bGV0Pzogc3RyaW5nO1xuICAvKiogVGhlIGNvbXBvbmVudCBvZiB0aGUgcm91dGUuIEl0J3MgYSBjb25zdGFudCAqL1xuICBjb21wb25lbnQ/OiBUeXBlPHVua25vd24+IHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHNuYXBzaG90IG9mIHRoaXMgcm91dGUgKi9cbiAgc25hcHNob3Q/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBtYXRjaCB0aGlzIHJvdXRlICovXG4gIHJvdXRlQ29uZmlnPzogUm91dGUgfCBudWxsO1xuICAvKiogVGhlIHJvb3Qgb2YgdGhlIHJvdXRlciBzdGF0ZSAqL1xuICByb290PzogQWN0aXZhdGVkUm91dGU7XG4gIC8qKiBUaGUgcGFyZW50IG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlICovXG4gIHBhcmVudD86IEFjdGl2YXRlZFJvdXRlIHwgbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGU7XG4gIC8qKiBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgY2hpbGRyZW4/OiBBY3RpdmF0ZWRSb3V0ZVtdO1xuICAvKiogVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXRoRnJvbVJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZVtdO1xufSk6IEFjdGl2YXRlZFJvdXRlIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICBwYXJhbU1hcDogb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXMucGlwZShtYXAocGFyYW1zID0+IGNvbnZlcnRUb1BhcmFtTWFwKHBhcmFtcykpKSxcbiAgICBxdWVyeVBhcmFtczogb3B0aW9ucy5xdWVyeVBhcmFtcyxcbiAgICBxdWVyeVBhcmFtTWFwOiBvcHRpb25zLnF1ZXJ5UGFyYW1zICYmIG9wdGlvbnMucXVlcnlQYXJhbXMucGlwZShtYXAocGFyYW1zID0+IGNvbnZlcnRUb1BhcmFtTWFwKHBhcmFtcykpKSxcbiAgICBmcmFnbWVudDogb3B0aW9ucy5mcmFnbWVudCxcbiAgICBkYXRhOiBvcHRpb25zLmRhdGEsXG4gICAgb3V0bGV0OiBvcHRpb25zLm91dGxldCxcbiAgICBjb21wb25lbnQ6IG9wdGlvbnMuY29tcG9uZW50LFxuICAgIHNuYXBzaG90OiBvcHRpb25zLnNuYXBzaG90LFxuICAgIHJvdXRlQ29uZmlnOiBvcHRpb25zLnJvdXRlQ29uZmlnLFxuICAgIHJvb3Q6IG9wdGlvbnMucm9vdCxcbiAgICBwYXJlbnQ6IG9wdGlvbnMucGFyZW50LFxuICAgIGZpcnN0Q2hpbGQ6IG9wdGlvbnMuZmlyc3RDaGlsZCxcbiAgICBjaGlsZHJlbjogb3B0aW9ucy5jaGlsZHJlbixcbiAgICBwYXRoRnJvbVJvb3Q6IG9wdGlvbnMucGF0aEZyb21Sb290XG4gIH0gYXMgQWN0aXZhdGVkUm91dGU7XG5cbiAgZm9yIChsZXQgcm91dGU6IG51bGwgfCBBY3RpdmF0ZWRSb3V0ZSA9IHJlc3VsdDsgcm91dGU7IHJvdXRlID0gcm91dGUucGFyZW50KSB7XG4gICAgaWYgKHJvdXRlLnBhcmVudCAmJiByb3V0ZS5wYXJlbnQuc25hcHNob3QgJiYgIXJvdXRlLnNuYXBzaG90KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgIHJvdXRlLnNuYXBzaG90ID0gZmFrZVNuYXBzaG90KHt9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLnBhcmVudCAmJiByb3V0ZS5wYXJlbnQuc25hcHNob3QgJiYgIXJvdXRlLnNuYXBzaG90LnBhcmVudCkge1xuICAgICAgKHJvdXRlLnNuYXBzaG90IGFzIE9taXQ8QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgJ3BhcmVudCc+ICYgeyBwYXJlbnQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSkucGFyZW50ID0gcm91dGUucGFyZW50LnNuYXBzaG90O1xuICAgIH1cblxuICAgIGlmIChyb3V0ZS5zbmFwc2hvdCAmJiByb3V0ZS5zbmFwc2hvdC5wYXJlbnQgJiYgIXJvdXRlLnBhcmVudCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAocm91dGUgYXMgT21pdDxBY3RpdmF0ZWRSb3V0ZSwgJ3BhcmVudCc+ICYgeyBwYXJlbnQ6IEFjdGl2YXRlZFJvdXRlIH0pLnBhcmVudCA9IGZha2VSb3V0ZSh7fSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5zbmFwc2hvdCAmJiByb3V0ZS5zbmFwc2hvdC5wYXJlbnQgJiYgcm91dGUucGFyZW50ICYmICFyb3V0ZS5wYXJlbnQuc25hcHNob3QpIHtcbiAgICAgIHJvdXRlLnBhcmVudC5zbmFwc2hvdCA9IHJvdXRlLnNuYXBzaG90LnBhcmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHBhcnRpYWwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCBmb3IgdGVzdHMuXG4gKlxuICogSWYgeW91IHBhc3MgcGFyYW1zLCB0aGVuIHRoZSBjcmVhdGVkIHNuYXBzaG90J3MgcGFyYW1NYXAgd2lsbCBjb250YWluIHRoZSBzYW1lIHZhbHVlcy5cbiAqIFRoZSBzYW1lIGdvZXMgZm9yIHF1ZXJ5UGFyYW1zIGFuZCBxdWVyeVBhcmFtTWFwLlxuICpcbiAqIEByZXR1cm5zIGEgcGFydGlhbGx5IHBvcHVsYXRlZCwgZmFrZSBBY3RpdmF0ZWRSb3V0ZSwgZGVwZW5kaW5nIG9uIHdoYXQgeW91IHBhc3NlZCBpblxuICogQGRlcHJlY2F0ZWQgZmF2b3Igc3R1YlJvdXRlLCB3aGljaCBjcmVhdGVzIGFuIGVhc2llciB0byB1c2UgYW5kIG1vcmUgbG9naWNhbCBzdHViIGZvciBib3RoIHRoZSByb3V0ZSBhbmQgaXRzIHNuYXBzaG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWtlU25hcHNob3Qob3B0aW9uczoge1xuICB1cmw/OiBVcmxTZWdtZW50W107XG4gIC8qKiBUaGUgbWF0cml4IHBhcmFtZXRlcnMgc2NvcGVkIHRvIHRoaXMgcm91dGUgKi9cbiAgcGFyYW1zPzogUGFyYW1zO1xuICAvKiogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgc2hhcmVkIGJ5IGFsbCB0aGUgcm91dGVzICovXG4gIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAvKiogVGhlIFVSTCBmcmFnbWVudCBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgZnJhZ21lbnQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3RhdGljIGFuZCByZXNvbHZlZCBkYXRhIG9mIHRoaXMgcm91dGUgKi9cbiAgZGF0YT86IERhdGE7XG4gIC8qKiBUaGUgb3V0bGV0IG5hbWUgb2YgdGhlIHJvdXRlICovXG4gIG91dGxldD86IHN0cmluZztcbiAgLyoqIFRoZSBjb21wb25lbnQgb2YgdGhlIHJvdXRlICovXG4gIGNvbXBvbmVudD86IFR5cGU8dW5rbm93bj4gfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBtYXRjaCB0aGlzIHJvdXRlICovXG4gIHJvdXRlQ29uZmlnPzogUm91dGU7XG4gIC8qKiBUaGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlICovXG4gIHJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICAvKiogVGhlIHBhcmVudCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBwYXJlbnQ/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGw7XG4gIC8qKiBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgY2hpbGRyZW4/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90W107XG4gIC8qKiBUaGUgcGF0aCBmcm9tIHRoZSByb290IG9mIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSB0byB0aGlzIHJvdXRlICovXG4gIHBhdGhGcm9tUm9vdD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3RbXTtcbn0pOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcmV0dXJuIHtcbiAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgcGFyYW1NYXA6IG9wdGlvbnMucGFyYW1zICYmIGNvbnZlcnRUb1BhcmFtTWFwKG9wdGlvbnMucGFyYW1zKSxcbiAgICBxdWVyeVBhcmFtczogb3B0aW9ucy5xdWVyeVBhcmFtcyxcbiAgICBxdWVyeVBhcmFtTWFwOiBvcHRpb25zLnF1ZXJ5UGFyYW1zICYmIGNvbnZlcnRUb1BhcmFtTWFwKG9wdGlvbnMucXVlcnlQYXJhbXMpLFxuICAgIGZyYWdtZW50OiBvcHRpb25zLmZyYWdtZW50LFxuICAgIGRhdGE6IG9wdGlvbnMuZGF0YSxcbiAgICBvdXRsZXQ6IG9wdGlvbnMub3V0bGV0LFxuICAgIGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsXG4gICAgcm91dGVDb25maWc6IG9wdGlvbnMucm91dGVDb25maWcsXG4gICAgcm9vdDogb3B0aW9ucy5yb290LFxuICAgIHBhcmVudDogb3B0aW9ucy5wYXJlbnQsXG4gICAgZmlyc3RDaGlsZDogb3B0aW9ucy5maXJzdENoaWxkLFxuICAgIGNoaWxkcmVuOiBvcHRpb25zLmNoaWxkcmVuLFxuICAgIHBhdGhGcm9tUm9vdDogb3B0aW9ucy5wYXRoRnJvbVJvb3RcbiAgfSBhcyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB3aGVuIGNyZWF0aW5nIGFuIEFjdGl2YXRlZFJvdXRlU3R1Yi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0ZWRSb3V0ZVN0dWJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcm91dGVcbiAgICovXG4gIHBhcmFtcz86IFBhcmFtcztcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgcXVlcnkgcGFyYW1ldGVycyBvZiB0aGUgcm91dGVcbiAgICovXG4gIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBkYXRhIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgZGF0YT86IERhdGE7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBmcmFnbWVudCBvZiB0aGUgcm91dGVcbiAgICovXG4gIGZyYWdtZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHVybCBvZiB0aGUgcm91dGVcbiAgICovXG4gIHVybD86IFVybFNlZ21lbnRbXTtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgb2YgdGhlIHJvdXRlXG4gICAqL1xuICBwYXJlbnQ/OiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGNoaWxkIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgZmlyc3RDaGlsZD86IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGRyZW4gb2YgdGhlIHJvdXRlXG4gICAqL1xuICBjaGlsZHJlbj86IEFjdGl2YXRlZFJvdXRlU3R1YltdIHwgbnVsbDtcbn1cblxuY2xhc3MgQWN0aXZhdGVkUm91dGVTbmFwc2hvdFN0dWIgZXh0ZW5kcyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcHJpdmF0ZSBfcGFyZW50OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3Jvb3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG4gIHByaXZhdGUgX2ZpcnN0Q2hpbGQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+ID0gW107XG4gIHByaXZhdGUgX3BhdGhGcm9tUm9vdDogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4gPSBbXTtcblxuICBnZXQgcGFyZW50KCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG5cbiAgc2V0IHBhcmVudCh2YWx1ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCByb290KCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG5cbiAgc2V0IHJvb3QodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICB0aGlzLl9yb290ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZmlyc3RDaGlsZCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBzZXQgZmlyc3RDaGlsZCh2YWx1ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwpIHtcbiAgICB0aGlzLl9maXJzdENoaWxkID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4ge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcbiAgfVxuXG4gIHNldCBjaGlsZHJlbih2YWx1ZTogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4pIHtcbiAgICB0aGlzLl9jaGlsZHJlbiA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHBhdGhGcm9tUm9vdCgpOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdGhGcm9tUm9vdDtcbiAgfVxuXG4gIHNldCBwYXRoRnJvbVJvb3QodmFsdWU6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+KSB7XG4gICAgdGhpcy5fcGF0aEZyb21Sb290ID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3Jvb3QgPSB0aGlzO1xuICB9XG59XG5cbi8qKlxuICogQSBzdHViIGZvciBBY3RpdmF0ZWRSb3V0ZS4gSXQgYmVoYXZlcyBhbG1vc3QgdGhlIHNhbWUgd2F5IGFzIHRoZSBhY3R1YWwgQWN0aXZhdGVkUm91dGUsIGV4cG9zaW5nIGEgc25hcHNob3RcbiAqIGFuZCBvYnNlcnZhYmxlcyBmb3IgdGhlIHBhcmFtcywgcXVlcnkgcGFyYW1zIGV0Yy4sIHdoaWNoIGFyZSBrZXB0IGluIHN5bmMuXG4gKlxuICogSW4gYWRkaXRpb24sIHRoaXMgc3R1YiBhbGxvd3Mgc2ltdWxhdGluZyBhIG5hdmlnYXRpb24gYnkgY2hhbmdpbmcgdGhlIHBhcmFtcywgdGhlIHF1ZXJ5IHBhcmFtcywgdGhlIGZyYWdtZW50LCBldGMuXG4gKiBXaGVuIHRoYXQgaGFwcGVucywgdGhlIHNuYXBzaG90IGlzIG1vZGlmaWVkLCB0aGVuIHRoZSByZWxldmFudCBvYnNlcnZhYmxlcyBlbWl0IHRoZSBuZXcgdmFsdWVzLlxuICpcbiAqIFRoZXJlIGFyZSBzb21lIHRoaW5ncyB0aGF0IGRvbid0IHJlYWxseSB3b3JrIHRoZSBzYW1lIHdheSBhcyB0aGUgcmVhbCBBY3RpdmF0ZWRSb3V0ZSB0aG91Z2g6XG4gKiAtIHRoZSBoYW5kbGluZyBvZiB0aGUgZmlyc3RDaGlsZCBhbmQgb2YgdGhlIGNoaWxkcmVuIGlzIGVudGlyZWx5IHVuZGVyIHRoZSB0ZXN0ZXIncyByZXNwb25zaWJpbGl0eS4gU2V0dGluZyB0aGUgcGFyZW50XG4gKiAgIG9mIGEgcm91dGUgc3R1YiBkb2VzIG5vdCBhZGQgdGhpcyByb3V0ZSB0byB0aGUgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCwgZm9yIGV4YW1wbGUuXG4gKiAtIHdoZW4gY2hhbmdpbmcgdGhlIHBhcmFtcywgcXVlcnkgcGFyYW1zLCBmcmFnbWVudCwgZXRjLiwgdGhlaXIgYXNzb2NpYXRlZCBvYnNlcnZhYmxlIGVtaXRzIHVuY29uZGl0aW9uYWxseSwgaW5zdGVhZCBvZlxuICogICBmaXJzdCBjaGVja2luZyBpZiB0aGUgdmFsdWUgaXMgYWN0dWFsbHkgZGlmZmVyZW50IGZyb20gYmVmb3JlLiBJdCdzIHRodXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB0ZXN0ZXIgdG8gbm90XG4gKiAgIGNoYW5nZSB0aGUgdmFsdWVzIGlmIHRoZXkncmUgdGhlIHNhbWUgYXMgYmVmb3JlLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdGVkUm91dGVTdHViIGV4dGVuZHMgQWN0aXZhdGVkUm91dGUge1xuICBwcml2YXRlIF9maXJzdENoaWxkOiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsO1xuICBwcml2YXRlIF9jaGlsZHJlbjogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+O1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5UGFyYW1zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxEYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmcmFnbWVudFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPjtcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8VXJsU2VnbWVudD4+O1xuXG4gIHByaXZhdGUgX3BhcmVudDogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbDtcbiAgcHJpdmF0ZSBfcm9vdDogQWN0aXZhdGVkUm91dGVTdHViO1xuICBwcml2YXRlIF9wYXRoRnJvbVJvb3Q6IEFycmF5PEFjdGl2YXRlZFJvdXRlU3R1Yj47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UsIGJhc2VkIG9uIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgKiBJZiBhbiBvcHRpb24gaXMgbm90IHByb3ZpZGVkIChvciBpZiBubyBvcHRpb24gaXMgcHJvdmlkZWQgYXQgYWxsKSwgdGhlbiB0aGUgcm91dGUgaGFzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBvcHRpb25cbiAgICogKGVtcHR5IHBhcmFtZXRlcnMgZm9yIGV4YW1wbGUsIG51bGwgZnJhZ21lbnQsIGV0Yy4pXG4gICAqIElmIG5vIHBhcmVudCBpcyBwYXNzZWQsIHRoZW4gdGhpcyByb3V0ZSBoYXMgbm8gcGFyZW50IGFuZCBpcyB0aHVzIHNldCBhcyB0aGUgcm9vdC4gT3RoZXJ3aXNlLCB0aGUgcm9vdCBhbmQgdGhlIHBhdGhcbiAgICogZnJvbSByb290IGFyZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSByb290IGFuZCBwYXRoIGZyb20gcm9vdCBvZiB0aGUgZ2l2ZW4gcGFyZW50IHJvdXRlLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IEFjdGl2YXRlZFJvdXRlU3R1Yk9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdFN0dWIoKTtcbiAgICB0aGlzLnNuYXBzaG90ID0gc25hcHNob3Q7XG5cbiAgICB0aGlzLl9maXJzdENoaWxkID0gb3B0aW9ucz8uZmlyc3RDaGlsZCA/PyBudWxsO1xuICAgIHRoaXMuX2NoaWxkcmVuID0gb3B0aW9ucz8uY2hpbGRyZW4gPz8gW107XG4gICAgdGhpcy5fcGFyZW50ID0gb3B0aW9ucz8ucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5fcm9vdCA9IHRoaXMucGFyZW50Py5yb290ID8/IHRoaXM7XG4gICAgdGhpcy5fcGF0aEZyb21Sb290ID0gdGhpcy5wYXJlbnQgPyBbLi4udGhpcy5wYXJlbnQucGF0aEZyb21Sb290LCB0aGlzXSA6IFt0aGlzXTtcblxuICAgIHNuYXBzaG90LnBhcmFtcyA9IG9wdGlvbnM/LnBhcmFtcyA/PyB7fTtcbiAgICBzbmFwc2hvdC5xdWVyeVBhcmFtcyA9IG9wdGlvbnM/LnF1ZXJ5UGFyYW1zID8/IHt9O1xuICAgIHNuYXBzaG90LmRhdGEgPSBvcHRpb25zPy5kYXRhID8/IHt9O1xuICAgIHNuYXBzaG90LmZyYWdtZW50ID0gb3B0aW9ucz8uZnJhZ21lbnQgPz8gbnVsbDtcbiAgICBzbmFwc2hvdC51cmwgPSBvcHRpb25zPy51cmwgPz8gW107XG5cbiAgICBzbmFwc2hvdC5maXJzdENoaWxkID0gdGhpcy5maXJzdENoaWxkPy5zbmFwc2hvdCA/PyBudWxsO1xuICAgIHNuYXBzaG90LmNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbj8ubWFwKHJvdXRlID0+IHJvdXRlLnNuYXBzaG90KSA/PyBbXTtcbiAgICBzbmFwc2hvdC5wYXJlbnQgPSB0aGlzLnBhcmVudD8uc25hcHNob3QgPz8gbnVsbDtcbiAgICBzbmFwc2hvdC5yb290ID0gdGhpcy5yb290LnNuYXBzaG90O1xuICAgIHNuYXBzaG90LnBhdGhGcm9tUm9vdCA9IHRoaXMucGF0aEZyb21Sb290Lm1hcChyb3V0ZSA9PiByb3V0ZS5zbmFwc2hvdCk7XG5cbiAgICB0aGlzLnBhcmFtc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz4odGhpcy5zbmFwc2hvdC5wYXJhbXMpO1xuICAgIHRoaXMucXVlcnlQYXJhbXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+KHRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMpO1xuICAgIHRoaXMuZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGE+KHRoaXMuc25hcHNob3QuZGF0YSk7XG4gICAgdGhpcy5mcmFnbWVudFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KHRoaXMuc25hcHNob3QuZnJhZ21lbnQpO1xuICAgIHRoaXMudXJsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8VXJsU2VnbWVudD4+KHRoaXMuc25hcHNob3QudXJsKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5wYXJhbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucXVlcnlQYXJhbXMgPSB0aGlzLnF1ZXJ5UGFyYW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnVybCA9IHRoaXMudXJsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCByb290KCkge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG5cbiAgZ2V0IHBhcmVudCgpOiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG5cbiAgZ2V0IHBhdGhGcm9tUm9vdCgpOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVN0dWI+IHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aEZyb21Sb290O1xuICB9XG5cbiAgZ2V0IGZpcnN0Q2hpbGQoKTogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcGFyYW1ldGVycy4gQWxsIHRoZSBvdGhlciBwYXJ0cyAocXVlcnkgcGFyYW1zIGV0Yy4pIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSB0aGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBzZXRQYXJhbXMocGFyYW1zOiBQYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJOYXZpZ2F0aW9uKHsgcGFyYW1zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcGFyYW1ldGVyLiBUaGUgb3RoZXIgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChxdWVyeSBwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIG9uZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwdWJsaWMgc2V0UGFyYW0obmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYXJhbXMoeyAuLi50aGlzLnNuYXBzaG90LnBhcmFtcywgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHF1ZXJ5IHBhcmFtZXRlcnMuIEFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKSBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBxdWVyeVBhcmFtcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHBhcmFtZXRlci4gVGhlIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgYWxsIHRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pXG4gICAqIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSBvbmUgcXVlcnkgcGFyYW1ldGVyLlxuICAgKi9cbiAgcHVibGljIHNldFF1ZXJ5UGFyYW0obmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRRdWVyeVBhcmFtcyh7IC4uLnRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMsIFtuYW1lXTogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBkYXRhLiBUaGUgb3RoZXIgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSBkYXRhLlxuICAgKi9cbiAgcHVibGljIHNldERhdGEoZGF0YTogRGF0YSk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgZGF0YSBpdGVtLiBUaGUgb3RoZXIgZGF0YSwgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIG9uZSBkYXRhIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgc2V0RGF0YUl0ZW0obmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0YSh7IC4uLnRoaXMuc25hcHNob3QuZGF0YSwgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IGZyYWdtZW50LiBUaGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKSAgc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSBmcmFnbWVudC5cbiAgICovXG4gIHB1YmxpYyBzZXRGcmFnbWVudChmcmFnbWVudDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBmcmFnbWVudCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHVybC4gVGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLikgIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSB0aGUgdXJsLlxuICAgKi9cbiAgcHVibGljIHNldFVybCh1cmw6IEFycmF5PFVybFNlZ21lbnQ+KTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IHVybCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIG9wdGlvbnMuIElmIGFuIG9wdGlvbiBpcyB1bmRlZmluZWQgb3IgbnVsbCwgaXQncyBpZ25vcmVkLiBFeGNlcHQgZm9yIGZyYWdtZW50LCB3aGljaCBpcyBvbmx5XG4gICAqIGlnbm9yZWQgaWYgaXQncyB1bmRlZmluZWQsIGJlY2F1c2UgbnVsbCBpcyBhIHZhbGlkIHZhbHVlIGZvciBhIGZyYWdtZW50LlxuICAgKlxuICAgKiBUaGUgbm9uLWlnbm9yZWQgdmFsdWVzIGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgc25hcHNob3Qgb2YgdGhlIHJvdXRlLiBPbmNlIHRoZSBzbmFwc2hvdCBoYXMgYmVlbiBtb2RpZmllZCxcbiAgICogdGhlIG9ic2VydmFibGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVwZGF0ZWQgcGFydHMgZW1pdCB0aGUgbmV3IHZhbHVlLlxuICAgKlxuICAgKiBTbywgc2V0dGluZyBwYXJhbXMgYW5kIHF1ZXJ5IHBhcmFtcyB3aWxsIG1ha2UgdGhlIHBhcmFtcyBhbmQgcXVlcnlQYXJhbXMgb2JzZXJ2YWJsZXMgZW1pdCwgYnV0IG5vdCB0aGUgZnJhZ21lbnQsIGRhdGEgYW5kXG4gICAqIHVybCBvYnNlcnZhYmxlcyBmb3IgZXhhbXBsZS4gVGhpcyBpcyBjb25zaXN0ZW50IHRvIGhvdyB0aGUgcm91dGVyIGJlaGF2ZXMuXG4gICAqL1xuICBwdWJsaWMgdHJpZ2dlck5hdmlnYXRpb24ob3B0aW9uczoge1xuICAgIHBhcmFtcz86IFBhcmFtcztcbiAgICBxdWVyeVBhcmFtcz86IFBhcmFtcztcbiAgICBmcmFnbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgZGF0YT86IERhdGEgfCBudWxsO1xuICAgIHVybD86IEFycmF5PFVybFNlZ21lbnQ+IHwgbnVsbDtcbiAgfSk6IHZvaWQge1xuICAgIC8vIHNldCB0aGUgc25hcHNob3QgZmlyc3RcbiAgICBpZiAob3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgIHRoaXMuc25hcHNob3QucGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LnF1ZXJ5UGFyYW1zID0gb3B0aW9ucy5xdWVyeVBhcmFtcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZnJhZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zbmFwc2hvdC5mcmFnbWVudCA9IG9wdGlvbnMuZnJhZ21lbnQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIHRoaXMuc25hcHNob3QuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LnVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cblxuICAgIC8vIHRoZW4gZW1pdCBldmVyeXRoaW5nIHRoYXQgaGFzIGNoYW5nZWRcbiAgICBpZiAob3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgIHRoaXMucGFyYW1zU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QucGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnlQYXJhbXMpIHtcbiAgICAgIHRoaXMucXVlcnlQYXJhbXNTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC5xdWVyeVBhcmFtcyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZnJhZ21lbnRTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC5mcmFnbWVudCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LmRhdGEpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgIHRoaXMudXJsU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QudXJsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0FjdGl2YXRlZFJvdXRlU3R1Yic7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFjdGl2YXRlZFJvdXRlU3R1YiwgYnkgY2FsbGluZyBpdHMgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHViUm91dGUob3B0aW9ucz86IEFjdGl2YXRlZFJvdXRlU3R1Yk9wdGlvbnMpOiBBY3RpdmF0ZWRSb3V0ZVN0dWIge1xuICByZXR1cm4gbmV3IEFjdGl2YXRlZFJvdXRlU3R1YihvcHRpb25zKTtcbn1cbiJdfQ==
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { TestButton } from './test-button';
2
3
  import { TestSelect } from './test-select';
3
4
  import { TestElement } from './test-element';
@@ -35,11 +36,11 @@ export class TestElementQuerier {
35
36
  }
36
37
  }
37
38
  /**
38
- * Gets the first element matching the given CSS selector and wraps it into a TestElement. The actual type
39
+ * Gets the first element matching the given selector and wraps it into a TestElement. The actual type
39
40
  * of the returned value is the TestElement subclass matching the type of the found element. So, if the
40
41
  * matched element is an input for example, the method will return a TestInput. You can thus use
41
42
  * `tester.element('#some-input') as TestInput`.
42
- * @param selector a CSS selector
43
+ * @param selector a CSS or directive selector
43
44
  * @returns the wrapped element, or null if no element matches the selector.
44
45
  */
45
46
  element(selector) {
@@ -47,11 +48,11 @@ export class TestElementQuerier {
47
48
  return childElement && TestElementQuerier.wrap(childElement, this.tester);
48
49
  }
49
50
  /**
50
- * Gets all the elements matching the given CSS selector and wraps them into a TestElement. The actual type
51
+ * Gets all the elements matching the given selector and wraps them into a TestElement. The actual type
51
52
  * of the returned elements is the TestElement subclass matching the type of the found element. So, if the
52
53
  * matched elements are inputs for example, the method will return an array of TestInput. You can thus use
53
54
  * `tester.elements('input') as Array<TestInput>`.
54
- * @param selector a CSS selector
55
+ * @param selector a CSS or directive selector
55
56
  * @returns the array of matched elements, empty if no element was matched
56
57
  */
57
58
  elements(selector) {
@@ -60,7 +61,7 @@ export class TestElementQuerier {
60
61
  }
61
62
  /**
62
63
  * Gets the first input matched by the given selector. Throws an Error if the matched element isn't actually an input.
63
- * @param selector a CSS selector
64
+ * @param selector a CSS or directive selector
64
65
  * @returns the wrapped input, or null if no element was matched
65
66
  */
66
67
  input(selector) {
@@ -75,7 +76,7 @@ export class TestElementQuerier {
75
76
  }
76
77
  /**
77
78
  * Gets the first select matched by the given selector. Throws an Error if the matched element isn't actually a select.
78
- * @param selector a CSS selector
79
+ * @param selector a CSS or directive selector
79
80
  * @returns the wrapped select, or null if no element was matched
80
81
  */
81
82
  select(selector) {
@@ -90,7 +91,7 @@ export class TestElementQuerier {
90
91
  }
91
92
  /**
92
93
  * Gets the first textarea matched by the given selector
93
- * @param selector a CSS selector
94
+ * @param selector a CSS or directive selector
94
95
  * @returns the wrapped textarea, or null if no element was matched. Throws an Error if the matched element isn't actually a textarea.
95
96
  * @throws {Error} if the matched element isn't actually a textarea
96
97
  */
@@ -106,7 +107,7 @@ export class TestElementQuerier {
106
107
  }
107
108
  /**
108
109
  * Gets the first button matched by the given selector. Throws an Error if the matched element isn't actually a button.
109
- * @param selector a CSS selector
110
+ * @param selector a CSS or directive selector
110
111
  * @returns the wrapped button, or null if no element was matched
111
112
  */
112
113
  button(selector) {
@@ -120,10 +121,20 @@ export class TestElementQuerier {
120
121
  return new TestButton(this.tester, childElement);
121
122
  }
122
123
  query(selector) {
123
- return this.root.query(By.css(selector));
124
+ if (typeof selector === 'string') {
125
+ return this.root.query(By.css(selector));
126
+ }
127
+ else {
128
+ return this.root.query(By.directive(selector));
129
+ }
124
130
  }
125
131
  queryAll(selector) {
126
- return this.root.queryAll(By.css(selector));
132
+ if (typeof selector === 'string') {
133
+ return this.root.queryAll(By.css(selector));
134
+ }
135
+ else {
136
+ return this.root.queryAll(By.directive(selector));
137
+ }
127
138
  }
128
139
  }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1lbGVtZW50LXF1ZXJpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvdGVzdC1lbGVtZW50LXF1ZXJpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRS9DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUFvQixNQUFnQyxFQUFVLElBQWtCO1FBQTVELFdBQU0sR0FBTixNQUFNLENBQTBCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBYztJQUFHLENBQUM7SUFFcEYsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBK0IsRUFBRSxNQUFnQztRQUMzRSxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7UUFDckQsSUFBSSxZQUFZLFlBQVksaUJBQWlCLEVBQUU7WUFDN0MsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUNsRDthQUFNLElBQUksWUFBWSxZQUFZLGdCQUFnQixFQUFFO1lBQ25ELE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDakQ7YUFBTSxJQUFJLFlBQVksWUFBWSxpQkFBaUIsRUFBRTtZQUNwRCxPQUFPLElB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QVksRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQztTQUNiO2FBQU0sSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsWUFBWSxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsOEJBQThCLENBQUMsQ0FBQztTQUNsRjtRQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQWdCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxRQUFRLENBQUMsUUFBZ0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdEJ1dHRvbiB9IGZyb20gJy4vdGVzdC1idXR0b24nO1xuaW1wb3J0IHsgVGVzdFNlbGVjdCB9IGZyb20gJy4vdGVzdC1zZWxlY3QnO1xuaW1wb3J0IHsgVGVzdEVsZW1lbnQgfSBmcm9tICcuL3Rlc3QtZWxlbWVudCc7XG5pbXBvcnQgeyBUZXN0VGV4dEFyZWEgfSBmcm9tICcuL3Rlc3QtdGV4dGFyZWEnO1xuaW1wb3J0IHsgVGVzdElucHV0IH0gZnJvbSAnLi90ZXN0LWlucHV0JztcbmltcG9ydCB7IFRlc3RIdG1sRWxlbWVudCB9IGZyb20gJy4vdGVzdC1odG1sLWVsZW1lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50VGVzdGVyIH0gZnJvbSAnLi9jb21wb25lbnQtdGVzdGVyJztcbmltcG9ydCB7IERlYnVnRWxlbWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnkgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRlc3RFbGVtZW50UXVlcmllciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGVzdGVyOiBDb21wb25lbnRUZXN0ZXI8dW5rbm93bj4sIHByaXZhdGUgcm9vdDogRGVidWdFbGVtZW50KSB7fVxuXG4gIHN0YXRpYyB3cmFwKGNoaWxkRGVidWdFbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHRlc3RlcjogQ29tcG9uZW50VGVzdGVyPHVua25vd24+KTogVGVzdEVsZW1lbnQge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IGNoaWxkRGVidWdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNoaWxkRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFRlc3RCdXR0b24odGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFRlc3RJbnB1dCh0ZXN0ZXIsIGNoaWxkRGVidWdFbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFRlc3RTZWxlY3QodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFRlc3RUZXh0QXJlYSh0ZXN0ZXIsIGNoaWxkRGVidWdFbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFRlc3RIdG1sRWxlbWVudCh0ZXN0ZXIsIGNoaWxkRGVidWdFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0RWxlbWVudCh0ZXN0ZXIsIGNoaWxkRGVidWdFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gQ1NTIHNlbGVjdG9yIGFuZCB3cmFwcyBpdCBpbnRvIGEgVGVzdEVsZW1lbnQuIFRoZSBhY3R1YWwgdHlwZVxuICAgKiBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIFRlc3RFbGVtZW50IHN1YmNsYXNzIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHRoZSBmb3VuZCBlbGVtZW50LiBTbywgaWYgdGhlXG4gICAqIG1hdGNoZWQgZWxlbWVudCBpcyBhbiBpbnB1dCBmb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhIFRlc3RJbnB1dC4gWW91IGNhbiB0aHVzIHVzZVxuICAgKiBgdGVzdGVyLmVsZW1lbnQoJyNzb21lLWlucHV0JykgYXMgVGVzdElucHV0YC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHRoZSB3cmFwcGVkIGVsZW1lbnQsIG9yIG51bGwgaWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cbiAgICovXG4gIGVsZW1lbnQoc2VsZWN0b3I6IHN0cmluZyk6IFRlc3RFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50ID0gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgcmV0dXJuIGNoaWxkRWxlbWVudCAmJiBUZXN0RWxlbWVudFF1ZXJpZXIud3JhcChjaGlsZEVsZW1lbnQsIHRoaXMudGVzdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIENTUyBzZWxlY3RvciBhbmQgd3JhcHMgdGhlbSBpbnRvIGEgVGVzdEVsZW1lbnQuIFRoZSBhY3R1YWwgdHlwZVxuICAgKiBvZiB0aGUgcmV0dXJuZWQgZWxlbWVudHMgaXMgdGhlIFRlc3RFbGVtZW50IHN1YmNsYXNzIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHRoZSBmb3VuZCBlbGVtZW50LiBTbywgaWYgdGhlXG4gICAqIG1hdGNoZWQgZWxlbWVudHMgYXJlIGlucHV0cyBmb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBUZXN0SW5wdXQuIFlvdSBjYW4gdGh1cyB1c2VcbiAgICogYHRlc3Rlci5lbGVtZW50cygnaW5wdXQnKSBhcyBBcnJheTxUZXN0SW5wdXQ+YC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHRoZSBhcnJheSBvZiBtYXRjaGVkIGVsZW1lbnRzLCBlbXB0eSBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkXG4gICAqL1xuICBlbGVtZW50cyhzZWxlY3Rvcjogc3RyaW5nKTogQXJyYXk8VGVzdEVsZW1lbnQ+IHtcbiAgICBjb25zdCBjaGlsZEVsZW1lbnRzID0gdGhpcy5xdWVyeUFsbChzZWxlY3Rvcik7XG4gICAgcmV0dXJuIGNoaWxkRWxlbWVudHMubWFwKGRlYnVnRWxlbWVudCA9PiBUZXN0RWxlbWVudFF1ZXJpZXIud3JhcChkZWJ1Z0VsZW1lbnQsIHRoaXMudGVzdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3QgaW5wdXQgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gc2VsZWN0b3IuIFRocm93cyBhbiBFcnJvciBpZiB0aGUgbWF0Y2hlZCBlbGVtZW50IGlzbid0IGFjdHVhbGx5IGFuIGlucHV0LlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgYSBDU1Mgc2VsZWN0b3JcbiAgICogQHJldHVybnMgdGhlIHdyYXBwZWQgaW5wdXQsIG9yIG51bGwgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZFxuICAgKi9cbiAgaW5wdXQoc2VsZWN0b3I6IHN0cmluZyk6IFRlc3RJbnB1dCB8IG51bGwge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIGlmICghY2hpbGRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCEoY2hpbGRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IHdpdGggc2VsZWN0b3IgJHtzZWxlY3Rvcn0gaXMgbm90IGFuIEhUTUxJbnB1dEVsZW1lbnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXN0SW5wdXQodGhpcy50ZXN0ZXIsIGNoaWxkRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3Qgc2VsZWN0IG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yLiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhIHNlbGVjdC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHRoZSB3cmFwcGVkIHNlbGVjdCwgb3IgbnVsbCBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZyk6IFRlc3RTZWxlY3QgfCBudWxsIHtcbiAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICBpZiAoIWNoaWxkRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICghKGNoaWxkRWxlbWVudC5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgd2l0aCBzZWxlY3RvciAke3NlbGVjdG9yfSBpcyBub3QgYW4gSFRNTFNlbGVjdEVsZW1lbnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXN0U2VsZWN0KHRoaXMudGVzdGVyLCBjaGlsZEVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IHRleHRhcmVhIG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAqIEBwYXJhbSBzZWxlY3RvciBhIENTUyBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCB0ZXh0YXJlYSwgb3IgbnVsbCBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkLiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhIHRleHRhcmVhLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhIHRleHRhcmVhXG4gICAqL1xuICB0ZXh0YXJlYShzZWxlY3Rvcjogc3RyaW5nKTogVGVzdFRleHRBcmVhIHwgbnVsbCB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50ID0gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgaWYgKCFjaGlsZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoIShjaGlsZEVsZW1lbnQubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgd2l0aCBzZWxlY3RvciAke3NlbGVjdG9yfSBpcyBub3QgYW4gSFRNTFRleHRBcmVhRWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlc3RUZXh0QXJlYSh0aGlzLnRlc3RlciwgY2hpbGRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBidXR0b24gbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gc2VsZWN0b3IuIFRocm93cyBhbiBFcnJvciBpZiB0aGUgbWF0Y2hlZCBlbGVtZW50IGlzbid0IGFjdHVhbGx5IGEgYnV0dG9uLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgYSBDU1Mgc2VsZWN0b3JcbiAgICogQHJldHVybnMgdGhlIHdyYXBwZWQgYnV0dG9uLCBvciBudWxsIGlmIG5vIGVsZW1lbnQgd2FzIG1hdGNoZWRcbiAgICovXG4gIGJ1dHRvbihzZWxlY3Rvcjogc3RyaW5nKTogVGVzdEJ1dHRvbiB8IG51bGwge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIGlmICghY2hpbGRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCEoY2hpbGRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCB3aXRoIHNlbGVjdG9yICR7c2VsZWN0b3J9IGlzIG5vdCBhbiBIVE1MQnV0dG9uRWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlc3RCdXR0b24odGhpcy50ZXN0ZXIsIGNoaWxkRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcpOiBEZWJ1Z0VsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5KEJ5LmNzcyhzZWxlY3RvcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBxdWVyeUFsbChzZWxlY3Rvcjogc3RyaW5nKTogQXJyYXk8RGVidWdFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeUFsbChCeS5jc3Moc2VsZWN0b3IpKTtcbiAgfVxufVxuIl19
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1lbGVtZW50LXF1ZXJpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvdGVzdC1lbGVtZW50LXF1ZXJpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3RELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBb0IsTUFBZ0MsRUFBVSxJQUFrQjtRQUE1RCxXQUFNLEdBQU4sTUFBTSxDQUEwQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWM7SUFBRyxDQUFDO0lBRXBGLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQStCLEVBQUUsTUFBZ0M7UUFDM0UsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDO1FBQ3JELElBQUksWUFBWSxZQUFZLGlCQUFpQixFQUFFO1lBQzdDLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDbEQ7YUFBTSxJQUFJLFlBQVksWUFBWSxnQkFBZ0IsRUFBRTtZQUNuRCxPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxZQUFZLFlBQVksaUJBQWlCLEVBQUU7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LElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLFlBQVksaUJBQWlCLENBQUMsRUFBRTtZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixRQUFRLDhCQUE4QixDQUFDLENBQUM7U0FDbEY7UUFDRCxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUE0QjtRQUN4QyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLFFBQTRCO1FBQzNDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IFRlc3RCdXR0b24gfSBmcm9tICcuL3Rlc3QtYnV0dG9uJztcbmltcG9ydCB7IFRlc3RTZWxlY3QgfSBmcm9tICcuL3Rlc3Qtc2VsZWN0JztcbmltcG9ydCB7IFRlc3RFbGVtZW50IH0gZnJvbSAnLi90ZXN0LWVsZW1lbnQnO1xuaW1wb3J0IHsgVGVzdFRleHRBcmVhIH0gZnJvbSAnLi90ZXN0LXRleHRhcmVhJztcbmltcG9ydCB7IFRlc3RJbnB1dCB9IGZyb20gJy4vdGVzdC1pbnB1dCc7XG5pbXBvcnQgeyBUZXN0SHRtbEVsZW1lbnQgfSBmcm9tICcuL3Rlc3QtaHRtbC1lbGVtZW50JztcbmltcG9ydCB7IENvbXBvbmVudFRlc3RlciB9IGZyb20gJy4vY29tcG9uZW50LXRlc3Rlcic7XG5pbXBvcnQgeyBEZWJ1Z0VsZW1lbnQsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ5IH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXN0RWxlbWVudFF1ZXJpZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlc3RlcjogQ29tcG9uZW50VGVzdGVyPHVua25vd24+LCBwcml2YXRlIHJvb3Q6IERlYnVnRWxlbWVudCkge31cblxuICBzdGF0aWMgd3JhcChjaGlsZERlYnVnRWxlbWVudDogRGVidWdFbGVtZW50LCB0ZXN0ZXI6IENvbXBvbmVudFRlc3Rlcjx1bmtub3duPik6IFRlc3RFbGVtZW50IHtcbiAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBjaGlsZERlYnVnRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0QnV0dG9uKHRlc3RlciwgY2hpbGREZWJ1Z0VsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRFbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0SW5wdXQodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0U2VsZWN0KHRlc3RlciwgY2hpbGREZWJ1Z0VsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRFbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0VGV4dEFyZWEodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0SHRtbEVsZW1lbnQodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgVGVzdEVsZW1lbnQodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGFuZCB3cmFwcyBpdCBpbnRvIGEgVGVzdEVsZW1lbnQuIFRoZSBhY3R1YWwgdHlwZVxuICAgKiBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIFRlc3RFbGVtZW50IHN1YmNsYXNzIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHRoZSBmb3VuZCBlbGVtZW50LiBTbywgaWYgdGhlXG4gICAqIG1hdGNoZWQgZWxlbWVudCBpcyBhbiBpbnB1dCBmb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhIFRlc3RJbnB1dC4gWW91IGNhbiB0aHVzIHVzZVxuICAgKiBgdGVzdGVyLmVsZW1lbnQoJyNzb21lLWlucHV0JykgYXMgVGVzdElucHV0YC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCBlbGVtZW50LCBvciBudWxsIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAqL1xuICBlbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcgfCBUeXBlPGFueT4pOiBUZXN0RWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIHJldHVybiBjaGlsZEVsZW1lbnQgJiYgVGVzdEVsZW1lbnRRdWVyaWVyLndyYXAoY2hpbGRFbGVtZW50LCB0aGlzLnRlc3Rlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBhbmQgd3JhcHMgdGhlbSBpbnRvIGEgVGVzdEVsZW1lbnQuIFRoZSBhY3R1YWwgdHlwZVxuICAgKiBvZiB0aGUgcmV0dXJuZWQgZWxlbWVudHMgaXMgdGhlIFRlc3RFbGVtZW50IHN1YmNsYXNzIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHRoZSBmb3VuZCBlbGVtZW50LiBTbywgaWYgdGhlXG4gICAqIG1hdGNoZWQgZWxlbWVudHMgYXJlIGlucHV0cyBmb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBUZXN0SW5wdXQuIFlvdSBjYW4gdGh1cyB1c2VcbiAgICogYHRlc3Rlci5lbGVtZW50cygnaW5wdXQnKSBhcyBBcnJheTxUZXN0SW5wdXQ+YC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgYXJyYXkgb2YgbWF0Y2hlZCBlbGVtZW50cywgZW1wdHkgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZFxuICAgKi9cbiAgZWxlbWVudHMoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IEFycmF5PFRlc3RFbGVtZW50PiB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50cyA9IHRoaXMucXVlcnlBbGwoc2VsZWN0b3IpO1xuICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLm1hcChkZWJ1Z0VsZW1lbnQgPT4gVGVzdEVsZW1lbnRRdWVyaWVyLndyYXAoZGVidWdFbGVtZW50LCB0aGlzLnRlc3RlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IGlucHV0IG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yLiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhbiBpbnB1dC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCBpbnB1dCwgb3IgbnVsbCBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkXG4gICAqL1xuICBpbnB1dChzZWxlY3Rvcjogc3RyaW5nIHwgVHlwZTxhbnk+KTogVGVzdElucHV0IHwgbnVsbCB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50ID0gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgaWYgKCFjaGlsZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoIShjaGlsZEVsZW1lbnQubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgd2l0aCBzZWxlY3RvciAke3NlbGVjdG9yfSBpcyBub3QgYW4gSFRNTElucHV0RWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlc3RJbnB1dCh0aGlzLnRlc3RlciwgY2hpbGRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBzZWxlY3QgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gc2VsZWN0b3IuIFRocm93cyBhbiBFcnJvciBpZiB0aGUgbWF0Y2hlZCBlbGVtZW50IGlzbid0IGFjdHVhbGx5IGEgc2VsZWN0LlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgYSBDU1Mgb3IgZGlyZWN0aXZlIHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHRoZSB3cmFwcGVkIHNlbGVjdCwgb3IgbnVsbCBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IFRlc3RTZWxlY3QgfCBudWxsIHtcbiAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICBpZiAoIWNoaWxkRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICghKGNoaWxkRWxlbWVudC5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgd2l0aCBzZWxlY3RvciAke3NlbGVjdG9yfSBpcyBub3QgYW4gSFRNTFNlbGVjdEVsZW1lbnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXN0U2VsZWN0KHRoaXMudGVzdGVyLCBjaGlsZEVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IHRleHRhcmVhIG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAqIEBwYXJhbSBzZWxlY3RvciBhIENTUyBvciBkaXJlY3RpdmUgc2VsZWN0b3JcbiAgICogQHJldHVybnMgdGhlIHdyYXBwZWQgdGV4dGFyZWEsIG9yIG51bGwgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZC4gVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBtYXRjaGVkIGVsZW1lbnQgaXNuJ3QgYWN0dWFsbHkgYSB0ZXh0YXJlYS5cbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBtYXRjaGVkIGVsZW1lbnQgaXNuJ3QgYWN0dWFsbHkgYSB0ZXh0YXJlYVxuICAgKi9cbiAgdGV4dGFyZWEoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IFRlc3RUZXh0QXJlYSB8IG51bGwge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIGlmICghY2hpbGRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCEoY2hpbGRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IHdpdGggc2VsZWN0b3IgJHtzZWxlY3Rvcn0gaXMgbm90IGFuIEhUTUxUZXh0QXJlYUVsZW1lbnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXN0VGV4dEFyZWEodGhpcy50ZXN0ZXIsIGNoaWxkRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3QgYnV0dG9uIG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yLiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhIGJ1dHRvbi5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCBidXR0b24sIG9yIG51bGwgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZFxuICAgKi9cbiAgYnV0dG9uKHNlbGVjdG9yOiBzdHJpbmcgfCBUeXBlPGFueT4pOiBUZXN0QnV0dG9uIHwgbnVsbCB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50ID0gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgaWYgKCFjaGlsZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoIShjaGlsZEVsZW1lbnQubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IHdpdGggc2VsZWN0b3IgJHtzZWxlY3Rvcn0gaXMgbm90IGFuIEhUTUxCdXR0b25FbGVtZW50YCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVzdEJ1dHRvbih0aGlzLnRlc3RlciwgY2hpbGRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcXVlcnkoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IERlYnVnRWxlbWVudCB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5KEJ5LmNzcyhzZWxlY3RvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShzZWxlY3RvcikpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcXVlcnlBbGwoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IEFycmF5PERlYnVnRWxlbWVudD4ge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5QWxsKEJ5LmNzcyhzZWxlY3RvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShzZWxlY3RvcikpO1xuICAgIH1cbiAgfVxufVxuIl19