@skyux/tabs 5.0.4 → 5.5.0-beta.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.
Files changed (124) hide show
  1. package/README.md +6 -4
  2. package/bundles/skyux-tabs.umd.js +147 -181
  3. package/documentation.json +761 -481
  4. package/esm2015/index.js +23 -0
  5. package/esm2015/index.js.map +1 -0
  6. package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js +67 -0
  7. package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js.map +1 -0
  8. package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js +116 -0
  9. package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js.map +1 -0
  10. package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js +35 -0
  11. package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js.map +1 -0
  12. package/esm2015/lib/modules/sectioned-form/sectioned-form.service.js +35 -0
  13. package/esm2015/lib/modules/sectioned-form/sectioned-form.service.js.map +1 -0
  14. package/esm2015/lib/modules/shared/sky-tabs-resources.module.js +52 -0
  15. package/esm2015/lib/modules/shared/sky-tabs-resources.module.js.map +1 -0
  16. package/esm2015/lib/modules/tabs/tab-button.component.js +76 -0
  17. package/esm2015/lib/modules/tabs/tab-button.component.js.map +1 -0
  18. package/esm2015/lib/modules/tabs/tab-index.js +2 -0
  19. package/esm2015/lib/modules/tabs/tab-index.js.map +1 -0
  20. package/esm2015/lib/modules/tabs/tab.component.js +135 -0
  21. package/esm2015/lib/modules/tabs/tab.component.js.map +1 -0
  22. package/esm2015/lib/modules/tabs/tabs.module.js +57 -0
  23. package/esm2015/lib/modules/tabs/tabs.module.js.map +1 -0
  24. package/esm2015/lib/modules/tabs/tabset-active-tab-unregistered-args.js +2 -0
  25. package/esm2015/lib/modules/tabs/tabset-active-tab-unregistered-args.js.map +1 -0
  26. package/esm2015/lib/modules/tabs/tabset-adapter.service.js +56 -0
  27. package/esm2015/lib/modules/tabs/tabset-adapter.service.js.map +1 -0
  28. package/esm2015/lib/modules/tabs/tabset-buttons-display-mode.js +2 -0
  29. package/esm2015/lib/modules/tabs/tabset-buttons-display-mode.js.map +1 -0
  30. package/esm2015/lib/modules/tabs/tabset-nav-button.component.js +119 -0
  31. package/esm2015/lib/modules/tabs/tabset-nav-button.component.js.map +1 -0
  32. package/esm2015/lib/modules/tabs/tabset-permalink.service.js +126 -0
  33. package/esm2015/lib/modules/tabs/tabset-permalink.service.js.map +1 -0
  34. package/esm2015/lib/modules/tabs/tabset-style.js +2 -0
  35. package/esm2015/lib/modules/tabs/tabset-style.js.map +1 -0
  36. package/esm2015/lib/modules/tabs/tabset-tab-indexes-change.js +2 -0
  37. package/esm2015/lib/modules/tabs/tabset-tab-indexes-change.js.map +1 -0
  38. package/esm2015/lib/modules/tabs/tabset.component.js +405 -0
  39. package/esm2015/lib/modules/tabs/tabset.component.js.map +1 -0
  40. package/esm2015/lib/modules/tabs/tabset.service.js +110 -0
  41. package/esm2015/lib/modules/tabs/tabset.service.js.map +1 -0
  42. package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js +72 -0
  43. package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js.map +1 -0
  44. package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js +203 -0
  45. package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js.map +1 -0
  46. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js +48 -0
  47. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js.map +1 -0
  48. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js +89 -0
  49. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js.map +1 -0
  50. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js +157 -0
  51. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js.map +1 -0
  52. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js +60 -0
  53. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js.map +1 -0
  54. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js +170 -0
  55. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js.map +1 -0
  56. package/esm2015/skyux-tabs.js +2 -2
  57. package/esm2015/skyux-tabs.js.map +1 -0
  58. package/esm2015/testing/public-api.js +1 -1
  59. package/esm2015/testing/public-api.js.map +1 -0
  60. package/esm2015/testing/skyux-tabs-testing.js +1 -1
  61. package/esm2015/testing/skyux-tabs-testing.js.map +1 -0
  62. package/esm2015/testing/tabs/tab-fixture-tab.js +1 -1
  63. package/esm2015/testing/tabs/tab-fixture-tab.js.map +1 -0
  64. package/esm2015/testing/tabs/tabset-fixture.js +1 -1
  65. package/esm2015/testing/tabs/tabset-fixture.js.map +1 -0
  66. package/fesm2015/skyux-tabs-testing.js.map +1 -1
  67. package/fesm2015/skyux-tabs.js +238 -259
  68. package/fesm2015/skyux-tabs.js.map +1 -1
  69. package/index.d.ts +16 -0
  70. package/{modules → lib/modules}/sectioned-form/sectioned-form-section.component.d.ts +0 -3
  71. package/{modules → lib/modules}/sectioned-form/sectioned-form.component.d.ts +0 -0
  72. package/{modules → lib/modules}/sectioned-form/sectioned-form.module.d.ts +0 -0
  73. package/{modules → lib/modules}/sectioned-form/sectioned-form.service.d.ts +0 -0
  74. package/{modules → lib/modules}/shared/sky-tabs-resources.module.d.ts +0 -0
  75. package/{modules → lib/modules}/tabs/tab-button.component.d.ts +2 -2
  76. package/{modules → lib/modules}/tabs/tab-index.d.ts +0 -0
  77. package/{modules → lib/modules}/tabs/tab.component.d.ts +0 -0
  78. package/{modules → lib/modules}/tabs/tabs.module.d.ts +0 -0
  79. package/{modules → lib/modules}/tabs/tabset-active-tab-unregistered-args.d.ts +0 -0
  80. package/{modules → lib/modules}/tabs/tabset-adapter.service.d.ts +0 -0
  81. package/{modules → lib/modules}/tabs/tabset-buttons-display-mode.d.ts +0 -0
  82. package/{modules → lib/modules}/tabs/tabset-nav-button.component.d.ts +0 -0
  83. package/{modules → lib/modules}/tabs/tabset-permalink.service.d.ts +0 -0
  84. package/{modules → lib/modules}/tabs/tabset-style.d.ts +0 -0
  85. package/{modules → lib/modules}/tabs/tabset-tab-indexes-change.d.ts +0 -0
  86. package/{modules → lib/modules}/tabs/tabset.component.d.ts +1 -1
  87. package/{modules → lib/modules}/tabs/tabset.service.d.ts +0 -0
  88. package/{modules → lib/modules}/vertical-tabset/vertical-tab-media-query.service.d.ts +0 -0
  89. package/{modules → lib/modules}/vertical-tabset/vertical-tab.component.d.ts +8 -13
  90. package/{modules → lib/modules}/vertical-tabset/vertical-tabset-adapter.service.d.ts +0 -0
  91. package/{modules → lib/modules}/vertical-tabset/vertical-tabset-group.component.d.ts +2 -2
  92. package/{modules → lib/modules}/vertical-tabset/vertical-tabset.component.d.ts +17 -2
  93. package/{modules → lib/modules}/vertical-tabset/vertical-tabset.module.d.ts +4 -3
  94. package/{modules → lib/modules}/vertical-tabset/vertical-tabset.service.d.ts +0 -0
  95. package/package.json +25 -11
  96. package/skyux-tabs.d.ts +1 -1
  97. package/LICENSE +0 -21
  98. package/esm2015/modules/sectioned-form/sectioned-form-section.component.js +0 -70
  99. package/esm2015/modules/sectioned-form/sectioned-form.component.js +0 -116
  100. package/esm2015/modules/sectioned-form/sectioned-form.module.js +0 -35
  101. package/esm2015/modules/sectioned-form/sectioned-form.service.js +0 -35
  102. package/esm2015/modules/shared/sky-tabs-resources.module.js +0 -52
  103. package/esm2015/modules/tabs/tab-button.component.js +0 -65
  104. package/esm2015/modules/tabs/tab-index.js +0 -2
  105. package/esm2015/modules/tabs/tab.component.js +0 -133
  106. package/esm2015/modules/tabs/tabs.module.js +0 -57
  107. package/esm2015/modules/tabs/tabset-active-tab-unregistered-args.js +0 -2
  108. package/esm2015/modules/tabs/tabset-adapter.service.js +0 -56
  109. package/esm2015/modules/tabs/tabset-buttons-display-mode.js +0 -2
  110. package/esm2015/modules/tabs/tabset-nav-button.component.js +0 -117
  111. package/esm2015/modules/tabs/tabset-permalink.service.js +0 -124
  112. package/esm2015/modules/tabs/tabset-style.js +0 -2
  113. package/esm2015/modules/tabs/tabset-tab-indexes-change.js +0 -2
  114. package/esm2015/modules/tabs/tabset.component.js +0 -405
  115. package/esm2015/modules/tabs/tabset.service.js +0 -110
  116. package/esm2015/modules/vertical-tabset/vertical-tab-media-query.service.js +0 -72
  117. package/esm2015/modules/vertical-tabset/vertical-tab.component.js +0 -192
  118. package/esm2015/modules/vertical-tabset/vertical-tabset-adapter.service.js +0 -48
  119. package/esm2015/modules/vertical-tabset/vertical-tabset-group.component.js +0 -134
  120. package/esm2015/modules/vertical-tabset/vertical-tabset.component.js +0 -149
  121. package/esm2015/modules/vertical-tabset/vertical-tabset.module.js +0 -56
  122. package/esm2015/modules/vertical-tabset/vertical-tabset.service.js +0 -170
  123. package/esm2015/public-api.js +0 -23
  124. package/public-api.d.ts +0 -16
