@villedemontreal/angular-ui 18.0.0 → 19.0.1

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 (102) hide show
  1. package/fesm2022/villedemontreal-angular-ui.mjs +421 -372
  2. package/fesm2022/villedemontreal-angular-ui.mjs.map +1 -1
  3. package/lib/dropdown-menu/dropdown-menu.component.d.ts +16 -9
  4. package/lib/modal/modal-container.d.ts +1 -1
  5. package/lib/modal/modal.d.ts +1 -1
  6. package/package.json +5 -7
  7. package/esm2022/lib/alert/alert.component.mjs +0 -169
  8. package/esm2022/lib/alert/index.mjs +0 -8
  9. package/esm2022/lib/alert/module.mjs +0 -41
  10. package/esm2022/lib/avatar/avatar.component.mjs +0 -102
  11. package/esm2022/lib/avatar/index.mjs +0 -8
  12. package/esm2022/lib/avatar/module.mjs +0 -24
  13. package/esm2022/lib/badge/badge.component.mjs +0 -27
  14. package/esm2022/lib/badge/index.mjs +0 -8
  15. package/esm2022/lib/badge/module.mjs +0 -24
  16. package/esm2022/lib/bao.module.mjs +0 -124
  17. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -36
  18. package/esm2022/lib/breadcrumb/index.mjs +0 -8
  19. package/esm2022/lib/breadcrumb/module.mjs +0 -25
  20. package/esm2022/lib/button/button.component.mjs +0 -100
  21. package/esm2022/lib/button/index.mjs +0 -8
  22. package/esm2022/lib/button/module.mjs +0 -25
  23. package/esm2022/lib/card/card.component.mjs +0 -94
  24. package/esm2022/lib/card/index.mjs +0 -8
  25. package/esm2022/lib/card/module.mjs +0 -38
  26. package/esm2022/lib/checkbox/checkbox-group.component.mjs +0 -58
  27. package/esm2022/lib/checkbox/checkbox.component.mjs +0 -304
  28. package/esm2022/lib/checkbox/index.mjs +0 -9
  29. package/esm2022/lib/checkbox/module.mjs +0 -35
  30. package/esm2022/lib/common-components/error-text/errorText.component.mjs +0 -16
  31. package/esm2022/lib/common-components/guiding-text/guidingText.component.mjs +0 -16
  32. package/esm2022/lib/common-components/index.mjs +0 -11
  33. package/esm2022/lib/common-components/label-text/labelText.component.mjs +0 -22
  34. package/esm2022/lib/common-components/module.mjs +0 -38
  35. package/esm2022/lib/common-components/title-text/titleText.component.mjs +0 -16
  36. package/esm2022/lib/core/breakpoints.mjs +0 -13
  37. package/esm2022/lib/core/colors.mjs +0 -25
  38. package/esm2022/lib/core/index.mjs +0 -8
  39. package/esm2022/lib/dropdown-menu/dropdown-menu.component.mjs +0 -573
  40. package/esm2022/lib/dropdown-menu/index.mjs +0 -8
  41. package/esm2022/lib/dropdown-menu/module.mjs +0 -47
  42. package/esm2022/lib/file/file-input.component.mjs +0 -320
  43. package/esm2022/lib/file/file-intl.mjs +0 -65
  44. package/esm2022/lib/file/file-preview.component.mjs +0 -96
  45. package/esm2022/lib/file/index.mjs +0 -10
  46. package/esm2022/lib/file/module.mjs +0 -56
  47. package/esm2022/lib/header-info/header-info.component.mjs +0 -104
  48. package/esm2022/lib/header-info/index.mjs +0 -8
  49. package/esm2022/lib/header-info/module.mjs +0 -41
  50. package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -84
  51. package/esm2022/lib/hyperlink/index.mjs +0 -8
  52. package/esm2022/lib/hyperlink/module.mjs +0 -24
  53. package/esm2022/lib/icon/bao-icon-registry.mjs +0 -47
  54. package/esm2022/lib/icon/icon.component.mjs +0 -158
  55. package/esm2022/lib/icon/icons-dictionary.mjs +0 -129
  56. package/esm2022/lib/icon/index.mjs +0 -8
  57. package/esm2022/lib/icon/module.mjs +0 -24
  58. package/esm2022/lib/list/index.mjs +0 -8
  59. package/esm2022/lib/list/list.component.mjs +0 -73
  60. package/esm2022/lib/list/module.mjs +0 -38
  61. package/esm2022/lib/message-bar/index.mjs +0 -8
  62. package/esm2022/lib/message-bar/message-bar.component.mjs +0 -87
  63. package/esm2022/lib/message-bar/module.mjs +0 -26
  64. package/esm2022/lib/modal/index.mjs +0 -12
  65. package/esm2022/lib/modal/modal-config.mjs +0 -73
  66. package/esm2022/lib/modal/modal-container.mjs +0 -240
  67. package/esm2022/lib/modal/modal-directives.mjs +0 -84
  68. package/esm2022/lib/modal/modal-ref.mjs +0 -226
  69. package/esm2022/lib/modal/modal.mjs +0 -344
  70. package/esm2022/lib/modal/module.mjs +0 -29
  71. package/esm2022/lib/pagination/index.mjs +0 -8
  72. package/esm2022/lib/pagination/module.mjs +0 -25
  73. package/esm2022/lib/pagination/pagination.component.mjs +0 -217
  74. package/esm2022/lib/radio/index.mjs +0 -9
  75. package/esm2022/lib/radio/module.mjs +0 -54
  76. package/esm2022/lib/radio/radio-group.component.mjs +0 -247
  77. package/esm2022/lib/radio/radio.component.mjs +0 -291
  78. package/esm2022/lib/shared/enum/display-mode.mjs +0 -2
  79. package/esm2022/lib/shared/index.mjs +0 -7
  80. package/esm2022/lib/snack-bar/index.mjs +0 -12
  81. package/esm2022/lib/snack-bar/module.mjs +0 -51
  82. package/esm2022/lib/snack-bar/simple-snack-bar.component.mjs +0 -92
  83. package/esm2022/lib/snack-bar/snack-bar-animations.mjs +0 -28
  84. package/esm2022/lib/snack-bar/snack-bar-config.mjs +0 -37
  85. package/esm2022/lib/snack-bar/snack-bar-container.mjs +0 -277
  86. package/esm2022/lib/snack-bar/snack-bar-ref.mjs +0 -75
  87. package/esm2022/lib/snack-bar/snack-bar.mjs +0 -251
  88. package/esm2022/lib/summary/index.mjs +0 -9
  89. package/esm2022/lib/summary/list-summary.component.mjs +0 -30
  90. package/esm2022/lib/summary/module.mjs +0 -37
  91. package/esm2022/lib/summary/summary.component.mjs +0 -93
  92. package/esm2022/lib/system-header/index.mjs +0 -8
  93. package/esm2022/lib/system-header/module.mjs +0 -33
  94. package/esm2022/lib/system-header/system-header.component.mjs +0 -130
  95. package/esm2022/lib/tabs/index.mjs +0 -8
  96. package/esm2022/lib/tabs/module.mjs +0 -35
  97. package/esm2022/lib/tabs/tabs.component.mjs +0 -295
  98. package/esm2022/lib/tag/index.mjs +0 -8
  99. package/esm2022/lib/tag/module.mjs +0 -24
  100. package/esm2022/lib/tag/tag.component.mjs +0 -75
  101. package/esm2022/public-api.mjs +0 -31
  102. package/esm2022/villedemontreal-angular-ui.mjs +0 -5
