@ethlete/cdk 3.3.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +4 -4
- package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +37 -7
- package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +33 -470
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +466 -8
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/index.mjs +2 -0
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +2 -2
- package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +2 -2
- package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-option/selection-list-option.directive.mjs +1 -2
- package/fesm2022/ethlete-cdk.mjs +243 -197
- package/fesm2022/ethlete-cdk.mjs.map +1 -1
- package/lib/components/button/components/query-button/query-button.component.d.ts +1 -1
- package/lib/components/button/directives/query-button/query-button.directive.d.ts +13 -1
- package/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.d.ts +7 -71
- package/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.d.ts +76 -4
- package/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/index.d.ts +1 -0
- package/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.d.ts +1 -1
- package/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.d.ts +1 -1
- package/package.json +2 -2
|
@@ -1,487 +1,50 @@
|
|
|
1
|
-
import { A, ENTER, ESCAPE, TAB } from '@angular/cdk/keycodes';
|
|
2
1
|
import { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, Component,
|
|
4
|
-
import {
|
|
5
|
-
import { BehaviorSubject, catchError, combineLatest, debounceTime, distinctUntilChanged, filter, map, skip, skipWhile, take, takeUntil, tap, throwError, } from 'rxjs';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';
|
|
3
|
+
import { AnimatedOverlayDirective, LetDirective } from '@ethlete/core';
|
|
6
4
|
import { ChevronIconComponent } from '../../../../../../../icons';
|
|
7
|
-
import {
|
|
5
|
+
import { InputDirective, NativeInputRefDirective } from '../../../../../../directives';
|
|
8
6
|
import { DecoratedInputBase } from '../../../../../../utils';
|
|
9
|
-
import {
|
|
10
|
-
import { COMBOBOX_OPTION_TEMPLATE_TOKEN, COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN } from '../../directives';
|
|
7
|
+
import { COMBOBOX_TOKEN, ComboboxDirective } from '../../directives';
|
|
11
8
|
import { ComboboxBodyComponent } from '../../partials';
|
|
12
|
-
import { isOptionDisabled } from '../../utils';
|
|
13
9
|
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "
|
|
15
|
-
import * as i2 from "
|
|
16
|
-
|
|
17
|
-
1: 'Expected options to be an array of objects. This is due to "bindLabel" and "bindValue" being set.',
|
|
18
|
-
2: 'Expected options to be an array of primitives. This is due to "bindLabel" and "bindValue" not being set or "allowCustomValues" being set to true.',
|
|
19
|
-
};
|
|
20
|
-
const comboboxError = (code, data) => {
|
|
21
|
-
const message = `<et-combobox>: ${COMBOBOX_ERRORS[code]}`;
|
|
22
|
-
throw new RuntimeError(code, message, data);
|
|
23
|
-
};
|
|
24
|
-
const isPrimitiveArray = (value) => {
|
|
25
|
-
if (!Array.isArray(value))
|
|
26
|
-
return false;
|
|
27
|
-
const first = value[0];
|
|
28
|
-
const last = value[value.length - 1];
|
|
29
|
-
if (!first || !last)
|
|
30
|
-
return false;
|
|
31
|
-
return typeof first !== 'object' && typeof last !== 'object';
|
|
32
|
-
};
|
|
33
|
-
const isObjectArray = (value) => {
|
|
34
|
-
if (!Array.isArray(value))
|
|
35
|
-
return false;
|
|
36
|
-
const first = value[0];
|
|
37
|
-
const last = value[value.length - 1];
|
|
38
|
-
if (!first || !last)
|
|
39
|
-
return false;
|
|
40
|
-
return typeof first === 'object' && typeof last === 'object';
|
|
41
|
-
};
|
|
42
|
-
const isEmptyArray = (value) => {
|
|
43
|
-
return Array.isArray(value) && value.length === 0;
|
|
44
|
-
};
|
|
45
|
-
const ComboboxOptionType = {
|
|
46
|
-
Primitive: 'primitive',
|
|
47
|
-
Object: 'object',
|
|
48
|
-
};
|
|
49
|
-
export const COMBOBOX_TOKEN = new InjectionToken('ET_COMBOBOX_TOKEN');
|
|
10
|
+
import * as i1 from "@ethlete/core";
|
|
11
|
+
import * as i2 from "../../../../../../directives/input/input.directive";
|
|
12
|
+
import * as i3 from "../../directives/combobox/combobox.directive";
|
|
50
13
|
export class ComboboxComponent extends DecoratedInputBase {
|
|
51
|
-
//#endregion
|
|
52
|
-
//#region Inputs
|
|
53
|
-
get options() {
|
|
54
|
-
return this._selectionModel.getFilteredOptions();
|
|
55
|
-
}
|
|
56
|
-
set options(value) {
|
|
57
|
-
this._selectionModel.setOptions(value);
|
|
58
|
-
}
|
|
59
|
-
set initialValue(value) {
|
|
60
|
-
this._selectionModel.setSelection(value);
|
|
61
|
-
}
|
|
62
|
-
get filterInternal() {
|
|
63
|
-
return this._filterInternal$.value;
|
|
64
|
-
}
|
|
65
|
-
set filterInternal(value) {
|
|
66
|
-
const val = booleanAttribute(value);
|
|
67
|
-
this._filterInternal$.next(val);
|
|
68
|
-
if (!val) {
|
|
69
|
-
this._selectionModel.setFilter('');
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
this._selectionModel.setFilter(this._currentFilter);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
get loading() {
|
|
76
|
-
return this._loading$.value;
|
|
77
|
-
}
|
|
78
|
-
set loading(value) {
|
|
79
|
-
this._loading$.next(booleanAttribute(value));
|
|
80
|
-
}
|
|
81
|
-
get error() {
|
|
82
|
-
return this._error$.value;
|
|
83
|
-
}
|
|
84
|
-
set error(value) {
|
|
85
|
-
this._error$.next(value);
|
|
86
|
-
}
|
|
87
|
-
get placeholder() {
|
|
88
|
-
return this._placeholder$.value;
|
|
89
|
-
}
|
|
90
|
-
set placeholder(value) {
|
|
91
|
-
this._placeholder$.next(value);
|
|
92
|
-
}
|
|
93
|
-
set multiple(value) {
|
|
94
|
-
this._selectionModel.setAllowMultiple(booleanAttribute(value));
|
|
95
|
-
}
|
|
96
|
-
set bindLabel(value) {
|
|
97
|
-
this._selectionModel.setLabelBinding(value);
|
|
98
|
-
}
|
|
99
|
-
set bindValue(value) {
|
|
100
|
-
this._selectionModel.setValueBinding(value);
|
|
101
|
-
}
|
|
102
|
-
get allowCustomValues() {
|
|
103
|
-
return this._allowCustomValues$.value;
|
|
104
|
-
}
|
|
105
|
-
set allowCustomValues(value) {
|
|
106
|
-
this._allowCustomValues$.next(booleanAttribute(value));
|
|
107
|
-
}
|
|
108
|
-
//#endregion
|
|
109
|
-
//#region Members
|
|
110
|
-
get _currentFilter() {
|
|
111
|
-
return this._currentFilter$.value;
|
|
112
|
-
}
|
|
113
|
-
get _isOpen() {
|
|
114
|
-
return this._animatedOverlay.isMounted;
|
|
115
|
-
}
|
|
116
|
-
set optionTemplate(value) {
|
|
117
|
-
this._optionTemplate$.next(value ?? null);
|
|
118
|
-
}
|
|
119
|
-
set selectedOptionTemplate(value) {
|
|
120
|
-
this._selectedOptionTemplate$.next(value ?? null);
|
|
121
|
-
}
|
|
122
|
-
//#endregion
|
|
123
|
-
//#region Lifecycle
|
|
124
14
|
constructor() {
|
|
125
15
|
super();
|
|
126
|
-
|
|
127
|
-
this.
|
|
128
|
-
this._animatedOverlay = inject(AnimatedOverlayDirective);
|
|
129
|
-
this._selectField = inject(SELECT_FIELD_TOKEN);
|
|
130
|
-
this._filterInternal$ = new BehaviorSubject(false);
|
|
131
|
-
this._loading$ = new BehaviorSubject(false);
|
|
132
|
-
this.loading$ = this._loading$.asObservable();
|
|
133
|
-
this._error$ = new BehaviorSubject(null);
|
|
134
|
-
this.emptyText = 'No results found';
|
|
135
|
-
this._placeholder$ = new BehaviorSubject(null);
|
|
136
|
-
this._allowCustomValues$ = new BehaviorSubject(false);
|
|
137
|
-
//#endregion
|
|
138
|
-
//#region Outputs
|
|
139
|
-
this.filterChange = new EventEmitter();
|
|
140
|
-
this._currentFilter$ = new BehaviorSubject('');
|
|
141
|
-
this._isOpen$ = this._animatedOverlay.isMounted$;
|
|
142
|
-
this._selectionModel = new SelectionModel();
|
|
143
|
-
this._activeSelectionModel = new ActiveSelectionModel();
|
|
144
|
-
this.selectedOptions$ = this._selectionModel.selection$;
|
|
145
|
-
this.multiple$ = this._selectionModel.allowMultiple$;
|
|
146
|
-
this.options$ = this._selectionModel.filteredOptions$;
|
|
147
|
-
this.rawOptions$ = this._selectionModel.options$;
|
|
148
|
-
this._optionTemplate$ = new BehaviorSubject(null);
|
|
149
|
-
this._selectedOptionTemplate$ = new BehaviorSubject(null);
|
|
150
|
-
//#endregion
|
|
151
|
-
//#region Computes
|
|
152
|
-
this.customOptionTpl$ = this._optionTemplate$.asObservable();
|
|
153
|
-
this.customSelectedOptionTpl$ = this._selectedOptionTemplate$.asObservable();
|
|
154
|
-
this._activeSelectionModel.setSelectionModel(this._selectionModel);
|
|
155
|
-
this._animatedOverlay.placement = 'bottom';
|
|
156
|
-
this._animatedOverlay.fallbackPlacements = ['bottom', 'top'];
|
|
157
|
-
this._animatedOverlay.autoResize = true;
|
|
158
|
-
this._bindings.push({
|
|
159
|
-
attribute: 'class.et-combobox--loading',
|
|
160
|
-
observable: this._loading$,
|
|
161
|
-
});
|
|
162
|
-
this._bindings.push({
|
|
163
|
-
attribute: 'class.et-combobox--error',
|
|
164
|
-
observable: this._error$.pipe(map((v) => !!v)),
|
|
165
|
-
});
|
|
166
|
-
this._bindings.push({
|
|
167
|
-
attribute: 'class.et-combobox--open',
|
|
168
|
-
observable: this._isOpen$,
|
|
169
|
-
});
|
|
170
|
-
this._selectField._bindings.push({
|
|
171
|
-
attribute: 'class.et-select-field--multiple',
|
|
172
|
-
observable: this.multiple$,
|
|
173
|
-
});
|
|
174
|
-
this._selectField._bindings.push({
|
|
175
|
-
attribute: 'class.et-select-field--open',
|
|
176
|
-
observable: this._isOpen$,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
ngOnInit() {
|
|
180
|
-
this._initDispatchFilterChanges();
|
|
181
|
-
if (isDevMode()) {
|
|
182
|
-
this._debugValidateComboboxConfig();
|
|
183
|
-
}
|
|
184
|
-
this._selectionModel.value$
|
|
185
|
-
.pipe(takeUntil(this._destroy$), tap((value) => {
|
|
186
|
-
this._input._updateValue(value);
|
|
187
|
-
this._setFilterFromInputValue();
|
|
188
|
-
}))
|
|
189
|
-
.subscribe();
|
|
190
|
-
this.input.nativeInputRef$
|
|
191
|
-
.pipe(takeUntil(this._destroy$), debounceTime(0), filter((ref) => !!ref?.element.nativeElement), tap(() => this._updateFilter(this._currentFilter)), take(1))
|
|
192
|
-
.subscribe();
|
|
193
|
-
}
|
|
194
|
-
//#endregion
|
|
195
|
-
//#region Public Methods
|
|
196
|
-
getOptionLabel(option) {
|
|
197
|
-
return this._selectionModel.getLabel$(option);
|
|
198
|
-
}
|
|
199
|
-
getOptionValue(option) {
|
|
200
|
-
return this._selectionModel.getValue$(option);
|
|
201
|
-
}
|
|
202
|
-
removeSelectedOption(option) {
|
|
203
|
-
this._selectionModel.removeSelectedOption(option);
|
|
204
|
-
this.input._markAsTouched();
|
|
205
|
-
}
|
|
206
|
-
open() {
|
|
207
|
-
// if (!this._selectBodyConfig) return;
|
|
208
|
-
if (this._isOpen || this.input.disabled || this._animatedOverlay.isMounting)
|
|
209
|
-
return;
|
|
210
|
-
// this._setSelectedOptionActive();
|
|
211
|
-
const instance = this._animatedOverlay.mount({
|
|
212
|
-
component: ComboboxBodyComponent,
|
|
213
|
-
mirrorWidth: true,
|
|
214
|
-
// data: { _bodyTemplate: this._selectBodyConfig.template },
|
|
215
|
-
});
|
|
216
|
-
if (!instance)
|
|
217
|
-
return;
|
|
218
|
-
// this._selectBodyId$.next(instance.selectBody.id);
|
|
219
|
-
}
|
|
220
|
-
close() {
|
|
221
|
-
if (!this._isOpen || this._animatedOverlay.isUnmounting)
|
|
222
|
-
return;
|
|
223
|
-
this._animatedOverlay.unmount();
|
|
224
|
-
// this._selectBodyId$.next(null);
|
|
225
|
-
}
|
|
226
|
-
selectInputAndOpen() {
|
|
227
|
-
if (this.input.disabled)
|
|
228
|
-
return;
|
|
229
|
-
this.input.nativeInputRef?.element.nativeElement.select();
|
|
230
|
-
this.open();
|
|
231
|
-
}
|
|
232
|
-
writeValueFromOption(option) {
|
|
233
|
-
this.input._markAsTouched();
|
|
234
|
-
if (this._selectionModel.allowMultiple) {
|
|
235
|
-
this._selectionModel.toggleSelectedOption(option);
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
this._selectionModel.addSelectedOption(option);
|
|
239
|
-
}
|
|
240
|
-
if (!this._selectionModel.allowMultiple) {
|
|
241
|
-
this.close();
|
|
242
|
-
this._setFilterFromInputValue();
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
this._updateFilter('');
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
isOptionSelected(option) {
|
|
249
|
-
return this._selectionModel.isSelected$(option);
|
|
250
|
-
}
|
|
251
|
-
isOptionActive(option) {
|
|
252
|
-
return this._activeSelectionModel.activeOption$.pipe(map((activeOption) => activeOption === option));
|
|
253
|
-
}
|
|
254
|
-
//#endregion
|
|
255
|
-
//#region Protected Methods
|
|
256
|
-
processKeydownEvent(event) {
|
|
257
|
-
const keyCode = event.keyCode;
|
|
258
|
-
const isOpen = this._isOpen;
|
|
259
|
-
const isMultiple = this._selectionModel.allowMultiple;
|
|
260
|
-
const canAddCustomValue = this.allowCustomValues;
|
|
261
|
-
const value = event.target.value;
|
|
262
|
-
const hasFilterValue = !!value;
|
|
263
|
-
const result = {};
|
|
264
|
-
if (keyCode === ENTER) {
|
|
265
|
-
event.preventDefault();
|
|
266
|
-
event.stopPropagation();
|
|
267
|
-
// The user typed a custom value and pressed enter. Add it to the selected options.
|
|
268
|
-
// FIXME: Currently it is impossible to select the active option with the keyboard if canAddCustomValue is true.
|
|
269
|
-
// To fix this, the active option should also include the origin it got active from (keyboard or programmatic).
|
|
270
|
-
// The "value" changing should put the combobox into a "use the custom input on enter" mode.
|
|
271
|
-
// The "active option" changing via keyboard should put the combobox into a "use the active option on enter" mode.
|
|
272
|
-
if (canAddCustomValue && hasFilterValue) {
|
|
273
|
-
result.optionAction = { type: 'add', option: value };
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
const activeOption = this._activeSelectionModel.activeOption;
|
|
277
|
-
if (activeOption) {
|
|
278
|
-
if (isMultiple) {
|
|
279
|
-
result.optionAction = { type: 'toggle', option: activeOption };
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
result.optionAction = { type: 'add', option: activeOption };
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (isMultiple) {
|
|
287
|
-
result.setFilter = '';
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
result.overlayOperation = 'close';
|
|
291
|
-
}
|
|
292
|
-
return this._interpretKeyHandlerResult(result);
|
|
293
|
-
}
|
|
294
|
-
if (keyCode === ESCAPE) {
|
|
295
|
-
if (isOpen) {
|
|
296
|
-
result.overlayOperation = 'close';
|
|
297
|
-
}
|
|
298
|
-
else if (!isMultiple) {
|
|
299
|
-
result.setFilter = '';
|
|
300
|
-
result.optionAction = 'clear';
|
|
301
|
-
}
|
|
302
|
-
return this._interpretKeyHandlerResult(result);
|
|
303
|
-
}
|
|
304
|
-
if (keyCode === TAB) {
|
|
305
|
-
result.overlayOperation = 'close';
|
|
306
|
-
return this._interpretKeyHandlerResult(result);
|
|
307
|
-
}
|
|
308
|
-
if (!isOpen) {
|
|
309
|
-
result.overlayOperation = 'open';
|
|
310
|
-
}
|
|
311
|
-
this._activeSelectionModel.evaluateKeyboardEvent(event);
|
|
312
|
-
if (keyCode === A && event.ctrlKey && isMultiple) {
|
|
313
|
-
result.optionAction = 'toggleAll';
|
|
314
|
-
event.preventDefault();
|
|
315
|
-
}
|
|
316
|
-
return this._interpretKeyHandlerResult(result);
|
|
317
|
-
}
|
|
318
|
-
processInputEvent(event) {
|
|
319
|
-
const value = event.target.value;
|
|
320
|
-
this._updateFilter(value);
|
|
321
|
-
}
|
|
322
|
-
handleBlurEvent() {
|
|
323
|
-
this.input._markAsTouched();
|
|
324
|
-
this.input._setShouldDisplayError(true);
|
|
325
|
-
if (this._selectionModel.allowMultiple) {
|
|
326
|
-
this._updateFilter('');
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
if (this._currentFilter === '') {
|
|
330
|
-
this._selectionModel.clearSelectedOptions();
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
this._setFilterFromInputValue();
|
|
334
|
-
}
|
|
335
|
-
//#endregion
|
|
336
|
-
//#region Private Methods
|
|
337
|
-
_initDispatchFilterChanges() {
|
|
338
|
-
this._currentFilter$
|
|
339
|
-
.pipe(skipWhile(() => this.filterInternal), debounceTime(300), distinctUntilChanged(), takeUntil(this._destroy$), tap((v) => this.filterChange.emit(v)))
|
|
340
|
-
.subscribe();
|
|
341
|
-
}
|
|
342
|
-
_updateFilter(value) {
|
|
343
|
-
if (this.input.nativeInputRef && this.input.nativeInputRef.element.nativeElement.value !== value) {
|
|
344
|
-
this.input.nativeInputRef.element.nativeElement.value = value;
|
|
345
|
-
}
|
|
346
|
-
if (this._currentFilter === value)
|
|
347
|
-
return;
|
|
348
|
-
this._currentFilter$.next(value);
|
|
349
|
-
if (this.filterInternal) {
|
|
350
|
-
this._selectionModel.setFilter(value);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
_setFilterFromInputValue() {
|
|
354
|
-
if (this._selectionModel.allowMultiple)
|
|
355
|
-
return;
|
|
356
|
-
const value = this.input.value;
|
|
357
|
-
if (!value || Array.isArray(value)) {
|
|
358
|
-
this._updateFilter('');
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
const option = this._selectionModel.getOptionByValue(value);
|
|
362
|
-
if (!option)
|
|
363
|
-
return;
|
|
364
|
-
const label = this._selectionModel.getLabel(option);
|
|
365
|
-
if (typeof label !== 'string')
|
|
366
|
-
return;
|
|
367
|
-
this._updateFilter(label);
|
|
368
|
-
}
|
|
369
|
-
_interpretKeyHandlerResult(result) {
|
|
370
|
-
if (result.overlayOperation === 'close') {
|
|
371
|
-
this.close();
|
|
372
|
-
}
|
|
373
|
-
else if (result.overlayOperation === 'open') {
|
|
374
|
-
this.open();
|
|
375
|
-
}
|
|
376
|
-
if (result.setFilter !== undefined) {
|
|
377
|
-
this._updateFilter(result.setFilter);
|
|
378
|
-
}
|
|
379
|
-
if (result.optionAction) {
|
|
380
|
-
if (typeof result.optionAction === 'string') {
|
|
381
|
-
if (result.optionAction === 'clear') {
|
|
382
|
-
this._selectionModel.clearSelectedOptions();
|
|
383
|
-
}
|
|
384
|
-
else if (result.optionAction === 'toggleAll') {
|
|
385
|
-
this._selectionModel.toggleAllSelectedOptions();
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
else {
|
|
389
|
-
const { type, option } = result.optionAction;
|
|
390
|
-
if (isOptionDisabled(option))
|
|
391
|
-
return;
|
|
392
|
-
if (type === 'add') {
|
|
393
|
-
this._selectionModel.addSelectedOption(option);
|
|
394
|
-
}
|
|
395
|
-
if (type === 'remove') {
|
|
396
|
-
this._selectionModel.removeSelectedOption(option);
|
|
397
|
-
}
|
|
398
|
-
if (type === 'toggle') {
|
|
399
|
-
this._selectionModel.toggleSelectedOption(option);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
//#endregion
|
|
405
|
-
//#region Dev mode
|
|
406
|
-
_debugValidateComboboxConfig(isRetry = false) {
|
|
407
|
-
combineLatest([this._selectionModel.labelBinding$, this._selectionModel.valueBinding$, this._allowCustomValues$])
|
|
408
|
-
.pipe(skip(isRetry ? 1 : 0), // Skip if retrying to avoid infinite loop
|
|
409
|
-
debounceTime(0), takeUntil(this._destroy$), map(([bindLabel, bindValue, allowCustomValues]) => {
|
|
410
|
-
const shouldBeObjects = bindLabel && bindValue && !allowCustomValues;
|
|
411
|
-
if (shouldBeObjects) {
|
|
412
|
-
return ComboboxOptionType.Object;
|
|
413
|
-
}
|
|
414
|
-
return ComboboxOptionType.Primitive;
|
|
415
|
-
}), tap((expectedOptionType) => {
|
|
416
|
-
const options = this._selectionModel.options;
|
|
417
|
-
if (isEmptyArray(options)) {
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
if (expectedOptionType === ComboboxOptionType.Object) {
|
|
421
|
-
if (!isObjectArray(options)) {
|
|
422
|
-
throw comboboxError(1, options);
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
else if (expectedOptionType === ComboboxOptionType.Primitive) {
|
|
426
|
-
if (!isPrimitiveArray(options)) {
|
|
427
|
-
throw comboboxError(2, options);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}), catchError((e) => {
|
|
431
|
-
this._debugValidateComboboxConfig(true);
|
|
432
|
-
return throwError(() => e);
|
|
433
|
-
}))
|
|
434
|
-
.subscribe();
|
|
16
|
+
this.combobox = inject(COMBOBOX_TOKEN);
|
|
17
|
+
this.combobox.setBodyComponent(ComboboxBodyComponent);
|
|
435
18
|
}
|
|
436
19
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
437
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: ComboboxComponent, isStandalone: true, selector: "et-combobox",
|
|
438
|
-
{
|
|
439
|
-
provide: COMBOBOX_TOKEN,
|
|
440
|
-
useExisting: ComboboxComponent,
|
|
441
|
-
},
|
|
442
|
-
], queries: [{ propertyName: "optionTemplate", first: true, predicate: COMBOBOX_OPTION_TEMPLATE_TOKEN, descendants: true, read: TemplateRef }, { propertyName: "selectedOptionTemplate", first: true, predicate: COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, descendants: true, read: TemplateRef }], usesInheritance: true, hostDirectives: [{ directive: i1.InputDirective }, { directive: i2.AnimatedOverlayDirective }], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple$ | async\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n <ng-container\n *ngIf=\"customSelectedOptionTpl$ | async as customSelectedOptionTpl; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ getOptionLabel(item) | async }}\n </ng-template>\n\n <span\n (click)=\"removeSelectedOption(item); $event.stopPropagation()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </span>\n </li>\n <li class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </li>\n </ul>\n\n <ng-template #inputTpl>\n <input\n (keydown)=\"processKeydownEvent($event)\"\n (click)=\"open()\"\n (blur)=\"handleBlurEvent()\"\n (input)=\"processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
20
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: ComboboxComponent, isStandalone: true, selector: "et-combobox", host: { listeners: { "click": "combobox.selectInputAndOpen()" }, classAttribute: "et-combobox" }, usesInheritance: true, hostDirectives: [{ directive: i1.AnimatedOverlayDirective }, { directive: i2.InputDirective }, { directive: i3.ComboboxDirective, inputs: ["options", "options", "initialValue", "initialValue", "filterInternal", "filterInternal", "loading", "loading", "error", "error", "emptyText", "emptyText", "placeholder", "placeholder", "multiple", "multiple", "bindLabel", "bindLabel", "bindValue", "bindValue", "allowCustomValues", "allowCustomValues"], outputs: ["filterChange", "filterChange"] }], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"combobox.multiple$ | async\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of combobox.selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n <ng-container\n *ngIf=\"combobox.customSelectedOptionTpl$ | async as customSelectedOptionTpl; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ combobox.getOptionLabel(item) | async }}\n </ng-template>\n\n <span\n (click)=\"combobox.removeSelectedOption(item); $event.stopPropagation()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </span>\n </li>\n <li class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </li>\n </ul>\n\n <ng-template #inputTpl>\n <input\n (keydown)=\"combobox._processKeydownEvent($event)\"\n (click)=\"combobox.open()\"\n (blur)=\"combobox._handleBlurEvent()\"\n (input)=\"combobox._processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(combobox.multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NativeInputRefDirective, selector: "input[etNativeInputRef], textarea[etNativeInputRef], select[etNativeInputRef], button[etNativeInputRef]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
443
21
|
}
|
|
444
22
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ComboboxComponent, decorators: [{
|
|
445
23
|
type: Component,
|
|
446
24
|
args: [{ selector: 'et-combobox', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
447
25
|
class: 'et-combobox',
|
|
448
|
-
'(click)': 'selectInputAndOpen()',
|
|
449
|
-
}, imports: [NgIf, NativeInputRefDirective, AsyncPipe, ChevronIconComponent, LetDirective, NgFor, NgTemplateOutlet], hostDirectives: [
|
|
26
|
+
'(click)': 'combobox.selectInputAndOpen()',
|
|
27
|
+
}, imports: [NgIf, NativeInputRefDirective, AsyncPipe, ChevronIconComponent, LetDirective, NgFor, NgTemplateOutlet], hostDirectives: [
|
|
28
|
+
AnimatedOverlayDirective,
|
|
29
|
+
{ directive: InputDirective },
|
|
450
30
|
{
|
|
451
|
-
|
|
452
|
-
|
|
31
|
+
directive: ComboboxDirective,
|
|
32
|
+
inputs: [
|
|
33
|
+
'options',
|
|
34
|
+
'initialValue',
|
|
35
|
+
'filterInternal',
|
|
36
|
+
'loading',
|
|
37
|
+
'error',
|
|
38
|
+
'emptyText',
|
|
39
|
+
'placeholder',
|
|
40
|
+
'multiple',
|
|
41
|
+
'bindLabel',
|
|
42
|
+
'bindValue',
|
|
43
|
+
'allowCustomValues',
|
|
44
|
+
],
|
|
45
|
+
// eslint-disable-next-line @angular-eslint/no-outputs-metadata-property
|
|
46
|
+
outputs: ['filterChange'],
|
|
453
47
|
},
|
|
454
|
-
], template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"multiple$ | async\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n <ng-container\n *ngIf=\"customSelectedOptionTpl$ | async as customSelectedOptionTpl; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ getOptionLabel(item) | async }}\n </ng-template>\n\n <span\n (click)=\"removeSelectedOption(item); $event.stopPropagation()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </span>\n </li>\n <li class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </li>\n </ul>\n\n <ng-template #inputTpl>\n <input\n (keydown)=\"
|
|
455
|
-
}], ctorParameters: function () { return []; }
|
|
456
|
-
|
|
457
|
-
args: [{ required: true }]
|
|
458
|
-
}], initialValue: [{
|
|
459
|
-
type: Input
|
|
460
|
-
}], filterInternal: [{
|
|
461
|
-
type: Input
|
|
462
|
-
}], loading: [{
|
|
463
|
-
type: Input
|
|
464
|
-
}], error: [{
|
|
465
|
-
type: Input
|
|
466
|
-
}], emptyText: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}], placeholder: [{
|
|
469
|
-
type: Input
|
|
470
|
-
}], multiple: [{
|
|
471
|
-
type: Input
|
|
472
|
-
}], bindLabel: [{
|
|
473
|
-
type: Input
|
|
474
|
-
}], bindValue: [{
|
|
475
|
-
type: Input
|
|
476
|
-
}], allowCustomValues: [{
|
|
477
|
-
type: Input
|
|
478
|
-
}], filterChange: [{
|
|
479
|
-
type: Output
|
|
480
|
-
}], optionTemplate: [{
|
|
481
|
-
type: ContentChild,
|
|
482
|
-
args: [COMBOBOX_OPTION_TEMPLATE_TOKEN, { read: TemplateRef }]
|
|
483
|
-
}], selectedOptionTemplate: [{
|
|
484
|
-
type: ContentChild,
|
|
485
|
-
args: [COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, { read: TemplateRef }]
|
|
486
|
-
}] } });
|
|
487
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLGNBQWMsRUFDZCxLQUFLLEVBRUwsTUFBTSxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLFlBQVksRUFDWixjQUFjLEdBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxJQUFJLEVBQ0os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LEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQU8vRCxzQkFBc0I7c0JBRHpCLFlBQVk7dUJBQUMsdUNBQXVDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQSwgRU5URVIsIEVTQ0FQRSwgVEFCIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZlU2VsZWN0aW9uTW9kZWwsXG4gIEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZSxcbiAgTGV0RGlyZWN0aXZlLFxuICBSdW50aW1lRXJyb3IsXG4gIFNlbGVjdGlvbk1vZGVsLFxufSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHNraXAsXG4gIHNraXBXaGlsZSxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hldnJvbkljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi8uLi9pY29ucyc7XG5pbXBvcnQgeyBJTlBVVF9UT0tFTiwgSW5wdXREaXJlY3RpdmUsIE5hdGl2ZUlucHV0UmVmRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBEZWNvcmF0ZWRJbnB1dEJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBTRUxFQ1RfRklFTERfVE9LRU4gfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IENPTUJPQk9YX09QVElPTl9URU1QTEFURV9UT0tFTiwgQ09NQk9CT1hfU0VMRUNURURfT1BUSU9OX1RFTVBMQVRFX1RPS0VOIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBDb21ib2JveEJvZHlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYXJ0aWFscyc7XG5pbXBvcnQgeyBpc09wdGlvbkRpc2FibGVkIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5jb25zdCBDT01CT0JPWF9FUlJPUlMgPSB7XG4gIDE6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgYmVpbmcgc2V0LicsXG4gIDI6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgbm90IGJlaW5nIHNldCBvciBcImFsbG93Q3VzdG9tVmFsdWVzXCIgYmVpbmcgc2V0IHRvIHRydWUuJyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNvbWJvYm94RXJyb3IgPSAoY29kZToga2V5b2YgdHlwZW9mIENPTUJPQk9YX0VSUk9SUywgZGF0YTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gYDxldC1jb21ib2JveD46ICR7Q09NQk9CT1hfRVJST1JTW2NvZGVdfWA7XG5cbiAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihjb2RlLCBtZXNzYWdlLCBkYXRhKTtcbn07XG5cbmNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdCA9IHZhbHVlWzBdO1xuICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKCFmaXJzdCB8fCAhbGFzdCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0eXBlb2YgZmlyc3QgIT09ICdvYmplY3QnICYmIHR5cGVvZiBsYXN0ICE9PSAnb2JqZWN0Jztcbn07XG5cbmNvbnN0IGlzT2JqZWN0QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xuXG4gIGlmICghZmlyc3QgfHwgIWxhc3QpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCc7XG59O1xuXG5jb25zdCBpc0VtcHR5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBbXSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG59O1xuXG5jb25zdCBDb21ib2JveE9wdGlvblR5cGUgPSB7XG4gIFByaW1pdGl2ZTogJ3ByaW1pdGl2ZScsXG4gIE9iamVjdDogJ29iamVjdCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQ09NQk9CT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tYm9ib3hDb21wb25lbnQ+KCdFVF9DT01CT0JPWF9UT0tFTicpO1xuXG5pbnRlcmZhY2UgS2V5SGFuZGxlclJlc3VsdCB7XG4gIHNldEZpbHRlcj86IHN0cmluZztcbiAgb3ZlcmxheU9wZXJhdGlvbj86ICdvcGVuJyB8ICdjbG9zZSc7XG4gIG9wdGlvbkFjdGlvbj86XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdhZGQnO1xuICAgICAgICBvcHRpb246IHVua25vd247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZW1vdmUnO1xuICAgICAgICBvcHRpb246IHVua25vd247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd0b2dnbGUnO1xuICAgICAgICBvcHRpb246IHVua25vd247XG4gICAgICB9XG4gICAgfCAnY2xlYXInXG4gICAgfCAndG9nZ2xlQWxsJztcbn1cblxudHlwZSBUZW1wbGF0ZVJlZldpdGhPcHRpb24gPSBUZW1wbGF0ZVJlZjx7XG4gIG9wdGlvbjogdW5rbm93bjtcbn0+O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbWJvYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1jb21ib2JveCcsXG4gICAgJyhjbGljayknOiAnc2VsZWN0SW5wdXRBbmRPcGVuKCknLFxuICB9LFxuICBpbXBvcnRzOiBbTmdJZiwgTmF0aXZlSW5wdXRSZWZEaXJlY3RpdmUsIEFzeW5jUGlwZSwgQ2hldnJvbkljb25Db21wb25lbnQsIExldERpcmVjdGl2ZSwgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICBob3N0RGlyZWN0aXZlczogW3sgZGlyZWN0aXZlOiBJbnB1dERpcmVjdGl2ZSB9LCBBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDT01CT0JPWF9UT0tFTixcbiAgICAgIHVzZUV4aXN0aW5nOiBDb21ib2JveENvbXBvbmVudCxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIERlY29yYXRlZElucHV0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vI3JlZ2lvbiBJbmplY3RzXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXQgPSBpbmplY3QoSU5QVVRfVE9LRU4pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbmltYXRlZE92ZXJsYXkgPSBpbmplY3Q8QW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlPENvbWJvYm94Qm9keUNvbXBvbmVudD4+KEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdEZpZWxkID0gaW5qZWN0KFNFTEVDVF9GSUVMRF9UT0tFTik7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIElucHV0c1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5nZXRGaWx0ZXJlZE9wdGlvbnMoKTtcbiAgfVxuICBzZXQgb3B0aW9ucyh2YWx1ZTogdW5rbm93bltdKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0T3B0aW9ucyh2YWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaW5pdGlhbFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJJbnRlcm5hbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySW50ZXJuYWwkLnZhbHVlO1xuICB9XG4gIHNldCBmaWx0ZXJJbnRlcm5hbCh2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IHZhbCA9IGJvb2xlYW5BdHRyaWJ1dGUodmFsdWUpO1xuICAgIHRoaXMuX2ZpbHRlckludGVybmFsJC5uZXh0KHZhbCk7XG5cbiAgICBpZiAoIXZhbCkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0RmlsdGVyKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0RmlsdGVyKHRoaXMuX2N1cnJlbnRGaWx0ZXIpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9maWx0ZXJJbnRlcm5hbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBASW5wdXQoKVxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQudmFsdWU7XG4gIH1cbiAgc2V0IGxvYWRpbmcodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9sb2FkaW5nJC5uZXh0KGJvb2xlYW5BdHRyaWJ1dGUodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9sb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWFkb25seSBsb2FkaW5nJCA9IHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3IkLnZhbHVlO1xuICB9XG4gIHNldCBlcnJvcih2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX2Vycm9yJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIGVtcHR5VGV4dCA9ICdObyByZXN1bHRzIGZvdW5kJztcblxuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyJC52YWx1ZTtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICBASW5wdXQoKVxuICBzZXQgbXVsdGlwbGUodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRBbGxvd011bHRpcGxlKGJvb2xlYW5BdHRyaWJ1dGUodmFsdWUpKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBiaW5kTGFiZWwodmFsdWU6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRMYWJlbEJpbmRpbmcodmFsdWUpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGJpbmRWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNldFZhbHVlQmluZGluZyh2YWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgYWxsb3dDdXN0b21WYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93Q3VzdG9tVmFsdWVzJC52YWx1ZTtcbiAgfVxuICBzZXQgYWxsb3dDdXN0b21WYWx1ZXModmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9hbGxvd0N1c3RvbVZhbHVlcyQubmV4dChib29sZWFuQXR0cmlidXRlKHZhbHVlKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWxsb3dDdXN0b21WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE91dHB1dHNcblxuICBAT3V0cHV0KClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNZW1iZXJzXG5cbiAgcHJpdmF0ZSBnZXQgX2N1cnJlbnRGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGaWx0ZXIkLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRGaWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcblxuICBwcml2YXRlIGdldCBfaXNPcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9hbmltYXRlZE92ZXJsYXkuaXNNb3VudGVkO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX2lzT3BlbiQgPSB0aGlzLl9hbmltYXRlZE92ZXJsYXkuaXNNb3VudGVkJDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBBY3RpdmVTZWxlY3Rpb25Nb2RlbCgpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkT3B0aW9ucyQgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb24kO1xuICByZWFkb25seSBtdWx0aXBsZSQgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hbGxvd011bHRpcGxlJDtcbiAgcmVhZG9ubHkgb3B0aW9ucyQgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5maWx0ZXJlZE9wdGlvbnMkO1xuICByZWFkb25seSByYXdPcHRpb25zJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLm9wdGlvbnMkO1xuXG4gIEBDb250ZW50Q2hpbGQoQ09NQk9CT1hfT1BUSU9OX1RFTVBMQVRFX1RPS0VOLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHNldCBvcHRpb25UZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWZXaXRoT3B0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fb3B0aW9uVGVtcGxhdGUkLm5leHQodmFsdWUgPz8gbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uVGVtcGxhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZW1wbGF0ZVJlZldpdGhPcHRpb24gfCBudWxsPihudWxsKTtcblxuICBAQ29udGVudENoaWxkKENPTUJPQk9YX1NFTEVDVEVEX09QVElPTl9URU1QTEFURV9UT0tFTiwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBzZXQgc2VsZWN0ZWRPcHRpb25UZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWZXaXRoT3B0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRPcHRpb25UZW1wbGF0ZSQubmV4dCh2YWx1ZSA/PyBudWxsKTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZE9wdGlvblRlbXBsYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGVtcGxhdGVSZWZXaXRoT3B0aW9uIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIENvbXB1dGVzXG5cbiAgcmVhZG9ubHkgY3VzdG9tT3B0aW9uVHBsJCA9IHRoaXMuX29wdGlvblRlbXBsYXRlJC5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY3VzdG9tU2VsZWN0ZWRPcHRpb25UcGwkID0gdGhpcy5fc2VsZWN0ZWRPcHRpb25UZW1wbGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25Nb2RlbCh0aGlzLl9zZWxlY3Rpb25Nb2RlbCk7XG5cbiAgICB0aGlzLl9hbmltYXRlZE92ZXJsYXkucGxhY2VtZW50ID0gJ2JvdHRvbSc7XG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LmZhbGxiYWNrUGxhY2VtZW50cyA9IFsnYm90dG9tJywgJ3RvcCddO1xuICAgIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5hdXRvUmVzaXplID0gdHJ1ZTtcblxuICAgIHRoaXMuX2JpbmRpbmdzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtY29tYm9ib3gtLWxvYWRpbmcnLFxuICAgICAgb2JzZXJ2YWJsZTogdGhpcy5fbG9hZGluZyQsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LWNvbWJvYm94LS1lcnJvcicsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9lcnJvciQucGlwZShtYXAoKHYpID0+ICEhdikpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYmluZGluZ3MucHVzaCh7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC0tb3BlbicsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9pc09wZW4kLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fc2VsZWN0RmllbGQuX2JpbmRpbmdzLnB1c2goe1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtc2VsZWN0LWZpZWxkLS1tdWx0aXBsZScsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLm11bHRpcGxlJCxcbiAgICB9KTtcblxuICAgIHRoaXMuX3NlbGVjdEZpZWxkLl9iaW5kaW5ncy5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LXNlbGVjdC1maWVsZC0tb3BlbicsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9pc09wZW4kLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdERpc3BhdGNoRmlsdGVyQ2hhbmdlcygpO1xuXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aGlzLl9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC52YWx1ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5wdXQuX3VwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLl9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuaW5wdXQubmF0aXZlSW5wdXRSZWYkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICBmaWx0ZXIoKHJlZikgPT4gISFyZWY/LmVsZW1lbnQubmF0aXZlRWxlbWVudCksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl91cGRhdGVGaWx0ZXIodGhpcy5fY3VycmVudEZpbHRlcikpLFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFB1YmxpYyBNZXRob2RzXG5cbiAgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldExhYmVsJChvcHRpb24pO1xuICB9XG5cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldFZhbHVlJChvcHRpb24pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcblxuICAgIHRoaXMuaW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgLy8gaWYgKCF0aGlzLl9zZWxlY3RCb2R5Q29uZmlnKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5faXNPcGVuIHx8IHRoaXMuaW5wdXQuZGlzYWJsZWQgfHwgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LmlzTW91bnRpbmcpIHJldHVybjtcblxuICAgIC8vIHRoaXMuX3NldFNlbGVjdGVkT3B0aW9uQWN0aXZlKCk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5tb3VudCh7XG4gICAgICBjb21wb25lbnQ6IENvbWJvYm94Qm9keUNvbXBvbmVudCxcbiAgICAgIG1pcnJvcldpZHRoOiB0cnVlLFxuICAgICAgLy8gZGF0YTogeyBfYm9keVRlbXBsYXRlOiB0aGlzLl9zZWxlY3RCb2R5Q29uZmlnLnRlbXBsYXRlIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyB0aGlzLl9zZWxlY3RCb2R5SWQkLm5leHQoaW5zdGFuY2Uuc2VsZWN0Qm9keS5pZCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzT3BlbiB8fCB0aGlzLl9hbmltYXRlZE92ZXJsYXkuaXNVbm1vdW50aW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9hbmltYXRlZE92ZXJsYXkudW5tb3VudCgpO1xuXG4gICAgLy8gdGhpcy5fc2VsZWN0Qm9keUlkJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgc2VsZWN0SW5wdXRBbmRPcGVuKCkge1xuICAgIGlmICh0aGlzLmlucHV0LmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLmlucHV0Lm5hdGl2ZUlucHV0UmVmPy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlRnJvbU9wdGlvbihvcHRpb246IHVua25vd24pIHtcbiAgICB0aGlzLmlucHV0Ll9tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NlbGVjdGlvbk1vZGVsLmFsbG93TXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHRoaXMuX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgfVxuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IHVua25vd24pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZCQob3B0aW9uKTtcbiAgfVxuXG4gIGlzT3B0aW9uQWN0aXZlKG9wdGlvbjogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlbC5hY3RpdmVPcHRpb24kLnBpcGUobWFwKChhY3RpdmVPcHRpb24pID0+IGFjdGl2ZU9wdGlvbiA9PT0gb3B0aW9uKSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJvdGVjdGVkIE1ldGhvZHNcblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0tleWRvd25FdmVudChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuX2lzT3BlbjtcbiAgICBjb25zdCBpc011bHRpcGxlID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZTtcbiAgICBjb25zdCBjYW5BZGRDdXN0b21WYWx1ZSA9IHRoaXMuYWxsb3dDdXN0b21WYWx1ZXM7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgIGNvbnN0IGhhc0ZpbHRlclZhbHVlID0gISF2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3VsdDogS2V5SGFuZGxlclJlc3VsdCA9IHt9O1xuXG4gICAgaWYgKGtleUNvZGUgPT09IEVOVEVSKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIC8vIFRoZSB1c2VyIHR5cGVkIGEgY3VzdG9tIHZhbHVlIGFuZCBwcmVzc2VkIGVudGVyLiBBZGQgaXQgdG8gdGhlIHNlbGVjdGVkIG9wdGlvbnMuXG4gICAgICAvLyBGSVhNRTogQ3VycmVudGx5IGl0IGlzIGltcG9zc2libGUgdG8gc2VsZWN0IHRoZSBhY3RpdmUgb3B0aW9uIHdpdGggdGhlIGtleWJvYXJkIGlmIGNhbkFkZEN1c3RvbVZhbHVlIGlzIHRydWUuXG4gICAgICAvLyBUbyBmaXggdGhpcywgdGhlIGFjdGl2ZSBvcHRpb24gc2hvdWxkIGFsc28gaW5jbHVkZSB0aGUgb3JpZ2luIGl0IGdvdCBhY3RpdmUgZnJvbSAoa2V5Ym9hcmQgb3IgcHJvZ3JhbW1hdGljKS5cbiAgICAgIC8vIFRoZSBcInZhbHVlXCIgY2hhbmdpbmcgc2hvdWxkIHB1dCB0aGUgY29tYm9ib3ggaW50byBhIFwidXNlIHRoZSBjdXN0b20gaW5wdXQgb24gZW50ZXJcIiBtb2RlLlxuICAgICAgLy8gVGhlIFwiYWN0aXZlIG9wdGlvblwiIGNoYW5naW5nIHZpYSBrZXlib2FyZCBzaG91bGQgcHV0IHRoZSBjb21ib2JveCBpbnRvIGEgXCJ1c2UgdGhlIGFjdGl2ZSBvcHRpb24gb24gZW50ZXJcIiBtb2RlLlxuICAgICAgaWYgKGNhbkFkZEN1c3RvbVZhbHVlICYmIGhhc0ZpbHRlclZhbHVlKSB7XG4gICAgICAgIHJlc3VsdC5vcHRpb25BY3Rpb24gPSB7IHR5cGU6ICdhZGQnLCBvcHRpb246IHZhbHVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlbC5hY3RpdmVPcHRpb247XG5cbiAgICAgICAgaWYgKGFjdGl2ZU9wdGlvbikge1xuICAgICAgICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9uQWN0aW9uID0geyB0eXBlOiAndG9nZ2xlJywgb3B0aW9uOiBhY3RpdmVPcHRpb24gfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbkFjdGlvbiA9IHsgdHlwZTogJ2FkZCcsIG9wdGlvbjogYWN0aXZlT3B0aW9uIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICAgIHJlc3VsdC5zZXRGaWx0ZXIgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID0gJ2Nsb3NlJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRVNDQVBFKSB7XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID0gJ2Nsb3NlJztcbiAgICAgIH0gZWxzZSBpZiAoIWlzTXVsdGlwbGUpIHtcbiAgICAgICAgcmVzdWx0LnNldEZpbHRlciA9ICcnO1xuICAgICAgICByZXN1bHQub3B0aW9uQWN0aW9uID0gJ2NsZWFyJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gVEFCKSB7XG4gICAgICByZXN1bHQub3ZlcmxheU9wZXJhdGlvbiA9ICdjbG9zZSc7XG4gICAgICByZXR1cm4gdGhpcy5faW50ZXJwcmV0S2V5SGFuZGxlclJlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIGlmICghaXNPcGVuKSB7XG4gICAgICByZXN1bHQub3ZlcmxheU9wZXJhdGlvbiA9ICdvcGVuJztcbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlbC5ldmFsdWF0ZUtleWJvYXJkRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGtleUNvZGUgPT09IEEgJiYgZXZlbnQuY3RybEtleSAmJiBpc011bHRpcGxlKSB7XG4gICAgICByZXN1bHQub3B0aW9uQWN0aW9uID0gJ3RvZ2dsZUFsbCc7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbnRlcnByZXRLZXlIYW5kbGVyUmVzdWx0KHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc0lucHV0RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuXG4gICAgdGhpcy5fdXBkYXRlRmlsdGVyKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVCbHVyRXZlbnQoKSB7XG4gICAgdGhpcy5pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuaW5wdXQuX3NldFNob3VsZERpc3BsYXlFcnJvcih0cnVlKTtcblxuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hbGxvd011bHRpcGxlKSB7XG4gICAgICB0aGlzLl91cGRhdGVGaWx0ZXIoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jdXJyZW50RmlsdGVyID09PSAnJykge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3RlZE9wdGlvbnMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xuXG4gIHByaXZhdGUgX2luaXREaXNwYXRjaEZpbHRlckNoYW5nZXMoKSB7XG4gICAgdGhpcy5fY3VycmVudEZpbHRlciRcbiAgICAgIC5waXBlKFxuICAgICAgICBza2lwV2hpbGUoKCkgPT4gdGhpcy5maWx0ZXJJbnRlcm5hbCksXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHYpID0+IHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodikpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pbnB1dC5uYXRpdmVJbnB1dFJlZiAmJiB0aGlzLmlucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlSW5wdXRSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGaWx0ZXIgPT09IHZhbHVlKSByZXR1cm47XG5cbiAgICB0aGlzLl9jdXJyZW50RmlsdGVyJC5uZXh0KHZhbHVlKTtcblxuICAgIGlmICh0aGlzLmZpbHRlckludGVybmFsKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRGaWx0ZXIodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldEZpbHRlckZyb21JbnB1dFZhbHVlKCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hbGxvd011bHRpcGxlKSByZXR1cm47XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5wdXQudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB0aGlzLl91cGRhdGVGaWx0ZXIoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldE9wdGlvbkJ5VmFsdWUodmFsdWUpO1xuXG4gICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuZ2V0TGFiZWwob3B0aW9uKTtcblxuICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVGaWx0ZXIobGFiZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW50ZXJwcmV0S2V5SGFuZGxlclJlc3VsdChyZXN1bHQ6IEtleUhhbmRsZXJSZXN1bHQpIHtcbiAgICBpZiAocmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPT09ICdjbG9zZScpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID09PSAnb3BlbicpIHtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuc2V0RmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcihyZXN1bHQuc2V0RmlsdGVyKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Lm9wdGlvbkFjdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiByZXN1bHQub3B0aW9uQWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAocmVzdWx0Lm9wdGlvbkFjdGlvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0ZWRPcHRpb25zKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lm9wdGlvbkFjdGlvbiA9PT0gJ3RvZ2dsZUFsbCcpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGVBbGxTZWxlY3RlZE9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBvcHRpb24gfSA9IHJlc3VsdC5vcHRpb25BY3Rpb247XG5cbiAgICAgICAgaWYgKGlzT3B0aW9uRGlzYWJsZWQob3B0aW9uKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnYWRkJykge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBEZXYgbW9kZVxuXG4gIHByaXZhdGUgX2RlYnVnVmFsaWRhdGVDb21ib2JveENvbmZpZyhpc1JldHJ5ID0gZmFsc2UpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLl9zZWxlY3Rpb25Nb2RlbC5sYWJlbEJpbmRpbmckLCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC52YWx1ZUJpbmRpbmckLCB0aGlzLl9hbGxvd0N1c3RvbVZhbHVlcyRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHNraXAoaXNSZXRyeSA/IDEgOiAwKSwgLy8gU2tpcCBpZiByZXRyeWluZyB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgbWFwKChbYmluZExhYmVsLCBiaW5kVmFsdWUsIGFsbG93Q3VzdG9tVmFsdWVzXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNob3VsZEJlT2JqZWN0cyA9IGJpbmRMYWJlbCAmJiBiaW5kVmFsdWUgJiYgIWFsbG93Q3VzdG9tVmFsdWVzO1xuXG4gICAgICAgICAgaWYgKHNob3VsZEJlT2JqZWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIENvbWJvYm94T3B0aW9uVHlwZS5PYmplY3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmU7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKGV4cGVjdGVkT3B0aW9uVHlwZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5vcHRpb25zO1xuXG4gICAgICAgICAgaWYgKGlzRW1wdHlBcnJheShvcHRpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChleHBlY3RlZE9wdGlvblR5cGUgPT09IENvbWJvYm94T3B0aW9uVHlwZS5PYmplY3QpIHtcbiAgICAgICAgICAgIGlmICghaXNPYmplY3RBcnJheShvcHRpb25zKSkge1xuICAgICAgICAgICAgICB0aHJvdyBjb21ib2JveEVycm9yKDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRPcHRpb25UeXBlID09PSBDb21ib2JveE9wdGlvblR5cGUuUHJpbWl0aXZlKSB7XG4gICAgICAgICAgICBpZiAoIWlzUHJpbWl0aXZlQXJyYXkob3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgY29tYm9ib3hFcnJvcigyLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKHRydWUpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxufVxuIiwiPCEtLSBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdGVtcGxhdGUvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cbjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0UHJlZml4XVwiIC8+XG5cbjxkaXYgY2xhc3M9XCJldC1jb21ib2JveC13cmFwcGVyXCI+XG4gIDx1bCAqbmdJZj1cIm11bHRpcGxlJCB8IGFzeW5jXCIgY2xhc3M9XCJldC1jb21ib2JveC1zZWxlY3RlZC1vcHRpb25zXCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkT3B0aW9ucyQgfCBhc3luY1wiIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY3VzdG9tU2VsZWN0ZWRPcHRpb25UcGwkIHwgYXN5bmMgYXMgY3VzdG9tU2VsZWN0ZWRPcHRpb25UcGw7IGVsc2UgZGVmYXVsdFNlbGVjdGVkT3B0aW9uTGFiZWxUcGxcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tU2VsZWN0ZWRPcHRpb25UcGw7IGNvbnRleHQ6IHsgb3B0aW9uOiBpdGVtIH1cIiAvPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdGVkT3B0aW9uTGFiZWxUcGw+XG4gICAgICAgIHt7IGdldE9wdGlvbkxhYmVsKGl0ZW0pIHwgYXN5bmMgfX1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxzcGFuXG4gICAgICAgIChjbGljayk9XCJyZW1vdmVTZWxlY3RlZE9wdGlvbihpdGVtKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJldC1jb21ib2JveC1zZWxlY3RlZC1vcHRpb24tcmVtb3ZlXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICA+XG4gICAgICAgIHhcbiAgICAgIDwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxsaSBjbGFzcz1cImV0LWNvbWJvYm94LW11bGlwbGUtaW5wdXRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRwbFwiIC8+XG4gICAgPC9saT5cbiAgPC91bD5cblxuICA8bmctdGVtcGxhdGUgI2lucHV0VHBsPlxuICAgIDxpbnB1dFxuICAgICAgKGtleWRvd24pPVwicHJvY2Vzc0tleWRvd25FdmVudCgkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJvcGVuKClcIlxuICAgICAgKGJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KClcIlxuICAgICAgKGlucHV0KT1cInByb2Nlc3NJbnB1dEV2ZW50KCRldmVudClcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgZXROYXRpdmVJbnB1dFJlZlxuICAgIC8+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihtdWx0aXBsZSQgfCBhc3luYykgPT09IGZhbHNlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VHBsXCIgLz5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGV0LWNoZXZyb24taWNvbiBjbGFzcz1cImV0LWNvbWJvYm94LWNoZXZyb25cIiAvPlxuPC9kaXY+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cIltldElucHV0U3VmZml4XVwiIC8+XG5cbjxuZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
48
|
+
], template: "<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<!-- eslint-disable @angular-eslint/template/use-track-by-function -->\n<ng-content select=\"[etInputPrefix]\" />\n\n<div class=\"et-combobox-wrapper\">\n <ul *ngIf=\"combobox.multiple$ | async\" class=\"et-combobox-selected-options\">\n <li *ngFor=\"let item of combobox.selectedOptions$ | async\" class=\"et-combobox-selected-option\">\n <ng-container\n *ngIf=\"combobox.customSelectedOptionTpl$ | async as customSelectedOptionTpl; else defaultSelectedOptionLabelTpl\"\n >\n <ng-container *ngTemplateOutlet=\"customSelectedOptionTpl; context: { option: item }\" />\n </ng-container>\n\n <ng-template #defaultSelectedOptionLabelTpl>\n {{ combobox.getOptionLabel(item) | async }}\n </ng-template>\n\n <span\n (click)=\"combobox.removeSelectedOption(item); $event.stopPropagation()\"\n class=\"et-combobox-selected-option-remove\"\n tabindex=\"-1\"\n >\n x\n </span>\n </li>\n <li class=\"et-combobox-muliple-input\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </li>\n </ul>\n\n <ng-template #inputTpl>\n <input\n (keydown)=\"combobox._processKeydownEvent($event)\"\n (click)=\"combobox.open()\"\n (blur)=\"combobox._handleBlurEvent()\"\n (input)=\"combobox._processInputEvent($event)\"\n type=\"text\"\n etNativeInputRef\n />\n </ng-template>\n\n <ng-container *ngIf=\"(combobox.multiple$ | async) === false\">\n <ng-container *ngTemplateOutlet=\"inputTpl\" />\n </ng-container>\n\n <et-chevron-icon class=\"et-combobox-chevron\" />\n</div>\n\n<ng-content select=\"[etInputSuffix]\" />\n\n<ng-template>\n <ng-content />\n</ng-template>\n", styles: [".et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-from,.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-to{opacity:0;transform:scaleY(0)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-enter-active{transition:transform 125ms var(--ease-out-5),opacity 125ms var(--ease-out-5)}.et-combobox-body.et-with-default-animation .et-combobox-body-container.et-animation-leave-active{transition:transform 50ms var(--ease-in-5),opacity 50ms var(--ease-in-5)}.et-combobox-body.et-with-default-animation[et-floating-placement^=top] .et-combobox-body-container{transform-origin:bottom}.et-combobox-body.et-with-default-animation[et-floating-placement^=bottom] .et-combobox-body-container{transform-origin:top}.et-combobox-body-container{display:block;background-color:#3d3d3d;color:#fff;max-height:min(200px,var(--et-floating-max-height, 200px));overflow:auto}@supports (overflow: overlay){.et-combobox-body-container{overflow:overlay}}.et-combobox-body{width:100%;display:grid;transform:var(--et-floating-translate);will-change:transform}.et-combobox-option{display:block}:where(.et-combobox-option--active){background-color:#1e1e1e}.et-combobox{display:block;border:1px solid #ccc;padding:15px;position:relative}.et-combobox-chevron{transform:rotate(180deg);display:block;inline-size:15px;block-size:15px;position:absolute;inset-inline-end:15px;inset-block-start:7px}\n"] }]
|
|
49
|
+
}], ctorParameters: function () { return []; } });
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvY29tcG9uZW50cy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9jb21wb25lbnRzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFxQ3ZELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7SUFHdkQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUhTLGFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFLbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7OEdBUFUsaUJBQWlCO2tHQUFqQixpQkFBaUIsMHFCQzVDOUIsb3ZEQXFEQSw4L0NEakNZLElBQUksNkZBQUUsdUJBQXVCLCtJQUFFLFNBQVMsOENBQUUsb0JBQW9CLDREQUFnQixLQUFLLG1IQUFFLGdCQUFnQjs7MkZBd0JwRyxpQkFBaUI7a0JBbkM3QixTQUFTOytCQUNFLGFBQWEsY0FHWCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osS0FBSyxFQUFFLGFBQWE7d0JBQ3BCLFNBQVMsRUFBRSwrQkFBK0I7cUJBQzNDLFdBQ1EsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsa0JBQ2hHO3dCQUNkLHdCQUF3Qjt3QkFDeEIsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO3dCQUM3Qjs0QkFDRSxTQUFTLEVBQUUsaUJBQWlCOzRCQUM1QixNQUFNLEVBQUU7Z0NBQ04sU0FBUztnQ0FDVCxjQUFjO2dDQUNkLGdCQUFnQjtnQ0FDaEIsU0FBUztnQ0FDVCxPQUFPO2dDQUNQLFdBQVc7Z0NBQ1gsYUFBYTtnQ0FDYixVQUFVO2dDQUNWLFdBQVc7Z0NBQ1gsV0FBVztnQ0FDWCxtQkFBbUI7NkJBQ3BCOzRCQUNELHdFQUF3RTs0QkFDeEUsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO3lCQUMxQjtxQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlLCBMZXREaXJlY3RpdmUgfSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7IENoZXZyb25JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vLi4vaWNvbnMnO1xuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUsIE5hdGl2ZUlucHV0UmVmRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBEZWNvcmF0ZWRJbnB1dEJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDT01CT0JPWF9UT0tFTiwgQ29tYm9ib3hEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IENvbWJvYm94Qm9keUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhcnRpYWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZXQtY29tYm9ib3gnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZXQtY29tYm9ib3gnLFxuICAgICcoY2xpY2spJzogJ2NvbWJvYm94LnNlbGVjdElucHV0QW5kT3BlbigpJyxcbiAgfSxcbiAgaW1wb3J0czogW05nSWYsIE5hdGl2ZUlucHV0UmVmRGlyZWN0aXZlLCBBc3luY1BpcGUsIENoZXZyb25JY29uQ29tcG9uZW50LCBMZXREaXJlY3RpdmUsIE5nRm9yLCBOZ1RlbXBsYXRlT3V0bGV0XSxcbiAgaG9zdERpcmVjdGl2ZXM6IFtcbiAgICBBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgeyBkaXJlY3RpdmU6IElucHV0RGlyZWN0aXZlIH0sXG4gICAge1xuICAgICAgZGlyZWN0aXZlOiBDb21ib2JveERpcmVjdGl2ZSxcbiAgICAgIGlucHV0czogW1xuICAgICAgICAnb3B0aW9ucycsXG4gICAgICAgICdpbml0aWFsVmFsdWUnLFxuICAgICAgICAnZmlsdGVySW50ZXJuYWwnLFxuICAgICAgICAnbG9hZGluZycsXG4gICAgICAgICdlcnJvcicsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgICAnbXVsdGlwbGUnLFxuICAgICAgICAnYmluZExhYmVsJyxcbiAgICAgICAgJ2JpbmRWYWx1ZScsXG4gICAgICAgICdhbGxvd0N1c3RvbVZhbHVlcycsXG4gICAgICBdLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gICAgICBvdXRwdXRzOiBbJ2ZpbHRlckNoYW5nZSddLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGV4dGVuZHMgRGVjb3JhdGVkSW5wdXRCYXNlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbWJvYm94ID0gaW5qZWN0KENPTUJPQk9YX1RPS0VOKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb21ib2JveC5zZXRCb2R5Q29tcG9uZW50KENvbWJvYm94Qm9keUNvbXBvbmVudCk7XG4gIH1cbn1cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XG48IS0tIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS91c2UtdHJhY2stYnktZnVuY3Rpb24gLS0+XG48bmctY29udGVudCBzZWxlY3Q9XCJbZXRJbnB1dFByZWZpeF1cIiAvPlxuXG48ZGl2IGNsYXNzPVwiZXQtY29tYm9ib3gtd3JhcHBlclwiPlxuICA8dWwgKm5nSWY9XCJjb21ib2JveC5tdWx0aXBsZSQgfCBhc3luY1wiIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uc1wiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21ib2JveC5zZWxlY3RlZE9wdGlvbnMkIHwgYXN5bmNcIiBjbGFzcz1cImV0LWNvbWJvYm94LXNlbGVjdGVkLW9wdGlvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbWJvYm94LmN1c3RvbVNlbGVjdGVkT3B0aW9uVHBsJCB8IGFzeW5jIGFzIGN1c3RvbVNlbGVjdGVkT3B0aW9uVHBsOyBlbHNlIGRlZmF1bHRTZWxlY3RlZE9wdGlvbkxhYmVsVHBsXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVNlbGVjdGVkT3B0aW9uVHBsOyBjb250ZXh0OiB7IG9wdGlvbjogaXRlbSB9XCIgLz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3RlZE9wdGlvbkxhYmVsVHBsPlxuICAgICAgICB7eyBjb21ib2JveC5nZXRPcHRpb25MYWJlbChpdGVtKSB8IGFzeW5jIH19XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8c3BhblxuICAgICAgICAoY2xpY2spPVwiY29tYm9ib3gucmVtb3ZlU2VsZWN0ZWRPcHRpb24oaXRlbSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIGNsYXNzPVwiZXQtY29tYm9ib3gtc2VsZWN0ZWQtb3B0aW9uLXJlbW92ZVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICB4XG4gICAgICA8L3NwYW4+XG4gICAgPC9saT5cbiAgICA8bGkgY2xhc3M9XCJldC1jb21ib2JveC1tdWxpcGxlLWlucHV0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUcGxcIiAvPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPG5nLXRlbXBsYXRlICNpbnB1dFRwbD5cbiAgICA8aW5wdXRcbiAgICAgIChrZXlkb3duKT1cImNvbWJvYm94Ll9wcm9jZXNzS2V5ZG93bkV2ZW50KCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cImNvbWJvYm94Lm9wZW4oKVwiXG4gICAgICAoYmx1cik9XCJjb21ib2JveC5faGFuZGxlQmx1ckV2ZW50KClcIlxuICAgICAgKGlucHV0KT1cImNvbWJvYm94Ll9wcm9jZXNzSW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIGV0TmF0aXZlSW5wdXRSZWZcbiAgICAvPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoY29tYm9ib3gubXVsdGlwbGUkIHwgYXN5bmMpID09PSBmYWxzZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRwbFwiIC8+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxldC1jaGV2cm9uLWljb24gY2xhc3M9XCJldC1jb21ib2JveC1jaGV2cm9uXCIgLz5cbjwvZGl2PlxuXG48bmctY29udGVudCBzZWxlY3Q9XCJbZXRJbnB1dFN1ZmZpeF1cIiAvPlxuXG48bmctdGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IC8+XG48L25nLXRlbXBsYXRlPlxuIl19
|