@libs-ui/components-buttons-dropdown 0.2.279 → 0.2.281

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/README.md CHANGED
@@ -1,3 +1,160 @@
1
- # buttons-dropdown
1
+ # Button Dropdown
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ ## Giới thiệu
4
+
5
+ `@libs-ui/components-buttons-dropdown` là một component Dropdown Button dùng cho Angular, cho phép hiển thị danh sách các tùy chọn khi nhấn vào button, hỗ trợ custom templates, binding lựa chọn và nhiều tùy chỉnh linh hoạt.
6
+
7
+ ## Tính năng
8
+
9
+ - Hiển thị danh sách items dưới dạng popover khi click (hoặc hover)
10
+ - Hỗ trợ custom label và key cho items
11
+ - Two-way binding giá trị chọn (`keySelected`)
12
+ - Tuỳ chọn auto apply (`applyNow`) hoặc yêu cầu click nút Áp dụng
13
+ - Hỗ trợ vô hiệu hóa và tuỳ chỉnh kích thước, kiểu button
14
+ - Cấu hình popover (kích thước, vị trí, z-index, direction)
15
+ - Hỗ trợ custom CSS classes cho container và items
16
+
17
+ ## Cài đặt
18
+
19
+ ```bash
20
+ npm install @libs-ui/components-buttons-dropdown
21
+ ```
22
+
23
+ hoặc
24
+
25
+ ```bash
26
+ yarn add @libs-ui/components-buttons-dropdown
27
+ ```
28
+
29
+ ## Sử dụng
30
+
31
+ ### Inline Template
32
+
33
+ ```typescript
34
+ import { Component } from '@angular/core';
35
+ import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
36
+
37
+ @Component({
38
+ selector: 'app-example',
39
+ standalone: true,
40
+ imports: [LibsUiComponentsButtonsDropdownComponent],
41
+ template: `
42
+ <libs_ui-components-buttons-dropdown
43
+ [label]="'Chọn mục'"
44
+ [items]="items"
45
+ [(keySelected)]="selectedKey"
46
+ (outSelectItem)="onSelect($event)">
47
+ </libs_ui-components-buttons-dropdown>
48
+ `
49
+ })
50
+ export class ExampleComponent {
51
+ items = [
52
+ { id: '1', label: 'Option 1' },
53
+ { id: '2', label: 'Option 2' },
54
+ { id: '3', label: 'Option 3' }
55
+ ];
56
+ selectedKey = '1';
57
+ onSelect(item: any) {
58
+ console.log('Selected:', item);
59
+ }
60
+ }
61
+ ```
62
+
63
+ ### File HTML riêng
64
+
65
+ ```typescript
66
+ import { Component } from '@angular/core';
67
+ import { LibsUiComponentsButtonsDropdownComponent } from '@libs-ui/components-buttons-dropdown';
68
+
69
+ @Component({
70
+ selector: 'app-example',
71
+ standalone: true,
72
+ imports: [LibsUiComponentsButtonsDropdownComponent],
73
+ templateUrl: './example.component.html'
74
+ })
75
+ export class ExampleComponent {
76
+ items = [ /* ... */ ];
77
+ selectedKey = '';
78
+ onSelect(item: any) { }
79
+ }
80
+ ```
81
+
82
+ ```html
83
+ <libs_ui-components-buttons-dropdown
84
+ [label]="'Chọn mục'"
85
+ [items]="items"
86
+ [(keySelected)]="selectedKey"
87
+ (outSelectItem)="onSelect($event)">
88
+ </libs_ui-components-buttons-dropdown>
89
+ ```
90
+
91
+ ## API Reference
92
+
93
+ ### Inputs
94
+
95
+ | Tên | Kiểu | Mặc định | Mô tả |
96
+ |---------------------------------|--------------------------------|--------------------------|------------------------------------------------------------|
97
+ | label | `string` | `''` | Text hiển thị trên nút (ví dụ: "Chọn mục"). |
98
+ | items | `Array<any>` | required | Danh sách các mục sẽ hiển thị trong menu. |
99
+ | fieldDisplay | `string` | `label` | Trường của mục để hiển thị nội dung. |
100
+ | keyField | `string` | `id` | Trường của mục dùng làm giá trị key. |
101
+ | keySelected | `string` | undefined | Giá trị key đang được chọn (hỗ trợ two-way binding). |
102
+ | applyNow | `boolean` | `false` | Nếu true: chọn xong tự emit sự kiện; false: cần bấm nút Áp dụng. |
103
+ | showBorderBottom | `boolean` | `false` | Hiện đường kẻ dưới menu khi mở. |
104
+ | disable | `boolean` | `false` | Khóa dropdown, không cho chọn mục. |
105
+ | sizeButton | `TYPE_SIZE_BUTTON` | `medium` | Kích thước nút (.small/.medium/.large). |
106
+ | typeButton | `TYPE_BUTTON` | `button-primary` | Kiểu style của nút (primary, secondary,...). |
107
+ | classLabel | `string` | `''` | Class CSS thêm cho nhãn (text). |
108
+ | classInclude | `string` | `''` | Class CSS thêm cho phần container chính. |
109
+ | classIncludeContainer | `string` | undefined | Class CSS thêm cho phần container nội dung. |
110
+ | fieldClass | `string` | `class` | Trường trong mục chứa class CSS khi cần. |
111
+ | classIconLeft | `string` | `''` | Class CSS thêm cho icon bên trái. |
112
+ | classIconRight | `string` | `libs-ui-icon-move-right rotate-[90deg]` | Class CSS thêm cho icon bên phải. |
113
+ | iconOnlyType | `boolean` | `false` | Chỉ hiện icon, không hiển thị nhãn. |
114
+ | popupConfig | `IPopupConfigButtonDropdown` | default cấu hình popover | Cấu hình chi tiết cho popover (vị trí, kích thước). |
115
+ | ignoreHiddenPopoverContentWhenMouseLeave | `boolean` | `true` | Giữ popover mở khi chuột rời khỏi nội dung. |
116
+ | modePopover | `TYPE_POPOVER_MODE` | `click-toggle` | Cách hiển thị popover (click, hover,...). |
117
+
118
+ ### Outputs
119
+
120
+ | Tên | Kiểu | Mô tả |
121
+ |----------------------|-------------------------------|-----------------------------------------------------------|
122
+ | outSelectItem | `(item: any) => void` | Trả về mục (item) bạn vừa chọn. |
123
+ | outHover | `(isHover: boolean) => void` | Phát ra khi rê chuột lên/xuống trên một mục. |
124
+ | outApply | `(item: any) => void` | Phát ra khi bạn bấm nút Áp dụng (với applyNow=false). |
125
+ | outPopoverEvent | `(event: TYPE_POPOVER_EVENT) => void` | Phát ra các sự kiện của popover (show, hide, click, ...). |
126
+ | outFunctionsControl | `(control: IPopoverFunctionControlEvent) => void` | Cung cấp control API để điều khiển popover. |
127
+ | outIconEvent | `(event: MouseEvent) => void` | Phát ra khi bạn nhấn vào icon. |
128
+
129
+ ### Interfaces
130
+ ```typescript
131
+ export interface IButtonDropdown extends IButton {
132
+ items: any[];
133
+ fieldDisplay?: string;
134
+ keyField?: string;
135
+ keySelected?: string;
136
+ applyNow?: boolean;
137
+ showBorderBottom?: boolean;
138
+ popupConfig?: IPopupConfigButtonDropdown;
139
+ ignoreHiddenPopoverContentWhenMouseLeave?: boolean;
140
+ modePopover?: TYPE_POPOVER_MODE;
141
+ }
142
+
143
+ export interface IPopupConfigButtonDropdown {
144
+ width?: number;
145
+ maxWidth?: number;
146
+ maxHeight?: number;
147
+ zIndex?: number;
148
+ direction?: TYPE_POPOVER_DIRECTION;
149
+ timeDestroy?: number;
150
+ widthByParent?: boolean;
151
+ position?: {
152
+ mode: 'start' | 'center' | 'end';
153
+ distance: number;
154
+ };
155
+ classInclude?: string;
156
+ }
157
+
158
+ export type TYPE_POPOVER_DIRECTION = 'top' | 'right' | 'bottom' | 'left';
159
+ export type TYPE_POPOVER_MODE = 'hover' | 'click' | 'click-toggle' | 'click_open_and_click_panel_content_hidden';
160
+ ```
@@ -1,16 +1,29 @@
1
1
  import { IButton } from "@libs-ui/components-buttons-button";