@@ -1,573 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Ville de Montreal. All rights reserved.
3
- * Licensed under the MIT license.
4
- * See LICENSE file in the project root for full license information.
5
- */
6
- import { OverlayConfig } from '@angular/cdk/overlay';
7
- import { DomPortal } from '@angular/cdk/portal';
8
- import { ChangeDetectionStrategy, Component, ContentChildren, Directive, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/cdk/overlay";
11
- /**
12
- * Unique ID for each dropdown menu
13
- */
14
- let dropdownMenuUniqueId = 0;
15
- export class BaoDropdownMenuItem {
16
- constructor(renderer, elementRef, _parent) {
17
- this.renderer = renderer;
18
- this.elementRef = elementRef;
19
- this._parent = _parent;
20
- /**
21
- * Is the list item disabled
22
- */
23
- this.disabled = false;
24
- /**
25
- * Emits when menu item is clicked
26
- */
27
- this.itemClicked = new EventEmitter();
28
- }
29
- get nativeElement() {
30
- return this.elementRef.nativeElement;
31
- }
32
- spaceKeyEvent() {
33
- if (document.activeElement == this.nativeElement) {
34
- this.nativeElement.click();
35
- }
36
- }
37
- onClick(el) {
38
- if (this.nativeElement.attributes['href']) {
39
- this._parent.setNavigationAttribute(this.nativeElement);
40
- }
41
- // Prevent double-click on checkbox input that undoes the toggle
42
- if (!el.classList.contains('bao-checkbox-content-container')) {
43
- this.propagateClick();
44
- }
45
- }
46
- enterKeyEvent() {
47
- if (document.activeElement == this.nativeElement) {
48
- this.nativeElement.click();
49
- }
50
- }
51
- ngAfterViewInit() {
52
- this.addContentDiv();
53
- if (!this.disabled) {
54
- this.renderer.setAttribute(this.nativeElement, 'tabIndex', '0');
55
- }
56
- this.addPaddingClass();
57
- // Remove input element inside item from keyboard navigation sequence
58
- if (this.nativeElement.classList.contains('has-element-left')) {
59
- this.renderer.setAttribute(this.nativeElement.children.item(0).firstElementChild, 'tabIndex', '-1');
60
- }
61
- }
62
- ngOnChanges(changes) {
63
- if (changes['disabled'] && changes['disabled'].currentValue == true) {
64
- this.disableItem();
65
- }
66
- }
67
- /** Regroups label and description in a new div to help with layout */
68
- addContentDiv() {
69
- const children = Array.from(this.nativeElement.children);
70
- const labelIndex = children.findIndex(c => c.localName === 'bao-dropdown-menu-item-label');
71
- const labelElement = children[labelIndex];
72
- this.renderer.removeChild(this.nativeElement, children[labelIndex]);
73
- const contentDiv = this.renderer.createElement('div');
74
- this.renderer.addClass(contentDiv, 'bao-dropdown-menu-item-content');
75
- this.renderer.appendChild(this.nativeElement, contentDiv);
76
- this.renderer.appendChild(contentDiv, labelElement);
77
- const descriptionIndex = children.findIndex(c => c.localName === 'bao-dropdown-menu-item-description');
78
- if (descriptionIndex > 0) {
79
- const descriptionElement = children[descriptionIndex];
80
- this.renderer.removeChild(this.nativeElement, children[descriptionIndex]);
81
- this.renderer.appendChild(contentDiv, descriptionElement);
82
- }
83
- }
84
- addPaddingClass() {
85
- const children = Array.from(this.nativeElement.children);
86
- // Menu item has extra element next to label
87
- if (children.length > 1) {
88
- // Only toggle element can be on the right
89
- if (children.findIndex(c => c.localName === 'bao-toggle') > 0) {
90
- this.renderer.addClass(this.nativeElement, 'has-element-right');
91
- }
92
- // Icon, checkbox, radio button or avatar must be on the left
93
- else {
94
- this.renderer.addClass(this.nativeElement, 'has-element-left');
95
- }
96
- }
97
- }
98
- disableItem() {
99
- if (this.disabled) {
100
- this.renderer.setAttribute(this.nativeElement, 'aria-disabled', 'true');
101
- this.renderer.setAttribute(this.nativeElement, 'tabIndex', '-1');
102
- }
103
- }
104
- /**
105
- * This method propagates a click event to menu item children with inputs (checkbox, radio button).
106
- * It emits event to close menu if item does not contain an input.
107
- */
108
- propagateClick() {
109
- let closeMenu = true;
110
- for (let i = 0; i < this.nativeElement.children.length; i++) {
111
- if (this.nativeElement.children.item(i).firstElementChild.localName ==
112
- 'input') {
113
- this.nativeElement.children.item(i).firstElementChild.click();
114
- closeMenu = false;
115
- }
116
- }
117
- if (closeMenu) {
118
- this.itemClicked.emit();
119
- }
120
- }
121
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuItem, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: BaoDropdownMenuComponent }], target: i0.ɵɵFactoryTarget.Directive }); }
122
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuItem, selector: "bao-dropdown-menu-item, [bao-dropdown-menu-item]", inputs: { disabled: "disabled" }, outputs: { itemClicked: "itemClicked" }, host: { listeners: { "window:keyup.space": "spaceKeyEvent()", "click": "onClick($event.target)", "window:keyup.enter": "enterKeyEvent()" }, properties: { "class.bao-dropdown-menu-item-disabled": "disabled===true" }, classAttribute: "bao-dropdown-menu-item" }, usesOnChanges: true, ngImport: i0 }); }
123
- }
124
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuItem, decorators: [{
125
- type: Directive,
126
- args: [{
127
- selector: 'bao-dropdown-menu-item, [bao-dropdown-menu-item]',
128
- host: {
129
- class: 'bao-dropdown-menu-item',
130
- '[class.bao-dropdown-menu-item-disabled]': 'disabled===true'
131
- }
132
- }]
133
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: BaoDropdownMenuComponent }], propDecorators: { disabled: [{
134
- type: Input
135
- }], itemClicked: [{
136
- type: Output
137
- }], spaceKeyEvent: [{
138
- type: HostListener,
139
- args: ['window:keyup.space']
140
- }], onClick: [{
141
- type: HostListener,
142
- args: ['click', ['$event.target']]
143
- }], enterKeyEvent: [{
144
- type: HostListener,
145
- args: ['window:keyup.enter']
146
- }] } });
147
- export class BaoDropdownMenuComponent {
148
- constructor(cdr, renderer, elementRef) {
149
- this.cdr = cdr;
150
- this.renderer = renderer;
151
- this.elementRef = elementRef;
152
- /**
153
- * Fired when the dropdown-menu changes its 'isOpen' value
154
- */
155
- this.isOpenChange = new EventEmitter();
156
- /**
157
- * Fired when menu is closed by key event triggered from menu item
158
- */
159
- this.isClosedByKeyEvent = new EventEmitter();
160
- /**
161
- * Unique identifier of the dropdown menu
162
- */
163
- this.menuId = `bao-dropdown-menu-${++dropdownMenuUniqueId}`;
164
- /**
165
- * Is the dropwdown menu currently open
166
- */
167
- this._isOpen = false;
168
- }
169
- get isOpen() {
170
- return this._isOpen;
171
- }
172
- get activeItemIndex() {
173
- return this._activeItemIndex;
174
- }
175
- get menuPortal() {
176
- return this._menuPortal;
177
- }
178
- get nativeElement() {
179
- return this.elementRef.nativeElement;
180
- }
181
- set isOpen(isOpen) {
182
- this._isOpen = isOpen;
183
- this.cdr.detectChanges();
184
- this.isOpenChange.emit(isOpen);
185
- }
186
- set activeItemIndex(index) {
187
- this._activeItemIndex = index;
188
- }
189
- upKeyEvent() {
190
- if (this.isOpen) {
191
- const index = isNaN(this._activeItemIndex) ? -1 : this._activeItemIndex;
192
- const nextIndex = this.getNextActivableItemIndex(index, false);
193
- if (nextIndex > -1) {
194
- this.focusNextItem(nextIndex);
195
- }
196
- }
197
- }
198
- downKeyEvent() {
199
- if (this.isOpen) {
200
- const index = isNaN(this._activeItemIndex) ? -1 : this._activeItemIndex;
201
- const nextIndex = this.getNextActivableItemIndex(index, true);
202
- if (nextIndex > -1) {
203
- this.focusNextItem(nextIndex);
204
- }
205
- }
206
- }
207
- /** Prevents focus to be lost when TAB has reached end of menu */
208
- tabKeyEvent() {
209
- if (this.isOpen) {
210
- if (document.activeElement === this._listItems.last.nativeElement) {
211
- this.isClosedByKeyEvent.emit();
212
- }
213
- }
214
- }
215
- tabUpKeyEvent() {
216
- if (this.isOpen) {
217
- this._activeItemIndex = this._listItems.reduce((acc, element, index) => {
218
- if (element.nativeElement === document.activeElement) {
219
- acc = index;
220
- }
221
- return acc;
222
- }, -1);
223
- }
224
- }
225
- /** Prevents focus to be lost when SHIFT + TAB has reached beginning of menu */
226
- shiftTabKeyEvent(event) {
227
- if (this.isOpen) {
228
- if (document.activeElement === this._listItems.first.nativeElement) {
229
- event.preventDefault();
230
- event.stopPropagation();
231
- this.isClosedByKeyEvent.emit();
232
- }
233
- }
234
- }
235
- ngAfterViewInit() {
236
- this.renderer.setAttribute(this.nativeElement, 'id', this.menuId);
237
- this._menuPortal = new DomPortal(this._menuContent);
238
- }
239
- ngAfterContentInit() {
240
- this._listItems.forEach((item) => item.itemClicked.subscribe(() => this.isClosedByKeyEvent.emit()));
241
- }
242
- open() {
243
- this.isOpen = true;
244
- }
245
- close() {
246
- this.isOpen = false;
247
- }
248
- focus() {
249
- this._activeItemIndex = -1;
250
- this._menuContent.nativeElement.focus();
251
- }
252
- /** Move the aria-current attribute to new active page */
253
- setNavigationAttribute(activePageElement) {
254
- const previousActivePage = this._listItems.find((item) => {
255
- return item.nativeElement.attributes['aria-current'] === 'page';
256
- });
257
- if (previousActivePage) {
258
- this.renderer.removeAttribute(previousActivePage.nativeElement, 'aria-current');
259
- this.renderer.removeClass(previousActivePage.nativeElement, 'active-link');
260
- }
261
- this.renderer.setAttribute(activePageElement, 'aria-current', 'page');
262
- this.renderer.addClass(activePageElement, 'active-link');
263
- }
264
- focusNextItem(nextIndex) {
265
- this._activeItemIndex = nextIndex;
266
- this._listItems.get(nextIndex).nativeElement.focus();
267
- }
268
- /**
269
- * Finds the next activable tab index when navigating with up and down arrow or TAB keys
270
- * @param currentIndex List item index which currently has focus
271
- * @param isDown Whether the navigation is going in the down direction or not
272
- * @param isBackward If recursive function is going backward looking for last activable item in list
273
- * @returns Index of the next item that will receive focus
274
- */
275
- getNextActivableItemIndex(currentIndex, isDown) {
276
- const init = [];
277
- // Get all the activable indexes
278
- const activableIndexes = this._listItems.reduce((acc, element, index) => {
279
- if (!element.disabled) {
280
- acc = [...acc, index];
281
- }
282
- return acc;
283
- }, init);
284
- if (activableIndexes.length) {
285
- if (isDown) {
286
- // Select the first enabled element
287
- if (currentIndex === -1) {
288
- return activableIndexes[0];
289
- }
290
- // Select the only enabled element
291
- if (activableIndexes.length === 1) {
292
- return activableIndexes[0];
293
- }
294
- // Stay on the last enabled element
295
- if (currentIndex === activableIndexes[activableIndexes.length - 1]) {
296
- return currentIndex;
297
- }
298
- // Select the next enabled element
299
- return activableIndexes.find(index => index > currentIndex);
300
- }
301
- const isUp = !isDown;
302
- if (isUp) {
303
- // Do nothing whenever nothing is selected
304
- if (currentIndex === -1) {
305
- return currentIndex;
306
- }
307
- // Select the only enabled element
308
- if (activableIndexes.length === 1) {
309
- return activableIndexes[0];
310
- }
311
- // Stay on the first enabled element
312
- if (currentIndex === activableIndexes[0]) {
313
- return currentIndex;
314
- }
315
- // Select the above enabled element
316
- return activableIndexes.reverse().find(index => index < currentIndex);
317
- }
318
- return -1;
319
- }
320
- }
321
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
322
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuComponent, selector: "bao-dropdown-menu", outputs: { isOpenChange: "isOpenChange", isClosedByKeyEvent: "isClosedByKeyEvent" }, host: { listeners: { "window:keyup.arrowup": "upKeyEvent()", "window:keyup.arrowdown": "downKeyEvent()", "window:keydown.tab": "tabKeyEvent()", "window:keyup.tab": "tabUpKeyEvent()", "window:keydown.shift.tab": "shiftTabKeyEvent($event)" }, properties: { "class.bao-overlay-transparent-backdrop": "isOpen===false", "class.bao-dropdown-menu-closed": "isOpen===false", "attr.aria-expanded": "isOpen" }, classAttribute: "bao-dropdown-menu-container" }, queries: [{ propertyName: "_listItems", predicate: BaoDropdownMenuItem, descendants: true }], viewQueries: [{ propertyName: "_menuContent", first: true, predicate: ["menuContent"], descendants: true }], ngImport: i0, template: "<div #menuContent class=\"bao-dropdown-menu\" tabindex=\"-1\">\n <ng-content></ng-content>\n</div>\n", styles: [".bao-dropdown-menu-container.bao-dropdown-menu-closed{display:none}.bao-dropdown-menu{min-width:16rem;max-width:32rem;overflow-y:auto;background:#fff;box-shadow:0 .5rem 2rem #0000001a;border-radius:.25rem;margin-top:.25rem;margin-bottom:.25rem;padding-top:.5rem;padding-bottom:.5rem}.bao-dropdown-menu:focus-visible{outline:none}.bao-dropdown-menu .bao-overlay-transparent-backdrop{background-color:#fff0;display:none}.bao-dropdown-menu ul{list-style-type:none;padding:0;margin:0}.bao-dropdown-menu h5{padding:.5rem 0 .5rem 1rem;margin:0}.bao-dropdown-menu .bao-dropdown-menu-item{display:flex;align-items:center;text-decoration:none;border-bottom:none;cursor:default}.bao-dropdown-menu .bao-dropdown-menu-item:hover{background-color:#f8f9fa}.bao-dropdown-menu .bao-dropdown-menu-item:active{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item:focus{box-shadow:inset 0 0 0 .25rem #98bcde}.bao-dropdown-menu .bao-dropdown-menu-item.active-link{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-right{padding-right:1.5rem}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-left{padding-left:1rem}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled{cursor:not-allowed;pointer-events:none}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:hover,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:active{background:#fff}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-label,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{color:#adb2bd}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content{display:flex;flex-direction:column;margin:.5rem 1rem;background-color:inherit}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-label{font-weight:400;font-size:1rem;line-height:1.5rem;color:#212529}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{font-weight:400;font-size:.875rem;line-height:1.25rem;color:#637381}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-icon{color:#adb2bd;flex-shrink:0}.bao-dropdown-menu .bao-dropdown-menu-divider hr{margin-top:.5rem;margin-bottom:.5rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
323
- }
324
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuComponent, decorators: [{
325
- type: Component,
326
- args: [{ selector: 'bao-dropdown-menu', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
327
- class: 'bao-dropdown-menu-container',
328
- '[class.bao-overlay-transparent-backdrop]': 'isOpen===false',
329
- '[class.bao-dropdown-menu-closed]': 'isOpen===false',
330
- '[attr.aria-expanded]': 'isOpen'
331
- }, template: "<div #menuContent class=\"bao-dropdown-menu\" tabindex=\"-1\">\n <ng-content></ng-content>\n</div>\n", styles: [".bao-dropdown-menu-container.bao-dropdown-menu-closed{display:none}.bao-dropdown-menu{min-width:16rem;max-width:32rem;overflow-y:auto;background:#fff;box-shadow:0 .5rem 2rem #0000001a;border-radius:.25rem;margin-top:.25rem;margin-bottom:.25rem;padding-top:.5rem;padding-bottom:.5rem}.bao-dropdown-menu:focus-visible{outline:none}.bao-dropdown-menu .bao-overlay-transparent-backdrop{background-color:#fff0;display:none}.bao-dropdown-menu ul{list-style-type:none;padding:0;margin:0}.bao-dropdown-menu h5{padding:.5rem 0 .5rem 1rem;margin:0}.bao-dropdown-menu .bao-dropdown-menu-item{display:flex;align-items:center;text-decoration:none;border-bottom:none;cursor:default}.bao-dropdown-menu .bao-dropdown-menu-item:hover{background-color:#f8f9fa}.bao-dropdown-menu .bao-dropdown-menu-item:active{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item:focus{box-shadow:inset 0 0 0 .25rem #98bcde}.bao-dropdown-menu .bao-dropdown-menu-item.active-link{background-color:#eefaf8}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-right{padding-right:1.5rem}.bao-dropdown-menu .bao-dropdown-menu-item.has-element-left{padding-left:1rem}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled{cursor:not-allowed;pointer-events:none}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:hover,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled:active{background:#fff}.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-label,.bao-dropdown-menu .bao-dropdown-menu-item.bao-dropdown-menu-item-disabled .bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{color:#adb2bd}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content{display:flex;flex-direction:column;margin:.5rem 1rem;background-color:inherit}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-label{font-weight:400;font-size:1rem;line-height:1.5rem;color:#212529}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-dropdown-menu-item-content .bao-dropdown-menu-item-description{font-weight:400;font-size:.875rem;line-height:1.25rem;color:#637381}.bao-dropdown-menu .bao-dropdown-menu-item>.bao-icon{color:#adb2bd;flex-shrink:0}.bao-dropdown-menu .bao-dropdown-menu-divider hr{margin-top:.5rem;margin-bottom:.5rem}\n"] }]
332
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { isOpenChange: [{
333
- type: Output
334
- }], isClosedByKeyEvent: [{
335
- type: Output
336
- }], _menuContent: [{
337
- type: ViewChild,
338
- args: ['menuContent']
339
- }], _listItems: [{
340
- type: ContentChildren,
341
- args: [BaoDropdownMenuItem, { descendants: true }]
342
- }], upKeyEvent: [{
343
- type: HostListener,
344
- args: ['window:keyup.arrowup']
345
- }], downKeyEvent: [{
346
- type: HostListener,
347
- args: ['window:keyup.arrowdown']
348
- }], tabKeyEvent: [{
349
- type: HostListener,
350
- args: ['window:keydown.tab']
351
- }], tabUpKeyEvent: [{
352
- type: HostListener,
353
- args: ['window:keyup.tab']
354
- }], shiftTabKeyEvent: [{
355
- type: HostListener,
356
- args: ['window:keydown.shift.tab', ['$event']]
357
- }] } });
358
- /**
359
- * Directive to be applied on element that will trigger the opening and closing of menu.
360
- */
361
- export class BaoDropdownMenuTrigger {
362
- constructor(renderer, elementRef, overlay) {
363
- this.renderer = renderer;
364
- this.elementRef = elementRef;
365
- this.overlay = overlay;
366
- this._overlayRef = null;
367
- this._isMenuOpen = false;
368
- }
369
- get nativeElement() {
370
- return this.elementRef.nativeElement;
371
- }
372
- escapeKeyEvent() {
373
- if (this._isMenuOpen) {
374
- this.closeMenu();
375
- this.nativeElement.focus();
376
- }
377
- }
378
- onClick() {
379
- this.toggleMenu();
380
- }
381
- ngAfterViewInit() {
382
- this.renderer.setAttribute(this.nativeElement, 'role', 'button');
383
- this.renderer.setAttribute(this.nativeElement, 'aria-controls', `bao-dropdown-menu-${dropdownMenuUniqueId}`);
384
- this.menu.isClosedByKeyEvent.subscribe(() => {
385
- this.closeMenu();
386
- this.nativeElement.focus();
387
- });
388
- }
389
- ngOnDestroy() {
390
- if (this._overlayRef) {
391
- this._overlayRef.dispose();
392
- }
393
- }
394
- toggleMenu() {
395
- return this._isMenuOpen ? this.closeMenu() : this.openMenu();
396
- }
397
- closeMenu() {
398
- this._isMenuOpen = false;
399
- this.menu.close();
400
- if (this._overlayRef) {
401
- this._overlayRef.detach();
402
- }
403
- }
404
- openMenu() {
405
- if (!this.menu) {
406
- return;
407
- }
408
- const overlayRef = this.createOverlay();
409
- overlayRef.attach(this.menu.menuPortal);
410
- this._isMenuOpen = true;
411
- this.menu.open();
412
- this.menu.focus();
413
- }
414
- createOverlay() {
415
- if (!this._overlayRef) {
416
- const config = this.getOverlayConfig();
417
- this._overlayRef = this.overlay.create(config);
418
- }
419
- this._overlayRef.backdropClick().subscribe(() => {
420
- this.closeMenu();
421
- });
422
- return this._overlayRef;
423
- }
424
- getOverlayConfig() {
425
- return new OverlayConfig({
426
- positionStrategy: this.overlay
427
- .position()
428
- .flexibleConnectedTo(this.elementRef)
429
- .withLockedPosition()
430
- .withGrowAfterOpen()
431
- .withPositions([
432
- {
433
- // top-left of the overlay is connected to bottom-left of the origin;
434
- originX: 'start',
435
- originY: 'bottom',
436
- overlayX: 'start',
437
- overlayY: 'top'
438
- },
439
- {
440
- // bottom-left of the overlay is connected to top-left of the origin;
441
- originX: 'start',
442
- originY: 'top',
443
- overlayX: 'start',
444
- overlayY: 'bottom'
445
- },
446
- {
447
- // top-right of the overlay is connected to bottom-right of the origin;
448
- originX: 'end',
449
- originY: 'bottom',
450
- overlayX: 'end',
451
- overlayY: 'top'
452
- },
453
- {
454
- // bottom-right of the overlay is connected to top-right of the origin;
455
- originX: 'end',
456
- originY: 'top',
457
- overlayX: 'end',
458
- overlayY: 'bottom'
459
- }
460
- ]),
461
- backdropClass: 'bao-overlay-transparent-backdrop',
462
- hasBackdrop: true,
463
- scrollStrategy: this.overlay.scrollStrategies.block()
464
- });
465
- }
466
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuTrigger, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.Overlay }], target: i0.ɵɵFactoryTarget.Directive }); }
467
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuTrigger, selector: "bao-dropdown-menu-trigger, [bao-dropdown-menu-trigger], [baoDropdownMenuTriggerFor]", inputs: { menu: ["baoDropdownMenuTriggerFor", "menu"] }, host: { listeners: { "window:keyup.escape": "escapeKeyEvent()", "click": "onClick()" }, classAttribute: "bao-dropdown-menu-trigger" }, ngImport: i0 }); }
468
- }
469
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuTrigger, decorators: [{
470
- type: Directive,
471
- args: [{
472
- selector: 'bao-dropdown-menu-trigger, [bao-dropdown-menu-trigger], [baoDropdownMenuTriggerFor]',
473
- host: { class: 'bao-dropdown-menu-trigger' }
474
- }]
475
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.Overlay }], propDecorators: { menu: [{
476
- type: Input,
477
- args: ['baoDropdownMenuTriggerFor']
478
- }], escapeKeyEvent: [{
479
- type: HostListener,
480
- args: ['window:keyup.escape']
481
- }], onClick: [{
482
- type: HostListener,
483
- args: ['click']
484
- }] } });
485
- /**
486
- * Sections of list items in menu. Apply proper styling to section's title if there is one.
487
- */
488
- export class BaoDropdownMenuSection {
489
- constructor(elementRef, renderer) {
490
- this.elementRef = elementRef;
491
- this.renderer = renderer;
492
- }
493
- get nativeElement() {
494
- return this.elementRef.nativeElement;
495
- }
496
- ngAfterViewInit() {
497
- const children = Array.from(this.nativeElement.childNodes);
498
- const textIndex = children.findIndex((c) => c.nodeName === '#text');
499
- if (textIndex > -1) {
500
- this.insertTitle(children, textIndex);
501
- }
502
- }
503
- insertTitle(children, txtIdx) {
504
- const titleElement = this.renderer.createElement('h5');
505
- this.renderer.setProperty(titleElement, 'textContent', children[txtIdx].nodeValue);
506
- this.renderer.removeChild(this.nativeElement, children[txtIdx]);
507
- const listIndex = children.findIndex((c) => c.nodeName === 'UL');
508
- this.renderer.insertBefore(this.nativeElement, titleElement, children[listIndex]);
509
- }
510
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuSection, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
511
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuSection, selector: "bao-dropdown-menu-section, [bao-dropdown-menu-section]", host: { classAttribute: "bao-dropdown-menu-section" }, ngImport: i0 }); }
512
- }
513
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuSection, decorators: [{
514
- type: Directive,
515
- args: [{
516
- selector: 'bao-dropdown-menu-section, [bao-dropdown-menu-section]',
517
- host: { class: 'bao-dropdown-menu-section' }
518
- }]
519
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] });
520
- /**
521
- * Label of a list item, add css class to apply proper styling.
522
- */
523
- export class BaoDropdownMenuItemLabel {
524
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuItemLabel, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
525
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuItemLabel, selector: "bao-dropdown-menu-item-label, [bao-dropdown-menu-item-label]", host: { classAttribute: "bao-dropdown-menu-item-label" }, ngImport: i0 }); }
526
- }
527
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuItemLabel, decorators: [{
528
- type: Directive,
529
- args: [{
530
- selector: 'bao-dropdown-menu-item-label, [bao-dropdown-menu-item-label]',
531
- host: { class: 'bao-dropdown-menu-item-label' }
532
- }]
533
- }] });
534
- /**
535
- * Description of a list item, add css class to apply proper styling.
536
- */
537
- export class BaoDropdownMenuItemDescription {
538
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuItemDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
539
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuItemDescription, selector: "bao-dropdown-menu-item-description, [bao-dropdown-menu-item-description]", host: { classAttribute: "bao-dropdown-menu-item-description" }, ngImport: i0 }); }
540
- }
541
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuItemDescription, decorators: [{
542
- type: Directive,
543
- args: [{
544
- selector: 'bao-dropdown-menu-item-description, [bao-dropdown-menu-item-description]',
545
- host: { class: 'bao-dropdown-menu-item-description' }
546
- }]
547
- }] });
548
- /**
549
- * Divider to separate sections.
550
- */
551
- export class BaoDropdownMenuDivider {
552
- constructor(renderer, elementRef) {
553
- this.renderer = renderer;
554
- this.elementRef = elementRef;
555
- }
556
- get nativeElement() {
557
- return this.elementRef.nativeElement;
558
- }
559
- ngAfterContentInit() {
560
- this.renderer.setAttribute(this.nativeElement, 'role', 'separator');
561
- }
562
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuDivider, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
563
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BaoDropdownMenuDivider, selector: "bao-dropdown-menu-divider, [bao-dropdown-menu-divider]", host: { classAttribute: "bao-dropdown-menu-divider" }, ngImport: i0, template: `<hr />`, isInline: true }); }
564
- }
565
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BaoDropdownMenuDivider, decorators: [{
566
- type: Component,
567
- args: [{
568
- template: `<hr />`,
569
- selector: 'bao-dropdown-menu-divider, [bao-dropdown-menu-divider]',
570
- host: { class: 'bao-dropdown-menu-divider' }
571
- }]
572
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }] });
573
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXVpL3NyYy9saWIvZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdWkvc3JjL2xpYi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFHTCxhQUFhLEVBRWQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBR3ZCOztHQUVHO0FBQ0gsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFRN0IsTUFBTSxPQUFPLG1CQUFtQjtJQVc5QixZQUNVLFFBQW1CLEVBQ25CLFVBQW1DLEVBQ25DLE9BQWlDO1FBRmpDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFiM0M7O1dBRUc7UUFDYSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpDOztXQUVHO1FBQ2MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBTS9DLENBQUM7SUFFSixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFHRCxhQUFhO1FBQ1gsSUFBSSxRQUFRLENBQUMsYUFBYSxJQUFJ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QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1UsUUFBbUIsRUFDbkIsVUFBbUM7UUFEbkMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUF5QjtJQUMxQyxDQUFDO0lBRUosSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7K0dBWlUsc0JBQXNCO21HQUF0QixzQkFBc0IscUpBSnZCLFFBQVE7OzRGQUlQLHNCQUFzQjtrQkFMbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsUUFBUSxFQUFFLHdEQUF3RDtvQkFDbEUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFO2lCQUM3QyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYgVmlsbGUgZGUgTW9udHJlYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuXG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheUNvbmZpZyxcbiAgT3ZlcmxheVJlZlxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBEb21Qb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFVuaXF1ZSBJRCBmb3IgZWFjaCBkcm9wZG93biBtZW51XG4gKi9cbmxldCBkcm9wZG93bk1lbnVVbmlxdWVJZCA9IDA7XG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLCBbYmFvLWRyb3Bkb3duLW1lbnUtaXRlbV0nLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtJyxcbiAgICAnW2NsYXNzLmJhby1kcm9wZG93bi1tZW51LWl0ZW0tZGlzYWJsZWRdJzogJ2Rpc2FibGVkPT09dHJ1ZSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVJdGVtIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIElzIHRoZSBsaXN0IGl0ZW0gZGlzYWJsZWRcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIG1lbnUgaXRlbSBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIGl0ZW1DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgX3BhcmVudDogQmFvRHJvcGRvd25NZW51Q29tcG9uZW50XG4gICkge31cblxuICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLnNwYWNlJylcbiAgc3BhY2VLZXlFdmVudCgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PSB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gIG9uQ2xpY2soZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5hdHRyaWJ1dGVzWydocmVmJ10pIHtcbiAgICAgIHRoaXMuX3BhcmVudC5zZXROYXZpZ2F0aW9uQXR0cmlidXRlKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIC8vIFByZXZlbnQgZG91YmxlLWNsaWNrIG9uIGNoZWNrYm94IGlucHV0IHRoYXQgdW5kb2VzIHRoZSB0b2dnbGVcbiAgICBpZiAoIWVsLmNsYXNzTGlzdC5jb250YWlucygnYmFvLWNoZWNrYm94LWNvbnRlbnQtY29udGFpbmVyJykpIHtcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2xpY2soKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAuZW50ZXInKVxuICBlbnRlcktleUV2ZW50KCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09IHRoaXMubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENvbnRlbnREaXYoKTtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMubmF0aXZlRWxlbWVudCwgJ3RhYkluZGV4JywgJzAnKTtcbiAgICB9XG4gICAgdGhpcy5hZGRQYWRkaW5nQ2xhc3MoKTtcbiAgICAvLyBSZW1vdmUgaW5wdXQgZWxlbWVudCBpbnNpZGUgaXRlbSBmcm9tIGtleWJvYXJkIG5hdmlnYXRpb24gc2VxdWVuY2VcbiAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnaGFzLWVsZW1lbnQtbGVmdCcpKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLml0ZW0oMCkuZmlyc3RFbGVtZW50Q2hpbGQsXG4gICAgICAgICd0YWJJbmRleCcsXG4gICAgICAgICctMSdcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiBjaGFuZ2VzWydkaXNhYmxlZCddLmN1cnJlbnRWYWx1ZSA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRpc2FibGVJdGVtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlZ3JvdXBzIGxhYmVsIGFuZCBkZXNjcmlwdGlvbiBpbiBhIG5ldyBkaXYgdG8gaGVscCB3aXRoIGxheW91dCAqL1xuICBwcml2YXRlIGFkZENvbnRlbnREaXYoKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbik7XG4gICAgY29uc3QgbGFiZWxJbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChcbiAgICAgIGMgPT4gYy5sb2NhbE5hbWUgPT09ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWxhYmVsJ1xuICAgICk7XG4gICAgY29uc3QgbGFiZWxFbGVtZW50ID0gY2hpbGRyZW5bbGFiZWxJbmRleF07XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGNoaWxkcmVuW2xhYmVsSW5kZXhdKTtcbiAgICBjb25zdCBjb250ZW50RGl2ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGNvbnRlbnREaXYsICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWNvbnRlbnQnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMubmF0aXZlRWxlbWVudCwgY29udGVudERpdik7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250ZW50RGl2LCBsYWJlbEVsZW1lbnQpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uSW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgoXG4gICAgICBjID0+IGMubG9jYWxOYW1lID09PSAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1kZXNjcmlwdGlvbidcbiAgICApO1xuICAgIGlmIChkZXNjcmlwdGlvbkluZGV4ID4gMCkge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25FbGVtZW50ID0gY2hpbGRyZW5bZGVzY3JpcHRpb25JbmRleF07XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubmF0aXZlRWxlbWVudCwgY2hpbGRyZW5bZGVzY3JpcHRpb25JbmRleF0pO1xuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250ZW50RGl2LCBkZXNjcmlwdGlvbkVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkUGFkZGluZ0NsYXNzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbSh0aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pO1xuICAgIC8vIE1lbnUgaXRlbSBoYXMgZXh0cmEgZWxlbWVudCBuZXh0IHRvIGxhYmVsXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIE9ubHkgdG9nZ2xlIGVsZW1lbnQgY2FuIGJlIG9uIHRoZSByaWdodFxuICAgICAgaWYgKGNoaWxkcmVuLmZpbmRJbmRleChjID0+IGMubG9jYWxOYW1lID09PSAnYmFvLXRvZ2dsZScpID4gMCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgJ2hhcy1lbGVtZW50LXJpZ2h0Jyk7XG4gICAgICB9XG4gICAgICAvLyBJY29uLCBjaGVja2JveCwgcmFkaW8gYnV0dG9uIG9yIGF2YXRhciBtdXN0IGJlIG9uIHRoZSBsZWZ0XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdoYXMtZWxlbWVudC1sZWZ0Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSXRlbSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5uYXRpdmVFbGVtZW50LCAnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICd0YWJJbmRleCcsICctMScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBwcm9wYWdhdGVzIGEgY2xpY2sgZXZlbnQgdG8gbWVudSBpdGVtIGNoaWxkcmVuIHdpdGggaW5wdXRzIChjaGVja2JveCwgcmFkaW8gYnV0dG9uKS5cbiAgICogSXQgZW1pdHMgZXZlbnQgdG8gY2xvc2UgbWVudSBpZiBpdGVtIGRvZXMgbm90IGNvbnRhaW4gYW4gaW5wdXQuXG4gICAqL1xuICBwcml2YXRlIHByb3BhZ2F0ZUNsaWNrKCk6IHZvaWQge1xuICAgIGxldCBjbG9zZU1lbnUgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5pdGVtKGkpLmZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZSA9PVxuICAgICAgICAnaW5wdXQnXG4gICAgICApIHtcbiAgICAgICAgKFxuICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5pdGVtKGkpLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50XG4gICAgICAgICkuY2xpY2soKTtcbiAgICAgICAgY2xvc2VNZW51ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjbG9zZU1lbnUpIHtcbiAgICAgIHRoaXMuaXRlbUNsaWNrZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYmFvLWRyb3Bkb3duLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24tbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2Jhby1kcm9wZG93bi1tZW51LWNvbnRhaW5lcicsXG4gICAgJ1tjbGFzcy5iYW8tb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcF0nOiAnaXNPcGVuPT09ZmFsc2UnLFxuICAgICdbY2xhc3MuYmFvLWRyb3Bkb3duLW1lbnUtY2xvc2VkXSc6ICdpc09wZW49PT1mYWxzZScsXG4gICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2lzT3BlbidcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBkcm9wZG93bi1tZW51IGNoYW5nZXMgaXRzICdpc09wZW4nIHZhbHVlXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIGlzT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBtZW51IGlzIGNsb3NlZCBieSBrZXkgZXZlbnQgdHJpZ2dlcmVkIGZyb20gbWVudSBpdGVtXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIGlzQ2xvc2VkQnlLZXlFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogQ29udGVudCBvZiBtZW51IHRvIGJlIGxvYWRlZCBpbnNpZGUgT3ZlcmxheVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnbWVudUNvbnRlbnQnKSBfbWVudUNvbnRlbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBBbGwgbGlzdCBpdGVtcyBpbnNpZGUgbWVudVxuICAgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihCYW9Ecm9wZG93bk1lbnVJdGVtLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIF9saXN0SXRlbXM6IFF1ZXJ5TGlzdDxCYW9Ecm9wZG93bk1lbnVJdGVtPjtcblxuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRyb3Bkb3duIG1lbnVcbiAgICovXG4gIHJlYWRvbmx5IG1lbnVJZCA9IGBiYW8tZHJvcGRvd24tbWVudS0keysrZHJvcGRvd25NZW51VW5pcXVlSWR9YDtcblxuICAvKipcbiAgICogSXMgdGhlIGRyb3B3ZG93biBtZW51IGN1cnJlbnRseSBvcGVuXG4gICAqL1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHBvcnRhbCB3aGljaCBpcyBhdHRhY2hlZCB0byBPdmVybGF5XG4gICAqL1xuICBwcml2YXRlIF9tZW51UG9ydGFsOiBEb21Qb3J0YWw7XG5cbiAgLyoqXG4gICAqIEluZGV4IG9mIGN1cnJlbnRseSBhY3RpdmUgbGlzdCBpdGVtXG4gICAqL1xuICBwcml2YXRlIF9hY3RpdmVJdGVtSW5kZXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgKSB7fVxuXG4gIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuICBnZXQgYWN0aXZlSXRlbUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleDtcbiAgfVxuICBnZXQgbWVudVBvcnRhbCgpOiBEb21Qb3J0YWwge1xuICAgIHJldHVybiB0aGlzLl9tZW51UG9ydGFsO1xuICB9XG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cbiAgc2V0IGlzT3Blbihpc09wZW46IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc09wZW4gPSBpc09wZW47XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQoaXNPcGVuKTtcbiAgfVxuICBzZXQgYWN0aXZlSXRlbUluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cC5hcnJvd3VwJylcbiAgdXBLZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaXNOYU4odGhpcy5fYWN0aXZlSXRlbUluZGV4KSA/IC0xIDogdGhpcy5fYWN0aXZlSXRlbUluZGV4O1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5nZXROZXh0QWN0aXZhYmxlSXRlbUluZGV4KGluZGV4LCBmYWxzZSk7XG4gICAgICBpZiAobmV4dEluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5mb2N1c05leHRJdGVtKG5leHRJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLmFycm93ZG93bicpXG4gIGRvd25LZXlFdmVudCgpIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaXNOYU4odGhpcy5fYWN0aXZlSXRlbUluZGV4KSA/IC0xIDogdGhpcy5fYWN0aXZlSXRlbUluZGV4O1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5nZXROZXh0QWN0aXZhYmxlSXRlbUluZGV4KGluZGV4LCB0cnVlKTtcbiAgICAgIGlmIChuZXh0SW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLmZvY3VzTmV4dEl0ZW0obmV4dEluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogUHJldmVudHMgZm9jdXMgdG8gYmUgbG9zdCB3aGVuIFRBQiBoYXMgcmVhY2hlZCBlbmQgb2YgbWVudSAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24udGFiJylcbiAgdGFiS2V5RXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5fbGlzdEl0ZW1zLmxhc3QubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLmlzQ2xvc2VkQnlLZXlFdmVudC5lbWl0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLnRhYicpXG4gIHRhYlVwS2V5RXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSB0aGlzLl9saXN0SXRlbXMucmVkdWNlKChhY2MsIGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBhY2MgPSBpbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCAtMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFByZXZlbnRzIGZvY3VzIHRvIGJlIGxvc3Qgd2hlbiBTSElGVCArIFRBQiBoYXMgcmVhY2hlZCBiZWdpbm5pbmcgb2YgbWVudSAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24uc2hpZnQudGFiJywgWyckZXZlbnQnXSlcbiAgc2hpZnRUYWJLZXlFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuX2xpc3RJdGVtcy5maXJzdC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmlzQ2xvc2VkQnlLZXlFdmVudC5lbWl0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdpZCcsIHRoaXMubWVudUlkKTtcbiAgICB0aGlzLl9tZW51UG9ydGFsID0gbmV3IERvbVBvcnRhbCh0aGlzLl9tZW51Q29udGVudCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RJdGVtcy5mb3JFYWNoKFxuICAgICAgKGl0ZW06IEJhb0Ryb3Bkb3duTWVudUl0ZW0pOiBTdWJzY3JpcHRpb24gPT5cbiAgICAgICAgaXRlbS5pdGVtQ2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5pc0Nsb3NlZEJ5S2V5RXZlbnQuZW1pdCgpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSAtMTtcbiAgICB0aGlzLl9tZW51Q29udGVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogTW92ZSB0aGUgYXJpYS1jdXJyZW50IGF0dHJpYnV0ZSB0byBuZXcgYWN0aXZlIHBhZ2UgKi9cbiAgcHVibGljIHNldE5hdmlnYXRpb25BdHRyaWJ1dGUoYWN0aXZlUGFnZUVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNBY3RpdmVQYWdlID0gdGhpcy5fbGlzdEl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbTogQmFvRHJvcGRvd25NZW51SXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5uYXRpdmVFbGVtZW50LmF0dHJpYnV0ZXNbJ2FyaWEtY3VycmVudCddID09PSAncGFnZSc7XG4gICAgICB9XG4gICAgKTtcbiAgICBpZiAocHJldmlvdXNBY3RpdmVQYWdlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShcbiAgICAgICAgcHJldmlvdXNBY3RpdmVQYWdlLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICdhcmlhLWN1cnJlbnQnXG4gICAgICApO1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhcbiAgICAgICAgcHJldmlvdXNBY3RpdmVQYWdlLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICdhY3RpdmUtbGluaydcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGFjdGl2ZVBhZ2VFbGVtZW50LCAnYXJpYS1jdXJyZW50JywgJ3BhZ2UnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGFjdGl2ZVBhZ2VFbGVtZW50LCAnYWN0aXZlLWxpbmsnKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNOZXh0SXRlbShuZXh0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IG5leHRJbmRleDtcbiAgICB0aGlzLl9saXN0SXRlbXMuZ2V0KG5leHRJbmRleCkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBuZXh0IGFjdGl2YWJsZSB0YWIgaW5kZXggd2hlbiBuYXZpZ2F0aW5nIHdpdGggdXAgYW5kIGRvd24gYXJyb3cgb3IgVEFCIGtleXNcbiAgICogQHBhcmFtIGN1cnJlbnRJbmRleCBMaXN0IGl0ZW0gaW5kZXggd2hpY2ggY3VycmVudGx5IGhhcyBmb2N1c1xuICAgKiBAcGFyYW0gaXNEb3duIFdoZXRoZXIgdGhlIG5hdmlnYXRpb24gaXMgZ29pbmcgaW4gdGhlIGRvd24gZGlyZWN0aW9uIG9yIG5vdFxuICAgKiBAcGFyYW0gaXNCYWNrd2FyZCBJZiByZWN1cnNpdmUgZnVuY3Rpb24gaXMgZ29pbmcgYmFja3dhcmQgbG9va2luZyBmb3IgbGFzdCBhY3RpdmFibGUgaXRlbSBpbiBsaXN0XG4gICAqIEByZXR1cm5zIEluZGV4IG9mIHRoZSBuZXh0IGl0ZW0gdGhhdCB3aWxsIHJlY2VpdmUgZm9jdXNcbiAgICovXG4gIHByaXZhdGUgZ2V0TmV4dEFjdGl2YWJsZUl0ZW1JbmRleChcbiAgICBjdXJyZW50SW5kZXg6IG51bWJlcixcbiAgICBpc0Rvd246IGJvb2xlYW5cbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBpbml0OiBudW1iZXJbXSA9IFtdO1xuICAgIC8vIEdldCBhbGwgdGhlIGFjdGl2YWJsZSBpbmRleGVzXG4gICAgY29uc3QgYWN0aXZhYmxlSW5kZXhlcyA9IHRoaXMuX2xpc3RJdGVtcy5yZWR1Y2UoKGFjYywgZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghZWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgICBhY2MgPSBbLi4uYWNjLCBpbmRleF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgaW5pdCk7XG5cbiAgICBpZiAoYWN0aXZhYmxlSW5kZXhlcy5sZW5ndGgpIHtcbiAgICAgIGlmIChpc0Rvd24pIHtcbiAgICAgICAgLy8gU2VsZWN0IHRoZSBmaXJzdCBlbmFibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aXZhYmxlSW5kZXhlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlbGVjdCB0aGUgb25seSBlbmFibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKGFjdGl2YWJsZUluZGV4ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGl2YWJsZUluZGV4ZXNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGF5IG9uIHRoZSBsYXN0IGVuYWJsZWQgZWxlbWVudFxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBhY3RpdmFibGVJbmRleGVzW2FjdGl2YWJsZUluZGV4ZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBuZXh0IGVuYWJsZWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gYWN0aXZhYmxlSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4ID4gY3VycmVudEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVcCA9ICFpc0Rvd247XG4gICAgICBpZiAoaXNVcCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nIHdoZW5ldmVyIG5vdGhpbmcgaXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBvbmx5IGVuYWJsZWQgZWxlbWVudFxuICAgICAgICBpZiAoYWN0aXZhYmxlSW5kZXhlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aXZhYmxlSW5kZXhlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXkgb24gdGhlIGZpcnN0IGVuYWJsZWQgZWxlbWVudFxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBhY3RpdmFibGVJbmRleGVzWzBdKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlbGVjdCB0aGUgYWJvdmUgZW5hYmxlZCBlbGVtZW50XG4gICAgICAgIHJldHVybiBhY3RpdmFibGVJbmRleGVzLnJldmVyc2UoKS5maW5kKGluZGV4ID0+IGluZGV4IDwgY3VycmVudEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gYmUgYXBwbGllZCBvbiBlbGVtZW50IHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIG9mIG1lbnUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnYmFvLWRyb3Bkb3duLW1lbnUtdHJpZ2dlciwgW2Jhby1kcm9wZG93bi1tZW51LXRyaWdnZXJdLCBbYmFvRHJvcGRvd25NZW51VHJpZ2dlckZvcl0nLFxuICBob3N0OiB7IGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtdHJpZ2dlcicgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVUcmlnZ2VyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCdiYW9Ecm9wZG93bk1lbnVUcmlnZ2VyRm9yJykgbWVudTogQmFvRHJvcGRvd25NZW51Q29tcG9uZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pc01lbnVPcGVuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5XG4gICkge31cblxuICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwLmVzY2FwZScpXG4gIGVzY2FwZUtleUV2ZW50KCkge1xuICAgIGlmICh0aGlzLl9pc01lbnVPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICBvbkNsaWNrKCkge1xuICAgIHRoaXMudG9nZ2xlTWVudSgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdyb2xlJywgJ2J1dHRvbicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2FyaWEtY29udHJvbHMnLFxuICAgICAgYGJhby1kcm9wZG93bi1tZW51LSR7ZHJvcGRvd25NZW51VW5pcXVlSWR9YFxuICAgICk7XG4gICAgdGhpcy5tZW51LmlzQ2xvc2VkQnlLZXlFdmVudC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZU1lbnUoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTWVudU9wZW4gPyB0aGlzLmNsb3NlTWVudSgpIDogdGhpcy5vcGVuTWVudSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZU1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5faXNNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubWVudS5jbG9zZSgpO1xuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3Blbk1lbnUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMubWVudS5tZW51UG9ydGFsKTtcbiAgICB0aGlzLl9pc01lbnVPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm1lbnUub3BlbigpO1xuICAgIHRoaXMubWVudS5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xuICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZikge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRPdmVybGF5Q29uZmlnKCk7XG4gICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUNvbmZpZygpOiBPdmVybGF5Q29uZmlnIHtcbiAgICByZXR1cm4gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZilcbiAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbigpXG4gICAgICAgIC53aXRoR3Jvd0FmdGVyT3BlbigpXG4gICAgICAgIC53aXRoUG9zaXRpb25zKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyB0b3AtbGVmdCBvZiB0aGUgb3ZlcmxheSBpcyBjb25uZWN0ZWQgdG8gYm90dG9tLWxlZnQgb2YgdGhlIG9yaWdpbjtcbiAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnXG4gICAgICAgICAgfSBhcyBDb25uZWN0ZWRQb3NpdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBib3R0b20tbGVmdCBvZiB0aGUgb3ZlcmxheSBpcyBjb25uZWN0ZWQgdG8gdG9wLWxlZnQgb2YgdGhlIG9yaWdpbjtcbiAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nXG4gICAgICAgICAgfSBhcyBDb25uZWN0ZWRQb3NpdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyB0b3AtcmlnaHQgb2YgdGhlIG92ZXJsYXkgaXMgY29ubmVjdGVkIHRvIGJvdHRvbS1yaWdodCBvZiB0aGUgb3JpZ2luO1xuICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgICAgICAgIH0gYXMgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gYm90dG9tLXJpZ2h0IG9mIHRoZSBvdmVybGF5IGlzIGNvbm5lY3RlZCB0byB0b3AtcmlnaHQgb2YgdGhlIG9yaWdpbjtcbiAgICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbSdcbiAgICAgICAgICB9IGFzIENvbm5lY3RlZFBvc2l0aW9uXG4gICAgICAgIF0pLFxuICAgICAgYmFja2Ryb3BDbGFzczogJ2Jhby1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKClcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBTZWN0aW9ucyBvZiBsaXN0IGl0ZW1zIGluIG1lbnUuIEFwcGx5IHByb3BlciBzdHlsaW5nIHRvIHNlY3Rpb24ncyB0aXRsZSBpZiB0aGVyZSBpcyBvbmUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2Jhby1kcm9wZG93bi1tZW51LXNlY3Rpb24sIFtiYW8tZHJvcGRvd24tbWVudS1zZWN0aW9uXScsXG4gIGhvc3Q6IHsgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1zZWN0aW9uJyB9XG59KVxuZXhwb3J0IGNsYXNzIEJhb0Ryb3Bkb3duTWVudVNlY3Rpb24gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcbiAgKSB7fVxuXG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbSh0aGlzLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2Rlcyk7XG4gICAgY29uc3QgdGV4dEluZGV4ID0gY2hpbGRyZW4uZmluZEluZGV4KFxuICAgICAgKGM6IENoaWxkTm9kZSkgPT4gYy5ub2RlTmFtZSA9PT0gJyN0ZXh0J1xuICAgICk7XG4gICAgaWYgKHRleHRJbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmluc2VydFRpdGxlKGNoaWxkcmVuLCB0ZXh0SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0VGl0bGUoY2hpbGRyZW46IENoaWxkTm9kZVtdLCB0eHRJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaDUnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGl0bGVFbGVtZW50LFxuICAgICAgJ3RleHRDb250ZW50JyxcbiAgICAgIGNoaWxkcmVuW3R4dElkeF0ubm9kZVZhbHVlXG4gICAgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMubmF0aXZlRWxlbWVudCwgY2hpbGRyZW5bdHh0SWR4XSk7XG4gICAgY29uc3QgbGlzdEluZGV4ID0gY2hpbGRyZW4uZmluZEluZGV4KChjOiBDaGlsZE5vZGUpID0+IGMubm9kZU5hbWUgPT09ICdVTCcpO1xuICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKFxuICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LFxuICAgICAgdGl0bGVFbGVtZW50LFxuICAgICAgY2hpbGRyZW5bbGlzdEluZGV4XVxuICAgICk7XG4gIH1cbn1cbi8qKlxuICogTGFiZWwgb2YgYSBsaXN0IGl0ZW0sIGFkZCBjc3MgY2xhc3MgdG8gYXBwbHkgcHJvcGVyIHN0eWxpbmcuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2Jhby1kcm9wZG93bi1tZW51LWl0ZW0tbGFiZWwsIFtiYW8tZHJvcGRvd24tbWVudS1pdGVtLWxhYmVsXScsXG4gIGhvc3Q6IHsgY2xhc3M6ICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWxhYmVsJyB9XG59KVxuZXhwb3J0IGNsYXNzIEJhb0Ryb3Bkb3duTWVudUl0ZW1MYWJlbCB7fVxuLyoqXG4gKiBEZXNjcmlwdGlvbiBvZiBhIGxpc3QgaXRlbSwgYWRkIGNzcyBjbGFzcyB0byBhcHBseSBwcm9wZXIgc3R5bGluZy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdiYW8tZHJvcGRvd24tbWVudS1pdGVtLWRlc2NyaXB0aW9uLCBbYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1kZXNjcmlwdGlvbl0nLFxuICBob3N0OiB7IGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtaXRlbS1kZXNjcmlwdGlvbicgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVJdGVtRGVzY3JpcHRpb24ge31cbi8qKlxuICogRGl2aWRlciB0byBzZXBhcmF0ZSBzZWN0aW9ucy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiBgPGhyIC8+YCxcbiAgc2VsZWN0b3I6ICdiYW8tZHJvcGRvd24tbWVudS1kaXZpZGVyLCBbYmFvLWRyb3Bkb3duLW1lbnUtZGl2aWRlcl0nLFxuICBob3N0OiB7IGNsYXNzOiAnYmFvLWRyb3Bkb3duLW1lbnUtZGl2aWRlcicgfVxufSlcbmV4cG9ydCBjbGFzcyBCYW9Ecm9wZG93bk1lbnVEaXZpZGVyIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICkge31cblxuICBnZXQgbmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLm5hdGl2ZUVsZW1lbnQsICdyb2xlJywgJ3NlcGFyYXRvcicpO1xuICB9XG59XG4iLCI8ZGl2ICNtZW51Q29udGVudCBjbGFzcz1cImJhby1kcm9wZG93bi1tZW51XCIgdGFiaW5kZXg9XCItMVwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==