@skyux/tabs 5.0.3 → 5.5.0-alpha.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 (128) hide show
  1. package/README.md +6 -4
  2. package/bundles/skyux-tabs-testing.umd.js +1 -1
  3. package/bundles/skyux-tabs.umd.js +267 -299
  4. package/documentation.json +829 -544
  5. package/esm2015/index.js +23 -0
  6. package/esm2015/index.js.map +1 -0
  7. package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js +67 -0
  8. package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js.map +1 -0
  9. package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js +116 -0
  10. package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js.map +1 -0
  11. package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js +35 -0
  12. package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js.map +1 -0
  13. package/esm2015/lib/modules/sectioned-form/sectioned-form.service.js +35 -0
  14. package/esm2015/lib/modules/sectioned-form/sectioned-form.service.js.map +1 -0
  15. package/esm2015/lib/modules/shared/sky-tabs-resources.module.js +52 -0
  16. package/esm2015/lib/modules/shared/sky-tabs-resources.module.js.map +1 -0
  17. package/esm2015/lib/modules/tabs/tab-button.component.js +76 -0
  18. package/esm2015/lib/modules/tabs/tab-button.component.js.map +1 -0
  19. package/esm2015/lib/modules/tabs/tab-index.js +2 -0
  20. package/esm2015/lib/modules/tabs/tab-index.js.map +1 -0
  21. package/esm2015/lib/modules/tabs/tab.component.js +135 -0
  22. package/esm2015/lib/modules/tabs/tab.component.js.map +1 -0
  23. package/esm2015/lib/modules/tabs/tabs.module.js +57 -0
  24. package/esm2015/lib/modules/tabs/tabs.module.js.map +1 -0
  25. package/esm2015/lib/modules/tabs/tabset-active-tab-unregistered-args.js +2 -0
  26. package/esm2015/lib/modules/tabs/tabset-active-tab-unregistered-args.js.map +1 -0
  27. package/esm2015/lib/modules/tabs/tabset-adapter.service.js +56 -0
  28. package/esm2015/lib/modules/tabs/tabset-adapter.service.js.map +1 -0
  29. package/esm2015/lib/modules/tabs/tabset-buttons-display-mode.js +2 -0
  30. package/esm2015/lib/modules/tabs/tabset-buttons-display-mode.js.map +1 -0
  31. package/esm2015/lib/modules/tabs/tabset-nav-button.component.js +119 -0
  32. package/esm2015/lib/modules/tabs/tabset-nav-button.component.js.map +1 -0
  33. package/esm2015/lib/modules/tabs/tabset-permalink.service.js +126 -0
  34. package/esm2015/lib/modules/tabs/tabset-permalink.service.js.map +1 -0
  35. package/esm2015/lib/modules/tabs/tabset-style.js +2 -0
  36. package/esm2015/lib/modules/tabs/tabset-style.js.map +1 -0
  37. package/esm2015/lib/modules/tabs/tabset-tab-indexes-change.js +2 -0
  38. package/esm2015/lib/modules/tabs/tabset-tab-indexes-change.js.map +1 -0
  39. package/esm2015/lib/modules/tabs/tabset.component.js +405 -0
  40. package/esm2015/lib/modules/tabs/tabset.component.js.map +1 -0
  41. package/esm2015/lib/modules/tabs/tabset.service.js +110 -0
  42. package/esm2015/lib/modules/tabs/tabset.service.js.map +1 -0
  43. package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js +72 -0
  44. package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js.map +1 -0
  45. package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js +203 -0
  46. package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js.map +1 -0
  47. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js +48 -0
  48. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js.map +1 -0
  49. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js +89 -0
  50. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js.map +1 -0
  51. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js +157 -0
  52. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js.map +1 -0
  53. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js +60 -0
  54. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js.map +1 -0
  55. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js +170 -0
  56. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js.map +1 -0
  57. package/esm2015/skyux-tabs.js +2 -2
  58. package/esm2015/skyux-tabs.js.map +1 -0
  59. package/esm2015/testing/public-api.js +1 -1
  60. package/esm2015/testing/public-api.js.map +1 -0
  61. package/esm2015/testing/skyux-tabs-testing.js +1 -1
  62. package/esm2015/testing/skyux-tabs-testing.js.map +1 -0
  63. package/esm2015/testing/tabs/tab-fixture-tab.js +1 -1
  64. package/esm2015/testing/tabs/tab-fixture-tab.js.map +1 -0
  65. package/esm2015/testing/tabs/tabset-fixture.js +2 -2
  66. package/esm2015/testing/tabs/tabset-fixture.js.map +1 -0
  67. package/fesm2015/skyux-tabs-testing.js +1 -1
  68. package/fesm2015/skyux-tabs-testing.js.map +1 -1
  69. package/fesm2015/skyux-tabs.js +382 -401
  70. package/fesm2015/skyux-tabs.js.map +1 -1
  71. package/index.d.ts +16 -0
  72. package/{modules → lib/modules}/sectioned-form/sectioned-form-section.component.d.ts +0 -3
  73. package/{modules → lib/modules}/sectioned-form/sectioned-form.component.d.ts +0 -0
  74. package/{modules → lib/modules}/sectioned-form/sectioned-form.module.d.ts +0 -0
  75. package/{modules → lib/modules}/sectioned-form/sectioned-form.service.d.ts +0 -0
  76. package/{modules → lib/modules}/shared/sky-tabs-resources.module.d.ts +0 -0
  77. package/{modules → lib/modules}/tabs/tab-button.component.d.ts +2 -2
  78. package/{modules → lib/modules}/tabs/tab-index.d.ts +0 -0
  79. package/{modules → lib/modules}/tabs/tab.component.d.ts +0 -0
  80. package/{modules → lib/modules}/tabs/tabs.module.d.ts +0 -0
  81. package/{modules → lib/modules}/tabs/tabset-active-tab-unregistered-args.d.ts +0 -0
  82. package/{modules → lib/modules}/tabs/tabset-adapter.service.d.ts +0 -0
  83. package/{modules → lib/modules}/tabs/tabset-buttons-display-mode.d.ts +0 -0
  84. package/{modules → lib/modules}/tabs/tabset-nav-button.component.d.ts +0 -0
  85. package/{modules → lib/modules}/tabs/tabset-permalink.service.d.ts +0 -0
  86. package/{modules → lib/modules}/tabs/tabset-style.d.ts +0 -0
  87. package/{modules → lib/modules}/tabs/tabset-tab-indexes-change.d.ts +0 -0
  88. package/{modules → lib/modules}/tabs/tabset.component.d.ts +1 -1
  89. package/{modules → lib/modules}/tabs/tabset.service.d.ts +0 -0
  90. package/{modules → lib/modules}/vertical-tabset/vertical-tab-media-query.service.d.ts +0 -0
  91. package/{modules → lib/modules}/vertical-tabset/vertical-tab.component.d.ts +8 -13
  92. package/{modules → lib/modules}/vertical-tabset/vertical-tabset-adapter.service.d.ts +0 -0
  93. package/{modules → lib/modules}/vertical-tabset/vertical-tabset-group.component.d.ts +2 -2
  94. package/{modules → lib/modules}/vertical-tabset/vertical-tabset.component.d.ts +17 -2
  95. package/{modules → lib/modules}/vertical-tabset/vertical-tabset.module.d.ts +4 -3
  96. package/{modules → lib/modules}/vertical-tabset/vertical-tabset.service.d.ts +0 -0
  97. package/package.json +11 -11
  98. package/skyux-tabs.d.ts +1 -1
  99. package/LICENSE +0 -21
  100. package/bundles/skyux-tabs-testing.umd.js.map +0 -1
  101. package/bundles/skyux-tabs.umd.js.map +0 -1
  102. package/esm2015/modules/sectioned-form/sectioned-form-section.component.js +0 -71
  103. package/esm2015/modules/sectioned-form/sectioned-form.component.js +0 -116
  104. package/esm2015/modules/sectioned-form/sectioned-form.module.js +0 -43
  105. package/esm2015/modules/sectioned-form/sectioned-form.service.js +0 -35
  106. package/esm2015/modules/shared/sky-tabs-resources.module.js +0 -41
  107. package/esm2015/modules/tabs/tab-button.component.js +0 -65
  108. package/esm2015/modules/tabs/tab-index.js +0 -2
  109. package/esm2015/modules/tabs/tab.component.js +0 -134
  110. package/esm2015/modules/tabs/tabs.module.js +0 -63
  111. package/esm2015/modules/tabs/tabset-active-tab-unregistered-args.js +0 -2
  112. package/esm2015/modules/tabs/tabset-adapter.service.js +0 -54
  113. package/esm2015/modules/tabs/tabset-buttons-display-mode.js +0 -2
  114. package/esm2015/modules/tabs/tabset-nav-button.component.js +0 -117
  115. package/esm2015/modules/tabs/tabset-permalink.service.js +0 -119
  116. package/esm2015/modules/tabs/tabset-style.js +0 -2
  117. package/esm2015/modules/tabs/tabset-tab-indexes-change.js +0 -2
  118. package/esm2015/modules/tabs/tabset.component.js +0 -402
  119. package/esm2015/modules/tabs/tabset.service.js +0 -111
  120. package/esm2015/modules/vertical-tabset/vertical-tab-media-query.service.js +0 -72
  121. package/esm2015/modules/vertical-tabset/vertical-tab.component.js +0 -187
  122. package/esm2015/modules/vertical-tabset/vertical-tabset-adapter.service.js +0 -48
  123. package/esm2015/modules/vertical-tabset/vertical-tabset-group.component.js +0 -134
  124. package/esm2015/modules/vertical-tabset/vertical-tabset.component.js +0 -152
  125. package/esm2015/modules/vertical-tabset/vertical-tabset.module.js +0 -60
  126. package/esm2015/modules/vertical-tabset/vertical-tabset.service.js +0 -170
  127. package/esm2015/public-api.js +0 -23
  128. package/public-api.d.ts +0 -16