2
- import { TYPE_POPOVER_DIRECTION } from "@libs-ui/components-popover";
3
- import { TYPE_OBJECT } from "@libs-ui/interfaces-types";
2
+ import { TYPE_POPOVER_DIRECTION, TYPE_POPOVER_MODE } from "@libs-ui/components-popover";
3
+ /**
4
+ * Interface for Dropdown Button component inputs.
5
+ */
4
6
  export interface IButtonDropdown extends IButton {
5
- items?: Array<TYPE_OBJECT>;
6
- fieldDisplay: any;
7
- keyField: any;
7
+ /** Danh sách các mục sẽ hiển thị trong menu. */
8
+ items: any[];
9
+ /** Tên trường dùng để hiển thị nội dung của mỗi mục. */
10
+ fieldDisplay?: string;
11
+ /** Tên trường dùng làm giá trị key của mỗi mục. */
12
+ keyField?: string;
13
+ /** Giá trị key đang được chọn (hỗ trợ two-way binding). */
8
14
  keySelected?: string;
15
+ /** Nếu true: chọn xong tự emit sự kiện; false: cần bấm nút Áp dụng. */
9
16
  applyNow?: boolean;
17
+ /** Hiển thị đường kẻ dưới menu khi mở. */
18
+ showBorderBottom?: boolean;
19
+ /** Cấu hình chi tiết cho popover (vị trí, kích thước). */
10
20
  popupConfig?: IPopupConfigButtonDropdown;
11
- demoMode?: string;
12
- ignoreHiddenTooltipContentWhenMouseLeave?: boolean;
21
+ /** Giữ popover mở khi chuột rời khỏi nội dung. */
22
+ ignoreHiddenPopoverContentWhenMouseLeave?: boolean;
23
+ /** Cách hiển thị popover (click, hover,...). */
24
+ modePopover?: TYPE_POPOVER_MODE;
13
25
  }
