@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.
- package/fesm2022/villedemontreal-angular-ui.mjs +421 -372
- package/fesm2022/villedemontreal-angular-ui.mjs.map +1 -1
- package/lib/dropdown-menu/dropdown-menu.component.d.ts +16 -9
- package/lib/modal/modal-container.d.ts +1 -1
- package/lib/modal/modal.d.ts +1 -1
- package/package.json +5 -7
- package/esm2022/lib/alert/alert.component.mjs +0 -169
- package/esm2022/lib/alert/index.mjs +0 -8
- package/esm2022/lib/alert/module.mjs +0 -41
- package/esm2022/lib/avatar/avatar.component.mjs +0 -102
- package/esm2022/lib/avatar/index.mjs +0 -8
- package/esm2022/lib/avatar/module.mjs +0 -24
- package/esm2022/lib/badge/badge.component.mjs +0 -27
- package/esm2022/lib/badge/index.mjs +0 -8
- package/esm2022/lib/badge/module.mjs +0 -24
- package/esm2022/lib/bao.module.mjs +0 -124
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -36
- package/esm2022/lib/breadcrumb/index.mjs +0 -8
- package/esm2022/lib/breadcrumb/module.mjs +0 -25
- package/esm2022/lib/button/button.component.mjs +0 -100
- package/esm2022/lib/button/index.mjs +0 -8
- package/esm2022/lib/button/module.mjs +0 -25
- package/esm2022/lib/card/card.component.mjs +0 -94
- package/esm2022/lib/card/index.mjs +0 -8
- package/esm2022/lib/card/module.mjs +0 -38
- package/esm2022/lib/checkbox/checkbox-group.component.mjs +0 -58
- package/esm2022/lib/checkbox/checkbox.component.mjs +0 -304
- package/esm2022/lib/checkbox/index.mjs +0 -9
- package/esm2022/lib/checkbox/module.mjs +0 -35
- package/esm2022/lib/common-components/error-text/errorText.component.mjs +0 -16
- package/esm2022/lib/common-components/guiding-text/guidingText.component.mjs +0 -16
- package/esm2022/lib/common-components/index.mjs +0 -11
- package/esm2022/lib/common-components/label-text/labelText.component.mjs +0 -22
- package/esm2022/lib/common-components/module.mjs +0 -38
- package/esm2022/lib/common-components/title-text/titleText.component.mjs +0 -16
- package/esm2022/lib/core/breakpoints.mjs +0 -13
- package/esm2022/lib/core/colors.mjs +0 -25
- package/esm2022/lib/core/index.mjs +0 -8
- package/esm2022/lib/dropdown-menu/dropdown-menu.component.mjs +0 -573
- package/esm2022/lib/dropdown-menu/index.mjs +0 -8
- package/esm2022/lib/dropdown-menu/module.mjs +0 -47
- package/esm2022/lib/file/file-input.component.mjs +0 -320
- package/esm2022/lib/file/file-intl.mjs +0 -65
- package/esm2022/lib/file/file-preview.component.mjs +0 -96
- package/esm2022/lib/file/index.mjs +0 -10
- package/esm2022/lib/file/module.mjs +0 -56
- package/esm2022/lib/header-info/header-info.component.mjs +0 -104
- package/esm2022/lib/header-info/index.mjs +0 -8
- package/esm2022/lib/header-info/module.mjs +0 -41
- package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -84
- package/esm2022/lib/hyperlink/index.mjs +0 -8
- package/esm2022/lib/hyperlink/module.mjs +0 -24
- package/esm2022/lib/icon/bao-icon-registry.mjs +0 -47
- package/esm2022/lib/icon/icon.component.mjs +0 -158
- package/esm2022/lib/icon/icons-dictionary.mjs +0 -129
- package/esm2022/lib/icon/index.mjs +0 -8
- package/esm2022/lib/icon/module.mjs +0 -24
- package/esm2022/lib/list/index.mjs +0 -8
- package/esm2022/lib/list/list.component.mjs +0 -73
- package/esm2022/lib/list/module.mjs +0 -38
- package/esm2022/lib/message-bar/index.mjs +0 -8
- package/esm2022/lib/message-bar/message-bar.component.mjs +0 -87
- package/esm2022/lib/message-bar/module.mjs +0 -26
- package/esm2022/lib/modal/index.mjs +0 -12
- package/esm2022/lib/modal/modal-config.mjs +0 -73
- package/esm2022/lib/modal/modal-container.mjs +0 -240
- package/esm2022/lib/modal/modal-directives.mjs +0 -84
- package/esm2022/lib/modal/modal-ref.mjs +0 -226
- package/esm2022/lib/modal/modal.mjs +0 -344
- package/esm2022/lib/modal/module.mjs +0 -29
- package/esm2022/lib/pagination/index.mjs +0 -8
- package/esm2022/lib/pagination/module.mjs +0 -25
- package/esm2022/lib/pagination/pagination.component.mjs +0 -217
- package/esm2022/lib/radio/index.mjs +0 -9
- package/esm2022/lib/radio/module.mjs +0 -54
- package/esm2022/lib/radio/radio-group.component.mjs +0 -247
- package/esm2022/lib/radio/radio.component.mjs +0 -291
- package/esm2022/lib/shared/enum/display-mode.mjs +0 -2
- package/esm2022/lib/shared/index.mjs +0 -7
- package/esm2022/lib/snack-bar/index.mjs +0 -12
- package/esm2022/lib/snack-bar/module.mjs +0 -51
- package/esm2022/lib/snack-bar/simple-snack-bar.component.mjs +0 -92
- package/esm2022/lib/snack-bar/snack-bar-animations.mjs +0 -28
- package/esm2022/lib/snack-bar/snack-bar-config.mjs +0 -37
- package/esm2022/lib/snack-bar/snack-bar-container.mjs +0 -277
- package/esm2022/lib/snack-bar/snack-bar-ref.mjs +0 -75
- package/esm2022/lib/snack-bar/snack-bar.mjs +0 -251
- package/esm2022/lib/summary/index.mjs +0 -9
- package/esm2022/lib/summary/list-summary.component.mjs +0 -30
- package/esm2022/lib/summary/module.mjs +0 -37
- package/esm2022/lib/summary/summary.component.mjs +0 -93
- package/esm2022/lib/system-header/index.mjs +0 -8
- package/esm2022/lib/system-header/module.mjs +0 -33
- package/esm2022/lib/system-header/system-header.component.mjs +0 -130
- package/esm2022/lib/tabs/index.mjs +0 -8
- package/esm2022/lib/tabs/module.mjs +0 -35
- package/esm2022/lib/tabs/tabs.component.mjs +0 -295
- package/esm2022/lib/tag/index.mjs +0 -8
- package/esm2022/lib/tag/module.mjs +0 -24
- package/esm2022/lib/tag/tag.component.mjs +0 -75
- package/esm2022/public-api.mjs +0 -31
- 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==
|