@@ -1,119 +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.createUrlTree(['.'], {
49
- relativeTo: this.activatedRoute,
50
- queryParams: params,
51
- queryParamsHandling: 'merge'
52
- }).toString();
53
- // Abort redirect if the current URL is equal to the new URL.
54
- if (this.location.isCurrentPathEqualTo(url)) {
55
- return;
56
- }
57
- this.location.go(url);
58
- }
59
- /**
60
- * Removes the provided query param from the URL.
61
- */
62
- clearParam(name) {
63
- /*tslint:disable-next-line:no-null-keyword*/
64
- this.setParam(name, null);
65
- }
66
- /**
67
- * Returns a relative URL that includes the provided query parameter. The value is inteded to be
68
- * used by an HTML anchor element.
69
- */
70
- getParamHref(name, value) {
71
- if (!name) {
72
- /*tslint:disable-next-line:no-null-keyword*/
73
- return null;
74
- }
75
- const params = this.getParams();
76
- params[name] = value;
77
- const baseUrl = this.location.path().split('?')[0];
78
- const paramString = Object.keys(params).map(k => `${k}=${params[k]}`).join('&');
79
- return this.location.prepareExternalUrl(`${baseUrl}?${paramString}`);
80
- }
81
- /**
82
- * Converts the provided string into a value that can be safely used in a URL.
83
- */
84
- urlify(value) {
85
- if (!value) {
86
- return '';
87
- }
88
- const sanitized = value.toLowerCase()
89
- // Remove special characters.
90
- .replace(/[\_\~\`\@\!\#\$\%\^\&\*\(\)\[\]\{\}\;\:\'\/\\\<\>\,\.\?\=\+\|"]/g, '')
91
- // Replace space characters with a dash.
92
- .replace(/\s/g, '-')
93
- // Remove any double-dashes.
94
- .replace(/--/g, '-');
95
- return sanitized;
96
- }
97
- /**
98
- * Returns all query params that exist in the current URL.
99
- */
100
- getParams() {
101
- const params = {};
102
- const path = this.location.path();
103
- if (path.indexOf('?') === -1) {
104
- return params;
105
- }
106
- const existingParamPairs = path.split('?')[1].split('&');
107
- existingParamPairs.forEach((pair) => {
108
- const fragments = pair.split('=');
109
- params[fragments[0]] = decodeURIComponent(fragments[1]);
110
- });
111
- return params;
112
- }
113
- }
114
- SkyTabsetPermalinkService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTabsetPermalinkService, deps: [{ token: i1.ActivatedRoute }, { token: i2.Location }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
115
- SkyTabsetPermalinkService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTabsetPermalinkService });
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTabsetPermalinkService, decorators: [{
117
- type: Injectable
118
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.Location }, { type: i1.Router }]; } });
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXBlcm1hbGluay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFicy9zcmMvbW9kdWxlcy90YWJzL3RhYnNldC1wZXJtYWxpbmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQ0wsVUFBVSxFQUVYLE1BQU0sZUFBZSxDQUFDO0FBT3ZCLE9BQU8sRUFFTCxPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7Ozs7QUFTZDs7R0FFRztBQUVILE1BQU0sT0FBTyx5QkFBeUI7SUFVcEMsWUFDVSxjQUE4QixFQUM5QixRQUFrQixFQUNsQixNQUFjO1FBRmQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVBoQixvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFRMUMsQ0FBQztJQVpMLElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQVlNLFdBQVc7UUFDaEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDakM7SUFDSCxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQy9DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsSUFBWTtRQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUMsSUFB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QUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzt1SEFsSVUseUJBQXlCOzJIQUF6Qix5QkFBeUI7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIExvY2F0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGUsXG4gIFJvdXRlclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb25MaWtlXG59IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgUGVybWFsaW5rUGFyYW1zIHtcbiAgW186IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBnZXQgcG9wU3RhdGVDaGFuZ2UoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcFN0YXRlQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcG9wU3RhdGVDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25MaWtlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7IH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhdGlvbi5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fcG9wU3RhdGVDaGFuZ2UubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgVVJMIHF1ZXJ5IHBhcmFtLlxuICAgKi9cbiAgcHVibGljIGdldFBhcmFtKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1zKClbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBVUkwgcXVlcnkgcGFyYW0uXG4gICAqL1xuICBwdWJsaWMgc2V0UGFyYW0obmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZ2V0UGFyYW1zKCk7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSBwYXJhbXNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc1tuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgVVJMIHdpdGhvdXQgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gc3RhdGUgY2hhbmdlLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NDg2Njc3XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy4nXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiBwYXJhbXMsXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgfSkudG9TdHJpbmcoKTtcblxuICAgIC8vIEFib3J0IHJlZGlyZWN0IGlmIHRoZSBjdXJyZW50IFVSTCBpcyBlcXVhbCB0byB0aGUgbmV3IFVSTC5cbiAgICBpZiAodGhpcy5sb2NhdGlvbi5pc0N1cnJlbnRQYXRoRXF1YWxUbyh1cmwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbi5nbyh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtIGZyb20gdGhlIFVSTC5cbiAgICovXG4gIHB1YmxpYyBjbGVhclBhcmFtKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgdGhpcy5zZXRQYXJhbShuYW1lLCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVsYXRpdmUgVVJMIHRoYXQgaW5jbHVkZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIHZhbHVlIGlzIGludGVkZWQgdG8gYmVcbiAgICogdXNlZCBieSBhbiBIVE1MIGFuY2hvciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGdldFBhcmFtSHJlZihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtcygpO1xuICAgIHBhcmFtc1tuYW1lXSA9IHZhbHVlO1xuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMubG9jYXRpb24ucGF0aCgpLnNwbGl0KCc/JylbMF07XG4gICAgY29uc3QgcGFyYW1TdHJpbmcgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChrID0+IGAke2t9PSR7cGFyYW1zW2tdfWApLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChgJHtiYXNlVXJsfT8ke3BhcmFtU3RyaW5nfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIGEgVVJMLlxuICAgKi9cbiAgcHVibGljIHVybGlmeSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gdmFsdWUudG9Mb3dlckNhc2UoKVxuXG4gICAgICAvLyBSZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgICAgLnJlcGxhY2UoL1tcXF9cXH5cXGBcXEBcXCFcXCNcXCRcXCVcXF5cXCZcXCpcXChcXClcXFtcXF1cXHtcXH1cXDtcXDpcXCdcXC9cXFxcXFw8XFw+XFwsXFwuXFw/XFw9XFwrXFx8XCJdL2csICcnKVxuXG4gICAgICAvLyBSZXBsYWNlIHNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIGRhc2guXG4gICAgICAucmVwbGFjZSgvXFxzL2csICctJylcblxuICAgICAgLy8gUmVtb3ZlIGFueSBkb3VibGUtZGFzaGVzLlxuICAgICAgLnJlcGxhY2UoLy0tL2csICctJyk7XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHF1ZXJ5IHBhcmFtcyB0aGF0IGV4aXN0IGluIHRoZSBjdXJyZW50IFVSTC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFyYW1zKCk6IFBlcm1hbGlua1BhcmFtcyB7XG4gICAgY29uc3QgcGFyYW1zOiBQZXJtYWxpbmtQYXJhbXMgPSB7fTtcblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgoKTtcbiAgICBpZiAocGF0aC5pbmRleE9mKCc/JykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUGFyYW1QYWlycyA9IHBhdGguc3BsaXQoJz8nKVsxXS5zcGxpdCgnJicpO1xuICAgIGV4aXN0aW5nUGFyYW1QYWlycy5mb3JFYWNoKChwYWlyKSA9PiB7XG4gICAgICBjb25zdCBmcmFnbWVudHMgPSBwYWlyLnNwbGl0KCc9Jyk7XG4gICAgICBwYXJhbXNbZnJhZ21lbnRzWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChmcmFnbWVudHNbMV0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG59XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXRhYi1pbmRleGVzLWNoYW5nZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYnMvc3JjL21vZHVsZXMvdGFicy90YWJzZXQtdGFiLWluZGV4ZXMtY2hhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBTa3lUYWJJbmRleFxufSBmcm9tICcuL3RhYi1pbmRleCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2t5VGFic2V0VGFiSW5kZXhlc0NoYW5nZSB7XG5cbiAgdGFicz86IHtcblxuICAgIHRhYkhlYWRpbmc6IHN0cmluZztcblxuICAgIHRhYkluZGV4OiBTa3lUYWJJbmRleDtcblxuICB9W107XG5cbn1cbiJdfQ==
@@ -1,402 +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
190
- .pipe(takeUntil(this.ngUnsubscribe))
191
- .subscribe(() => {
192
- this.resetTabComponents();
193
- });
194
- }
195
- listenTabComponentsStateChange() {
196
- combineLatest(this.tabs.map(tab => tab.activeChange))
197
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
198
- .subscribe(() => {
199
- // Wait for the tab components to render changes before finding the active one.
200
- setTimeout(() => {
201
- var _a;
202
- const tabIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
203
- this.tabsetService.setActiveTabIndex(tabIndex);
204
- });
205
- });
206
- combineLatest(this.tabs.map(tab => tab.tabIndexChange))
207
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
208
- .subscribe(() => {
209
- // Don't emit the first change.
210
- if (this.lastActiveTabIndex !== undefined) {
211
- // Wait for the tab components to render changes before updating the view.
212
- setTimeout(() => {
213
- this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
214
- this.emitTabIndexChange();
215
- });
216
- }
217
- });
218
- combineLatest(this.tabs.map(tab => tab.stateChange))
219
- .pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
220
- .subscribe(() => {
221
- // Wait for the tab components to render changes before finding the active one.
222
- setTimeout(() => {
223
- this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
224
- });
225
- });
226
- }
227
- initTabComponents() {
228
- this.tabs.forEach(tab => tab.init());
229
- }
230
- resetTabComponents() {
231
- var _a;
232
- this.unsubscribeTabComponentsStateChange();
233
- this.tabsetService.unregisterAll();
234
- // If there are no tab components, do a hard reset of the view.
235
- if (this.tabs.length === 0) {
236
- this.updateTabsetComponent(0, true);
237
- return;
238
- }
239
- this.initTabComponents();
240
- const activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
241
- this.tabsetService.setActiveTabIndex(activeIndex, {
242
- emitChange: false
243
- });
244
- this.listenTabComponentsStateChange();
245
- }
246
- emitTabIndexChange() {
247
- this.tabIndexesChange.emit({
248
- tabs: this.tabs.map(tab => ({
249
- tabHeading: tab.tabHeading,
250
- tabIndex: tab.tabIndex
251
- }))
252
- });
253
- }
254
- unsubscribeTabComponentsStateChange() {
255
- this.tabComponentsStateChangeUnsubscribe.next();
256
- this.tabComponentsStateChangeUnsubscribe.complete();
257
- this.tabComponentsStateChangeUnsubscribe = new Subject();
258
- }
259
- listenTabButtonsOverflowChange() {
260
- this.adapterService.registerTabset(this.elementRef);
261
- this.adapterService.overflowChange
262
- .pipe(takeUntil(this.ngUnsubscribe))
263
- .subscribe(isOverflowing => {
264
- this.tabDisplayMode = (isOverflowing) ? 'dropdown' : 'tabs';
265
- this.changeDetector.markForCheck();
266
- });
267
- }
268
- /**
269
- * Listen for back/forward history button presses to detect query param changes in the URL.
270
- */
271
- listenLocationPopStateChange() {
272
- this.permalinkService.popStateChange
273
- .pipe(takeUntil(this.ngUnsubscribe))
274
- .subscribe(() => {
275
- this.setActiveTabIndexByPermalinkId();
276
- });
277
- }
278
- setActiveTabIndexByPermalinkId() {
279
- const activeIndex = this.getActiveTabIndexByPermalinkId();
280
- this.tabsetService.setActiveTabIndex(activeIndex);
281
- }
282
- getActiveTabIndexByPermalinkId() {
283
- var _a;
284
- if (this.permalinkId) {
285
- const paramValue = this.permalinkService.getParam(this.permalinkId);
286
- if (paramValue) {
287
- return (_a = this.tabs.find(tab => tab.permalinkValue === paramValue)) === null || _a === void 0 ? void 0 : _a.tabIndex;
288
- }
289
- }
290
- }
291
- getActiveTabComponent() {
292
- return this.tabs.toArray().reverse().find(tab => tab.active === true);
293
- }
294
- createTabButtons(activeIndex) {
295
- return this.tabs.map(tab => ({
296
- active: this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),
297
- closeable: tab.closeable,
298
- ariaControls: tab.tabPanelId,
299
- disabled: tab.disabled,
300
- /*tslint:disable-next-line:no-null-keyword*/
301
- buttonHref: (tab.disabled) ? null : this.permalinkService.getParamHref(this.permalinkId, tab.permalinkValue),
302
- buttonId: tab.tabButtonId,
303
- buttonTextCount: tab.tabHeaderCount,
304
- buttonText: tab.tabHeading,
305
- tabIndex: tab.tabIndex
306
- }));
307
- }
308
- updateTabButtons(activeIndex) {
309
- this.tabButtons.forEach(button => {
310
- button.active = this.tabsetService.tabIndexesEqual(button.tabIndex, activeIndex);
311
- });
312
- }
313
- /**
314
- * Updates the UI and state of the tabset component after the tab index or
315
- * tab components have changed.
316
- * @param activeIndex The currently active tab index.
317
- * @param regenerateTabButtons Indicates if tab button view models should be regenerated.
318
- * Setting this value to `false` will simply update the existing tab buttons. Setting this value
319
- * to `true` is only necessary when the underlying tab components have changed and the tab
320
- * buttons must reflect those changes.
321
- */
322
- updateTabsetComponent(activeIndex, regenerateTabButtons = false) {
323
- var _a;
324
- // Activate/deactivate tab components.
325
- this.tabs.forEach(tab => {
326
- this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)
327
- ? tab.activate()
328
- : tab.deactivate();
329
- });
330
- // Update the tab button models.
331
- if (regenerateTabButtons || !this.tabButtons.length) {
332
- this.tabButtons = this.createTabButtons(activeIndex);
333
- }
334
- else {
335
- this.updateTabButtons(activeIndex);
336
- }
337
- // Update the dropdown trigger button text.
338
- this.dropdownTriggerButtonText = (_a = this.tabButtons.find(b => {
339
- return this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);
340
- })) === null || _a === void 0 ? void 0 : _a.buttonText;
341
- // Set the query params based on active tab.
342
- if (this.permalinkId) {
343
- const activeTabComponent = this.tabs.find(tab => {
344
- return this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);
345
- });
346
- this.permalinkService.setParam(this.permalinkId, activeTabComponent.permalinkValue);
347
- }
348
- // Wait for tab button view models to render before gauging dimensions.
349
- setTimeout(() => {
350
- this.adapterService.detectOverflow();
351
- });
352
- this.changeDetector.markForCheck();
353
- // Emit the new active index value to consumers.
354
- if (this.lastActiveTabIndex !== activeIndex) {
355
- this.lastActiveTabIndex = activeIndex;
356
- this.activeChange.emit(activeIndex);
357
- }
358
- }
359
- }
360
- SkyTabsetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTabsetComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyTabsetAdapterService }, { token: i2.SkyTabsetPermalinkService }, { token: i3.SkyTabsetService }], target: i0.ɵɵFactoryTarget.Component });
361
- SkyTabsetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", 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: [
362
- SkyTabsetAdapterService,
363
- SkyTabsetPermalinkService,
364
- SkyTabsetService
365
- ], 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]=\"'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\"\n (window:resize)=\"onWindowResize()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\"\n buttonType=\"tab\"\n >\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *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 *ngTemplateOutlet=\"tabButtonTemplate; context: {\n $implicit: tabButton\n }\"></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span\n class=\"sky-tabset-tabs\"\n >\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container *ngTemplateOutlet=\"tabButtonTemplate; context: {\n $implicit: tabButton\n }\"></ng-container>\n </ng-container>\n </span>\n <span\n class=\"sky-tabset-btns\"\n >\n <button *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\n icon=\"plus-circle\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n <button *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\n icon=\"folder-open-o\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template\n let-tabButton\n #tabButtonTemplate\n>\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 });
366
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SkyTabsetComponent, decorators: [{
367
- type: Component,
368
- args: [{
369
- selector: 'sky-tabset',
370
- styleUrls: ['./tabset.component.scss'],
371
- templateUrl: './tabset.component.html',
372
- providers: [
373
- SkyTabsetAdapterService,
374
- SkyTabsetPermalinkService,
375
- SkyTabsetService
376
- ],
377
- changeDetection: ChangeDetectionStrategy.OnPush,
378
- encapsulation: ViewEncapsulation.None
379
- }]
380
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyTabsetAdapterService }, { type: i2.SkyTabsetPermalinkService }, { type: i3.SkyTabsetService }]; }, propDecorators: { active: [{
381
- type: Input
382
- }], ariaLabel: [{
383
- type: Input
384
- }], ariaLabelledBy: [{
385
- type: Input
386
- }], permalinkId: [{
387
- type: Input
388
- }], tabStyle: [{
389
- type: Input
390
- }], activeChange: [{
391
- type: Output
392
- }], newTab: [{
393
- type: Output
394
- }], openTab: [{
395
- type: Output
396
- }], tabIndexesChange: [{
397
- type: Output
398
- }], tabs: [{
399
- type: ContentChildren,
400
- args: [SkyTabComponent]
401
- }] } });
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYnMvc3JjL21vZHVsZXMvdGFicy90YWJzZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFicy9zcmMvbW9kdWxlcy90YWJzL3RhYnNldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsSUFBSSxFQUNKLE9BQU8sRUFDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFVeEIsT0FBTyxFQUNMLGVBQWUsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3hCLE1BQU0sMEJBQTBCLENBQUM7QUFNbEMsT0FBTyxFQUNMLHlCQUF5QixFQUMxQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDakIsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFpQzFCLE1BQU0sT0FBTyxrQkFBa0I7SUErSjdCLFlBQ1UsY0FBaUMsRUFDakMsVUFBc0IsRUFDdEIsY0FBdUMsRUFDdkMsZ0JBQTJDLEVBQzNDLGFBQStCO1FBSi9CLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQUN2QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTJCO1FBQzNDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQWpFekM7O1dBRUc7UUFFSSxpQkFB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O1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDOztnSEFuY1Usa0JBQWtCO29HQUFsQixrQkFBa0Isc1NBUmxCO1FBQ1QsdUJBQXVCO1FBQ3ZCLHlCQUF5QjtRQUN6QixnQkFBZ0I7S0FDakIsK0NBMElnQixlQUFlLDZCQzNObEMsdzNGQWlHQTs0RkRaYSxrQkFBa0I7a0JBWjlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFNBQVMsRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN0QyxXQUFXLEVBQUUseUJBQXlCO29CQUN0QyxTQUFTLEVBQUU7d0JBQ1QsdUJBQXVCO3dCQUN2Qix5QkFBeUI7d0JBQ3pCLGdCQUFnQjtxQkFDakI7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzs4T0FPWSxNQUFNO3NCQURoQixLQUFLO2dCQXVDQyxTQUFTO3NCQURmLEtBQUs7Z0JBVUMsY0FBYztzQkFEcEIsS0FBSztnQkFVSyxXQUFXO3NCQURyQixLQUFLO2dCQXNCSyxRQUFRO3NCQURsQixLQUFLO2dCQXFCQyxZQUFZO3NCQURsQixNQUFNO2dCQVFBLE1BQU07c0JBRFosTUFBTTtnQkFRQSxPQUFPO3NCQURiLE1BQU07Z0JBT0EsZ0JBQWdCO3NCQUR0QixNQUFNO2dCQWFBLElBQUk7c0JBRFYsZUFBZTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3QsXG4gIHJhY2UsXG4gIFN1YmplY3Rcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICB0YWtlVW50aWxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJJbmRleFxufSBmcm9tICcuL3RhYi1pbmRleCc7XG5cbmltcG9ydCB7XG4gIFNreVRhYnNldFN0eWxlXG59IGZyb20gJy4vdGFic2V0LXN0eWxlJztcblxuaW1wb3J0IHtcbiAgU2t5VGFiQ29tcG9uZW50XG59IGZyb20gJy4vdGFiLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7XG4gIFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlXG59IGZyb20gJy4vdGFic2V0LWFkYXB0ZXIuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZVxufSBmcm9tICcuL3RhYnNldC1idXR0b25zLWRpc3BsYXktbW9kZSc7XG5cbmltcG9ydCB7XG4gIFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2Vcbn0gZnJvbSAnLi90YWJzZXQtcGVybWFsaW5rLnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRTZXJ2aWNlXG59IGZyb20gJy4vdGFic2V0LnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlXG59IGZyb20gJy4vdGFic2V0LXRhYi1pbmRleGVzLWNoYW5nZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBUYWJCdXR0b25WaWV3TW9kZWwge1xuICBhY3RpdmU6IGJvb2xlYW47XG4gIGFyaWFDb250cm9sczogc3RyaW5nO1xuICBidXR0b25IcmVmOiBzdHJpbmc7XG4gIGJ1dHRvbklkOiBzdHJpbmc7XG4gIGJ1dHRvblRleHQ6IHN0cmluZztcbiAgYnV0dG9uVGV4dENvdW50OiBzdHJpbmc7XG4gIGNsb3NlYWJsZTogYm9vbGVhbjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHRhYkluZGV4OiBTa3lUYWJJbmRleDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRhYnNldCcsXG4gIHN0eWxlVXJsczogWycuL3RhYnNldC5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFic2V0LmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgU2t5VGFic2V0QWRhcHRlclNlcnZpY2UsXG4gICAgU2t5VGFic2V0UGVybWFsaW5rU2VydmljZSxcbiAgICBTa3lUYWJzZXRTZXJ2aWNlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFNreVRhYnNldENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlcyBhIHRhYiBieSBpdHMgYHRhYkluZGV4YCBwcm9wZXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgYWN0aXZlKHZhbHVlOiBTa3lUYWJJbmRleCkge1xuICAgIGlmIChcbiAgICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodmFsdWUsIHRoaXMuX2FjdGl2ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmUgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLnRhYnMpIHtcbiAgICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9uIGluaXQsIHdhaXQgZm9yIGNoaWxkcmVuIHRhYnMgdG8gcmVuZGVyIGJlZm9yZSBicm9hZGNhc3RpbmcgdGhlIGFjdGl2ZSB0YWIgaW5kZXguXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGFic2V0U2VydmljZS5pc1ZhbGlkVGFiSW5kZXgodmFsdWUpKSB7XG4gICAgICAgICAgLy8gT24gaW5pdCwgeWllbGQgdG8gdGhlIHBlcm1hbGluayBJRCwgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBmaXJzdCB0YWIgaWYgdGhlIG5ldyB0YWIgaW5kZXggaXMgaW52YWxpZC5cbiAgICAgICAgICB0aGlzLl9hY3RpdmUgPSB0aGlzLnRhYnNldFNlcnZpY2UuYWN0aXZhdGVGaXJzdFRhYigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBTa3lUYWJJbmRleCB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gQVJJQSBsYWJlbCBmb3IgdGhlIHRhYnNldC4gVGhpcyBzZXRzIHRoZSB0YWJzZXQncyBgYXJpYS1sYWJlbGAgYXR0cmlidXRlXG4gICAqIFt0byBzdXBwb3J0IGFjY2Vzc2liaWxpdHldKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vYWNjZXNzaWJpbGl0eSkuXG4gICAqIElmIHRoZSB0YWJzZXQgaW5jbHVkZXMgYSB2aXNpYmxlIGxhYmVsLCB1c2UgYGFyaWFMYWJlbGxlZEJ5YCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIEhUTUwgZWxlbWVudCBJRCAod2l0aG91dCB0aGUgbGVhZGluZyBgI2ApIG9mIHRoZSBlbGVtZW50IHRoYXQgbGFiZWxzXG4gICAqIHRoZSB0YWJzZXQuIFRoaXMgc2V0cyB0aGUgdGFic2V0J3MgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlXG4gICAqIFt0byBzdXBwb3J0IGFjY2Vzc2liaWxpdHldKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vYWNjZXNzaWJpbGl0eSkuXG4gICAqIElmIHRoZSB0YWJzZXQgZG9lcyBub3QgaW5jbHVkZSBhIHZpc2libGUgbGFiZWwsIHVzZSBgYXJpYUxhYmVsYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFyaWFMYWJlbGxlZEJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc3Rpbmd1aXNoZXMgYSB0YWJzZXQncyB1bmlxdWUgc3RhdGUgaW4gdGhlIFVSTCBieSBnZW5lcmF0aW5nIGEgcXVlcnkgcGFyYW1ldGVyXG4gICAqIHRoYXQgaXMgd3JpdHRlbiBhcyBgPzxxdWVyeVBhcmFtPi1hY3RpdmUtdGFiPTxzYW5pdGl6ZWQtdGFiLWhlYWRpbmc+YC5cbiAgICogVGhlIHF1ZXJ5IHBhcmFtZXRlcidzIHZhbHVlIGlzIHBhcnNlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHNlbGVjdGVkIHRhYidzIGhlYWRpbmcgdGV4dCxcbiAgICogYnV0IHlvdSBjYW4gc3VwcGx5IGEgY3VzdG9tIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZSBmb3IgZWFjaCB0YWIgd2l0aCBpdHMgYHBlcm1hbGlua1ZhbHVlYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGVybWFsaW5rSWQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzYW5pdGl6ZWQgPSB0aGlzLnBlcm1hbGlua1NlcnZpY2UudXJsaWZ5KHZhbHVlKTtcbiAgICB0aGlzLl9wZXJtYWxpbmtJZCA9IGAke3Nhbml0aXplZH0tYWN0aXZlLXRhYmA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlcm1hbGlua0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1hbGlua0lkIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgYmVoYXZpb3IgZm9yIGEgc2VyaWVzIG9mIHRhYnMuXG4gICAqIEBkZXByZWNhdGVkIFRoZSBwcm9wZXJ0eSB3YXMgZGVzaWduZWQgdG8gY3JlYXRlIHdpemFyZHMgYnkgc2V0dGluZyB0YWJTdHlsZT1cIndpemFyZFwiIG9uIHRhYnNldHMgaW4gbW9kYWxzLFxuICAgKiBidXQgdGhpcyB3aXphcmQgaW1wbGVtZW50YXRpb24gd2FzIHJlcGxhY2VkIGJ5IHRoZVxuICAgKiBbcHJvZ3Jlc3MgaW5kaWNhdG9yIGNvbXBvbmVudF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL3Byb2dyZXNzLWluZGljYXRvcikuXG4gICAqIEBkZWZhdWx0ICd0YWJzJ1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB0YWJTdHlsZSh2YWx1ZTogU2t5VGFic2V0U3R5bGUpIHtcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbHNlKi9cbiAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3dpemFyZCcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1RoZSB0YWJzZXQgd2l6YXJkIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBpbXBsZW1lbnQgdGhlIG5ldyBhcHByb2FjaCB1c2luZyAnICtcbiAgICAgICAgJ3Byb2dyZXNzIGluZGljYXRvciBhcyBkb2N1bWVudGVkIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy93aXphcmQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJTdHlsZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJTdHlsZSgpOiBTa3lUYWJzZXRTdHlsZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYlN0eWxlIHx8ICd0YWJzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgdGFiIGNoYW5nZXMuIFRoaXMgZXZlbnQgZW1pdHMgdGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreVRhYkluZGV4PigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGNsaWNrIHRoZSBidXR0b24gdG8gYWRkIGEgbmV3IHRhYi5cbiAgICogVGhlIG5ldyB0YWIgYnV0dG9uIGlzIGFkZGVkIHRvIHRoZSB0YWIgYXJlYSB3aGVuIHlvdSBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG5ld1RhYiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjbGljayB0aGUgYnV0dG9uIHRvIG9wZW4gYSB0YWIuXG4gICAqIFRoZSBvcGVuIHRhYiBidXR0b24gaXMgYWRkZWQgdG8gdGhlIHRhYiBhcmVhIHdoZW4geW91IHNwZWNpZnkgYSBsaXN0ZW5lciBmb3IgdGhpcyBldmVudC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb3BlblRhYiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbnkgdGFiJ3MgYHRhYkluZGV4YCB2YWx1ZSBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0YWJJbmRleGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlPigpO1xuXG4gIHB1YmxpYyBzZXQgdGFiRGlzcGxheU1vZGUodmFsdWU6IFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZSkge1xuICAgIHRoaXMuX3RhYkRpc3BsYXlNb2RlID0gdmFsdWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdGFiRGlzcGxheU1vZGUoKTogU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiRGlzcGxheU1vZGUgfHwgJ3RhYnMnO1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lUYWJDb21wb25lbnQpXG4gIHB1YmxpYyB0YWJzOiBRdWVyeUxpc3Q8U2t5VGFiQ29tcG9uZW50PjtcblxuICBwdWJsaWMgZHJvcGRvd25UcmlnZ2VyQnV0dG9uVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgdGhlIGRlcHJlY2F0ZWQgdGFic2V0LW5hdi1idXR0b24gY29tcG9uZW50LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBsYXN0QWN0aXZlVGFiSW5kZXg6IFNreVRhYkluZGV4O1xuXG4gIHB1YmxpYyB0YWJCdXR0b25zOiBUYWJCdXR0b25WaWV3TW9kZWxbXSA9IFtdO1xuXG4gIHByaXZhdGUgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSB0YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfYWN0aXZlOiBTa3lUYWJJbmRleDtcblxuICBwcml2YXRlIF9wZXJtYWxpbmtJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3RhYkRpc3BsYXlNb2RlOiBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGU7XG5cbiAgcHJpdmF0ZSBfdGFiU3R5bGU6IFNreVRhYnNldFN0eWxlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lUYWJzZXRBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1hbGlua1NlcnZpY2U6IFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YWJzZXRTZXJ2aWNlOiBTa3lUYWJzZXRTZXJ2aWNlXG4gICkgeyB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuaW5pdFRhYkNvbXBvbmVudHMoKTtcbiAgICB0aGlzLmxpc3RlblRhYkNvbXBvbmVudHNTdHJ1Y3R1cmFsQ2hhbmdlKCk7XG5cbiAgICBjb25zdCBpbml0aWFsVGFiSW5kZXggPSB0aGlzLmdldEluaXRpYWxUYWJJbmRleCgpO1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChpbml0aWFsVGFiSW5kZXgpO1xuXG4gICAgdGhpcy5saXN0ZW5UYWJCdXR0b25zT3ZlcmZsb3dDaGFuZ2UoKTtcbiAgICB0aGlzLmxpc3RlbkxvY2F0aW9uUG9wU3RhdGVDaGFuZ2UoKTtcblxuICAgIC8vIElmIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYiBpcyBnZXR0aW5nIHVucmVnaXN0ZXJlZCwgYWN0aXZhdGUgdGhlIG5leHQgb25lLlxuICAgIHRoaXMudGFic2V0U2VydmljZS5hY3RpdmVUYWJVbnJlZ2lzdGVyZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSh0YWIgPT4ge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGUgbmV3IHRhYnMgdG8gcmVuZGVyIGJlZm9yZSBhY3RpdmF0aW5nLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRhYnNldFNlcnZpY2UuYWN0aXZhdGVOZWFyZXN0VGFiKHRhYi5hcnJheUluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIC8vIExldCB0aGUgdGFic2V0IHJlbmRlciB0aGUgaW5pdGlhbCBhY3RpdmUgaW5kZXggYmVmb3JlIGxpc3RlbmluZyBmb3IgY2hhbmdlcy5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubGlzdGVuVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gICAgICB0aGlzLmxpc3RlbkFjdGl2ZUluZGV4Q2hhbmdlKCk7XG4gICAgICB0aGlzLnBlcm1hbGlua1NlcnZpY2UuaW5pdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZVRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5jbGVhclBhcmFtKHRoaXMucGVybWFsaW5rSWQpO1xuICB9XG5cbiAgcHVibGljIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZGV0ZWN0T3ZlcmZsb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYkNsb3NlQ2xpY2sodGFiQnV0dG9uOiBUYWJCdXR0b25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJDb21wb25lbnQgPSB0aGlzLnRhYnMuZmluZCh0YWIgPT5cbiAgICAgIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCB0YWJCdXR0b24udGFiSW5kZXgpXG4gICAgKTtcblxuICAgIHRhYkNvbXBvbmVudC5jbG9zZS5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25UYWJCdXR0b25DbGljayh0YWJCdXR0b246IFRhYkJ1dHRvblZpZXdNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleCh0YWJCdXR0b24udGFiSW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG9uTmV3VGFiQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5uZXdUYWIuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIG9uT3BlblRhYkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub3BlblRhYi5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgaW5pdGlhbCBhY3RpdmUgdGFiIGluZGV4IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEuXG4gICAqIDEuIERvZXMgdGhlIFVSTCBpbmNsdWRlIGEgcXVlcnkgcGFyYW0gdGhhdCByZWZsZWN0cyB0aGlzIHRhYnNldCdzIGFjdGl2ZSB0YWI/XG4gICAqIDIuIERvZXMgb25lIG9mIHRoZSB0YWIgY29tcG9uZW50cyBoYXZlIHRoZWlyIGBhY3RpdmVgIHByb3BlcnR5IHNldCB0byBgdHJ1ZWA/XG4gICAqIDMuIElzIHRoZSB0YWJzZXQgY29tcG9uZW50J3MgYGFjdGl2ZWAgcHJvcGVydHkgc2V0IHRvIGEgc3BlY2lmaWMgdGFiIGluZGV4P1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRJbml0aWFsVGFiSW5kZXgoKTogU2t5VGFiSW5kZXgge1xuICAgIGxldCBhY3RpdmVJbmRleDogU2t5VGFiSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk/LnRhYkluZGV4O1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWN0aXZlSW5kZXggPSB0aGlzLmFjdGl2ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZlSW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlbkFjdGl2ZUluZGV4Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFic2V0U2VydmljZS5hY3RpdmVUYWJJbmRleFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGFjdGl2ZUluZGV4ID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVUYWJzZXRDb21wb25lbnQoYWN0aXZlSW5kZXgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRhYkNvbXBvbmVudHNTdHJ1Y3R1cmFsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFicy5jaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2V0VGFiQ29tcG9uZW50cygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KHRoaXMudGFicy5tYXAodGFiID0+IHRhYi5hY3RpdmVDaGFuZ2UpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHJhY2UodGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSwgdGhpcy5uZ1Vuc3Vic2NyaWJlKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSBmaW5kaW5nIHRoZSBhY3RpdmUgb25lLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk/LnRhYkluZGV4O1xuICAgICAgICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleCh0YWJJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KHRoaXMudGFicy5tYXAodGFiID0+IHRhYi50YWJJbmRleENoYW5nZSkpXG4gICAgICAucGlwZSh0YWtlVW50aWwocmFjZSh0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLm5nVW5zdWJzY3JpYmUpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBEb24ndCBlbWl0IHRoZSBmaXJzdCBjaGFuZ2UuXG4gICAgICAgIGlmICh0aGlzLmxhc3RBY3RpdmVUYWJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHRhYiBjb21wb25lbnRzIHRvIHJlbmRlciBjaGFuZ2VzIGJlZm9yZSB1cGRhdGluZyB0aGUgdmlldy5cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KHRoaXMudGFic2V0U2VydmljZS5jdXJyZW50QWN0aXZlVGFiSW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5lbWl0VGFiSW5kZXhDaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KHRoaXMudGFicy5tYXAodGFiID0+IHRhYi5zdGF0ZUNoYW5nZSkpXG4gICAgICAucGlwZSh0YWtlVW50aWwocmFjZSh0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLm5nVW5zdWJzY3JpYmUpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGFiIGNvbXBvbmVudHMgdG8gcmVuZGVyIGNoYW5nZXMgYmVmb3JlIGZpbmRpbmcgdGhlIGFjdGl2ZSBvbmUuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KHRoaXMudGFic2V0U2VydmljZS5jdXJyZW50QWN0aXZlVGFiSW5kZXgsIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VGFiQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4gdGFiLmluaXQoKSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGFiQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnVucmVnaXN0ZXJBbGwoKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyB0YWIgY29tcG9uZW50cywgZG8gYSBoYXJkIHJlc2V0IG9mIHRoZSB2aWV3LlxuICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudCgwLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRUYWJDb21wb25lbnRzKCk7XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkNvbXBvbmVudCgpPy50YWJJbmRleDtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgoYWN0aXZlSW5kZXgsIHtcbiAgICAgIGVtaXRDaGFuZ2U6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5saXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFRhYkluZGV4Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMudGFiSW5kZXhlc0NoYW5nZS5lbWl0KHtcbiAgICAgIHRhYnM6IHRoaXMudGFicy5tYXAodGFiID0+ICh7XG4gICAgICAgIHRhYkhlYWRpbmc6IHRhYi50YWJIZWFkaW5nLFxuICAgICAgICB0YWJJbmRleDogdGFiLnRhYkluZGV4XG4gICAgICB9KSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVUYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5UYWJCdXR0b25zT3ZlcmZsb3dDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5yZWdpc3RlclRhYnNldCh0aGlzLmVsZW1lbnRSZWYpO1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uub3ZlcmZsb3dDaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZShpc092ZXJmbG93aW5nID0+IHtcbiAgICAgICAgdGhpcy50YWJEaXNwbGF5TW9kZSA9IChpc092ZXJmbG93aW5nKSA/ICdkcm9wZG93bicgOiAndGFicyc7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGJhY2svZm9yd2FyZCBoaXN0b3J5IGJ1dHRvbiBwcmVzc2VzIHRvIGRldGVjdCBxdWVyeSBwYXJhbSBjaGFuZ2VzIGluIHRoZSBVUkwuXG4gICAqL1xuICBwcml2YXRlIGxpc3RlbkxvY2F0aW9uUG9wU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLnBvcFN0YXRlQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZVRhYkluZGV4QnlQZXJtYWxpbmtJZCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KGFjdGl2ZUluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk6IFNreVRhYkluZGV4IHtcbiAgICBpZiAodGhpcy5wZXJtYWxpbmtJZCkge1xuICAgICAgY29uc3QgcGFyYW1WYWx1ZSA9IHRoaXMucGVybWFsaW5rU2VydmljZS5nZXRQYXJhbSh0aGlzLnBlcm1hbGlua0lkKTtcbiAgICAgIGlmIChwYXJhbVZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYnMuZmluZCh0YWIgPT4gdGFiLnBlcm1hbGlua1ZhbHVlID09PSBwYXJhbVZhbHVlKT8udGFiSW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmVUYWJDb21wb25lbnQoKTogU2t5VGFiQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJzLnRvQXJyYXkoKS5yZXZlcnNlKCkuZmluZCh0YWIgPT4gdGFiLmFjdGl2ZSA9PT0gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4KTogVGFiQnV0dG9uVmlld01vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLnRhYnMubWFwKHRhYiA9PiAoe1xuICAgICAgYWN0aXZlOiB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpLFxuICAgICAgY2xvc2VhYmxlOiB0YWIuY2xvc2VhYmxlLFxuICAgICAgYXJpYUNvbnRyb2xzOiB0YWIudGFiUGFuZWxJZCxcbiAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWQsXG4gICAgICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1udWxsLWtleXdvcmQqL1xuICAgICAgYnV0dG9uSHJlZjogKHRhYi5kaXNhYmxlZCkgPyBudWxsIDogdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmdldFBhcmFtSHJlZihcbiAgICAgICAgdGhpcy5wZXJtYWxpbmtJZCxcbiAgICAgICAgdGFiLnBlcm1hbGlua1ZhbHVlXG4gICAgICApLFxuICAgICAgYnV0dG9uSWQ6IHRhYi50YWJCdXR0b25JZCxcbiAgICAgIGJ1dHRvblRleHRDb3VudDogdGFiLnRhYkhlYWRlckNvdW50LFxuICAgICAgYnV0dG9uVGV4dDogdGFiLnRhYkhlYWRpbmcsXG4gICAgICB0YWJJbmRleDogdGFiLnRhYkluZGV4XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYWJCdXR0b25zKGFjdGl2ZUluZGV4OiBTa3lUYWJJbmRleCk6IHZvaWQge1xuICAgIHRoaXMudGFiQnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICBidXR0b24uYWN0aXZlID0gdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbChidXR0b24udGFiSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBVSSBhbmQgc3RhdGUgb2YgdGhlIHRhYnNldCBjb21wb25lbnQgYWZ0ZXIgdGhlIHRhYiBpbmRleCBvclxuICAgKiB0YWIgY29tcG9uZW50cyBoYXZlIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBhY3RpdmVJbmRleCBUaGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgaW5kZXguXG4gICAqIEBwYXJhbSByZWdlbmVyYXRlVGFiQnV0dG9ucyBJbmRpY2F0ZXMgaWYgdGFiIGJ1dHRvbiB2aWV3IG1vZGVscyBzaG91bGQgYmUgcmVnZW5lcmF0ZWQuXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byBgZmFsc2VgIHdpbGwgc2ltcGx5IHVwZGF0ZSB0aGUgZXhpc3RpbmcgdGFiIGJ1dHRvbnMuIFNldHRpbmcgdGhpcyB2YWx1ZVxuICAgKiB0byBgdHJ1ZWAgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgdW5kZXJseWluZyB0YWIgY29tcG9uZW50cyBoYXZlIGNoYW5nZWQgYW5kIHRoZSB0YWJcbiAgICogYnV0dG9ucyBtdXN0IHJlZmxlY3QgdGhvc2UgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVGFic2V0Q29tcG9uZW50KFxuICAgIGFjdGl2ZUluZGV4OiBTa3lUYWJJbmRleCxcbiAgICByZWdlbmVyYXRlVGFiQnV0dG9ucyA9IGZhbHNlXG4gICk6IHZvaWQge1xuXG4gICAgLy8gQWN0aXZhdGUvZGVhY3RpdmF0ZSB0YWIgY29tcG9uZW50cy5cbiAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KVxuICAgICAgICA/IHRhYi5hY3RpdmF0ZSgpXG4gICAgICAgIDogdGFiLmRlYWN0aXZhdGUoKTtcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgdGFiIGJ1dHRvbiBtb2RlbHMuXG4gICAgaWYgKHJlZ2VuZXJhdGVUYWJCdXR0b25zIHx8ICF0aGlzLnRhYkJ1dHRvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRhYkJ1dHRvbnMgPSB0aGlzLmNyZWF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZHJvcGRvd24gdHJpZ2dlciBidXR0b24gdGV4dC5cbiAgICB0aGlzLmRyb3Bkb3duVHJpZ2dlckJ1dHRvblRleHQgPSB0aGlzLnRhYkJ1dHRvbnMuZmluZChiID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKGIudGFiSW5kZXgsIGFjdGl2ZUluZGV4KTtcbiAgICB9KT8uYnV0dG9uVGV4dDtcblxuICAgIC8vIFNldCB0aGUgcXVlcnkgcGFyYW1zIGJhc2VkIG9uIGFjdGl2ZSB0YWIuXG4gICAgaWYgKHRoaXMucGVybWFsaW5rSWQpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZVRhYkNvbXBvbmVudCA9IHRoaXMudGFicy5maW5kKHRhYiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnBlcm1hbGlua1NlcnZpY2Uuc2V0UGFyYW0odGhpcy5wZXJtYWxpbmtJZCwgYWN0aXZlVGFiQ29tcG9uZW50LnBlcm1hbGlua1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGZvciB0YWIgYnV0dG9uIHZpZXcgbW9kZWxzIHRvIHJlbmRlciBiZWZvcmUgZ2F1Z2luZyBkaW1lbnNpb25zLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hZGFwdGVyU2VydmljZS5kZXRlY3RPdmVyZmxvdygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIEVtaXQgdGhlIG5ldyBhY3RpdmUgaW5kZXggdmFsdWUgdG8gY29uc3VtZXJzLlxuICAgIGlmICh0aGlzLmxhc3RBY3RpdmVUYWJJbmRleCAhPT0gYWN0aXZlSW5kZXgpIHtcbiAgICAgIHRoaXMubGFzdEFjdGl2ZVRhYkluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5nZS5lbWl0KGFjdGl2ZUluZGV4KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktdGFic2V0XCJcbiAgcm9sZT1cInRhYmxpc3RcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFtuZ0NsYXNzXT1cIidza3ktdGFic2V0LW1vZGUtJyArIHRhYkRpc3BsYXlNb2RlICsgJyBza3ktdGFic2V0LXN0eWxlLScgKyB0YWJTdHlsZVwiXG4gICh3aW5kb3c6cmVzaXplKT1cIm9uV2luZG93UmVzaXplKClcIlxuPlxuICA8c3BhbiBjbGFzcz1cInNreS10YWJzZXQtZHJvcGRvd25cIj5cbiAgICA8c2t5LWRyb3Bkb3duICpuZ0lmPVwidGFiRGlzcGxheU1vZGUgPT09ICdkcm9wZG93bidcIlxuICAgICAgYnV0dG9uVHlwZT1cInRhYlwiXG4gICAgPlxuICAgICAgPHNreS1kcm9wZG93bi1idXR0b24+XG4gICAgICAgIHt7IGRyb3Bkb3duVHJpZ2dlckJ1dHRvblRleHQgfX1cbiAgICAgIDwvc2t5LWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgIDxza3ktZHJvcGRvd24tbWVudT5cbiAgICAgICAgPHNreS1kcm9wZG93bi1pdGVtICpuZ0Zvcj1cImxldCB0YWJCdXR0b24gb2YgdGFiQnV0dG9uc1wiXG4gICAgICAgICAgY2xhc3M9XCJza3ktdGFiLWRyb3Bkb3duLW1lbnUtaXRlbVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNreS10YWItZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdza3ktdGFiLWRyb3Bkb3duLWl0ZW0tc2VsZWN0ZWQnOiB0YWJCdXR0b24uYWN0aXZlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFiQnV0dG9uVGVtcGxhdGU7IGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiB0YWJCdXR0b25cbiAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9za3ktZHJvcGRvd24taXRlbT5cbiAgICAgIDwvc2t5LWRyb3Bkb3duLW1lbnU+XG4gICAgPC9za3ktZHJvcGRvd24+XG4gIDwvc3Bhbj5cbiAgPHNwYW5cbiAgICBjbGFzcz1cInNreS10YWJzZXQtdGFic1wiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWJCdXR0b24gb2YgdGFiQnV0dG9uc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYkJ1dHRvblRlbXBsYXRlOyBjb250ZXh0OiB7XG4gICAgICAgICRpbXBsaWNpdDogdGFiQnV0dG9uXG4gICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvc3Bhbj5cbiAgPHNwYW5cbiAgICBjbGFzcz1cInNreS10YWJzZXQtYnRuc1wiXG4gID5cbiAgICA8YnV0dG9uICpuZ0lmPVwibmV3VGFiLm9ic2VydmVycy5sZW5ndGggPiAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWljb24gc2t5LXRhYnNldC1idG4tbmV3IHNreS1tYXJnaW4taW5saW5lLWNvbXBhY3RcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidza3l1eF90YWJfYWRkJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICdza3ktbWFyZ2luLWlubGluZS1zbSc6ICdtb2Rlcm4nXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJvbk5ld1RhYkNsaWNrKClcIlxuICAgID5cbiAgICAgIDxza3ktaWNvblxuICAgICAgICBpY29uPVwicGx1cy1jaXJjbGVcIlxuICAgICAgICBzaXplPVwibGdcIlxuICAgICAgPlxuICAgICAgPC9za3ktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwib3BlblRhYi5vYnNlcnZlcnMubGVuZ3RoID4gMFwiXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1pY29uIHNreS10YWJzZXQtYnRuLW9wZW4gc2t5LW1hcmdpbi1pbmxpbmUtY29tcGFjdFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NreXV4X3RhYl9vcGVuJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICdza3ktbWFyZ2luLWlubGluZS1zbSc6ICdtb2Rlcm4nXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJvbk9wZW5UYWJDbGljaygpXCJcbiAgICA+XG4gICAgICA8c2t5LWljb25cbiAgICAgICAgaWNvbj1cImZvbGRlci1vcGVuLW9cIlxuICAgICAgICBzaXplPVwibGdcIlxuICAgICAgPlxuICAgICAgPC9za3ktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9zcGFuPlxuPC9kaXY+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZVxuICBsZXQtdGFiQnV0dG9uXG4gICN0YWJCdXR0b25UZW1wbGF0ZVxuPlxuICA8c2t5LXRhYi1idXR0b25cbiAgICBbYWN0aXZlXT1cInRhYkJ1dHRvbi5hY3RpdmVcIlxuICAgIFthcmlhQ29udHJvbHNdPVwidGFiQnV0dG9uLmFyaWFDb250cm9sc1wiXG4gICAgW2J1dHRvbkhyZWZdPVwidGFiQnV0dG9uLmJ1dHRvbkhyZWZcIlxuICAgIFtidXR0b25JZF09XCJ0YWJCdXR0b24uYnV0dG9uSWRcIlxuICAgIFtidXR0b25UZXh0XT1cInRhYkJ1dHRvbi5idXR0b25UZXh0XCJcbiAgICBbYnV0dG9uVGV4dENvdW50XT1cInRhYkJ1dHRvbi5idXR0b25UZXh0Q291bnRcIlxuICAgIFtjbG9zZWFibGVdPVwidGFiQnV0dG9uLmNsb3NlYWJsZVwiXG4gICAgW2Rpc2FibGVkXT1cInRhYkJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgW3RhYlN0eWxlXT1cInRhYlN0eWxlXCJcbiAgICAoYnV0dG9uQ2xpY2spPVwib25UYWJCdXR0b25DbGljayh0YWJCdXR0b24pXCJcbiAgICAoY2xvc2VDbGljayk9XCJvblRhYkNsb3NlQ2xpY2sodGFiQnV0dG9uKVwiXG4gID48L3NreS10YWItYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==