@@ -1,124 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/router";
5
- import * as i2 from "@angular/common";
6
- /**
7
- * @internal
8
- */
9
- export class SkyTabsetPermalinkService {
10
- constructor(activatedRoute, location, router) {
11
- this.activatedRoute = activatedRoute;
12
- this.location = location;
13
- this.router = router;
14
- this._popStateChange = new Subject();
15
- }
16
- get popStateChange() {
17
- return this._popStateChange.asObservable();
18
- }
19
- ngOnDestroy() {
20
- if (this.subscription) {
21
- this.subscription.unsubscribe();
22
- }
23
- }
24
- init() {
25
- this.subscription = this.location.subscribe(() => {
26
- this._popStateChange.next();
27
- });
28
- }
29
- /**
30
- * Returns the value of a URL query param.
31
- */
32
- getParam(name) {
33
- return this.getParams()[name];
34
- }
35
- /**
36
- * Sets the value of a URL query param.
37
- */
38
- setParam(name, value) {
39
- const params = this.getParams();
40
- if (value === null) {
41
- delete params[name];
42
- }
43
- else {
44
- params[name] = value;
45
- }
46
- // Update the URL without triggering a navigation state change.
47
- // See: https://stackoverflow.com/a/46486677
48
- const url = this.router
49
- .createUrlTree(['.'], {
50
- relativeTo: this.activatedRoute,
51
- queryParams: params,
52
- queryParamsHandling: 'merge',
53
- })
54
- .toString();
55
- // Abort redirect if the current URL is equal to the new URL.
56
- if (this.location.isCurrentPathEqualTo(url)) {
57
- return;
58
- }
59
- this.location.go(url);
60
- }
61
- /**
62
- * Removes the provided query param from the URL.
63
- */
64
- clearParam(name) {
65
- /*tslint:disable-next-line:no-null-keyword*/
66
- this.setParam(name, null);
67
- }
68
- /**
69
- * Returns a relative URL that includes the provided query parameter. The value is inteded to be
70
- * used by an HTML anchor element.
71
- */
72
- getParamHref(name, value) {
73
- if (!name) {
74
- /*tslint:disable-next-line:no-null-keyword*/
75
- return null;
76
- }
77
- const params = this.getParams();
78
- params[name] = value;
79
- const baseUrl = this.location.path().split('?')[0];
80
- const paramString = Object.keys(params)
81
- .map((k) => `${k}=${params[k]}`)
82
- .join('&');
83
- return this.location.prepareExternalUrl(`${baseUrl}?${paramString}`);
84
- }
85
- /**
86
- * Converts the provided string into a value that can be safely used in a URL.
87
- */
88
- urlify(value) {
89
- if (!value) {
90
- return '';
91
- }
92
- const sanitized = value
93
- .toLowerCase()
94
- // Remove special characters.
95
- .replace(/[\_\~\`\@\!\#\$\%\^\&\*\(\)\[\]\{\}\;\:\'\/\\\<\>\,\.\?\=\+\|"]/g, '')
96
- // Replace space characters with a dash.
97
- .replace(/\s/g, '-')
98
- // Remove any double-dashes.
99
- .replace(/--/g, '-');
100
- return sanitized;
101
- }
102
- /**
103
- * Returns all query params that exist in the current URL.
104
- */
105
- getParams() {
106
- const params = {};
107
- const path = this.location.path();
108
- if (path.indexOf('?') === -1) {
109
- return params;
110
- }
111
- const existingParamPairs = path.split('?')[1].split('&');
112
- existingParamPairs.forEach((pair) => {
113
- const fragments = pair.split('=');
114
- params[fragments[0]] = decodeURIComponent(fragments[1]);
115
- });
116
- return params;
117
- }
118
- }
119
- SkyTabsetPermalinkService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyTabsetPermalinkService, deps: [{ token: i1.ActivatedRoute }, { token: i2.Location }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
120
- SkyTabsetPermalinkService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyTabsetPermalinkService });
121
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyTabsetPermalinkService, decorators: [{
122
- type: Injectable
123
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.Location }, { type: i1.Router }]; } });
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXBlcm1hbGluay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFicy9zcmMvbW9kdWxlcy90YWJzL3RhYnNldC1wZXJtYWxpbmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBSXRELE9BQU8sRUFBYyxPQUFPLEVBQW9CLE1BQU0sTUFBTSxDQUFDOzs7O0FBUzdEOztHQUVHO0FBRUgsTUFBTSxPQUFPLHlCQUF5QjtJQVNwQyxZQUNVLGNBQThCLEVBQzlCLFFBQWtCLEVBQ2xCLE1BQWM7UUFGZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBUGhCLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQVEzQyxDQUFDO0lBWkosSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBWU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxJQUFZLEVBQUUsS0FBb0I7UUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWhDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQjthQUFNO1lBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUN0QjtRQUVELCtEQUErRDtRQUMvRCw0Q0FBNEM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU07YUFDcEIsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQy9CLFdBQVcsRUFBRSxNQUFNO1lBQ25CLG1CQUFtQixFQUFFLE9BQU87U0FDN0IsQ0FBQzthQUNELFFBQVEsRUFBRSxDQUFDO1FBRWQsNkRBQTZEO1FBQzdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMzQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUM1Qiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFlBQVksQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsNENBQTRDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVyQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNwQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUViLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSzthQUNwQixXQUFXLEVBQUU7WUFFZCw2QkFBNkI7YUFDNUIsT0FBTyxDQUNOLGtFQUFrRSxFQUNsRSxFQUFFLENBQ0g7WUFFRCx3Q0FBd0M7YUFDdkMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7WUFFcEIsNEJBQTRCO2FBQzNCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdkIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLE1BQU0sTUFBTSxHQUFvQixFQUFFLENBQUM7UUFFbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekQsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzt1SEF6SVUseUJBQXlCOzJIQUF6Qix5QkFBeUI7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb25MaWtlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBQZXJtYWxpbmtQYXJhbXMge1xuICBbXzogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2t5VGFic2V0UGVybWFsaW5rU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBnZXQgcG9wU3RhdGVDaGFuZ2UoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcFN0YXRlQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcG9wU3RhdGVDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25MaWtlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7fVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmxvY2F0aW9uLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9wb3BTdGF0ZUNoYW5nZS5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBVUkwgcXVlcnkgcGFyYW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFyYW0obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXJhbXMoKVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFVSTCBxdWVyeSBwYXJhbS5cbiAgICovXG4gIHB1YmxpYyBzZXRQYXJhbShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5nZXRQYXJhbXMoKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHBhcmFtc1tuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zW25hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBVUkwgd2l0aG91dCB0cmlnZ2VyaW5nIGEgbmF2aWdhdGlvbiBzdGF0ZSBjaGFuZ2UuXG4gICAgLy8gU2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDY0ODY2NzdcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlclxuICAgICAgLmNyZWF0ZVVybFRyZWUoWycuJ10sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcXVlcnlQYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIH0pXG4gICAgICAudG9TdHJpbmcoKTtcblxuICAgIC8vIEFib3J0IHJlZGlyZWN0IGlmIHRoZSBjdXJyZW50IFVSTCBpcyBlcXVhbCB0byB0aGUgbmV3IFVSTC5cbiAgICBpZiAodGhpcy5sb2NhdGlvbi5pc0N1cnJlbnRQYXRoRXF1YWxUbyh1cmwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbi5nbyh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtIGZyb20gdGhlIFVSTC5cbiAgICovXG4gIHB1YmxpYyBjbGVhclBhcmFtKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgdGhpcy5zZXRQYXJhbShuYW1lLCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVsYXRpdmUgVVJMIHRoYXQgaW5jbHVkZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIHZhbHVlIGlzIGludGVkZWQgdG8gYmVcbiAgICogdXNlZCBieSBhbiBIVE1MIGFuY2hvciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGdldFBhcmFtSHJlZihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtcygpO1xuICAgIHBhcmFtc1tuYW1lXSA9IHZhbHVlO1xuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMubG9jYXRpb24ucGF0aCgpLnNwbGl0KCc/JylbMF07XG4gICAgY29uc3QgcGFyYW1TdHJpbmcgPSBPYmplY3Qua2V5cyhwYXJhbXMpXG4gICAgICAubWFwKChrKSA9PiBgJHtrfT0ke3BhcmFtc1trXX1gKVxuICAgICAgLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChgJHtiYXNlVXJsfT8ke3BhcmFtU3RyaW5nfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIGEgVVJMLlxuICAgKi9cbiAgcHVibGljIHVybGlmeSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gdmFsdWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIC8vIFJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICAucmVwbGFjZShcbiAgICAgICAgL1tcXF9cXH5cXGBcXEBcXCFcXCNcXCRcXCVcXF5cXCZcXCpcXChcXClcXFtcXF1cXHtcXH1cXDtcXDpcXCdcXC9cXFxcXFw8XFw+XFwsXFwuXFw/XFw9XFwrXFx8XCJdL2csXG4gICAgICAgICcnXG4gICAgICApXG5cbiAgICAgIC8vIFJlcGxhY2Ugc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgZGFzaC5cbiAgICAgIC5yZXBsYWNlKC9cXHMvZywgJy0nKVxuXG4gICAgICAvLyBSZW1vdmUgYW55IGRvdWJsZS1kYXNoZXMuXG4gICAgICAucmVwbGFjZSgvLS0vZywgJy0nKTtcblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgcXVlcnkgcGFyYW1zIHRoYXQgZXhpc3QgaW4gdGhlIGN1cnJlbnQgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXJhbXMoKTogUGVybWFsaW5rUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXM6IFBlcm1hbGlua1BhcmFtcyA9IHt9O1xuXG4gICAgY29uc3QgcGF0aCA9IHRoaXMubG9jYXRpb24ucGF0aCgpO1xuICAgIGlmIChwYXRoLmluZGV4T2YoJz8nKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdQYXJhbVBhaXJzID0gcGF0aC5zcGxpdCgnPycpWzFdLnNwbGl0KCcmJyk7XG4gICAgZXhpc3RpbmdQYXJhbVBhaXJzLmZvckVhY2goKHBhaXIpID0+IHtcbiAgICAgIGNvbnN0IGZyYWdtZW50cyA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgIHBhcmFtc1tmcmFnbWVudHNbMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KGZyYWdtZW50c1sxXSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXN0eWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFicy9zcmMvbW9kdWxlcy90YWJzL3RhYnNldC1zdHlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgU2t5VGFic2V0U3R5bGUgPSAndGFicycgfCAnd2l6YXJkJztcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXRhYi1pbmRleGVzLWNoYW5nZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYnMvc3JjL21vZHVsZXMvdGFicy90YWJzZXQtdGFiLWluZGV4ZXMtY2hhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTa3lUYWJJbmRleCB9IGZyb20gJy4vdGFiLWluZGV4JztcblxuZXhwb3J0IGludGVyZmFjZSBTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlIHtcbiAgdGFicz86IHtcbiAgICB0YWJIZWFkaW5nOiBzdHJpbmc7XG5cbiAgICB0YWJJbmRleDogU2t5VGFiSW5kZXg7XG4gIH1bXTtcbn1cbiJdfQ==
@@ -1,405 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
2
- import { combineLatest, race, Subject } from 'rxjs';
3
- import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
4
- import { SkyTabComponent } from './tab.component';
5
- import { SkyTabsetAdapterService } from './tabset-adapter.service';
6
- import { SkyTabsetPermalinkService } from './tabset-permalink.service';
7
- import { SkyTabsetService } from './tabset.service';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./tabset-adapter.service";
10
- import * as i2 from "./tabset-permalink.service";
11
- import * as i3 from "./tabset.service";
12
- import * as i4 from "@skyux/popovers";
13
- import * as i5 from "@skyux/indicators";
14
- import * as i6 from "./tab-button.component";
15
- import * as i7 from "@angular/common";
16
- import * as i8 from "@skyux/theme";
17
- import * as i9 from "@skyux/i18n";
18
- export class SkyTabsetComponent {
19
- constructor(changeDetector, elementRef, adapterService, permalinkService, tabsetService) {
20
- this.changeDetector = changeDetector;
21
- this.elementRef = elementRef;
22
- this.adapterService = adapterService;
23
- this.permalinkService = permalinkService;
24
- this.tabsetService = tabsetService;
25
- /**
26
- * Fires when the active tab changes. This event emits the index of the active tab.
27
- */
28
- this.activeChange = new EventEmitter();
29
- /**
30
- * Fires when users click the button to add a new tab.
31
- * The new tab button is added to the tab area when you specify a listener for this event.
32
- */
33
- this.newTab = new EventEmitter();
34
- /**
35
- * Fires when users click the button to open a tab.
36
- * The open tab button is added to the tab area when you specify a listener for this event.
37
- */
38
- this.openTab = new EventEmitter();
39
- /**
40
- * Fires when any tab's `tabIndex` value changes.
41
- */
42
- this.tabIndexesChange = new EventEmitter();
43
- this.tabButtons = [];
44
- this.ngUnsubscribe = new Subject();
45
- this.tabComponentsStateChangeUnsubscribe = new Subject();
46
- }
47
- /**
48
- * Activates a tab by its `tabIndex` property.
49
- */
50
- set active(value) {
51
- if (value === undefined ||
52
- this.tabsetService.tabIndexesEqual(value, this._active)) {
53
- return;
54
- }
55
- this._active = value;
56
- if (this.tabs) {
57
- this.tabsetService.setActiveTabIndex(value);
58
- }
59
- else {
60
- // On init, wait for children tabs to render before broadcasting the active tab index.
61
- setTimeout(() => {
62
- if (this.tabsetService.isValidTabIndex(value)) {
63
- // On init, yield to the permalink ID, if it exists.
64
- if (this.getActiveTabIndexByPermalinkId() === undefined) {
65
- this.tabsetService.setActiveTabIndex(value);
66
- }
67
- }
68
- else {
69
- // Activate the first tab if the new tab index is invalid.
70
- this._active = this.tabsetService.activateFirstTab();
71
- }
72
- });
73
- }
74
- }
75
- get active() {
76
- return this._active;
77
- }
78
- /**
79
- * Distinguishes a tabset's unique state in the URL by generating a query parameter
80
- * that is written as `?<queryParam>-active-tab=<sanitized-tab-heading>`.
81
- * The query parameter's value is parsed automatically from the selected tab's heading text,
82
- * but you can supply a custom query parameter value for each tab with its `permalinkValue`.
83
- */
84
- set permalinkId(value) {
85
- if (!value) {
86
- return;
87
- }
88
- const sanitized = this.permalinkService.urlify(value);
89
- this._permalinkId = `${sanitized}-active-tab`;
90
- }
91
- get permalinkId() {
92
- return this._permalinkId || '';
93
- }
94
- /**
95
- * Specifies the behavior for a series of tabs.
96
- * @deprecated The property was designed to create wizards by setting tabStyle="wizard" on tabsets in modals,
97
- * but this wizard implementation was replaced by the
98
- * [progress indicator component](https://developer.blackbaud.com/skyux/components/progress-indicator).
99
- * @default 'tabs'
100
- */
101
- set tabStyle(value) {
102
- /*istanbul ignore else*/
103
- if (value && value.toLowerCase() === 'wizard') {
104
- console.warn('The tabset wizard is deprecated. Please implement the new approach using ' +
105
- 'progress indicator as documented here: https://developer.blackbaud.com/skyux/components/wizard.');
106
- }
107
- this._tabStyle = value;
108
- }
109
- get tabStyle() {
110
- return this._tabStyle || 'tabs';
111
- }
112
- set tabDisplayMode(value) {
113
- this._tabDisplayMode = value;
114
- this.changeDetector.markForCheck();
115
- }
116
- get tabDisplayMode() {
117
- return this._tabDisplayMode || 'tabs';
118
- }
119
- ngAfterViewInit() {
120
- this.initTabComponents();
121
- this.listenTabComponentsStructuralChange();
122
- const initialTabIndex = this.getInitialTabIndex();
123
- this.tabsetService.setActiveTabIndex(initialTabIndex);
124
- this.listenTabButtonsOverflowChange();
125
- this.listenLocationPopStateChange();
126
- // If the currently active tab is getting unregistered, activate the next one.
127
- this.tabsetService.activeTabUnregistered
128
- .pipe(takeUntil(this.ngUnsubscribe))
129
- .subscribe((tab) => {
130
- // Wait for the new tabs to render before activating.
131
- setTimeout(() => {
132
- this.tabsetService.activateNearestTab(tab.arrayIndex);
133
- });
134
- });
135
- // Let the tabset render the initial active index before listening for changes.
136
- setTimeout(() => {
137
- this.listenTabComponentsStateChange();
138
- this.listenActiveIndexChange();
139
- this.permalinkService.init();
140
- });
141
- }
142
- ngOnDestroy() {
143
- this.ngUnsubscribe.next();
144
- this.ngUnsubscribe.complete();
145
- this.unsubscribeTabComponentsStateChange();
146
- this.permalinkService.clearParam(this.permalinkId);
147
- }
148
- onWindowResize() {
149
- this.adapterService.detectOverflow();
150
- }
151
- onTabCloseClick(tabButton) {
152
- const tabComponent = this.tabs.find((tab) => this.tabsetService.tabIndexesEqual(tab.tabIndex, tabButton.tabIndex));
153
- tabComponent.close.emit();
154
- }
155
- onTabButtonClick(tabButton) {
156
- this.tabsetService.setActiveTabIndex(tabButton.tabIndex);
157
- }
158
- onNewTabClick() {
159
- this.newTab.emit();
160
- }
161
- onOpenTabClick() {
162
- this.openTab.emit();
163
- }
164
- /**
165
- * Sets the initial active tab index based on the following criteria.
166
- * 1. Does the URL include a query param that reflects this tabset's active tab?
167
- * 2. Does one of the tab components have their `active` property set to `true`?
168
- * 3. Is the tabset component's `active` property set to a specific tab index?
169
- */
170
- getInitialTabIndex() {
171
- var _a;
172
- let activeIndex = this.getActiveTabIndexByPermalinkId();
173
- if (activeIndex === undefined) {
174
- activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
175
- if (activeIndex === undefined) {
176
- activeIndex = this.active;
177
- }
178
- }
179
- return activeIndex;
180
- }
181
- listenActiveIndexChange() {
182
- this.tabsetService.activeTabIndex
183
- .pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
184
- .subscribe((activeIndex) => {
185
- this.updateTabsetComponent(activeIndex);
186
- });
187
- }
188
- listenTabComponentsStructuralChange() {
189
- this.tabs.changes.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
190
- this.resetTabComponents();
191
- });
192
- }
193
- listenTabComponentsStateChange() {
194
- combineLatest(this.tabs.map((tab) => tab.activeChange))
195
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
196
- .subscribe(() => {
197
- // Wait for the tab components to render changes before finding the active one.
198
- setTimeout(() => {
199
- var _a;
200
- const tabIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
201
- this.tabsetService.setActiveTabIndex(tabIndex);
202
- });
203
- });
204
- combineLatest(this.tabs.map((tab) => tab.tabIndexChange))
205
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
206
- .subscribe(() => {
207
- // Don't emit the first change.
208
- if (this.lastActiveTabIndex !== undefined) {
209
- // Wait for the tab components to render changes before updating the view.
210
- setTimeout(() => {
211
- this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
212
- this.emitTabIndexChange();
213
- });
214
- }
215
- });
216
- combineLatest(this.tabs.map((tab) => tab.stateChange))
217
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
218
- .subscribe(() => {
219
- // Wait for the tab components to render changes before finding the active one.
220
- setTimeout(() => {
221
- this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
222
- });
223
- });
224
- }
225
- initTabComponents() {
226
- this.tabs.forEach((tab) => tab.init());
227
- }
228
- resetTabComponents() {
229
- var _a;
230
- this.unsubscribeTabComponentsStateChange();
231
- this.tabsetService.unregisterAll();
232
- // If there are no tab components, do a hard reset of the view.
233
- if (this.tabs.length === 0) {
234
- this.updateTabsetComponent(0, true);
235
- return;
236
- }
237
- this.initTabComponents();
238
- const activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
239
- this.tabsetService.setActiveTabIndex(activeIndex, {
240
- emitChange: false,
241
- });
242
- this.listenTabComponentsStateChange();
243
- }
244
- emitTabIndexChange() {
245
- this.tabIndexesChange.emit({
246
- tabs: this.tabs.map((tab) => ({
247
- tabHeading: tab.tabHeading,
248
- tabIndex: tab.tabIndex,
249
- })),
250
- });
251
- }
252
- unsubscribeTabComponentsStateChange() {
253
- this.tabComponentsStateChangeUnsubscribe.next();
254
- this.tabComponentsStateChangeUnsubscribe.complete();
255
- this.tabComponentsStateChangeUnsubscribe = new Subject();
256
- }
257
- listenTabButtonsOverflowChange() {
258
- this.adapterService.registerTabset(this.elementRef);
259
- this.adapterService.overflowChange
260
- .pipe(takeUntil(this.ngUnsubscribe))
261
- .subscribe((isOverflowing) => {
262
- this.tabDisplayMode = isOverflowing ? 'dropdown' : 'tabs';
263
- this.changeDetector.markForCheck();
264
- });
265
- }
266
- /**
267
- * Listen for back/forward history button presses to detect query param changes in the URL.
268
- */
269
- listenLocationPopStateChange() {
270
- this.permalinkService.popStateChange
271
- .pipe(takeUntil(this.ngUnsubscribe))
272
- .subscribe(() => {
273
- this.setActiveTabIndexByPermalinkId();
274
- });
275
- }
276
- setActiveTabIndexByPermalinkId() {
277
- const activeIndex = this.getActiveTabIndexByPermalinkId();
278
- this.tabsetService.setActiveTabIndex(activeIndex);
279
- }
280
- getActiveTabIndexByPermalinkId() {
281
- var _a;
282
- if (this.permalinkId) {
283
- const paramValue = this.permalinkService.getParam(this.permalinkId);
284
- if (paramValue) {
285
- return (_a = this.tabs.find((tab) => tab.permalinkValue === paramValue)) === null || _a === void 0 ? void 0 : _a.tabIndex;
286
- }
287
- }
288
- }
289
- getActiveTabComponent() {
290
- return this.tabs
291
- .toArray()
292
- .reverse()
293
- .find((tab) => tab.active === true);
294
- }
295
- createTabButtons(activeIndex) {
296
- return this.tabs.map((tab) => ({
297
- active: this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),
298
- closeable: tab.closeable,
299
- ariaControls: tab.tabPanelId,
300
- disabled: tab.disabled,
301
- /*tslint:disable-next-line:no-null-keyword*/
302
- buttonHref: tab.disabled
303
- ? null
304
- : this.permalinkService.getParamHref(this.permalinkId, tab.permalinkValue),
305
- buttonId: tab.tabButtonId,
306
- buttonTextCount: tab.tabHeaderCount,
307
- buttonText: tab.tabHeading,
308
- tabIndex: tab.tabIndex,
309
- }));
310
- }
311
- updateTabButtons(activeIndex) {
312
- this.tabButtons.forEach((button) => {
313
- button.active = this.tabsetService.tabIndexesEqual(button.tabIndex, activeIndex);
314
- });
315
- }
316
- /**
317
- * Updates the UI and state of the tabset component after the tab index or
318
- * tab components have changed.
319
- * @param activeIndex The currently active tab index.
320
- * @param regenerateTabButtons Indicates if tab button view models should be regenerated.
321
- * Setting this value to `false` will simply update the existing tab buttons. Setting this value
322
- * to `true` is only necessary when the underlying tab components have changed and the tab
323
- * buttons must reflect those changes.
324
- */
325
- updateTabsetComponent(activeIndex, regenerateTabButtons = false) {
326
- var _a;
327
- // Activate/deactivate tab components.
328
- this.tabs.forEach((tab) => {
329
- this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)
330
- ? tab.activate()
331
- : tab.deactivate();
332
- });
333
- // Update the tab button models.
334
- if (regenerateTabButtons || !this.tabButtons.length) {
335
- this.tabButtons = this.createTabButtons(activeIndex);
336
- }
337
- else {
338
- this.updateTabButtons(activeIndex);
339
- }
340
- // Update the dropdown trigger button text.
341
- this.dropdownTriggerButtonText = (_a = this.tabButtons.find((b) => {
342
- return this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);
343
- })) === null || _a === void 0 ? void 0 : _a.buttonText;
344
- // Set the query params based on active tab.
345
- if (this.permalinkId) {
346
- const activeTabComponent = this.tabs.find((tab) => {
347
- return this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);
348
- });
349
- this.permalinkService.setParam(this.permalinkId, activeTabComponent.permalinkValue);
350
- }
351
- // Wait for tab button view models to render before gauging dimensions.
352
- setTimeout(() => {
353
- this.adapterService.detectOverflow();
354
- });
355
- this.changeDetector.markForCheck();
356
- // Emit the new active index value to consumers.
357
- if (this.lastActiveTabIndex !== activeIndex) {
358
- this.lastActiveTabIndex = activeIndex;
359
- this.activeChange.emit(activeIndex);
360
- }
361
- }
362
- }
363
- SkyTabsetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyTabsetComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyTabsetAdapterService }, { token: i2.SkyTabsetPermalinkService }, { token: i3.SkyTabsetService }], target: i0.ɵɵFactoryTarget.Component });
364
- SkyTabsetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: SkyTabsetComponent, selector: "sky-tabset", inputs: { active: "active", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", permalinkId: "permalinkId", tabStyle: "tabStyle" }, outputs: { activeChange: "activeChange", newTab: "newTab", openTab: "openTab", tabIndexesChange: "tabIndexesChange" }, providers: [
365
- SkyTabsetAdapterService,
366
- SkyTabsetPermalinkService,
367
- SkyTabsetService,
368
- ], queries: [{ propertyName: "tabs", predicate: SkyTabComponent }], ngImport: i0, template: "<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"\n 'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\n \"\n (window:resize)=\"onWindowResize()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\" buttonType=\"tab\">\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item\n *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span class=\"sky-tabset-tabs\">\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container\n *ngTemplateOutlet=\"\n tabButtonTemplate;\n context: {\n $implicit: tabButton\n }\n \"\n ></ng-container>\n </ng-container>\n </span>\n <span class=\"sky-tabset-btns\">\n <button\n *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon icon=\"plus-circle\" size=\"lg\"> </sky-icon>\n </button>\n <button\n *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon icon=\"folder-open-o\" size=\"lg\"> </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template let-tabButton #tabButtonTemplate>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabStyle]=\"tabStyle\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n", styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;padding-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}\n"], components: [{ type: i4.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { type: i4.λ2, selector: "sky-dropdown-button" }, { type: i4.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { type: i4.λ1, selector: "sky-dropdown-item", inputs: ["ariaRole"] }, { type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.SkyTabButtonComponent, selector: "sky-tab-button", inputs: ["active", "ariaControls", "buttonHref", "buttonId", "buttonText", "buttonTextCount", "closeable", "disabled", "tabStyle"], outputs: ["buttonClick", "closeClick"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }], pipes: { "skyLibResources": i9.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
369
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SkyTabsetComponent, decorators: [{
370
- type: Component,
371
- args: [{
372
- selector: 'sky-tabset',
373
- styleUrls: ['./tabset.component.scss'],
374
- templateUrl: './tabset.component.html',
375
- providers: [
376
- SkyTabsetAdapterService,
377
- SkyTabsetPermalinkService,
378
- SkyTabsetService,
379
- ],
380
- changeDetection: ChangeDetectionStrategy.OnPush,
381
- encapsulation: ViewEncapsulation.None,
382
- }]
383
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyTabsetAdapterService }, { type: i2.SkyTabsetPermalinkService }, { type: i3.SkyTabsetService }]; }, propDecorators: { active: [{
384
- type: Input
385
- }], ariaLabel: [{
386
- type: Input
387
- }], ariaLabelledBy: [{
388
- type: Input
389
- }], permalinkId: [{
390
- type: Input
391
- }], tabStyle: [{
392
- type: Input
393
- }], activeChange: [{
394
- type: Output
395
- }], newTab: [{
396
- type: Output
397
- }], openTab: [{
398
- type: Output
399
- }], tabIndexesChange: [{
400
- type: Output
401
- }], tabs: [{
402
- type: ContentChildren,
403
- args: [SkyTabComponent]
404
- }] } });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYnMvc3JjL21vZHVsZXMvdGFicy90YWJzZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFicy9zcmMvbW9kdWxlcy90YWJzL3RhYnNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSW5FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQStCcEQsTUFBTSxPQUFPLGtCQUFrQjtJQThKN0IsWUFDVSxjQUFpQyxFQUNqQyxVQUFzQixFQUN0QixjQUF1QyxFQUN2QyxnQkFBMkMsRUFDM0MsYUFBK0I7UUFKL0IsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBQ3ZDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkI7UUFDM0Msa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBakV6Qzs7V0FFRztRQUVJLGlCQUFZLEdB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QUUsQ0FBQztRQUVuQyxnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssV0FBVyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDOztnSEF6ZFUsa0JBQWtCO29HQUFsQixrQkFBa0Isc1NBUmxCO1FBQ1QsdUJBQXVCO1FBQ3ZCLHlCQUF5QjtRQUN6QixnQkFBZ0I7S0FDakIsK0NBeUlnQixlQUFlLDZCQ25NbEMsbzhGQStGQTs0RkRqQ2Esa0JBQWtCO2tCQVo5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxZQUFZO29CQUN0QixTQUFTLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztvQkFDdEMsV0FBVyxFQUFFLHlCQUF5QjtvQkFDdEMsU0FBUyxFQUFFO3dCQUNULHVCQUF1Qjt3QkFDdkIseUJBQXlCO3dCQUN6QixnQkFBZ0I7cUJBQ2pCO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7OE9BTVksTUFBTTtzQkFEaEIsS0FBSztnQkF1Q0MsU0FBUztzQkFEZixLQUFLO2dCQVVDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBVUssV0FBVztzQkFEckIsS0FBSztnQkFzQkssUUFBUTtzQkFEbEIsS0FBSztnQkFxQkMsWUFBWTtzQkFEbEIsTUFBTTtnQkFRQSxNQUFNO3NCQURaLE1BQU07Z0JBUUEsT0FBTztzQkFEYixNQUFNO2dCQU9BLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFhQSxJQUFJO3NCQURWLGVBQWU7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgcmFjZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lUYWJJbmRleCB9IGZyb20gJy4vdGFiLWluZGV4JztcblxuaW1wb3J0IHsgU2t5VGFic2V0U3R5bGUgfSBmcm9tICcuL3RhYnNldC1zdHlsZSc7XG5cbmltcG9ydCB7IFNreVRhYkNvbXBvbmVudCB9IGZyb20gJy4vdGFiLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi90YWJzZXQtYWRhcHRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlIH0gZnJvbSAnLi90YWJzZXQtYnV0dG9ucy1kaXNwbGF5LW1vZGUnO1xuXG5pbXBvcnQgeyBTa3lUYWJzZXRQZXJtYWxpbmtTZXJ2aWNlIH0gZnJvbSAnLi90YWJzZXQtcGVybWFsaW5rLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTa3lUYWJzZXRTZXJ2aWNlIH0gZnJvbSAnLi90YWJzZXQuc2VydmljZSc7XG5cbmltcG9ydCB7IFNreVRhYnNldFRhYkluZGV4ZXNDaGFuZ2UgfSBmcm9tICcuL3RhYnNldC10YWItaW5kZXhlcy1jaGFuZ2UnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgVGFiQnV0dG9uVmlld01vZGVsIHtcbiAgYWN0aXZlOiBib29sZWFuO1xuICBhcmlhQ29udHJvbHM6IHN0cmluZztcbiAgYnV0dG9uSHJlZjogc3RyaW5nO1xuICBidXR0b25JZDogc3RyaW5nO1xuICBidXR0b25UZXh0OiBzdHJpbmc7XG4gIGJ1dHRvblRleHRDb3VudDogc3RyaW5nO1xuICBjbG9zZWFibGU6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICB0YWJJbmRleDogU2t5VGFiSW5kZXg7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS10YWJzZXQnLFxuICBzdHlsZVVybHM6IFsnLi90YWJzZXQuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnNldC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlLFxuICAgIFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UsXG4gICAgU2t5VGFic2V0U2VydmljZSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRhYnNldENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgYSB0YWIgYnkgaXRzIGB0YWJJbmRleGAgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGFjdGl2ZSh2YWx1ZTogU2t5VGFiSW5kZXgpIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHZhbHVlLCB0aGlzLl9hY3RpdmUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPbiBpbml0LCB3YWl0IGZvciBjaGlsZHJlbiB0YWJzIHRvIHJlbmRlciBiZWZvcmUgYnJvYWRjYXN0aW5nIHRoZSBhY3RpdmUgdGFiIGluZGV4LlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRhYnNldFNlcnZpY2UuaXNWYWxpZFRhYkluZGV4KHZhbHVlKSkge1xuICAgICAgICAgIC8vIE9uIGluaXQsIHlpZWxkIHRvIHRoZSBwZXJtYWxpbmsgSUQsIGlmIGl0IGV4aXN0cy5cbiAgICAgICAgICBpZiAodGhpcy5nZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgZmlyc3QgdGFiIGlmIHRoZSBuZXcgdGFiIGluZGV4IGlzIGludmFsaWQuXG4gICAgICAgICAgdGhpcy5fYWN0aXZlID0gdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2YXRlRmlyc3RUYWIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmUoKTogU2t5VGFiSW5kZXgge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIEFSSUEgbGFiZWwgZm9yIHRoZSB0YWJzZXQuIFRoaXMgc2V0cyB0aGUgdGFic2V0J3MgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgdGFic2V0IGluY2x1ZGVzIGEgdmlzaWJsZSBsYWJlbCwgdXNlIGBhcmlhTGFiZWxsZWRCeWAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBIVE1MIGVsZW1lbnQgSUQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYCNgKSBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgdGFic2V0LiBUaGlzIHNldHMgdGhlIHRhYnNldCdzIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZVxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgdGFic2V0IGRvZXMgbm90IGluY2x1ZGUgYSB2aXNpYmxlIGxhYmVsLCB1c2UgYGFyaWFMYWJlbGAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXN0aW5ndWlzaGVzIGEgdGFic2V0J3MgdW5pcXVlIHN0YXRlIGluIHRoZSBVUkwgYnkgZ2VuZXJhdGluZyBhIHF1ZXJ5IHBhcmFtZXRlclxuICAgKiB0aGF0IGlzIHdyaXR0ZW4gYXMgYD88cXVlcnlQYXJhbT4tYWN0aXZlLXRhYj08c2FuaXRpemVkLXRhYi1oZWFkaW5nPmAuXG4gICAqIFRoZSBxdWVyeSBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBwYXJzZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBzZWxlY3RlZCB0YWIncyBoZWFkaW5nIHRleHQsXG4gICAqIGJ1dCB5b3UgY2FuIHN1cHBseSBhIGN1c3RvbSBxdWVyeSBwYXJhbWV0ZXIgdmFsdWUgZm9yIGVhY2ggdGFiIHdpdGggaXRzIGBwZXJtYWxpbmtWYWx1ZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHBlcm1hbGlua0lkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLnVybGlmeSh2YWx1ZSk7XG4gICAgdGhpcy5fcGVybWFsaW5rSWQgPSBgJHtzYW5pdGl6ZWR9LWFjdGl2ZS10YWJgO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJtYWxpbmtJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wZXJtYWxpbmtJZCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGJlaGF2aW9yIGZvciBhIHNlcmllcyBvZiB0YWJzLlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgcHJvcGVydHkgd2FzIGRlc2lnbmVkIHRvIGNyZWF0ZSB3aXphcmRzIGJ5IHNldHRpbmcgdGFiU3R5bGU9XCJ3aXphcmRcIiBvbiB0YWJzZXRzIGluIG1vZGFscyxcbiAgICogYnV0IHRoaXMgd2l6YXJkIGltcGxlbWVudGF0aW9uIHdhcyByZXBsYWNlZCBieSB0aGVcbiAgICogW3Byb2dyZXNzIGluZGljYXRvciBjb21wb25lbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9wcm9ncmVzcy1pbmRpY2F0b3IpLlxuICAgKiBAZGVmYXVsdCAndGFicydcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdGFiU3R5bGUodmFsdWU6IFNreVRhYnNldFN0eWxlKSB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZWxzZSovXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd3aXphcmQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdUaGUgdGFic2V0IHdpemFyZCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgaW1wbGVtZW50IHRoZSBuZXcgYXBwcm9hY2ggdXNpbmcgJyArXG4gICAgICAgICAgJ3Byb2dyZXNzIGluZGljYXRvciBhcyBkb2N1bWVudGVkIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy93aXphcmQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJTdHlsZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJTdHlsZSgpOiBTa3lUYWJzZXRTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYlN0eWxlIHx8ICd0YWJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMuIFRoaXMgZXZlbnQgZW1pdHMgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreVRhYkluZGV4PigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGNsaWNrIHRoZSBidXR0b24gdG8gYWRkIGEgbmV3IHRhYi5cbiAgICogVGhlIG5ldyB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG5ld1RhYiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjbGljayB0aGUgYnV0dG9uIHRvIG9wZW4gYSB0YWIuXG4gICAqIFRoZSBvcGVuIHRhYiBidXR0b24gaXMgYWRkZWQgdG8gdGhlIHRhYiBhcmVhIHdoZW4geW91IHNwZWNpZnkgYSBsaXN0ZW5lciBmb3IgdGhpcyBldmVudC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb3BlblRhYiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbnkgdGFiJ3MgYHRhYkluZGV4YCB2YWx1ZSBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0YWJJbmRleGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlPigpO1xuXG4gIHB1YmxpYyBzZXQgdGFiRGlzcGxheU1vZGUodmFsdWU6IFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZSkge1xuICAgIHRoaXMuX3RhYkRpc3BsYXlNb2RlID0gdmFsdWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFiRGlzcGxheU1vZGUoKTogU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiRGlzcGxheU1vZGUgfHwgJ3RhYnMnO1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lUYWJDb21wb25lbnQpXG4gIHB1YmxpYyB0YWJzOiBRdWVyeUxpc3Q8U2t5VGFiQ29tcG9uZW50PjtcblxuICBwdWJsaWMgZHJvcGRvd25UcmlnZ2VyQnV0dG9uVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGRlcHJlY2F0ZWQgdGFic2V0LW5hdi1idXR0b24gY29tcG9uZW50LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBsYXN0QWN0aXZlVGFiSW5kZXg6IFNreVRhYkluZGV4O1xuXG4gIHB1YmxpYyB0YWJCdXR0b25zOiBUYWJCdXR0b25WaWV3TW9kZWxbXSA9IFtdO1xuXG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSB0YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfYWN0aXZlOiBTa3lUYWJJbmRleDtcblxuICBwcml2YXRlIF9wZXJtYWxpbmtJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3RhYkRpc3BsYXlNb2RlOiBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGU7XG5cbiAgcHJpdmF0ZSBfdGFiU3R5bGU6IFNreVRhYnNldFN0eWxlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lUYWJzZXRBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1hbGlua1NlcnZpY2U6IFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YWJzZXRTZXJ2aWNlOiBTa3lUYWJzZXRTZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFRhYkNvbXBvbmVudHMoKTtcbiAgICB0aGlzLmxpc3RlblRhYkNvbXBvbmVudHNTdHJ1Y3R1cmFsQ2hhbmdlKCk7XG5cbiAgICBjb25zdCBpbml0aWFsVGFiSW5kZXggPSB0aGlzLmdldEluaXRpYWxUYWJJbmRleCgpO1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChpbml0aWFsVGFiSW5kZXgpO1xuXG4gICAgdGhpcy5saXN0ZW5UYWJCdXR0b25zT3ZlcmZsb3dDaGFuZ2UoKTtcbiAgICB0aGlzLmxpc3RlbkxvY2F0aW9uUG9wU3RhdGVDaGFuZ2UoKTtcblxuICAgIC8vIElmIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYiBpcyBnZXR0aW5nIHVucmVnaXN0ZXJlZCwgYWN0aXZhdGUgdGhlIG5leHQgb25lLlxuICAgIHRoaXMudGFic2V0U2VydmljZS5hY3RpdmVUYWJVbnJlZ2lzdGVyZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgodGFiKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXcgdGFicyB0byByZW5kZXIgYmVmb3JlIGFjdGl2YXRpbmcuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGFic2V0U2VydmljZS5hY3RpdmF0ZU5lYXJlc3RUYWIodGFiLmFycmF5SW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgLy8gTGV0IHRoZSB0YWJzZXQgcmVuZGVyIHRoZSBpbml0aWFsIGFjdGl2ZSBpbmRleCBiZWZvcmUgbGlzdGVuaW5nIGZvciBjaGFuZ2VzLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5saXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgICAgIHRoaXMubGlzdGVuQWN0aXZlSW5kZXhDaGFuZ2UoKTtcbiAgICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5pbml0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmNsZWFyUGFyYW0odGhpcy5wZXJtYWxpbmtJZCk7XG4gIH1cblxuICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5kZXRlY3RPdmVyZmxvdygpO1xuICB9XG5cbiAgcHVibGljIG9uVGFiQ2xvc2VDbGljayh0YWJCdXR0b246IFRhYkJ1dHRvblZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYkNvbXBvbmVudCA9IHRoaXMudGFicy5maW5kKCh0YWIpID0+XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgdGFiQnV0dG9uLnRhYkluZGV4KVxuICAgICk7XG5cbiAgICB0YWJDb21wb25lbnQuY2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uVGFiQnV0dG9uQ2xpY2sodGFiQnV0dG9uOiBUYWJCdXR0b25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodGFiQnV0dG9uLnRhYkluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBvbk5ld1RhYkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMubmV3VGFiLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk9wZW5UYWJDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5UYWIuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGluaXRpYWwgYWN0aXZlIHRhYiBpbmRleCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhLlxuICAgKiAxLiBEb2VzIHRoZSBVUkwgaW5jbHVkZSBhIHF1ZXJ5IHBhcmFtIHRoYXQgcmVmbGVjdHMgdGhpcyB0YWJzZXQncyBhY3RpdmUgdGFiP1xuICAgKiAyLiBEb2VzIG9uZSBvZiB0aGUgdGFiIGNvbXBvbmVudHMgaGF2ZSB0aGVpciBgYWN0aXZlYCBwcm9wZXJ0eSBzZXQgdG8gYHRydWVgP1xuICAgKiAzLiBJcyB0aGUgdGFic2V0IGNvbXBvbmVudCdzIGBhY3RpdmVgIHByb3BlcnR5IHNldCB0byBhIHNwZWNpZmljIHRhYiBpbmRleD9cbiAgICovXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFRhYkluZGV4KCk6IFNreVRhYkluZGV4IHtcbiAgICBsZXQgYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTtcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5BY3RpdmVJbmRleENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UuYWN0aXZlVGFiSW5kZXhcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoYWN0aXZlSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVUYWJzZXRDb21wb25lbnQoYWN0aXZlSW5kZXgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRhYkNvbXBvbmVudHNTdHJ1Y3R1cmFsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFicy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlc2V0VGFiQ29tcG9uZW50cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKCh0YWIpID0+IHRhYi5hY3RpdmVDaGFuZ2UpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbChcbiAgICAgICAgICByYWNlKHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUsIHRoaXMubmdVbnN1YnNjcmliZSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0YWIgY29tcG9uZW50cyB0byByZW5kZXIgY2hhbmdlcyBiZWZvcmUgZmluZGluZyB0aGUgYWN0aXZlIG9uZS5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFiSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICAgICAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgodGFiSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKCh0YWIpID0+IHRhYi50YWJJbmRleENoYW5nZSkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKFxuICAgICAgICAgIHJhY2UodGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSwgdGhpcy5uZ1Vuc3Vic2NyaWJlKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgZW1pdCB0aGUgZmlyc3QgY2hhbmdlLlxuICAgICAgICBpZiAodGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0YWIgY29tcG9uZW50cyB0byByZW5kZXIgY2hhbmdlcyBiZWZvcmUgdXBkYXRpbmcgdGhlIHZpZXcuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudChcbiAgICAgICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLmN1cnJlbnRBY3RpdmVUYWJJbmRleCxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFRhYkluZGV4Q2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY29tYmluZUxhdGVzdCh0aGlzLnRhYnMubWFwKCh0YWIpID0+IHRhYi5zdGF0ZUNoYW5nZSkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKFxuICAgICAgICAgIHJhY2UodGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSwgdGhpcy5uZ1Vuc3Vic2NyaWJlKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSBmaW5kaW5nIHRoZSBhY3RpdmUgb25lLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudChcbiAgICAgICAgICAgIHRoaXMudGFic2V0U2VydmljZS5jdXJyZW50QWN0aXZlVGFiSW5kZXgsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRhYkNvbXBvbmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy50YWJzLmZvckVhY2goKHRhYikgPT4gdGFiLmluaXQoKSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGFiQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnVucmVnaXN0ZXJBbGwoKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyB0YWIgY29tcG9uZW50cywgZG8gYSBoYXJkIHJlc2V0IG9mIHRoZSB2aWV3LlxuICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudCgwLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRUYWJDb21wb25lbnRzKCk7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgoYWN0aXZlSW5kZXgsIHtcbiAgICAgIGVtaXRDaGFuZ2U6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMubGlzdGVuVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRUYWJJbmRleENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkluZGV4ZXNDaGFuZ2UuZW1pdCh7XG4gICAgICB0YWJzOiB0aGlzLnRhYnMubWFwKCh0YWIpID0+ICh7XG4gICAgICAgIHRhYkhlYWRpbmc6IHRhYi50YWJIZWFkaW5nLFxuICAgICAgICB0YWJJbmRleDogdGFiLnRhYkluZGV4LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZVRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRhYkJ1dHRvbnNPdmVyZmxvd0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnJlZ2lzdGVyVGFic2V0KHRoaXMuZWxlbWVudFJlZik7XG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5vdmVyZmxvd0NoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChpc092ZXJmbG93aW5nKSA9PiB7XG4gICAgICAgIHRoaXMudGFiRGlzcGxheU1vZGUgPSBpc092ZXJmbG93aW5nID8gJ2Ryb3Bkb3duJyA6ICd0YWJzJztcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYmFjay9mb3J3YXJkIGhpc3RvcnkgYnV0dG9uIHByZXNzZXMgdG8gZGV0ZWN0IHF1ZXJ5IHBhcmFtIGNoYW5nZXMgaW4gdGhlIFVSTC5cbiAgICovXG4gIHByaXZhdGUgbGlzdGVuTG9jYXRpb25Qb3BTdGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1hbGlua1NlcnZpY2UucG9wU3RhdGVDaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgoYWN0aXZlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTogU2t5VGFiSW5kZXgge1xuICAgIGlmICh0aGlzLnBlcm1hbGlua0lkKSB7XG4gICAgICBjb25zdCBwYXJhbVZhbHVlID0gdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmdldFBhcmFtKHRoaXMucGVybWFsaW5rSWQpO1xuICAgICAgaWYgKHBhcmFtVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFicy5maW5kKCh0YWIpID0+IHRhYi5wZXJtYWxpbmtWYWx1ZSA9PT0gcGFyYW1WYWx1ZSlcbiAgICAgICAgICA/LnRhYkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk6IFNreVRhYkNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMudGFic1xuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmQoKHRhYikgPT4gdGFiLmFjdGl2ZSA9PT0gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4KTogVGFiQnV0dG9uVmlld01vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLnRhYnMubWFwKCh0YWIpID0+ICh7XG4gICAgICBhY3RpdmU6IHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBhY3RpdmVJbmRleCksXG4gICAgICBjbG9zZWFibGU6IHRhYi5jbG9zZWFibGUsXG4gICAgICBhcmlhQ29udHJvbHM6IHRhYi50YWJQYW5lbElkLFxuICAgICAgZGlzYWJsZWQ6IHRhYi5kaXNhYmxlZCxcbiAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgICBidXR0b25IcmVmOiB0YWIuZGlzYWJsZWRcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmdldFBhcmFtSHJlZihcbiAgICAgICAgICAgIHRoaXMucGVybWFsaW5rSWQsXG4gICAgICAgICAgICB0YWIucGVybWFsaW5rVmFsdWVcbiAgICAgICAgICApLFxuICAgICAgYnV0dG9uSWQ6IHRhYi50YWJCdXR0b25JZCxcbiAgICAgIGJ1dHRvblRleHRDb3VudDogdGFiLnRhYkhlYWRlckNvdW50LFxuICAgICAgYnV0dG9uVGV4dDogdGFiLnRhYkhlYWRpbmcsXG4gICAgICB0YWJJbmRleDogdGFiLnRhYkluZGV4LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleDogU2t5VGFiSW5kZXgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uYWN0aXZlID0gdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbChcbiAgICAgICAgYnV0dG9uLnRhYkluZGV4LFxuICAgICAgICBhY3RpdmVJbmRleFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBVSSBhbmQgc3RhdGUgb2YgdGhlIHRhYnNldCBjb21wb25lbnQgYWZ0ZXIgdGhlIHRhYiBpbmRleCBvclxuICAgKiB0YWIgY29tcG9uZW50cyBoYXZlIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBhY3RpdmVJbmRleCBUaGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgaW5kZXguXG4gICAqIEBwYXJhbSByZWdlbmVyYXRlVGFiQnV0dG9ucyBJbmRpY2F0ZXMgaWYgdGFiIGJ1dHRvbiB2aWV3IG1vZGVscyBzaG91bGQgYmUgcmVnZW5lcmF0ZWQuXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byBgZmFsc2VgIHdpbGwgc2ltcGx5IHVwZGF0ZSB0aGUgZXhpc3RpbmcgdGFiIGJ1dHRvbnMuIFNldHRpbmcgdGhpcyB2YWx1ZVxuICAgKiB0byBgdHJ1ZWAgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgdW5kZXJseWluZyB0YWIgY29tcG9uZW50cyBoYXZlIGNoYW5nZWQgYW5kIHRoZSB0YWJcbiAgICogYnV0dG9ucyBtdXN0IHJlZmxlY3QgdGhvc2UgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVGFic2V0Q29tcG9uZW50KFxuICAgIGFjdGl2ZUluZGV4OiBTa3lUYWJJbmRleCxcbiAgICByZWdlbmVyYXRlVGFiQnV0dG9ucyA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIC8vIEFjdGl2YXRlL2RlYWN0aXZhdGUgdGFiIGNvbXBvbmVudHMuXG4gICAgdGhpcy50YWJzLmZvckVhY2goKHRhYikgPT4ge1xuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KVxuICAgICAgICA/IHRhYi5hY3RpdmF0ZSgpXG4gICAgICAgIDogdGFiLmRlYWN0aXZhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgdGFiIGJ1dHRvbiBtb2RlbHMuXG4gICAgaWYgKHJlZ2VuZXJhdGVUYWJCdXR0b25zIHx8ICF0aGlzLnRhYkJ1dHRvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRhYkJ1dHRvbnMgPSB0aGlzLmNyZWF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZHJvcGRvd24gdHJpZ2dlciBidXR0b24gdGV4dC5cbiAgICB0aGlzLmRyb3Bkb3duVHJpZ2dlckJ1dHRvblRleHQgPSB0aGlzLnRhYkJ1dHRvbnMuZmluZCgoYikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwoYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpO1xuICAgIH0pPy5idXR0b25UZXh0O1xuXG4gICAgLy8gU2V0IHRoZSBxdWVyeSBwYXJhbXMgYmFzZWQgb24gYWN0aXZlIHRhYi5cbiAgICBpZiAodGhpcy5wZXJtYWxpbmtJZCkge1xuICAgICAgY29uc3QgYWN0aXZlVGFiQ29tcG9uZW50ID0gdGhpcy50YWJzLmZpbmQoKHRhYikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLnNldFBhcmFtKFxuICAgICAgICB0aGlzLnBlcm1hbGlua0lkLFxuICAgICAgICBhY3RpdmVUYWJDb21wb25lbnQucGVybWFsaW5rVmFsdWVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgdGFiIGJ1dHRvbiB2aWV3IG1vZGVscyB0byByZW5kZXIgYmVmb3JlIGdhdWdpbmcgZGltZW5zaW9ucy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZGV0ZWN0T3ZlcmZsb3coKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBFbWl0IHRoZSBuZXcgYWN0aXZlIGluZGV4IHZhbHVlIHRvIGNvbnN1bWVycy5cbiAgICBpZiAodGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggIT09IGFjdGl2ZUluZGV4KSB7XG4gICAgICB0aGlzLmxhc3RBY3RpdmVUYWJJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdChhY3RpdmVJbmRleCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwic2t5LXRhYnNldFwiXG4gIHJvbGU9XCJ0YWJsaXN0XCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICBbbmdDbGFzc109XCJcbiAgICAnc2t5LXRhYnNldC1tb2RlLScgKyB0YWJEaXNwbGF5TW9kZSArICcgc2t5LXRhYnNldC1zdHlsZS0nICsgdGFiU3R5bGVcbiAgXCJcbiAgKHdpbmRvdzpyZXNpemUpPVwib25XaW5kb3dSZXNpemUoKVwiXG4+XG4gIDxzcGFuIGNsYXNzPVwic2t5LXRhYnNldC1kcm9wZG93blwiPlxuICAgIDxza3ktZHJvcGRvd24gKm5nSWY9XCJ0YWJEaXNwbGF5TW9kZSA9PT0gJ2Ryb3Bkb3duJ1wiIGJ1dHRvblR5cGU9XCJ0YWJcIj5cbiAgICAgIDxza3ktZHJvcGRvd24tYnV0dG9uPlxuICAgICAgICB7eyBkcm9wZG93blRyaWdnZXJCdXR0b25UZXh0IH19XG4gICAgICA8L3NreS1kcm9wZG93bi1idXR0b24+XG4gICAgICA8c2t5LWRyb3Bkb3duLW1lbnU+XG4gICAgICAgIDxza3ktZHJvcGRvd24taXRlbVxuICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWJCdXR0b24gb2YgdGFiQnV0dG9uc1wiXG4gICAgICAgICAgY2xhc3M9XCJza3ktdGFiLWRyb3Bkb3duLW1lbnUtaXRlbVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNreS10YWItZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdza3ktdGFiLWRyb3Bkb3duLWl0ZW0tc2VsZWN0ZWQnOiB0YWJCdXR0b24uYWN0aXZlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgdGFiQnV0dG9uVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiB0YWJCdXR0b25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2t5LWRyb3Bkb3duLWl0ZW0+XG4gICAgICA8L3NreS1kcm9wZG93bi1tZW51PlxuICAgIDwvc2t5LWRyb3Bkb3duPlxuICA8L3NwYW4+XG4gIDxzcGFuIGNsYXNzPVwic2t5LXRhYnNldC10YWJzXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFiQnV0dG9uIG9mIHRhYkJ1dHRvbnNcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICB0YWJCdXR0b25UZW1wbGF0ZTtcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRhYkJ1dHRvblxuICAgICAgICAgIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9zcGFuPlxuICA8c3BhbiBjbGFzcz1cInNreS10YWJzZXQtYnRuc1wiPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwibmV3VGFiLm9ic2VydmVycy5sZW5ndGggPiAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWljb24gc2t5LXRhYnNldC1idG4tbmV3IHNreS1tYXJnaW4taW5saW5lLWNvbXBhY3RcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidza3l1eF90YWJfYWRkJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICdza3ktbWFyZ2luLWlubGluZS1zbSc6ICdtb2Rlcm4nXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJvbk5ld1RhYkNsaWNrKClcIlxuICAgID5cbiAgICAgIDxza3ktaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIiBzaXplPVwibGdcIj4gPC9za3ktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cIm9wZW5UYWIub2JzZXJ2ZXJzLmxlbmd0aCA+IDBcIlxuICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4taWNvbiBza3ktdGFic2V0LWJ0bi1vcGVuIHNreS1tYXJnaW4taW5saW5lLWNvbXBhY3RcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidza3l1eF90YWJfb3BlbicgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgICAnc2t5LW1hcmdpbi1pbmxpbmUtc20nOiAnbW9kZXJuJ1xuICAgICAgfVwiXG4gICAgICAoY2xpY2spPVwib25PcGVuVGFiQ2xpY2soKVwiXG4gICAgPlxuICAgICAgPHNreS1pY29uIGljb249XCJmb2xkZXItb3Blbi1vXCIgc2l6ZT1cImxnXCI+IDwvc2t5LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvc3Bhbj5cbjwvZGl2PlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgbGV0LXRhYkJ1dHRvbiAjdGFiQnV0dG9uVGVtcGxhdGU+XG4gIDxza3ktdGFiLWJ1dHRvblxuICAgIFthY3RpdmVdPVwidGFiQnV0dG9uLmFjdGl2ZVwiXG4gICAgW2FyaWFDb250cm9sc109XCJ0YWJCdXR0b24uYXJpYUNvbnRyb2xzXCJcbiAgICBbYnV0dG9uSHJlZl09XCJ0YWJCdXR0b24uYnV0dG9uSHJlZlwiXG4gICAgW2J1dHRvbklkXT1cInRhYkJ1dHRvbi5idXR0b25JZFwiXG4gICAgW2J1dHRvblRleHRdPVwidGFiQnV0dG9uLmJ1dHRvblRleHRcIlxuICAgIFtidXR0b25UZXh0Q291bnRdPVwidGFiQnV0dG9uLmJ1dHRvblRleHRDb3VudFwiXG4gICAgW2Nsb3NlYWJsZV09XCJ0YWJCdXR0b24uY2xvc2VhYmxlXCJcbiAgICBbZGlzYWJsZWRdPVwidGFiQnV0dG9uLmRpc2FibGVkXCJcbiAgICBbdGFiU3R5bGVdPVwidGFiU3R5bGVcIlxuICAgIChidXR0b25DbGljayk9XCJvblRhYkJ1dHRvbkNsaWNrKHRhYkJ1dHRvbilcIlxuICAgIChjbG9zZUNsaWNrKT1cIm9uVGFiQ2xvc2VDbGljayh0YWJCdXR0b24pXCJcbiAgPjwvc2t5LXRhYi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19