26
+ /** Configuration options for Dropdown popover. */
14
27
  export interface IPopupConfigButtonDropdown {
15
28
  width?: number;
16
29
  maxWidth?: number;
@@ -16,7 +16,7 @@ export class LibsUiComponentsButtonsDropdownComponent {
16
16
  fieldClassIconLeft = input('classIconLeft'); // iconclass item of items
17
17
  items = input.required({ transform: data => data.map(item => ({ ...item, [this.fieldDisplay()]: escapeHtml(item[this.fieldDisplay()]) })) }); // requried
18
18
  fieldDisplay = input('label', { transform: value => value ?? 'label' });
19
- keyField = input('key', { transform: value => value ?? 'id' });
19
+ keyField = input('key', { transform: value => value ?? 'key' });
20
20
  keySelected = model();
21
21
  applyNow = input(false); // if not applyNow: keyField is requried
22
22
  showBorderBottom = input(false);
@@ -88,4 +88,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
88
88
  LibsUiComponentsPopoverComponent
89
89
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: .5\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0\n }\n }\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config:{\n animationConfig: {\n time:.5\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance:2,\n position: {\n mode: 'start',\n distance: 0\n }\n }\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [config]=\"{content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2}\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event,item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\">\n </span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null;context:{item:item}\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n", styles: [":host ::ng-deep .libs-ui-buttons-dropdown{max-width:max-content}:host ::ng-deep .libs-ui-buttons-dropdown .libs-ui-button{border-radius:0!important;height:100%}:host ::ng-deep .libs-ui-buttons-dropdown>:first-child libs_ui-components-popover .libs-ui-button{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;padding-right:8px}:host ::ng-deep .libs-ui-buttons-dropdown>:last-child libs_ui-components-popover .libs-ui-button{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;padding-left:0}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:first-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4E8CF7)!important}:host ::ng-deep .libs-ui-buttons-dropdown:hover>:last-child .libs-ui-button-primary{background:var(--libs-ui-color-light-1, #4E8CF7)!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:first-child libs_ui-components-popover .libs-ui-button{padding-right:12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-un-apply-now>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent!important;padding:4px 12px}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:first-child libs_ui-components-popover .libs-ui-button{border-right:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-primary>:last-child libs_ui-components-popover .libs-ui-button{border-left:1px solid transparent}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:first-child libs_ui-components-popover .libs-ui-button{border-right:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary>:last-child libs_ui-components-popover .libs-ui-button{border-left:none!important}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover *>[class^=libs-ui-icon]:before{color:var(--libs-ui-color-light-1, #4E8CF7)}:host ::ng-deep .libs-ui-buttons-dropdown.libs-ui-buttons-dropdown-apply-now-button-secondary:hover .libs-ui-button{color:var(--libs-ui-color-light-1, #4E8CF7);background:var(--mo-button-other-color-background-hover, #E9F1FE)!important}\n"] }]
90
90
  }] });
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2J1dHRvbnMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9idXR0b25zL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLHNDQUFzQyxFQUFpQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzNILE9BQU8sRUFBZ0MsZ0NBQWdDLEVBQXlDLE1BQU0sNkJBQTZCLENBQUM7QUFDcEosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBZ0J0RCxNQUFNLE9BQU8sd0NBQXdDO0lBRW5ELG1CQUFtQjtJQUNULFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUVoRSxnQkFBZ0I7SUFDUCxLQUFLLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDeEIsVUFBVSxHQUFHLEtBQUssQ0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztJQUN4RSxrQkFBa0IsR0FBRyxLQUFLLENBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7SUFDL0UsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQXlCLEVBQUUsU0FB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RSxFQUFFLENBQUM7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQzt3R0EvRVUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0Msd3dHQ3RCckQsODNLQThIQSxrMEVEOUdJLGVBQWUsNEZBQUUsZ0JBQWdCLG9KQUNqQyxzQ0FBc0Msc2pCQUN0QyxnQ0FBZ0M7OzRGQUl2Qix3Q0FBd0M7a0JBYnBELFNBQVM7K0JBRUUscUNBQXFDLGNBR25DLElBQUksV0FDUDt3QkFDUCxlQUFlLEVBQUUsZ0JBQWdCO3dCQUNqQyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQztxQkFDakMsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgbW9kZWwsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsIFRZUEVfQlVUVE9OLCBUWVBFX1NJWkVfQlVUVE9OIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5ULCBUWVBFX1BPUE9WRVJfTU9ERSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJUG9wdXBDb25maWdCdXR0b25Ecm9wZG93biB9IGZyb20gJy4vZHJvcGRvd24uaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQge1xuXG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGxhYmVsRGlzcGxheSA9IGNvbXB1dGVkKHRoaXMubGFiZWxDb21wdXRlZC5iaW5kKHRoaXMpKVxuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgbGFiZWwgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGZpZWxkQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KCdjbGFzcycpOyAvLyBjaGFuZ2UgY29sb3IgbGFiZWwgaXRlbSBvZiBpdGVtc1xuICByZWFkb25seSBmaWVsZENsYXNzSWNvbkxlZnQgPSBpbnB1dDxzdHJpbmc+KCdjbGFzc0ljb25MZWZ0Jyk7IC8vIGljb25jbGFzcyBpdGVtIG9mIGl0ZW1zXG4gIHJlYWRvbmx5IGl0ZW1zID0gaW5wdXQucmVxdWlyZWQ8QXJyYXk8YW55PiwgQXJyYXk8YW55Pj4oeyB0cmFuc2Zvcm06IGRhdGEgPT4gZGF0YS5tYXAoaXRlbSA9PiAoeyAuLi5pdGVtLCBbdGhpcy5maWVsZERpc3BsYXkoKV06IGVzY2FwZUh0bWwoaXRlbVt0aGlzLmZpZWxkRGlzcGxheSgpXSkgfSkpIH0pOyAvLyByZXF1cmllZFxuICByZWFkb25seSBmaWVsZERpc3BsYXkgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xhYmVsJywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/ICdsYWJlbCcgfSk7XG4gIHJlYWRvbmx5IGtleUZpZWxkID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdrZXknLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2lkJyB9KTtcbiAgcmVhZG9ubHkga2V5U2VsZWN0ZWQgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGFwcGx5Tm93ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpOyAvLyBpZiBub3QgYXBwbHlOb3c6IGtleUZpZWxkIGlzIHJlcXVyaWVkXG4gIHJlYWRvbmx5IHNob3dCb3JkZXJCb3R0b20gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNpemVCdXR0b24gPSBpbnB1dDxUWVBFX1NJWkVfQlVUVE9OPignbWVkaXVtJyk7XG4gIHJlYWRvbmx5IGNsYXNzTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgaWNvbk9ubHlUeXBlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBjbGFzc0ljb25SaWdodCA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS1bOTBkZWddJyk7XG4gIHJlYWRvbmx5IGNsYXNzSWNvbkxlZnQgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgdHlwZUJ1dHRvbiA9IGlucHV0PFRZUEVfQlVUVE9OPignYnV0dG9uLXByaW1hcnknKTtcbiAgcmVhZG9ubHkgcG9wdXBDb25maWcgPSBpbnB1dDxJUG9wdXBDb25maWdCdXR0b25Ecm9wZG93bj4oeyB3aWR0aDogMjA1LCBtYXhXaWR0aDogMjUwLCBtYXhIZWlnaHQ6IDE0MCwgekluZGV4OiAxMjAwLCBkaXJlY3Rpb246ICd0b3AnIH0pO1xuICByZWFkb25seSBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBtb2RlUG9wb3ZlciA9IGlucHV0PFRZUEVfUE9QT1ZFUl9NT0RFPignY2xpY2stdG9nZ2xlJyk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUNvbnRhaW5lciA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRTZWxlY3RJdGVtID0gb3V0cHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgb3V0SG92ZXIgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0QXBwbHkgPSBvdXRwdXQ8YW55PigpOyAvLyBz4butIGThu6VuZyBjaG8gYuG6pW0gYnV0dG9uIGxlZnQgY2jhur8gxJHhu5kgYXBwbHlOb3cgPSBmYWxzZTtcbiAgcmVhZG9ubHkgb3V0UG9wb3ZlckV2ZW50ID0gb3V0cHV0PFRZUEVfUE9QT1ZFUl9FVkVOVD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRJY29uRXZlbnQgPSBvdXRwdXQ8TW91c2VFdmVudD4oKTtcblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBcHBseSgpIHtcbiAgICBpZiAoIXRoaXMuYXBwbHlOb3coKSkge1xuICAgICAgdGhpcy5vdXRBcHBseS5lbWl0KHRoaXMuaXRlbXMoKS5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLmtleUZpZWxkKCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEl0ZW0oZXZlbnQ6IEV2ZW50LCBkYXRhOiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZGF0YS5zdWJUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXBwbHlOb3coKSkge1xuICAgICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoZGF0YVt0aGlzLmtleUZpZWxkKCldKTtcbiAgICB9XG4gICAgdGhpcy5vdXRTZWxlY3RJdGVtLmVtaXQoZGF0YSk7XG4gICAgdGhpcy5vdXRIb3Zlci5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUG9wb3ZlckV2ZW50KGV2ZW50OiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLm91dFBvcG92ZXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudChjb250cm9sOiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoY29udHJvbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNsaWNrQnV0dG9uVGVtcGxhdGUoZXZlbnQ6IEV2ZW50LCBkYXRhOiBhbnksIGl0ZW1zOiBBcnJheTxhbnk+KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZGF0YS5idXR0b25UZW1wbGF0ZUNvbmZpZy5hY3Rpb24oZGF0YSwgaXRlbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBsYWJlbENvbXB1dGVkKCkge1xuICAgIGlmICghdGhpcy5rZXlTZWxlY3RlZCgpIHx8ICF0aGlzLml0ZW1zKCkgfHwgIXRoaXMuaXRlbXMoKS5sZW5ndGggfHwgIXRoaXMua2V5RmllbGQoKSB8fCB0aGlzLmFwcGx5Tm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhYmVsKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKCkpIHtcbiAgICAgIGlmIChpdGVtW3RoaXMua2V5RmllbGQoKV0gPT09IHRoaXMua2V5U2VsZWN0ZWQoKSkge1xuICAgICAgICByZXR1cm4gaXRlbVt0aGlzLmZpZWxkRGlzcGxheSgpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sYWJlbCgpO1xuICB9XG5cbn0iLCI8ZGl2ICNidXR0b25Ecm9wZG93bkVsXG4gIGNsYXNzPVwibGlicy11aS1idXR0b25zLWRyb3Bkb3duIGZsZXgge3sgY2xhc3NJbmNsdWRlQ29udGFpbmVyKCkgfHwgJycgfX1cIlxuICBbY2xhc3MubGlicy11aS1idXR0b25zLWRyb3Bkb3duLXVuLWFwcGx5LW5vd109XCIhYXBwbHlOb3coKVwiXG4gIFtjbGFzcy5saWJzLXVpLWJ1dHRvbnMtZHJvcGRvd24tYXBwbHktbm93LWJ1dHRvbi1wcmltYXJ5XT1cImFwcGx5Tm93KCkgJiYgdHlwZUJ1dHRvbigpID09PSAnYnV0dG9uLXByaW1hcnknXCJcbiAgW2NsYXNzLmxpYnMtdWktYnV0dG9ucy1kcm9wZG93bi1hcHBseS1ub3ctYnV0dG9uLXNlY29uZGFyeV09XCJhcHBseU5vdygpICYmIHR5cGVCdXR0b24oKSA9PT0gJ2J1dHRvbi1zZWNvbmRhcnknXCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICBbaWNvbk9ubHlUeXBlXT1cImljb25Pbmx5VHlwZSgpXCJcbiAgICBbY2xhc3NJY29uTGVmdF09XCJjbGFzc0ljb25MZWZ0KClcIlxuICAgIFtjbGFzc0ljb25SaWdodF09XCIhYXBwbHlOb3coKSA/ICcnIDogY2xhc3NJY29uUmlnaHQoKVwiXG4gICAgW3R5cGVdPVwidHlwZUJ1dHRvbigpXCJcbiAgICBbY2xhc3NMYWJlbF09XCJjbGFzc0xhYmVsKClcIlxuICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICAgIFtzaXplQnV0dG9uXT1cInNpemVCdXR0b24oKVwiXG4gICAgW3BvcG92ZXJdPVwie1xuICAgICAgZWxlbWVudFJlZkN1c3RvbTogYnV0dG9uRHJvcGRvd25FbCxcbiAgICAgIG1vZGU6IG1vZGVQb3BvdmVyKCksXG4gICAgICBpZ25vcmVTaG93UG9wb3ZlcjogIWFwcGx5Tm93KCksXG4gICAgICBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgICAgIHRpbWU6IC41XG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUNvbnRlbnRFbCxcbiAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgIHdpZHRoOiBwb3B1cENvbmZpZygpLndpZHRoLFxuICAgICAgICB3aWR0aEJ5UGFyZW50OiBwb3B1cENvbmZpZygpLndpZHRoQnlQYXJlbnQgPz8gZmFsc2UsXG4gICAgICAgIG1heFdpZHRoOiBwb3B1cENvbmZpZygpLm1heFdpZHRoLFxuICAgICAgICBtYXhIZWlnaHQ6IHBvcHVwQ29uZmlnKCkubWF4SGVpZ2h0LFxuICAgICAgICB6SW5kZXg6IHBvcHVwQ29uZmlnKCkuekluZGV4LFxuICAgICAgICBjbGFzc0luY2x1ZGU6ICdyb3VuZGVkLVs0cHhdICcgKyBwb3B1cENvbmZpZygpLmNsYXNzSW5jbHVkZSxcbiAgICAgICAgZGlyZWN0aW9uOiBwb3B1cENvbmZpZygpLmRpcmVjdGlvbixcbiAgICAgICAgdGltZXJEZXN0cm95OiBwb3B1cENvbmZpZygpLnRpbWVEZXN0cm95LFxuICAgICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICBtb2RlOiBwb3B1cENvbmZpZygpLnBvc2l0aW9uPy5tb2RlIHx8ICdzdGFydCcsXG4gICAgICAgICAgZGlzdGFuY2U6IHBvcHVwQ29uZmlnKCkucG9zaXRpb24/LmRpc3RhbmNlID8/IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cIlxuICAgIFtsYWJlbF09XCJsYWJlbERpc3BsYXkoKVwiXG4gICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dFBvcG92ZXJFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIlxuICAgIChvdXRDbGljayk9XCJoYW5kbGVyQXBwbHkoKVwiIC8+XG4gIEBpZiAoIWFwcGx5Tm93KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIHctWzFweF0gYmctd2hpdGVcIj48L2Rpdj5cbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFt0eXBlXT1cInR5cGVCdXR0b24oKVwiXG4gICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKClcIlxuICAgICAgW3NpemVCdXR0b25dPVwic2l6ZUJ1dHRvbigpXCJcbiAgICAgIFtwb3BvdmVyXT1cIntcbiAgICAgICAgbW9kZTogJ2NsaWNrLXRvZ2dsZScsXG4gICAgICAgIGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmU6IGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmUoKSxcbiAgICAgICAgY29uZmlnOntcbiAgICAgICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgICAgIHRpbWU6LjVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUNvbnRlbnRFbCxcbiAgICAgICAgICB3aGl0ZVRoZW1lOiB0cnVlLFxuICAgICAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgICAgIHdpZHRoOiBwb3B1cENvbmZpZygpLndpZHRoLFxuICAgICAgICAgIG1heFdpZHRoOiBwb3B1cENvbmZpZygpLm1heFdpZHRoLFxuICAgICAgICAgIHdpZHRoQnlQYXJlbnQ6IHBvcHVwQ29uZmlnKCkud2lkdGhCeVBhcmVudCA/PyBmYWxzZSxcbiAgICAgICAgICBtYXhIZWlnaHQ6IHBvcHVwQ29uZmlnKCkubWF4SGVpZ2h0LFxuICAgICAgICAgIHpJbmRleDogcG9wdXBDb25maWcoKS56SW5kZXgsXG4gICAgICAgICAgZGlyZWN0aW9uOiBwb3B1cENvbmZpZygpLmRpcmVjdGlvbixcbiAgICAgICAgICBjbGFzc0luY2x1ZGU6IHBvcHVwQ29uZmlnKCkuY2xhc3NJbmNsdWRlLFxuICAgICAgICAgIGRpcmVjdGlvbkRpc3RhbmNlOjIsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIG1vZGU6ICdzdGFydCcsXG4gICAgICAgICAgICBkaXN0YW5jZTogMFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVwiXG4gICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImNsYXNzSWNvblJpZ2h0KClcIlxuICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGUoKSB8fCAnIXB5LVs5cHhdJ1wiXG4gICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudCgkZXZlbnQpXCJcbiAgICAgIChvdXRQb3BvdmVyRXZlbnQpPVwiaGFuZGxlclBvcG92ZXJFdmVudCgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG48bmctdGVtcGxhdGUgI3RlbXBsYXRlQ29udGVudEVsPlxuICA8ZGl2PlxuICAgIEBpZiAoaXRlbXMoKSAmJiBpdGVtcygpLmxlbmd0aCkge1xuICAgICAgPGRpdiBjbGFzcz1cIm0tMCBwLTBcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtcygpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInt7IGl0ZW0uY2xhc3NSb3cgfHwgJycgfX1cIj5cbiAgICAgICAgICAgIDxkaXYgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7Y29udGVudDogaXRlbS5wb3BvdmVyQ29udGVudCwgekluZGV4OiBwb3B1cENvbmZpZygpLnpJbmRleCwgZGlyZWN0aW9uRGlzdGFuY2U6IC0yfVwiXG4gICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCIhaXRlbS5zaG93UG9wb3ZlclwiXG4gICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWJnLWxpc3QtaG92ZXIgcmVsYXRpdmUgY3Vyc29yLXBvaW50ZXIgcHktWzdweF0ge3sgaXRlbS5jbGFzc0luY2x1ZGUgfHwgJycgfX0gIHt7IHNob3dCb3JkZXJCb3R0b20oKSA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCcgOiAnJyB9fVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5mbGV4XT1cIiFpdGVtLmlnbm9yZUZsZXhcIlxuICAgICAgICAgICAgICBbY2xhc3MucHgtWzE2cHhdXT1cImFwcGx5Tm93KClcIlxuICAgICAgICAgICAgICBbY2xhc3MucGwtWzE2cHhdXT1cIiFhcHBseU5vdygpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnByLVs0MHB4XV09XCIhYXBwbHlOb3coKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiaXRlbS5kaXNhYmxlXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiaXRlbS5kaXNhYmxlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJTZWxlY3RJdGVtKCRldmVudCxpdGVtKVwiPlxuICAgICAgICAgICAgICBAaWYgKGl0ZW1bZmllbGRDbGFzc0ljb25MZWZ0KCldKSB7XG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW1bZmllbGRDbGFzc0ljb25MZWZ0KCldXCI+PC9pPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJpdGVtW2ZpZWxkQ2xhc3MoKV0gPz8gJ2xpYnMtdWktZm9udC1oNXInXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIml0ZW1bZmllbGREaXNwbGF5KCldIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbY2xhc3NJY29uTGVmdF09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmljb25MZWZ0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmljb25cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzTGFiZWxdPVwiaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQnV0dG9uVGVtcGxhdGUoJGV2ZW50LCBpdGVtLCBpdGVtcygpKVwiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLnR5cGVcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtPy5zdWJUZW1wbGF0ZSB8fCBudWxsO2NvbnRleHQ6e2l0ZW06aXRlbX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtW2tleUZpZWxkKCldID09PSBrZXlTZWxlY3RlZCgpICYmICFhcHBseU5vdygpKSB7XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hlY2sgYWJzb2x1dGUgcmlnaHQtWzE2cHhdIHRvcC1bOHB4XVwiPjwvaT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInAtWzIwcHhdXCJcbiAgICAgICAgW2lubmVySHRtbF09XCInaTE4bl9ub19kYXRhJyB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2J1dHRvbnMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9idXR0b25zL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLHNDQUFzQyxFQUFpQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzNILE9BQU8sRUFBZ0MsZ0NBQWdDLEVBQXlDLE1BQU0sNkJBQTZCLENBQUM7QUFDcEosT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBZ0J0RCxNQUFNLE9BQU8sd0NBQXdDO0lBRW5ELG1CQUFtQjtJQUNULFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUVoRSxnQkFBZ0I7SUFDUCxLQUFLLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDeEIsVUFBVSxHQUFHLEtBQUssQ0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztJQUN4RSxrQkFBa0IsR0FBRyxLQUFLLENBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7SUFDL0UsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQXlCLEVBQUUsU0FB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RSxFQUFFLENBQUM7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQzt3R0EvRVUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0Msd3dHQ3RCckQsODNLQThIQSxrMEVEOUdJLGVBQWUsNEZBQUUsZ0JBQWdCLG9KQUNqQyxzQ0FBc0Msc2pCQUN0QyxnQ0FBZ0M7OzRGQUl2Qix3Q0FBd0M7a0JBYnBELFNBQVM7K0JBRUUscUNBQXFDLGNBR25DLElBQUksV0FDUDt3QkFDUCxlQUFlLEVBQUUsZ0JBQWdCO3dCQUNqQyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQztxQkFDakMsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgbW9kZWwsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsIFRZUEVfQlVUVE9OLCBUWVBFX1NJWkVfQlVUVE9OIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5ULCBUWVBFX1BPUE9WRVJfTU9ERSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJUG9wdXBDb25maWdCdXR0b25Ecm9wZG93biB9IGZyb20gJy4vZHJvcGRvd24uaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNCdXR0b25zRHJvcGRvd25Db21wb25lbnQge1xuXG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGxhYmVsRGlzcGxheSA9IGNvbXB1dGVkKHRoaXMubGFiZWxDb21wdXRlZC5iaW5kKHRoaXMpKVxuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgbGFiZWwgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGZpZWxkQ2xhc3MgPSBpbnB1dDxzdHJpbmc+KCdjbGFzcycpOyAvLyBjaGFuZ2UgY29sb3IgbGFiZWwgaXRlbSBvZiBpdGVtc1xuICByZWFkb25seSBmaWVsZENsYXNzSWNvbkxlZnQgPSBpbnB1dDxzdHJpbmc+KCdjbGFzc0ljb25MZWZ0Jyk7IC8vIGljb25jbGFzcyBpdGVtIG9mIGl0ZW1zXG4gIHJlYWRvbmx5IGl0ZW1zID0gaW5wdXQucmVxdWlyZWQ8QXJyYXk8YW55PiwgQXJyYXk8YW55Pj4oeyB0cmFuc2Zvcm06IGRhdGEgPT4gZGF0YS5tYXAoaXRlbSA9PiAoeyAuLi5pdGVtLCBbdGhpcy5maWVsZERpc3BsYXkoKV06IGVzY2FwZUh0bWwoaXRlbVt0aGlzLmZpZWxkRGlzcGxheSgpXSkgfSkpIH0pOyAvLyByZXF1cmllZFxuICByZWFkb25seSBmaWVsZERpc3BsYXkgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xhYmVsJywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/ICdsYWJlbCcgfSk7XG4gIHJlYWRvbmx5IGtleUZpZWxkID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdrZXknLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2tleScgfSk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkID0gbW9kZWw8c3RyaW5nPigpO1xuICByZWFkb25seSBhcHBseU5vdyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTsgLy8gaWYgbm90IGFwcGx5Tm93OiBrZXlGaWVsZCBpcyByZXF1cmllZFxuICByZWFkb25seSBzaG93Qm9yZGVyQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzaXplQnV0dG9uID0gaW5wdXQ8VFlQRV9TSVpFX0JVVFRPTj4oJ21lZGl1bScpO1xuICByZWFkb25seSBjbGFzc0xhYmVsID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGljb25Pbmx5VHlwZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2xhc3NJY29uUmlnaHQgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtWzkwZGVnXScpO1xuICByZWFkb25seSBjbGFzc0ljb25MZWZ0ID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IHR5cGVCdXR0b24gPSBpbnB1dDxUWVBFX0JVVFRPTj4oJ2J1dHRvbi1wcmltYXJ5Jyk7XG4gIHJlYWRvbmx5IHBvcHVwQ29uZmlnID0gaW5wdXQ8SVBvcHVwQ29uZmlnQnV0dG9uRHJvcGRvd24+KHsgd2lkdGg6IDIwNSwgbWF4V2lkdGg6IDI1MCwgbWF4SGVpZ2h0OiAxNDAsIHpJbmRleDogMTIwMCwgZGlyZWN0aW9uOiAndG9wJyB9KTtcbiAgcmVhZG9ubHkgaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXIgPSBpbnB1dDxUWVBFX1BPUE9WRVJfTU9ERT4oJ2NsaWNrLXRvZ2dsZScpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVDb250YWluZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0U2VsZWN0SXRlbSA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IG91dEhvdmVyID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEFwcGx5ID0gb3V0cHV0PGFueT4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIGLhuqVtIGJ1dHRvbiBsZWZ0IGNo4bq/IMSR4buZIGFwcGx5Tm93ID0gZmFsc2U7XG4gIHJlYWRvbmx5IG91dFBvcG92ZXJFdmVudCA9IG91dHB1dDxUWVBFX1BPUE9WRVJfRVZFTlQ+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0SWNvbkV2ZW50ID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQXBwbHkoKSB7XG4gICAgaWYgKCF0aGlzLmFwcGx5Tm93KCkpIHtcbiAgICAgIHRoaXMub3V0QXBwbHkuZW1pdCh0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGl0ZW1bdGhpcy5rZXlGaWVsZCgpXSA9PT0gdGhpcy5rZXlTZWxlY3RlZCgpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RJdGVtKGV2ZW50OiBFdmVudCwgZGF0YTogYW55KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGRhdGEuc3ViVGVtcGxhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFwcGx5Tm93KCkpIHtcbiAgICAgIHRoaXMua2V5U2VsZWN0ZWQuc2V0KGRhdGFbdGhpcy5rZXlGaWVsZCgpXSk7XG4gICAgfVxuICAgIHRoaXMub3V0U2VsZWN0SXRlbS5lbWl0KGRhdGEpO1xuICAgIHRoaXMub3V0SG92ZXIuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclBvcG92ZXJFdmVudChldmVudDogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgdGhpcy5vdXRQb3BvdmVyRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoY29udHJvbDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KGNvbnRyb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDbGlja0J1dHRvblRlbXBsYXRlKGV2ZW50OiBFdmVudCwgZGF0YTogYW55LCBpdGVtczogQXJyYXk8YW55Pikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRhdGEuYnV0dG9uVGVtcGxhdGVDb25maWcuYWN0aW9uKGRhdGEsIGl0ZW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgbGFiZWxDb21wdXRlZCgpIHtcbiAgICBpZiAoIXRoaXMua2V5U2VsZWN0ZWQoKSB8fCAhdGhpcy5pdGVtcygpIHx8ICF0aGlzLml0ZW1zKCkubGVuZ3RoIHx8ICF0aGlzLmtleUZpZWxkKCkgfHwgdGhpcy5hcHBseU5vdygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWJlbCgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcygpKSB7XG4gICAgICBpZiAoaXRlbVt0aGlzLmtleUZpZWxkKCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy5maWVsZERpc3BsYXkoKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubGFiZWwoKTtcbiAgfVxuXG59IiwiPGRpdiAjYnV0dG9uRHJvcGRvd25FbFxuICBjbGFzcz1cImxpYnMtdWktYnV0dG9ucy1kcm9wZG93biBmbGV4IHt7IGNsYXNzSW5jbHVkZUNvbnRhaW5lcigpIHx8ICcnIH19XCJcbiAgW2NsYXNzLmxpYnMtdWktYnV0dG9ucy1kcm9wZG93bi11bi1hcHBseS1ub3ddPVwiIWFwcGx5Tm93KClcIlxuICBbY2xhc3MubGlicy11aS1idXR0b25zLWRyb3Bkb3duLWFwcGx5LW5vdy1idXR0b24tcHJpbWFyeV09XCJhcHBseU5vdygpICYmIHR5cGVCdXR0b24oKSA9PT0gJ2J1dHRvbi1wcmltYXJ5J1wiXG4gIFtjbGFzcy5saWJzLXVpLWJ1dHRvbnMtZHJvcGRvd24tYXBwbHktbm93LWJ1dHRvbi1zZWNvbmRhcnldPVwiYXBwbHlOb3coKSAmJiB0eXBlQnV0dG9uKCkgPT09ICdidXR0b24tc2Vjb25kYXJ5J1wiPlxuICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgW2ljb25Pbmx5VHlwZV09XCJpY29uT25seVR5cGUoKVwiXG4gICAgW2NsYXNzSWNvbkxlZnRdPVwiY2xhc3NJY29uTGVmdCgpXCJcbiAgICBbY2xhc3NJY29uUmlnaHRdPVwiIWFwcGx5Tm93KCkgPyAnJyA6IGNsYXNzSWNvblJpZ2h0KClcIlxuICAgIFt0eXBlXT1cInR5cGVCdXR0b24oKVwiXG4gICAgW2NsYXNzTGFiZWxdPVwiY2xhc3NMYWJlbCgpXCJcbiAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZSgpXCJcbiAgICBbc2l6ZUJ1dHRvbl09XCJzaXplQnV0dG9uKClcIlxuICAgIFtwb3BvdmVyXT1cIntcbiAgICAgIGVsZW1lbnRSZWZDdXN0b206IGJ1dHRvbkRyb3Bkb3duRWwsXG4gICAgICBtb2RlOiBtb2RlUG9wb3ZlcigpLFxuICAgICAgaWdub3JlU2hvd1BvcG92ZXI6ICFhcHBseU5vdygpLFxuICAgICAgaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgICB0aW1lOiAuNVxuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVDb250ZW50RWwsXG4gICAgICAgIHdoaXRlVGhlbWU6IHRydWUsXG4gICAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgICB3aWR0aDogcG9wdXBDb25maWcoKS53aWR0aCxcbiAgICAgICAgd2lkdGhCeVBhcmVudDogcG9wdXBDb25maWcoKS53aWR0aEJ5UGFyZW50ID8/IGZhbHNlLFxuICAgICAgICBtYXhXaWR0aDogcG9wdXBDb25maWcoKS5tYXhXaWR0aCxcbiAgICAgICAgbWF4SGVpZ2h0OiBwb3B1cENvbmZpZygpLm1heEhlaWdodCxcbiAgICAgICAgekluZGV4OiBwb3B1cENvbmZpZygpLnpJbmRleCxcbiAgICAgICAgY2xhc3NJbmNsdWRlOiAncm91bmRlZC1bNHB4XSAnICsgcG9wdXBDb25maWcoKS5jbGFzc0luY2x1ZGUsXG4gICAgICAgIGRpcmVjdGlvbjogcG9wdXBDb25maWcoKS5kaXJlY3Rpb24sXG4gICAgICAgIHRpbWVyRGVzdHJveTogcG9wdXBDb25maWcoKS50aW1lRGVzdHJveSxcbiAgICAgICAgZGlyZWN0aW9uRGlzdGFuY2U6IDIsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgbW9kZTogcG9wdXBDb25maWcoKS5wb3NpdGlvbj8ubW9kZSB8fCAnc3RhcnQnLFxuICAgICAgICAgIGRpc3RhbmNlOiBwb3B1cENvbmZpZygpLnBvc2l0aW9uPy5kaXN0YW5jZSA/PyAwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XCJcbiAgICBbbGFiZWxdPVwibGFiZWxEaXNwbGF5KClcIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyQ29udHJvbEV2ZW50KCRldmVudClcIlxuICAgIChvdXRQb3BvdmVyRXZlbnQpPVwiaGFuZGxlclBvcG92ZXJFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFwcGx5KClcIiAvPlxuICBAaWYgKCFhcHBseU5vdygpKSB7XG4gICAgPGRpdiBjbGFzcz1cImgtZnVsbCB3LVsxcHhdIGJnLXdoaXRlXCI+PC9kaXY+XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCJ0eXBlQnV0dG9uKClcIlxuICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgICAgIFtzaXplQnV0dG9uXT1cInNpemVCdXR0b24oKVwiXG4gICAgICBbcG9wb3Zlcl09XCJ7XG4gICAgICAgIG1vZGU6ICdjbGljay10b2dnbGUnLFxuICAgICAgICBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlOiBpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlKCksXG4gICAgICAgIGNvbmZpZzp7XG4gICAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgICAgICB0aW1lOi41XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVDb250ZW50RWwsXG4gICAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICB3aWR0aDogcG9wdXBDb25maWcoKS53aWR0aCxcbiAgICAgICAgICBtYXhXaWR0aDogcG9wdXBDb25maWcoKS5tYXhXaWR0aCxcbiAgICAgICAgICB3aWR0aEJ5UGFyZW50OiBwb3B1cENvbmZpZygpLndpZHRoQnlQYXJlbnQgPz8gZmFsc2UsXG4gICAgICAgICAgbWF4SGVpZ2h0OiBwb3B1cENvbmZpZygpLm1heEhlaWdodCxcbiAgICAgICAgICB6SW5kZXg6IHBvcHVwQ29uZmlnKCkuekluZGV4LFxuICAgICAgICAgIGRpcmVjdGlvbjogcG9wdXBDb25maWcoKS5kaXJlY3Rpb24sXG4gICAgICAgICAgY2xhc3NJbmNsdWRlOiBwb3B1cENvbmZpZygpLmNsYXNzSW5jbHVkZSxcbiAgICAgICAgICBkaXJlY3Rpb25EaXN0YW5jZToyLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICBtb2RlOiAnc3RhcnQnLFxuICAgICAgICAgICAgZGlzdGFuY2U6IDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cIlxuICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgIFtjbGFzc0ljb25SaWdodF09XCJjbGFzc0ljb25SaWdodCgpXCJcbiAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKCkgfHwgJyFweS1bOXB4XSdcIlxuICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgICAob3V0UG9wb3ZlckV2ZW50KT1cImhhbmRsZXJQb3BvdmVyRXZlbnQoJGV2ZW50KVwiIC8+XG4gIH1cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUNvbnRlbnRFbD5cbiAgPGRpdj5cbiAgICBAaWYgKGl0ZW1zKCkgJiYgaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtLTAgcC0wXCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBpdGVtLmNsYXNzUm93IHx8ICcnIH19XCI+XG4gICAgICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6IGl0ZW0ucG9wb3ZlckNvbnRlbnQsIHpJbmRleDogcG9wdXBDb25maWcoKS56SW5kZXgsIGRpcmVjdGlvbkRpc3RhbmNlOiAtMn1cIlxuICAgICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiIWl0ZW0uc2hvd1BvcG92ZXJcIlxuICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1iZy1saXN0LWhvdmVyIHJlbGF0aXZlIGN1cnNvci1wb2ludGVyIHB5LVs3cHhdIHt7IGl0ZW0uY2xhc3NJbmNsdWRlIHx8ICcnIH19ICB7eyBzaG93Qm9yZGVyQm90dG9tKCkgPyAnbGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWwnIDogJycgfX1cIlxuICAgICAgICAgICAgICBbY2xhc3MuZmxleF09XCIhaXRlbS5pZ25vcmVGbGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJhcHBseU5vdygpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnBsLVsxNnB4XV09XCIhYXBwbHlOb3coKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5wci1bNDBweF1dPVwiIWFwcGx5Tm93KClcIlxuICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cIml0ZW0uZGlzYWJsZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cIml0ZW0uZGlzYWJsZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyU2VsZWN0SXRlbSgkZXZlbnQsaXRlbSlcIj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtW2ZpZWxkQ2xhc3NJY29uTGVmdCgpXSkge1xuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtW2ZpZWxkQ2xhc3NJY29uTGVmdCgpXVwiPjwvaT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiaXRlbVtmaWVsZENsYXNzKCldID8/ICdsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJpdGVtW2ZpZWxkRGlzcGxheSgpXSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW2NsYXNzSWNvbkxlZnRdPVwiaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZy5pY29uTGVmdFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZy5pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmJ1dHRvblRlbXBsYXRlQ29uZmlnLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIml0ZW0uYnV0dG9uVGVtcGxhdGVDb25maWcubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0J1dHRvblRlbXBsYXRlKCRldmVudCwgaXRlbSwgaXRlbXMoKSlcIlxuICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiaXRlbS5idXR0b25UZW1wbGF0ZUNvbmZpZy50eXBlXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbT8uc3ViVGVtcGxhdGUgfHwgbnVsbDtjb250ZXh0OntpdGVtOml0ZW19XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbVtrZXlGaWVsZCgpXSA9PT0ga2V5U2VsZWN0ZWQoKSAmJiAhYXBwbHlOb3coKSkge1xuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZWNrIGFic29sdXRlIHJpZ2h0LVsxNnB4XSB0b3AtWzhweF1cIj48L2k+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJwLVsyMHB4XVwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiJ2kxOG5fbm9fZGF0YScgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2J1dHRvbnMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXCI7XG5pbXBvcnQgeyBUWVBFX1BPUE9WRVJfRElSRUNUSU9OIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3ZlclwiO1xuaW1wb3J0IHsgVFlQRV9PQkpFQ1QgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuZXhwb3J0IGludGVyZmFjZSBJQnV0dG9uRHJvcGRvd24gZXh0ZW5kcyBJQnV0dG9uIHtcbiAgaXRlbXM/OiBBcnJheTxUWVBFX09CSkVDVD47IC8vIHJlcXVyaWVkXG4gIGZpZWxkRGlzcGxheTogYW55OyAvLyByZXF1cmllZFxuICBrZXlGaWVsZDogYW55OyAgLy8gcmVxdXJpZWRcbiAga2V5U2VsZWN0ZWQ/OiBzdHJpbmc7XG4gIGFwcGx5Tm93PzogYm9vbGVhbjsgLy8gaWYgbm90IGFwcGx5Tm93Pzoga2V5RmllbGQgaXMgcmVxdXJpZWQvLyBz4butIGThu6VuZyBjaG8gYnV0dG9uIGRyb3Bkb3duIHRyb25nIHRhYmxlID86IHPhur0gc+G7rWEgdHlwZSBjaGkgdGnhur90IGtoaSBsw6BtIHRhYmxlXG4gIHBvcHVwQ29uZmlnPzogSVBvcHVwQ29uZmlnQnV0dG9uRHJvcGRvd247XG4gIGRlbW9Nb2RlPzogc3RyaW5nO1xuICBpZ25vcmVIaWRkZW5Ub29sdGlwQ29udGVudFdoZW5Nb3VzZUxlYXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUG9wdXBDb25maWdCdXR0b25Ecm9wZG93biB7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBtYXhXaWR0aD86IG51bWJlcjtcbiAgbWF4SGVpZ2h0PzogbnVtYmVyO1xuICB6SW5kZXg/OiBudW1iZXI7XG4gIGRpcmVjdGlvbj86IFRZUEVfUE9QT1ZFUl9ESVJFQ1RJT047XG4gIHRpbWVEZXN0cm95PzogbnVtYmVyO1xuICB3aWR0aEJ5UGFyZW50PzogYm9vbGVhbixcbiAgcG9zaXRpb24/OiB7XG4gICAgbW9kZTogJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCc7XG4gICAgZGlzdGFuY2U6IG51bWJlcjtcbiAgfTtcbiAgY2xhc3NJbmNsdWRlPzogc3RyaW5nO1xufSJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2J1dHRvbnMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXCI7XG5pbXBvcnQgeyBUWVBFX1BPUE9WRVJfRElSRUNUSU9OLCBUWVBFX1BPUE9WRVJfTU9ERSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIERyb3Bkb3duIEJ1dHRvbiBjb21wb25lbnQgaW5wdXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElCdXR0b25Ecm9wZG93biBleHRlbmRzIElCdXR0b24ge1xuICAvKiogRGFuaCBzw6FjaCBjw6FjIG3hu6VjIHPhur0gaGnhu4NuIHRo4buLIHRyb25nIG1lbnUuICovXG4gIGl0ZW1zOiBhbnlbXTtcbiAgLyoqIFTDqm4gdHLGsOG7nW5nIGTDuW5nIMSR4buDIGhp4buDbiB0aOG7iyBu4buZaSBkdW5nIGPhu6dhIG3hu5dpIG3hu6VjLiAqL1xuICBmaWVsZERpc3BsYXk/OiBzdHJpbmc7XG4gIC8qKiBUw6puIHRyxrDhu51uZyBkw7luZyBsw6BtIGdpw6EgdHLhu4sga2V5IGPhu6dhIG3hu5dpIG3hu6VjLiAqL1xuICBrZXlGaWVsZD86IHN0cmluZztcbiAgLyoqIEdpw6EgdHLhu4sga2V5IMSRYW5nIMSRxrDhu6NjIGNo4buNbiAoaOG7lyB0cuG7oyB0d28td2F5IGJpbmRpbmcpLiAqL1xuICBrZXlTZWxlY3RlZD86IHN0cmluZztcbiAgLyoqIE7hur91IHRydWU6IGNo4buNbiB4b25nIHThu7EgZW1pdCBz4buxIGtp4buHbjsgZmFsc2U6IGPhuqduIGLhuqVtIG7DunQgw4FwIGThu6VuZy4gKi9cbiAgYXBwbHlOb3c/OiBib29sZWFuO1xuICAvKiogSGnhu4NuIHRo4buLIMSRxrDhu51uZyBr4bq7IGTGsOG7m2kgbWVudSBraGkgbeG7ny4gKi9cbiAgc2hvd0JvcmRlckJvdHRvbT86IGJvb2xlYW47XG4gIC8qKiBD4bqldSBow6xuaCBjaGkgdGnhur90IGNobyBwb3BvdmVyICh24buLIHRyw60sIGvDrWNoIHRoxrDhu5tjKS4gKi9cbiAgcG9wdXBDb25maWc/OiBJUG9wdXBDb25maWdCdXR0b25Ecm9wZG93bjtcbiAgLyoqIEdp4buvIHBvcG92ZXIgbeG7nyBraGkgY2h14buZdCBy4budaSBraOG7j2kgbuG7mWkgZHVuZy4gKi9cbiAgaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZT86IGJvb2xlYW47XG4gIC8qKiBDw6FjaCBoaeG7g24gdGjhu4sgcG9wb3ZlciAoY2xpY2ssIGhvdmVyLC4uLikuICovXG4gIG1vZGVQb3BvdmVyPzogVFlQRV9QT1BPVkVSX01PREU7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIERyb3Bkb3duIHBvcG92ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIElQb3B1cENvbmZpZ0J1dHRvbkRyb3Bkb3duIHtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIG1heFdpZHRoPzogbnVtYmVyO1xuICBtYXhIZWlnaHQ/OiBudW1iZXI7XG4gIHpJbmRleD86IG51bWJlcjtcbiAgZGlyZWN0aW9uPzogVFlQRV9QT1BPVkVSX0RJUkVDVElPTjtcbiAgdGltZURlc3Ryb3k/OiBudW1iZXI7XG4gIHdpZHRoQnlQYXJlbnQ/OiBib29sZWFuO1xuICBwb3NpdGlvbj86IHtcbiAgICBtb2RlOiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xuICB9O1xuICBjbGFzc0luY2x1ZGU/OiBzdHJpbmc7XG59Il19
@@ -17,7 +17,7 @@ class LibsUiComponentsButtonsDropdownComponent {
17
17
  fieldClassIconLeft = input('classIconLeft'); // iconclass item of items
18
18
  items = input.required({ transform: data => data.map(item => ({ ...item, [this.fieldDisplay()]: escapeHtml(item[this.fieldDisplay()]) })) }); // requried
19
19
  fieldDisplay = input('label', { transform: value => value ?? 'label' });
20
- keyField = input('key', { transform: value => value ?? 'id' });
20
+ keyField = input('key', { transform: value => value ?? 'key' });
21
21
  keySelected = model();
22
22
  applyNow = input(false); // if not applyNow: keyField is requried
23
23
  showBorderBottom = input(false);
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-buttons-dropdown.mjs","sources":["../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.ts","../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.html","../../../../../../libs-ui/components/buttons/dropdown/src/libs-ui-components-buttons-dropdown.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent, TYPE_BUTTON, TYPE_SIZE_BUTTON } from '@libs-ui/components-buttons-button';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE } from '@libs-ui/components-popover';\nimport { escapeHtml } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPopupConfigButtonDropdown } from './dropdown.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-buttons-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrl: './dropdown.component.scss',\n standalone: true,\n imports: [\n TranslateModule, NgTemplateOutlet,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsPopoverComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LibsUiComponentsButtonsDropdownComponent {\n\n // #region PROPERTY\n protected labelDisplay = computed(this.labelComputed.bind(this))\n\n // #region INPUT\n readonly label = input<string>();\n readonly fieldClass = input<string>('class'); // change color label item of items\n readonly fieldClassIconLeft = input<string>('classIconLeft'); // iconclass item of items\n readonly items = input.required<Array<any>, Array<any>>({ transform: data => data.map(item => ({ ...item, [this.fieldDisplay()]: escapeHtml(item[this.fieldDisplay()]) })) }); // requried\n readonly fieldDisplay = input<string, string | undefined>('label', { transform: value => value ?? 'label' });\n readonly keyField = input<string, string | undefined>('key', { transform: value => value ?? 'id' });\n readonly keySelected = model<string>();\n readonly applyNow = input<boolean>(false); // if not applyNow: keyField is requried\n readonly showBorderBottom = input<boolean>(false);\n readonly disable = input<boolean>(false);\n readonly sizeButton = input<TYPE_SIZE_BUTTON>('medium');\n readonly classLabel = input<string>('');\n readonly iconOnlyType = input<boolean>(false);\n readonly classIconRight = input<string>('libs-ui-icon-move-right rotate-[90deg]');\n readonly classIconLeft = input<string>('');\n readonly typeButton = input<TYPE_BUTTON>('button-primary');\n readonly popupConfig = input<IPopupConfigButtonDropdown>({ width: 205, maxWidth: 250, maxHeight: 140, zIndex: 1200, direction: 'top' });\n readonly ignoreHiddenPopoverContentWhenMouseLeave = input<boolean>(true);\n readonly classInclude = input<string>('');\n readonly modePopover = input<TYPE_POPOVER_MODE>('click-toggle');\n readonly classIncludeContainer = input<string>();\n\n // #region OUTPUT\n readonly outSelectItem = output<any>();\n readonly outHover = output<boolean>();\n readonly outApply = output<any>(); // sử dụng cho bấm button left chế độ applyNow = false;\n readonly outPopoverEvent = output<TYPE_POPOVER_EVENT>();\n readonly outFunctionsControl = output<IPopoverFunctionControlEvent>();\n readonly outIconEvent = output<MouseEvent>();\n\n /* FUNCTIONS */\n protected async handlerApply() {\n if (!this.applyNow()) {\n this.outApply.emit(this.items().find(item => item[this.keyField()] === this.keySelected()));\n }\n }\n\n protected async handlerSelectItem(event: Event, data: any) {\n event.stopPropagation();\n if (data.subTemplate) {\n return;\n }\n if (!this.applyNow()) {\n this.keySelected.set(data[this.keyField()]);\n }\n this.outSelectItem.emit(data);\n this.outHover.emit(false);\n }\n\n protected async handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n this.outPopoverEvent.emit(event);\n }\n\n protected async handlerPopoverControlEvent(control: IPopoverFunctionControlEvent) {\n this.outFunctionsControl.emit(control);\n }\n\n protected async handlerClickButtonTemplate(event: Event, data: any, items: Array<any>) {\n event.stopPropagation();\n data.buttonTemplateConfig.action(data, items);\n }\n\n private labelComputed() {\n if (!this.keySelected() || !this.items() || !this.items().length || !this.keyField() || this.applyNow()) {\n return this.label();\n }\n for (const item of this.items()) {\n if (item[this.keyField()] === this.keySelected()) {\n return item[this.fieldDisplay()];\n }\n }\n\n return this.label();\n }\n\n}","<div #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: .5\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0\n }\n }\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config:{\n animationConfig: {\n time:.5\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance:2,\n position: {\n mode: 'start',\n distance: 0\n }\n }\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [config]=\"{content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2}\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event,item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\">\n </span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null;context:{item:item}\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-buttons-dropdown.mjs","sources":["../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.ts","../../../../../../libs-ui/components/buttons/dropdown/src/dropdown.component.html","../../../../../../libs-ui/components/buttons/dropdown/src/libs-ui-components-buttons-dropdown.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent, TYPE_BUTTON, TYPE_SIZE_BUTTON } from '@libs-ui/components-buttons-button';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT, TYPE_POPOVER_MODE } from '@libs-ui/components-popover';\nimport { escapeHtml } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IPopupConfigButtonDropdown } from './dropdown.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-buttons-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrl: './dropdown.component.scss',\n standalone: true,\n imports: [\n TranslateModule, NgTemplateOutlet,\n LibsUiComponentsButtonsButtonComponent,\n LibsUiComponentsPopoverComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LibsUiComponentsButtonsDropdownComponent {\n\n // #region PROPERTY\n protected labelDisplay = computed(this.labelComputed.bind(this))\n\n // #region INPUT\n readonly label = input<string>();\n readonly fieldClass = input<string>('class'); // change color label item of items\n readonly fieldClassIconLeft = input<string>('classIconLeft'); // iconclass item of items\n readonly items = input.required<Array<any>, Array<any>>({ transform: data => data.map(item => ({ ...item, [this.fieldDisplay()]: escapeHtml(item[this.fieldDisplay()]) })) }); // requried\n readonly fieldDisplay = input<string, string | undefined>('label', { transform: value => value ?? 'label' });\n readonly keyField = input<string, string | undefined>('key', { transform: value => value ?? 'key' });\n readonly keySelected = model<string>();\n readonly applyNow = input<boolean>(false); // if not applyNow: keyField is requried\n readonly showBorderBottom = input<boolean>(false);\n readonly disable = input<boolean>(false);\n readonly sizeButton = input<TYPE_SIZE_BUTTON>('medium');\n readonly classLabel = input<string>('');\n readonly iconOnlyType = input<boolean>(false);\n readonly classIconRight = input<string>('libs-ui-icon-move-right rotate-[90deg]');\n readonly classIconLeft = input<string>('');\n readonly typeButton = input<TYPE_BUTTON>('button-primary');\n readonly popupConfig = input<IPopupConfigButtonDropdown>({ width: 205, maxWidth: 250, maxHeight: 140, zIndex: 1200, direction: 'top' });\n readonly ignoreHiddenPopoverContentWhenMouseLeave = input<boolean>(true);\n readonly classInclude = input<string>('');\n readonly modePopover = input<TYPE_POPOVER_MODE>('click-toggle');\n readonly classIncludeContainer = input<string>();\n\n // #region OUTPUT\n readonly outSelectItem = output<any>();\n readonly outHover = output<boolean>();\n readonly outApply = output<any>(); // sử dụng cho bấm button left chế độ applyNow = false;\n readonly outPopoverEvent = output<TYPE_POPOVER_EVENT>();\n readonly outFunctionsControl = output<IPopoverFunctionControlEvent>();\n readonly outIconEvent = output<MouseEvent>();\n\n /* FUNCTIONS */\n protected async handlerApply() {\n if (!this.applyNow()) {\n this.outApply.emit(this.items().find(item => item[this.keyField()] === this.keySelected()));\n }\n }\n\n protected async handlerSelectItem(event: Event, data: any) {\n event.stopPropagation();\n if (data.subTemplate) {\n return;\n }\n if (!this.applyNow()) {\n this.keySelected.set(data[this.keyField()]);\n }\n this.outSelectItem.emit(data);\n this.outHover.emit(false);\n }\n\n protected async handlerPopoverEvent(event: TYPE_POPOVER_EVENT) {\n this.outPopoverEvent.emit(event);\n }\n\n protected async handlerPopoverControlEvent(control: IPopoverFunctionControlEvent) {\n this.outFunctionsControl.emit(control);\n }\n\n protected async handlerClickButtonTemplate(event: Event, data: any, items: Array<any>) {\n event.stopPropagation();\n data.buttonTemplateConfig.action(data, items);\n }\n\n private labelComputed() {\n if (!this.keySelected() || !this.items() || !this.items().length || !this.keyField() || this.applyNow()) {\n return this.label();\n }\n for (const item of this.items()) {\n if (item[this.keyField()] === this.keySelected()) {\n return item[this.fieldDisplay()];\n }\n }\n\n return this.label();\n }\n\n}","<div #buttonDropdownEl\n class=\"libs-ui-buttons-dropdown flex {{ classIncludeContainer() || '' }}\"\n [class.libs-ui-buttons-dropdown-un-apply-now]=\"!applyNow()\"\n [class.libs-ui-buttons-dropdown-apply-now-button-primary]=\"applyNow() && typeButton() === 'button-primary'\"\n [class.libs-ui-buttons-dropdown-apply-now-button-secondary]=\"applyNow() && typeButton() === 'button-secondary'\">\n <libs_ui-components-buttons-button [disable]=\"disable()\"\n [iconOnlyType]=\"iconOnlyType()\"\n [classIconLeft]=\"classIconLeft()\"\n [classIconRight]=\"!applyNow() ? '' : classIconRight()\"\n [type]=\"typeButton()\"\n [classLabel]=\"classLabel()\"\n [classInclude]=\"classInclude()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n elementRefCustom: buttonDropdownEl,\n mode: modePopover(),\n ignoreShowPopover: !applyNow(),\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n animationConfig: {\n time: .5\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n widthByParent: popupConfig().widthByParent ?? false,\n maxWidth: popupConfig().maxWidth,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n classInclude: 'rounded-[4px] ' + popupConfig().classInclude,\n direction: popupConfig().direction,\n timerDestroy: popupConfig().timeDestroy,\n directionDistance: 2,\n position: {\n mode: popupConfig().position?.mode || 'start',\n distance: popupConfig().position?.distance ?? 0\n }\n }\n }\"\n [label]=\"labelDisplay()\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\"\n (outClick)=\"handlerApply()\" />\n @if (!applyNow()) {\n <div class=\"h-full w-[1px] bg-white\"></div>\n <libs_ui-components-buttons-button [type]=\"typeButton()\"\n [disable]=\"disable()\"\n [sizeButton]=\"sizeButton()\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: ignoreHiddenPopoverContentWhenMouseLeave(),\n config:{\n animationConfig: {\n time:.5\n },\n template: templateContentEl,\n whiteTheme: true,\n ignoreArrow: true,\n width: popupConfig().width,\n maxWidth: popupConfig().maxWidth,\n widthByParent: popupConfig().widthByParent ?? false,\n maxHeight: popupConfig().maxHeight,\n zIndex: popupConfig().zIndex,\n direction: popupConfig().direction,\n classInclude: popupConfig().classInclude,\n directionDistance:2,\n position: {\n mode: 'start',\n distance: 0\n }\n }\n }\"\n [iconOnlyType]=\"true\"\n [classIconRight]=\"classIconRight()\"\n [classInclude]=\"classInclude() || '!py-[9px]'\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outPopoverEvent)=\"handlerPopoverEvent($event)\" />\n }\n</div>\n<ng-template #templateContentEl>\n <div>\n @if (items() && items().length) {\n <div class=\"m-0 p-0\">\n @for (item of items(); track item) {\n <div class=\"{{ item.classRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [config]=\"{content: item.popoverContent, zIndex: popupConfig().zIndex, directionDistance: -2}\"\n [ignoreShowPopover]=\"!item.showPopover\"\n [ignoreStopPropagationEvent]=\"true\"\n class=\"libs-ui-bg-list-hover relative cursor-pointer py-[7px] {{ item.classInclude || '' }} {{ showBorderBottom() ? 'libs-ui-border-bottom-general' : '' }}\"\n [class.flex]=\"!item.ignoreFlex\"\n [class.px-[16px]]=\"applyNow()\"\n [class.pl-[16px]]=\"!applyNow()\"\n [class.pr-[40px]]=\"!applyNow()\"\n [class.libs-ui-disable]=\"item.disable\"\n [class.pointer-events-none]=\"item.disable\"\n (click)=\"handlerSelectItem($event,item)\">\n @if (item[fieldClassIconLeft()]) {\n <i [class]=\"item[fieldClassIconLeft()]\"></i>\n }\n <span [class]=\"item[fieldClass()] ?? 'libs-ui-font-h5r'\"\n [innerHtml]=\"item[fieldDisplay()] | translate\">\n </span>\n @if (item.buttonTemplateConfig) {\n <libs_ui-components-buttons-button [classIconLeft]=\"item.buttonTemplateConfig.iconLeft\"\n [classIconRight]=\"item.buttonTemplateConfig.icon\"\n [label]=\"item.buttonTemplateConfig.label\"\n [classLabel]=\"item.buttonTemplateConfig.label\"\n (outClick)=\"handlerClickButtonTemplate($event, item, items())\"\n [type]=\"item.buttonTemplateConfig.type\" />\n }\n <ng-container *ngTemplateOutlet=\"item?.subTemplate || null;context:{item:item}\"></ng-container>\n @if (item[keyField()] === keySelected() && !applyNow()) {\n <i class=\"libs-ui-icon-check absolute right-[16px] top-[8px]\"></i>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"p-[20px]\"\n [innerHtml]=\"'i18n_no_data' | translate\"></div>\n }\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@libs-ui/components-buttons-dropdown",
3
- "version": "0.2.279",
3
+ "version": "0.2.281",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^18.2.0",
6
6
  "@angular/core": "^18.2.0",
7
- "@libs-ui/components-buttons-button": "^0.2.279",
8
- "@libs-ui/components-popover": "^0.2.279",
9
- "@libs-ui/utils": "^0.2.279",
7
+ "@libs-ui/components-buttons-button": "0.2.281",
8
+ "@libs-ui/components-popover": "0.2.281",
9
+ "@libs-ui/utils": "0.2.281",
10
10
  "@ngx-translate/core": "^15.0.0",
11
- "@libs-ui/interfaces-types": "^0.2.279"
11
+ "@libs-ui/interfaces-types": "0.2.281"
12
12
  },
13
13
  "sideEffects": false,
14
14
  "module": "fesm2022/libs-ui-components-buttons-dropdown.mjs",