valtech-components 2.0.396 → 2.0.397
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/esm2022/lib/components/molecules/select-search/select-search.component.mjs +316 -254
- package/esm2022/lib/components/organisms/form/form.component.mjs +2 -18
- package/esm2022/public-api.mjs +15 -17
- package/fesm2022/valtech-components.mjs +1454 -2195
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/select-search/select-search.component.d.ts +40 -22
- package/lib/components/organisms/article/article.component.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +14 -16
- package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs +0 -405
- package/esm2022/lib/components/molecules/multi-select-simple/multi-select-simple.component.mjs +0 -406
- package/lib/components/molecules/multi-select-search/multi-select-search.component.d.ts +0 -49
- package/lib/components/molecules/multi-select-simple/multi-select-simple.component.d.ts +0 -48
|
@@ -1,37 +1,55 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
|
|
2
|
+
import { IonModal } from '@ionic/angular';
|
|
3
|
+
import { IconService } from '../../../services/icons.service';
|
|
2
4
|
import { InputMetadata, InputOption } from '../../types';
|
|
3
5
|
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class SelectSearchComponent implements
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
props: InputMetadata;
|
|
6
|
+
export declare class SelectSearchComponent implements OnChanges, OnDestroy {
|
|
7
|
+
modal: IonModal;
|
|
8
|
+
label: string;
|
|
8
9
|
labelProperty: string;
|
|
9
10
|
valueProperty: string;
|
|
11
|
+
multiple: boolean;
|
|
10
12
|
placeholder: string;
|
|
11
13
|
private langService;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Input configuration object.
|
|
17
|
+
* @type {InputMetadata}
|
|
18
|
+
* @property control - The Angular FormControl for the select input.
|
|
19
|
+
* @property label - The label for the select.
|
|
20
|
+
* @property options - The available options for the select.
|
|
21
|
+
* @property placeholder - The placeholder text.
|
|
22
|
+
*/
|
|
23
|
+
props: InputMetadata;
|
|
24
|
+
icon: IconService;
|
|
12
25
|
private changeDetector;
|
|
13
|
-
isOpen: boolean;
|
|
14
26
|
searchTerm: string;
|
|
15
|
-
|
|
27
|
+
filteredItems: InputOption[];
|
|
28
|
+
selectedItems: InputOption[];
|
|
16
29
|
displayValue: string;
|
|
17
|
-
|
|
18
|
-
|
|
30
|
+
private previousOptions;
|
|
31
|
+
private isProcessingChanges;
|
|
32
|
+
private valueChangesSubscription?;
|
|
19
33
|
ngOnInit(): void;
|
|
20
34
|
ngOnDestroy(): void;
|
|
21
35
|
ngOnChanges(changes: SimpleChanges): void;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
private handleClickOutside;
|
|
28
|
-
private getOptionByValue;
|
|
29
|
-
private initializeOptions;
|
|
30
|
-
private filterOptions;
|
|
31
|
-
private updateDisplayValue;
|
|
36
|
+
ionViewWillEnter(): void;
|
|
37
|
+
private subscribeToValueChanges;
|
|
38
|
+
private areOptionsEqual;
|
|
39
|
+
private initializeItems;
|
|
40
|
+
private syncControlValueWithSelectedItems;
|
|
32
41
|
private applyDefaultValue;
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
onFilter(event: any): void;
|
|
43
|
+
onFocus(): void;
|
|
44
|
+
onBlur(): void;
|
|
45
|
+
openModal(): void;
|
|
46
|
+
preventDefaultBehavior(event: MouseEvent): void;
|
|
47
|
+
cancelModal(): void;
|
|
48
|
+
selectItem(item: any): void;
|
|
49
|
+
isItemSelected(item: any): boolean;
|
|
50
|
+
updateDisplayValue(): void;
|
|
51
|
+
applyChanges(): void;
|
|
52
|
+
reset(): void;
|
|
35
53
|
static ɵfac: i0.ɵɵFactoryDeclaration<SelectSearchComponent, never>;
|
|
36
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SelectSearchComponent, "val-select-search", never, { "
|
|
54
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SelectSearchComponent, "val-select-search", never, { "label": { "alias": "label"; "required": false; }; "labelProperty": { "alias": "labelProperty"; "required": false; }; "valueProperty": { "alias": "valueProperty"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "props": { "alias": "props"; "required": false; }; }, {}, never, never, true, never>;
|
|
37
55
|
}
|
|
@@ -75,7 +75,7 @@ export declare class ArticleComponent implements OnInit {
|
|
|
75
75
|
shape?: "round";
|
|
76
76
|
size?: "small" | "large" | "default";
|
|
77
77
|
fill?: "default" | "clear" | "outline" | "solid";
|
|
78
|
-
type: "
|
|
78
|
+
type: "submit" | "button" | "reset";
|
|
79
79
|
token?: string;
|
|
80
80
|
ref?: any;
|
|
81
81
|
handler?: (value: any) => any;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -20,8 +20,6 @@ export * from './lib/components/atoms/text/text.component';
|
|
|
20
20
|
export * from './lib/components/atoms/text/types';
|
|
21
21
|
export * from './lib/components/atoms/title/title.component';
|
|
22
22
|
export * from './lib/components/atoms/title/types';
|
|
23
|
-
export * from './lib/components/molecules/action-header/action-header.component';
|
|
24
|
-
export * from './lib/components/molecules/action-header/types';
|
|
25
23
|
export * from './lib/components/molecules/alert-box/alert-box.component';
|
|
26
24
|
export * from './lib/components/molecules/alert-box/types';
|
|
27
25
|
export * from './lib/components/molecules/button-group/button-group.component';
|
|
@@ -29,10 +27,6 @@ export * from './lib/components/molecules/button-group/types';
|
|
|
29
27
|
export * from './lib/components/molecules/card/card.component';
|
|
30
28
|
export * from './lib/components/molecules/card/types';
|
|
31
29
|
export * from './lib/components/molecules/check-input/check-input.component';
|
|
32
|
-
export * from './lib/components/molecules/code-display/code-display.component';
|
|
33
|
-
export * from './lib/components/molecules/code-display/types';
|
|
34
|
-
export * from './lib/components/molecules/command-display/command-display.component';
|
|
35
|
-
export * from './lib/components/molecules/command-display/types';
|
|
36
30
|
export * from './lib/components/molecules/comment-input/comment-input.component';
|
|
37
31
|
export * from './lib/components/molecules/content-loader/content-loader.component';
|
|
38
32
|
export * from './lib/components/molecules/content-loader/types';
|
|
@@ -43,8 +37,6 @@ export * from './lib/components/molecules/expandable-text/types';
|
|
|
43
37
|
export * from './lib/components/molecules/file-input/file-input.component';
|
|
44
38
|
export * from './lib/components/molecules/hint/hint.component';
|
|
45
39
|
export * from './lib/components/molecules/hour-input/hour-input.component';
|
|
46
|
-
export * from './lib/components/molecules/info/info.component';
|
|
47
|
-
export * from './lib/components/molecules/info/types';
|
|
48
40
|
export * from './lib/components/molecules/language-selector/language-selector.component';
|
|
49
41
|
export * from './lib/components/molecules/language-selector/types';
|
|
50
42
|
export * from './lib/components/molecules/layered-card/layered-card.component';
|
|
@@ -53,18 +45,12 @@ export * from './lib/components/molecules/link/link.component';
|
|
|
53
45
|
export * from './lib/components/molecules/link/types';
|
|
54
46
|
export * from './lib/components/molecules/links-cake/links-cake.component';
|
|
55
47
|
export * from './lib/components/molecules/links-cake/types';
|
|
56
|
-
export * from './lib/components/molecules/multi-select-search/multi-select-search.component';
|
|
57
|
-
export * from './lib/components/molecules/multi-select-simple/multi-select-simple.component';
|
|
58
48
|
export * from './lib/components/molecules/notes-box/notes-box.component';
|
|
59
49
|
export * from './lib/components/molecules/notes-box/types';
|
|
60
|
-
export * from './lib/components/molecules/number-from-to/number-from-to.component';
|
|
61
50
|
export * from './lib/components/molecules/number-input/number-input.component';
|
|
51
|
+
export * from './lib/components/molecules/number-from-to/number-from-to.component';
|
|
62
52
|
export * from './lib/components/molecules/password-input/password-input.component';
|
|
63
|
-
export * from './lib/components/molecules/pill/pill.component';
|
|
64
|
-
export * from './lib/components/molecules/pill/types';
|
|
65
53
|
export * from './lib/components/molecules/pin-input/pin-input.component';
|
|
66
|
-
export * from './lib/components/molecules/plain-code-box/plain-code-box.component';
|
|
67
|
-
export * from './lib/components/molecules/plain-code-box/types';
|
|
68
54
|
export * from './lib/components/molecules/popover-selector/popover-selector.component';
|
|
69
55
|
export * from './lib/components/molecules/popover-selector/types';
|
|
70
56
|
export * from './lib/components/molecules/progress-status/progress-status.component';
|
|
@@ -78,6 +64,18 @@ export * from './lib/components/molecules/select-search/select-search.component'
|
|
|
78
64
|
export * from './lib/components/molecules/text-input/text-input.component';
|
|
79
65
|
export * from './lib/components/molecules/title-block/title-block.component';
|
|
80
66
|
export * from './lib/components/molecules/title-block/types';
|
|
67
|
+
export * from './lib/components/molecules/code-display/code-display.component';
|
|
68
|
+
export * from './lib/components/molecules/code-display/types';
|
|
69
|
+
export * from './lib/components/molecules/action-header/action-header.component';
|
|
70
|
+
export * from './lib/components/molecules/action-header/types';
|
|
71
|
+
export * from './lib/components/molecules/pill/pill.component';
|
|
72
|
+
export * from './lib/components/molecules/pill/types';
|
|
73
|
+
export * from './lib/components/molecules/command-display/command-display.component';
|
|
74
|
+
export * from './lib/components/molecules/command-display/types';
|
|
75
|
+
export * from './lib/components/molecules/info/info.component';
|
|
76
|
+
export * from './lib/components/molecules/info/types';
|
|
77
|
+
export * from './lib/components/molecules/plain-code-box/plain-code-box.component';
|
|
78
|
+
export * from './lib/components/molecules/plain-code-box/types';
|
|
81
79
|
export * from './lib/components/organisms/article/article.component';
|
|
82
80
|
export * from './lib/components/organisms/article/types';
|
|
83
81
|
export * from './lib/components/organisms/banner/banner.component';
|
|
@@ -119,6 +117,6 @@ export * from './lib/shared/pipes/process-links.pipe';
|
|
|
119
117
|
export * from './lib/shared/utils/content';
|
|
120
118
|
export * from './lib/shared/utils/dom';
|
|
121
119
|
export * from './lib/shared/utils/form-defaults';
|
|
122
|
-
export { createReactiveContentMetadata, extractContentConfig, extractContentConfigWithInterpolation, interpolateStaticContent, ReactiveContentMetadata, ReactiveContentWithInterpolation, ReactiveTextMetadata, shouldUseReactiveContent, shouldUseReactiveContentWithInterpolation } from './lib/shared/utils/simple-content';
|
|
120
|
+
export { createReactiveContentMetadata, extractContentConfig, extractContentConfigWithInterpolation, interpolateStaticContent, ReactiveContentMetadata, ReactiveContentWithInterpolation, ReactiveTextMetadata, shouldUseReactiveContent, shouldUseReactiveContentWithInterpolation, } from './lib/shared/utils/simple-content';
|
|
123
121
|
export * from './lib/shared/utils/styles';
|
|
124
122
|
export * from './lib/shared/utils/text';
|
package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs
DELETED
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { ChangeDetectorRef, Component, inject, Input, ViewChild, } from '@angular/core';
|
|
3
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
-
import { IonicModule } from '@ionic/angular';
|
|
5
|
-
import { IconService } from '../../../services/icons.service';
|
|
6
|
-
import { LangService } from '../../../services/lang-provider/lang-provider.service';
|
|
7
|
-
import { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';
|
|
8
|
-
import { replaceSpecialChars } from '../../../shared/utils/text';
|
|
9
|
-
import { SearchbarComponent } from '../searchbar/searchbar.component';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "@ionic/angular";
|
|
13
|
-
import * as i3 from "@angular/forms";
|
|
14
|
-
export class MultiSelectSearchComponent {
|
|
15
|
-
constructor() {
|
|
16
|
-
this.labelProperty = 'name';
|
|
17
|
-
this.valueProperty = 'id';
|
|
18
|
-
this.langService = inject(LangService);
|
|
19
|
-
this.icon = inject(IconService);
|
|
20
|
-
this.changeDetector = inject(ChangeDetectorRef);
|
|
21
|
-
this.searchTerm = '';
|
|
22
|
-
this.filteredItems = [];
|
|
23
|
-
this.selectedItems = [];
|
|
24
|
-
this.tempSelectedItems = [];
|
|
25
|
-
this.displayValue = '';
|
|
26
|
-
this.previousOptions = [];
|
|
27
|
-
this.isProcessingChanges = false;
|
|
28
|
-
this.label = this.langService.getText('_global', 'selectMultiple', 'Seleccionar múltiples');
|
|
29
|
-
this.placeholder = this.langService.getText('_global', 'selectOptions', 'Seleccione opciones');
|
|
30
|
-
}
|
|
31
|
-
ngOnInit() {
|
|
32
|
-
this.applyDefaultValue();
|
|
33
|
-
this.initializeItems();
|
|
34
|
-
this.syncControlValueWithSelectedItems();
|
|
35
|
-
this.updateDisplayValue();
|
|
36
|
-
this.subscribeToValueChanges();
|
|
37
|
-
}
|
|
38
|
-
ngOnDestroy() {
|
|
39
|
-
if (this.valueChangesSubscription) {
|
|
40
|
-
this.valueChangesSubscription.unsubscribe();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
ngOnChanges(changes) {
|
|
44
|
-
if (this.isProcessingChanges) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
if (changes['props']) {
|
|
48
|
-
try {
|
|
49
|
-
this.isProcessingChanges = true;
|
|
50
|
-
if (this.valueChangesSubscription) {
|
|
51
|
-
this.valueChangesSubscription.unsubscribe();
|
|
52
|
-
}
|
|
53
|
-
if (this.props?.options) {
|
|
54
|
-
const optionsChanged = !this.areOptionsEqual(this.previousOptions, this.props.options);
|
|
55
|
-
if (optionsChanged) {
|
|
56
|
-
this.previousOptions = [...this.props.options];
|
|
57
|
-
this.initializeItems();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
this.syncControlValueWithSelectedItems();
|
|
61
|
-
this.updateDisplayValue();
|
|
62
|
-
this.subscribeToValueChanges();
|
|
63
|
-
}
|
|
64
|
-
finally {
|
|
65
|
-
this.isProcessingChanges = false;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
ionViewWillEnter() {
|
|
70
|
-
if (this.isProcessingChanges) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
try {
|
|
74
|
-
this.isProcessingChanges = true;
|
|
75
|
-
this.initializeItems();
|
|
76
|
-
this.syncControlValueWithSelectedItems();
|
|
77
|
-
this.updateDisplayValue();
|
|
78
|
-
this.subscribeToValueChanges();
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
this.isProcessingChanges = false;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
subscribeToValueChanges() {
|
|
85
|
-
if (!this.props?.control)
|
|
86
|
-
return;
|
|
87
|
-
this.valueChangesSubscription = this.props.control.valueChanges.subscribe(() => {
|
|
88
|
-
if (this.isProcessingChanges)
|
|
89
|
-
return;
|
|
90
|
-
try {
|
|
91
|
-
this.isProcessingChanges = true;
|
|
92
|
-
this.syncControlValueWithSelectedItems();
|
|
93
|
-
this.updateDisplayValue();
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
this.isProcessingChanges = false;
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
areOptionsEqual(prevOptions, newOptions) {
|
|
101
|
-
if (prevOptions === newOptions)
|
|
102
|
-
return true;
|
|
103
|
-
if (!prevOptions || !newOptions)
|
|
104
|
-
return prevOptions === newOptions;
|
|
105
|
-
if (prevOptions.length !== newOptions.length)
|
|
106
|
-
return false;
|
|
107
|
-
for (let i = 0; i < prevOptions.length; i++) {
|
|
108
|
-
if (prevOptions[i][this.valueProperty] !== newOptions[i][this.valueProperty]) {
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
initializeItems() {
|
|
115
|
-
this.filteredItems = this.props?.options || [];
|
|
116
|
-
}
|
|
117
|
-
syncControlValueWithSelectedItems() {
|
|
118
|
-
if (!this.props?.control) {
|
|
119
|
-
this.selectedItems = [];
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
const controlValue = this.props.control.value;
|
|
123
|
-
if (!controlValue || controlValue === '') {
|
|
124
|
-
this.selectedItems = [];
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
// Handle both array and string formats
|
|
128
|
-
let valueArray = [];
|
|
129
|
-
if (Array.isArray(controlValue)) {
|
|
130
|
-
valueArray = controlValue;
|
|
131
|
-
}
|
|
132
|
-
else if (typeof controlValue === 'string') {
|
|
133
|
-
valueArray = controlValue.split(',').filter(v => v.trim() !== '');
|
|
134
|
-
}
|
|
135
|
-
if (this.props.options && this.props.options.length > 0) {
|
|
136
|
-
const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));
|
|
137
|
-
this.selectedItems = valueArray
|
|
138
|
-
.map(value => map.get(value.toString().trim()))
|
|
139
|
-
.filter(item => item !== undefined);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
this.selectedItems = [];
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
applyDefaultValue() {
|
|
146
|
-
applyDefaultValueToControl(this.props);
|
|
147
|
-
}
|
|
148
|
-
onFilter(event) {
|
|
149
|
-
if (!event || event.trim() === '') {
|
|
150
|
-
this.filteredItems = this.props?.options ? [...this.props.options] : [];
|
|
151
|
-
this.changeDetector.detectChanges();
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
if (!this.props?.options || this.props.options.length === 0) {
|
|
155
|
-
this.filteredItems = [];
|
|
156
|
-
this.changeDetector.detectChanges();
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
const search = replaceSpecialChars(event.toLowerCase());
|
|
160
|
-
this.filteredItems = this.props.options.filter(element => {
|
|
161
|
-
const label = element[this.labelProperty]
|
|
162
|
-
? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())
|
|
163
|
-
: '';
|
|
164
|
-
const value = element[this.valueProperty]
|
|
165
|
-
? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())
|
|
166
|
-
: '';
|
|
167
|
-
return label.includes(search) || value.includes(search);
|
|
168
|
-
});
|
|
169
|
-
this.changeDetector.detectChanges();
|
|
170
|
-
}
|
|
171
|
-
onFocus() {
|
|
172
|
-
console.log('onFocus');
|
|
173
|
-
}
|
|
174
|
-
onBlur() {
|
|
175
|
-
console.log('onBlur');
|
|
176
|
-
}
|
|
177
|
-
openModal() {
|
|
178
|
-
this.syncControlValueWithSelectedItems();
|
|
179
|
-
this.tempSelectedItems = [...this.selectedItems];
|
|
180
|
-
this.updateDisplayValue();
|
|
181
|
-
if (this.modal) {
|
|
182
|
-
this.modal.present();
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
preventDefaultBehavior(event) {
|
|
186
|
-
event.preventDefault();
|
|
187
|
-
event.stopPropagation();
|
|
188
|
-
this.openModal();
|
|
189
|
-
}
|
|
190
|
-
cancelModal() {
|
|
191
|
-
// Reset filter and show all options when closing modal
|
|
192
|
-
this.searchTerm = '';
|
|
193
|
-
this.filteredItems = this.props?.options ? [...this.props.options] : [];
|
|
194
|
-
this.changeDetector.detectChanges();
|
|
195
|
-
if (this.modal) {
|
|
196
|
-
this.modal.dismiss();
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
selectItem(item) {
|
|
200
|
-
const index = this.tempSelectedItems.findIndex(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
|
|
201
|
-
if (index === -1) {
|
|
202
|
-
this.tempSelectedItems.push(item);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
this.tempSelectedItems.splice(index, 1);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
isItemSelected(item) {
|
|
209
|
-
return this.tempSelectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);
|
|
210
|
-
}
|
|
211
|
-
clearSelection() {
|
|
212
|
-
this.tempSelectedItems = [];
|
|
213
|
-
}
|
|
214
|
-
applySelection() {
|
|
215
|
-
this.selectedItems = [...this.tempSelectedItems];
|
|
216
|
-
this.updateDisplayValue();
|
|
217
|
-
this.applyChanges();
|
|
218
|
-
this.cancelModal();
|
|
219
|
-
}
|
|
220
|
-
updateDisplayValue() {
|
|
221
|
-
if (this.selectedItems.length === 0) {
|
|
222
|
-
this.displayValue = '';
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
if (this.selectedItems.length === 1) {
|
|
226
|
-
this.displayValue = this.selectedItems[0][this.labelProperty];
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
this.displayValue = `${this.selectedItems.length} elementos seleccionados`;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
applyChanges() {
|
|
233
|
-
if (!this.props?.control) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
try {
|
|
237
|
-
this.isProcessingChanges = true;
|
|
238
|
-
const values = this.selectedItems.map(item => item[this.valueProperty]);
|
|
239
|
-
const stringValue = values.join(',');
|
|
240
|
-
this.props.control.setValue(stringValue);
|
|
241
|
-
this.props.control.markAsDirty();
|
|
242
|
-
this.props.control.markAsTouched();
|
|
243
|
-
this.props.control.updateValueAndValidity();
|
|
244
|
-
// Debug validators if still having issues
|
|
245
|
-
if (this.props.control.invalid) {
|
|
246
|
-
console.warn('Control is invalid after setValue:', {
|
|
247
|
-
value: this.props.control.value,
|
|
248
|
-
errors: this.props.control.errors,
|
|
249
|
-
validators: this.props.control.validator
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
finally {
|
|
254
|
-
this.isProcessingChanges = false;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
reset() {
|
|
258
|
-
this.selectedItems = [];
|
|
259
|
-
this.displayValue = '';
|
|
260
|
-
if (this.props?.control) {
|
|
261
|
-
this.props.control.setValue('');
|
|
262
|
-
}
|
|
263
|
-
this.changeDetector.detectChanges();
|
|
264
|
-
}
|
|
265
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
266
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiSelectSearchComponent, isStandalone: true, selector: "val-multi-select-search", inputs: { label: "label", labelProperty: "labelProperty", valueProperty: "valueProperty", placeholder: "placeholder", props: "props" }, viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
267
|
-
<ion-input
|
|
268
|
-
type="text"
|
|
269
|
-
[value]="displayValue"
|
|
270
|
-
[placeholder]="props?.placeholder || placeholder"
|
|
271
|
-
readonly
|
|
272
|
-
(mousedown)="preventDefaultBehavior($event)"
|
|
273
|
-
/>
|
|
274
|
-
|
|
275
|
-
<ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
|
|
276
|
-
|
|
277
|
-
<ion-modal
|
|
278
|
-
#modal
|
|
279
|
-
[initialBreakpoint]="1"
|
|
280
|
-
[breakpoints]="[0, 0.5, 0.75, 1]"
|
|
281
|
-
(didDismiss)="cancelModal()"
|
|
282
|
-
>
|
|
283
|
-
<ng-template>
|
|
284
|
-
<ion-header>
|
|
285
|
-
<ion-toolbar>
|
|
286
|
-
<ion-title>{{ label }}</ion-title>
|
|
287
|
-
<ion-buttons slot="end">
|
|
288
|
-
<ion-button (click)="cancelModal()">Cerrar</ion-button>
|
|
289
|
-
</ion-buttons>
|
|
290
|
-
</ion-toolbar>
|
|
291
|
-
<ion-toolbar>
|
|
292
|
-
<val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
|
|
293
|
-
</ion-toolbar>
|
|
294
|
-
</ion-header>
|
|
295
|
-
<ion-content>
|
|
296
|
-
<ion-item *ngIf="tempSelectedItems.length > 0" lines="none" color="light">
|
|
297
|
-
<ion-icon name="checkmark-circle-outline" slot="start" color="success"></ion-icon>
|
|
298
|
-
<ion-label>
|
|
299
|
-
<h3>{{ tempSelectedItems.length }} item{{ tempSelectedItems.length === 1 ? '' : 's' }} seleccionado{{ tempSelectedItems.length === 1 ? '' : 's' }}</h3>
|
|
300
|
-
</ion-label>
|
|
301
|
-
</ion-item>
|
|
302
|
-
<ion-list>
|
|
303
|
-
<ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
|
|
304
|
-
<ion-checkbox
|
|
305
|
-
[checked]="isItemSelected(item)"
|
|
306
|
-
slot="start"
|
|
307
|
-
[disabled]="true"
|
|
308
|
-
></ion-checkbox>
|
|
309
|
-
<ion-label>{{ item[labelProperty] }}</ion-label>
|
|
310
|
-
</ion-item>
|
|
311
|
-
<ion-item *ngIf="filteredItems.length === 0" lines="none">
|
|
312
|
-
<ion-label color="dark">No se encontraron resultados</ion-label>
|
|
313
|
-
</ion-item>
|
|
314
|
-
</ion-list>
|
|
315
|
-
</ion-content>
|
|
316
|
-
<ion-footer *ngIf="tempSelectedItems.length > 0">
|
|
317
|
-
<ion-toolbar>
|
|
318
|
-
<ion-buttons slot="end">
|
|
319
|
-
<ion-button (click)="clearSelection()">Limpiar</ion-button>
|
|
320
|
-
<ion-button fill="solid" (click)="applySelection()">Aplicar ({{ tempSelectedItems.length }})</ion-button>
|
|
321
|
-
</ion-buttons>
|
|
322
|
-
</ion-toolbar>
|
|
323
|
-
</ion-footer>
|
|
324
|
-
</ng-template>
|
|
325
|
-
</ion-modal>
|
|
326
|
-
`, isInline: true, styles: ["ion-header{padding:8px 8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i2.IonCheckbox, selector: "ion-checkbox", inputs: ["alignment", "checked", "color", "disabled", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: i2.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i2.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i2.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i2.IonModal, selector: "ion-modal" }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: SearchbarComponent, selector: "val-searchbar", inputs: ["disabled"], outputs: ["filterEvent", "focusEvent", "blurEvent"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
|
|
327
|
-
}
|
|
328
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSearchComponent, decorators: [{
|
|
329
|
-
type: Component,
|
|
330
|
-
args: [{ selector: 'val-multi-select-search', standalone: true, imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule], template: `
|
|
331
|
-
<ion-input
|
|
332
|
-
type="text"
|
|
333
|
-
[value]="displayValue"
|
|
334
|
-
[placeholder]="props?.placeholder || placeholder"
|
|
335
|
-
readonly
|
|
336
|
-
(mousedown)="preventDefaultBehavior($event)"
|
|
337
|
-
/>
|
|
338
|
-
|
|
339
|
-
<ion-input style="position: absolute;" [formControl]="props.control" type="hidden"></ion-input>
|
|
340
|
-
|
|
341
|
-
<ion-modal
|
|
342
|
-
#modal
|
|
343
|
-
[initialBreakpoint]="1"
|
|
344
|
-
[breakpoints]="[0, 0.5, 0.75, 1]"
|
|
345
|
-
(didDismiss)="cancelModal()"
|
|
346
|
-
>
|
|
347
|
-
<ng-template>
|
|
348
|
-
<ion-header>
|
|
349
|
-
<ion-toolbar>
|
|
350
|
-
<ion-title>{{ label }}</ion-title>
|
|
351
|
-
<ion-buttons slot="end">
|
|
352
|
-
<ion-button (click)="cancelModal()">Cerrar</ion-button>
|
|
353
|
-
</ion-buttons>
|
|
354
|
-
</ion-toolbar>
|
|
355
|
-
<ion-toolbar>
|
|
356
|
-
<val-searchbar (filterEvent)="onFilter($event)" (focusEvent)="onFocus()" (blurEvent)="onBlur()" />
|
|
357
|
-
</ion-toolbar>
|
|
358
|
-
</ion-header>
|
|
359
|
-
<ion-content>
|
|
360
|
-
<ion-item *ngIf="tempSelectedItems.length > 0" lines="none" color="light">
|
|
361
|
-
<ion-icon name="checkmark-circle-outline" slot="start" color="success"></ion-icon>
|
|
362
|
-
<ion-label>
|
|
363
|
-
<h3>{{ tempSelectedItems.length }} item{{ tempSelectedItems.length === 1 ? '' : 's' }} seleccionado{{ tempSelectedItems.length === 1 ? '' : 's' }}</h3>
|
|
364
|
-
</ion-label>
|
|
365
|
-
</ion-item>
|
|
366
|
-
<ion-list>
|
|
367
|
-
<ion-item *ngFor="let item of filteredItems" button (click)="selectItem(item)" detail="false">
|
|
368
|
-
<ion-checkbox
|
|
369
|
-
[checked]="isItemSelected(item)"
|
|
370
|
-
slot="start"
|
|
371
|
-
[disabled]="true"
|
|
372
|
-
></ion-checkbox>
|
|
373
|
-
<ion-label>{{ item[labelProperty] }}</ion-label>
|
|
374
|
-
</ion-item>
|
|
375
|
-
<ion-item *ngIf="filteredItems.length === 0" lines="none">
|
|
376
|
-
<ion-label color="dark">No se encontraron resultados</ion-label>
|
|
377
|
-
</ion-item>
|
|
378
|
-
</ion-list>
|
|
379
|
-
</ion-content>
|
|
380
|
-
<ion-footer *ngIf="tempSelectedItems.length > 0">
|
|
381
|
-
<ion-toolbar>
|
|
382
|
-
<ion-buttons slot="end">
|
|
383
|
-
<ion-button (click)="clearSelection()">Limpiar</ion-button>
|
|
384
|
-
<ion-button fill="solid" (click)="applySelection()">Aplicar ({{ tempSelectedItems.length }})</ion-button>
|
|
385
|
-
</ion-buttons>
|
|
386
|
-
</ion-toolbar>
|
|
387
|
-
</ion-footer>
|
|
388
|
-
</ng-template>
|
|
389
|
-
</ion-modal>
|
|
390
|
-
`, styles: ["ion-header{padding:8px 8px 0}\n"] }]
|
|
391
|
-
}], ctorParameters: () => [], propDecorators: { modal: [{
|
|
392
|
-
type: ViewChild,
|
|
393
|
-
args: ['modal']
|
|
394
|
-
}], label: [{
|
|
395
|
-
type: Input
|
|
396
|
-
}], labelProperty: [{
|
|
397
|
-
type: Input
|
|
398
|
-
}], valueProperty: [{
|
|
399
|
-
type: Input
|
|
400
|
-
}], placeholder: [{
|
|
401
|
-
type: Input
|
|
402
|
-
}], props: [{
|
|
403
|
-
type: Input
|
|
404
|
-
}] } });
|
|
405
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tdWx0aS1zZWxlY3Qtc2VhcmNoL211bHRpLXNlbGVjdC1zZWFyY2guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUlMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRXZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7O0FBMkV0RSxNQUFNLE9BQU8sMEJBQTBCO0lBdUJyQztRQW5CUyxrQkFBYSxHQUFXLE1BQU0sQ0FBQztRQUMvQixrQkFBYSxHQUFXLElBQUksQ0FBQztRQUk5QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7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Q2xDLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7K0dBcFNVLDBCQUEwQjttR0FBMUIsMEJBQTBCLGdWQXJFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTREVCx3R0E3RFMsWUFBWSwrUEFBRSxXQUFXLHc4RUFBRSxXQUFXLHVJQUFFLGtCQUFrQixvSUFBRSxtQkFBbUI7OzRGQXNFOUUsMEJBQTBCO2tCQXpFdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsWUFDaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTREVDt3REFVbUIsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPO2dCQUVULEtBQUs7c0JBQWIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlLCBJb25Nb2RhbCB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pY29ucy5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvZm9ybS1kZWZhdWx0cyc7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3RleHQnO1xuaW1wb3J0IHsgSW5wdXRNZXRhZGF0YSwgSW5wdXRPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBTZWFyY2hiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hiYXIvc2VhcmNoYmFyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1tdWx0aS1zZWxlY3Qtc2VhcmNoJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uaWNNb2R1bGUsIEZvcm1zTW9kdWxlLCBTZWFyY2hiYXJDb21wb25lbnQsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taW5wdXRcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInByb3BzPy5wbGFjZWhvbGRlciB8fCBwbGFjZWhvbGRlclwiXG4gICAgICByZWFkb25seVxuICAgICAgKG1vdXNlZG93bik9XCJwcmV2ZW50RGVmYXVsdEJlaGF2aW9yKCRldmVudClcIlxuICAgIC8+XG5cbiAgICA8aW9uLWlucHV0IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlO1wiIFtmb3JtQ29udHJvbF09XCJwcm9wcy5jb250cm9sXCIgdHlwZT1cImhpZGRlblwiPjwvaW9uLWlucHV0PlxuXG4gICAgPGlvbi1tb2RhbFxuICAgICAgI21vZGFsXG4gICAgICBbaW5pdGlhbEJyZWFrcG9pbnRdPVwiMVwiXG4gICAgICBbYnJlYWtwb2ludHNdPVwiWzAsIDAuNSwgMC43NSwgMV1cIlxuICAgICAgKGRpZERpc21pc3MpPVwiY2FuY2VsTW9kYWwoKVwiXG4gICAgPlxuICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICA8aW9uLWhlYWRlcj5cbiAgICAgICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgICAgICA8aW9uLXRpdGxlPnt7IGxhYmVsIH19PC9pb24tdGl0bGU+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2FuY2VsTW9kYWwoKVwiPkNlcnJhcjwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICAgICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgICAgICA8dmFsLXNlYXJjaGJhciAoZmlsdGVyRXZlbnQpPVwib25GaWx0ZXIoJGV2ZW50KVwiIChmb2N1c0V2ZW50KT1cIm9uRm9jdXMoKVwiIChibHVyRXZlbnQpPVwib25CbHVyKClcIiAvPlxuICAgICAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgICAgIDwvaW9uLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jb250ZW50PlxuICAgICAgICAgIDxpb24taXRlbSAqbmdJZj1cInRlbXBTZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDBcIiBsaW5lcz1cIm5vbmVcIiBjb2xvcj1cImxpZ2h0XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZWNrbWFyay1jaXJjbGUtb3V0bGluZVwiIHNsb3Q9XCJzdGFydFwiIGNvbG9yPVwic3VjY2Vzc1wiPjwvaW9uLWljb24+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8aDM+e3sgdGVtcFNlbGVjdGVkSXRlbXMubGVuZ3RoIH19IGl0ZW17eyB0ZW1wU2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJyB9fSBzZWxlY2Npb25hZG97eyB0ZW1wU2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJyB9fTwvaDM+XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgIDxpb24tbGlzdD5cbiAgICAgICAgICAgIDxpb24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zXCIgYnV0dG9uIChjbGljayk9XCJzZWxlY3RJdGVtKGl0ZW0pXCIgZGV0YWlsPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGlvbi1jaGVja2JveCBcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiIFxuICAgICAgICAgICAgICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICA+PC9pb24tY2hlY2tib3g+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgaXRlbVtsYWJlbFByb3BlcnR5XSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgIDxpb24taXRlbSAqbmdJZj1cImZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwXCIgbGluZXM9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYXJrXCI+Tm8gc2UgZW5jb250cmFyb24gcmVzdWx0YWRvczwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgICA8L2lvbi1jb250ZW50PlxuICAgICAgICA8aW9uLWZvb3RlciAqbmdJZj1cInRlbXBTZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2xlYXJTZWxlY3Rpb24oKVwiPkxpbXBpYXI8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIChjbGljayk9XCJhcHBseVNlbGVjdGlvbigpXCI+QXBsaWNhciAoe3sgdGVtcFNlbGVjdGVkSXRlbXMubGVuZ3RoIH19KTwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICAgICAgPC9pb24tZm9vdGVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2lvbi1tb2RhbD5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgaW9uLWhlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDhweCA4cHggMHB4IDhweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aVNlbGVjdFNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnbW9kYWwnKSBtb2RhbCE6IElvbk1vZGFsO1xuXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxhYmVsUHJvcGVydHk6IHN0cmluZyA9ICduYW1lJztcbiAgQElucHV0KCkgdmFsdWVQcm9wZXJ0eTogc3RyaW5nID0gJ2lkJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgcHJvcHM6IElucHV0TWV0YWRhdGE7XG5cbiAgcHJpdmF0ZSBsYW5nU2VydmljZSA9IGluamVjdChMYW5nU2VydmljZSk7XG4gIGljb24gPSBpbmplY3QoSWNvblNlcnZpY2UpO1xuICBwcml2YXRlIGNoYW5nZURldGVjdG9yID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJztcbiAgZmlsdGVyZWRJdGVtczogSW5wdXRPcHRpb25bXSA9IFtdO1xuICBzZWxlY3RlZEl0ZW1zOiBJbnB1dE9wdGlvbltdID0gW107XG4gIHRlbXBTZWxlY3RlZEl0ZW1zOiBJbnB1dE9wdGlvbltdID0gW107XG4gIGRpc3BsYXlWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBwcmV2aW91c09wdGlvbnM6IGFueVtdID0gW107XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nQ2hhbmdlcyA9IGZhbHNlO1xuICBwcml2YXRlIHZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxhYmVsID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ3NlbGVjdE11bHRpcGxlJywgJ1NlbGVjY2lvbmFyIG3Dumx0aXBsZXMnKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ3NlbGVjdE9wdGlvbnMnLCAnU2VsZWNjaW9uZSBvcGNpb25lcycpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hcHBseURlZmF1bHRWYWx1ZSgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jQ29udHJvbFZhbHVlV2l0aFNlbGVjdGVkSXRlbXMoKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9WYWx1ZUNoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNQcm9jZXNzaW5nQ2hhbmdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZ0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcz8ub3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnNDaGFuZ2VkID0gIXRoaXMuYXJlT3B0aW9uc0VxdWFsKHRoaXMucHJldmlvdXNPcHRpb25zLCB0aGlzLnByb3BzLm9wdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzT3B0aW9ucyA9IFsuLi50aGlzLnByb3BzLm9wdGlvbnNdO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplSXRlbXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN5bmNDb250cm9sVmFsdWVXaXRoU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvVmFsdWVDaGFuZ2VzKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZ0NoYW5nZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpb25WaWV3V2lsbEVudGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZ0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUl0ZW1zKCk7XG4gICAgICB0aGlzLnN5bmNDb250cm9sVmFsdWVXaXRoU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlVG9WYWx1ZUNoYW5nZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdDaGFuZ2VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1ZhbHVlQ2hhbmdlcygpIHtcbiAgICBpZiAoIXRoaXMucHJvcHM/LmNvbnRyb2wpIHJldHVybjtcblxuICAgIHRoaXMudmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy5wcm9wcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNQcm9jZXNzaW5nQ2hhbmdlcykgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZ0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmNDb250cm9sVmFsdWVXaXRoU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFyZU9wdGlvbnNFcXVhbChwcmV2T3B0aW9uczogYW55W10sIG5ld09wdGlvbnM6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKHByZXZPcHRpb25zID09PSBuZXdPcHRpb25zKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXByZXZPcHRpb25zIHx8ICFuZXdPcHRpb25zKSByZXR1cm4gcHJldk9wdGlvbnMgPT09IG5ld09wdGlvbnM7XG4gICAgaWYgKHByZXZPcHRpb25zLmxlbmd0aCAhPT0gbmV3T3B0aW9ucy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZPcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJldk9wdGlvbnNbaV1bdGhpcy52YWx1ZVByb3BlcnR5XSAhPT0gbmV3T3B0aW9uc1tpXVt0aGlzLnZhbHVlUHJvcGVydHldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLnByb3BzPy5vcHRpb25zIHx8IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udHJvbFZhbHVlV2l0aFNlbGVjdGVkSXRlbXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb3BzPy5jb250cm9sKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLnByb3BzLmNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFjb250cm9sVmFsdWUgfHwgY29udHJvbFZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgYW5kIHN0cmluZyBmb3JtYXRzXG4gICAgbGV0IHZhbHVlQXJyYXk6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFZhbHVlKSkge1xuICAgICAgdmFsdWVBcnJheSA9IGNvbnRyb2xWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250cm9sVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZUFycmF5ID0gY29udHJvbFZhbHVlLnNwbGl0KCcsJykuZmlsdGVyKHYgPT4gdi50cmltKCkgIT09ICcnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vcHRpb25zICYmIHRoaXMucHJvcHMub3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKHRoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFtvcHRbdGhpcy52YWx1ZVByb3BlcnR5XSwgb3B0XSkpO1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdmFsdWVBcnJheVxuICAgICAgICAubWFwKHZhbHVlID0+IG1hcC5nZXQodmFsdWUudG9TdHJpbmcoKS50cmltKCkpKVxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRWYWx1ZSgpOiB2b2lkIHtcbiAgICBhcHBseURlZmF1bHRWYWx1ZVRvQ29udHJvbCh0aGlzLnByb3BzKTtcbiAgfVxuXG4gIG9uRmlsdGVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMucHJvcHM/Lm9wdGlvbnMgPyBbLi4udGhpcy5wcm9wcy5vcHRpb25zXSA6IFtdO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByb3BzPy5vcHRpb25zIHx8IHRoaXMucHJvcHMub3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoID0gcmVwbGFjZVNwZWNpYWxDaGFycyhldmVudC50b0xvd2VyQ2FzZSgpKTtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLnByb3BzLm9wdGlvbnMuZmlsdGVyKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSBlbGVtZW50W3RoaXMubGFiZWxQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhlbGVtZW50W3RoaXMubGFiZWxQcm9wZXJ0eV0pLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnRbdGhpcy52YWx1ZVByb3BlcnR5XVxuICAgICAgICA/IHJlcGxhY2VTcGVjaWFsQ2hhcnMoU3RyaW5nKGVsZW1lbnRbdGhpcy52YWx1ZVByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIHJldHVybiBsYWJlbC5pbmNsdWRlcyhzZWFyY2gpIHx8IHZhbHVlLmluY2x1ZGVzKHNlYXJjaCk7XG4gICAgfSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkZvY3VzKCkge1xuICAgIGNvbnNvbGUubG9nKCdvbkZvY3VzJyk7XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgY29uc29sZS5sb2coJ29uQmx1cicpO1xuICB9XG5cbiAgb3Blbk1vZGFsKCkge1xuICAgIHRoaXMuc3luY0NvbnRyb2xWYWx1ZVdpdGhTZWxlY3RlZEl0ZW1zKCk7XG4gICAgdGhpcy50ZW1wU2VsZWN0ZWRJdGVtcyA9IFsuLi50aGlzLnNlbGVjdGVkSXRlbXNdO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gICAgaWYgKHRoaXMubW9kYWwpIHtcbiAgICAgIHRoaXMubW9kYWwucHJlc2VudCgpO1xuICAgIH1cbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0QmVoYXZpb3IoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMub3Blbk1vZGFsKCk7XG4gIH1cblxuICBjYW5jZWxNb2RhbCgpIHtcbiAgICAvLyBSZXNldCBmaWx0ZXIgYW5kIHNob3cgYWxsIG9wdGlvbnMgd2hlbiBjbG9zaW5nIG1vZGFsXG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5wcm9wcz8ub3B0aW9ucyA/IFsuLi50aGlzLnByb3BzLm9wdGlvbnNdIDogW107XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgaWYgKHRoaXMubW9kYWwpIHtcbiAgICAgIHRoaXMubW9kYWwuZGlzbWlzcygpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEl0ZW0oaXRlbTogYW55KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRlbXBTZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChcbiAgICAgIHNlbGVjdGVkSXRlbSA9PiBzZWxlY3RlZEl0ZW1bdGhpcy52YWx1ZVByb3BlcnR5XSA9PT0gaXRlbVt0aGlzLnZhbHVlUHJvcGVydHldXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHRoaXMudGVtcFNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wU2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGlzSXRlbVNlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBTZWxlY3RlZEl0ZW1zLnNvbWUoXG4gICAgICBzZWxlY3RlZEl0ZW0gPT4gc2VsZWN0ZWRJdGVtW3RoaXMudmFsdWVQcm9wZXJ0eV0gPT09IGl0ZW1bdGhpcy52YWx1ZVByb3BlcnR5XVxuICAgICk7XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICB0aGlzLnRlbXBTZWxlY3RlZEl0ZW1zID0gW107XG4gIH1cblxuICBhcHBseVNlbGVjdGlvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy50ZW1wU2VsZWN0ZWRJdGVtc107XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICB0aGlzLmFwcGx5Q2hhbmdlcygpO1xuICAgIHRoaXMuY2FuY2VsTW9kYWwoKTtcbiAgfVxuXG4gIHVwZGF0ZURpc3BsYXlWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlbXNbMF1bdGhpcy5sYWJlbFByb3BlcnR5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBgJHt0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RofSBlbGVtZW50b3Mgc2VsZWNjaW9uYWRvc2A7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlDaGFuZ2VzKCkge1xuICAgIGlmICghdGhpcy5wcm9wcz8uY29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZ0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMubWFwKGl0ZW0gPT4gaXRlbVt0aGlzLnZhbHVlUHJvcGVydHldKTtcbiAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdmFsdWVzLmpvaW4oJywnKTtcbiAgICAgIHRoaXMucHJvcHMuY29udHJvbC5zZXRWYWx1ZShzdHJpbmdWYWx1ZSk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMucHJvcHMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgXG4gICAgICAvLyBEZWJ1ZyB2YWxpZGF0b3JzIGlmIHN0aWxsIGhhdmluZyBpc3N1ZXNcbiAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvbnRyb2wgaXMgaW52YWxpZCBhZnRlciBzZXRWYWx1ZTonLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMucHJvcHMuY29udHJvbC52YWx1ZSxcbiAgICAgICAgICBlcnJvcnM6IHRoaXMucHJvcHMuY29udHJvbC5lcnJvcnMsXG4gICAgICAgICAgdmFsaWRhdG9yczogdGhpcy5wcm9wcy5jb250cm9sLnZhbGlkYXRvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmdDaGFuZ2VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICBpZiAodGhpcy5wcm9wcz8uY29udHJvbCkge1xuICAgICAgdGhpcy5wcm9wcy5jb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbn0iXX0=
|