@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,14 +1,441 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A, ENTER, ESCAPE, TAB } from '@angular/cdk/keycodes';
|
|
2
|
+
import { ContentChild, Directive, EventEmitter, InjectionToken, Input, Output, TemplateRef, booleanAttribute, inject, isDevMode, } from '@angular/core';
|
|
3
|
+
import { ActiveSelectionModel, AnimatedOverlayDirective, RuntimeError, SelectionModel, createDestroy, createReactiveBindings, } from '@ethlete/core';
|
|
4
|
+
import { BehaviorSubject, catchError, combineLatest, debounceTime, distinctUntilChanged, filter, map, skip, skipWhile, take, takeUntil, tap, throwError, } from 'rxjs';
|
|
5
|
+
import { INPUT_TOKEN } from '../../../../../../directives';
|
|
6
|
+
import { isOptionDisabled } from '../../utils';
|
|
7
|
+
import { COMBOBOX_OPTION_TEMPLATE_TOKEN } from '../combobox-option-template';
|
|
8
|
+
import { COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN } from '../combobox-selected-option-template';
|
|
2
9
|
import * as i0 from "@angular/core";
|
|
3
|
-
export const
|
|
10
|
+
export const COMBOBOX_TOKEN = new InjectionToken('ET_COMBOBOX_INPUT_TOKEN');
|
|
11
|
+
const COMBOBOX_ERRORS = {
|
|
12
|
+
1: 'Expected options to be an array of objects. This is due to "bindLabel" and "bindValue" being set.',
|
|
13
|
+
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.',
|
|
14
|
+
};
|
|
15
|
+
const comboboxError = (code, data) => {
|
|
16
|
+
const message = `<et-combobox>: ${COMBOBOX_ERRORS[code]}`;
|
|
17
|
+
throw new RuntimeError(code, message, data);
|
|
18
|
+
};
|
|
19
|
+
const isPrimitiveArray = (value) => {
|
|
20
|
+
if (!Array.isArray(value))
|
|
21
|
+
return false;
|
|
22
|
+
const first = value[0];
|
|
23
|
+
const last = value[value.length - 1];
|
|
24
|
+
if (!first || !last)
|
|
25
|
+
return false;
|
|
26
|
+
return typeof first !== 'object' && typeof last !== 'object';
|
|
27
|
+
};
|
|
28
|
+
const isObjectArray = (value) => {
|
|
29
|
+
if (!Array.isArray(value))
|
|
30
|
+
return false;
|
|
31
|
+
const first = value[0];
|
|
32
|
+
const last = value[value.length - 1];
|
|
33
|
+
if (!first || !last)
|
|
34
|
+
return false;
|
|
35
|
+
return typeof first === 'object' && typeof last === 'object';
|
|
36
|
+
};
|
|
37
|
+
const isEmptyArray = (value) => {
|
|
38
|
+
return Array.isArray(value) && value.length === 0;
|
|
39
|
+
};
|
|
40
|
+
const ComboboxOptionType = {
|
|
41
|
+
Primitive: 'primitive',
|
|
42
|
+
Object: 'object',
|
|
43
|
+
};
|
|
44
|
+
function assetComboboxBodyComponentSet(component) {
|
|
45
|
+
if (!component) {
|
|
46
|
+
throw new RuntimeError(1, 'Combobox body component is not set');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
4
49
|
export class ComboboxDirective {
|
|
50
|
+
//#region Inputs
|
|
51
|
+
get options() {
|
|
52
|
+
return this._selectionModel.getFilteredOptions();
|
|
53
|
+
}
|
|
54
|
+
set options(value) {
|
|
55
|
+
this._selectionModel.setOptions(value);
|
|
56
|
+
}
|
|
57
|
+
set initialValue(value) {
|
|
58
|
+
this._selectionModel.setSelection(value);
|
|
59
|
+
}
|
|
60
|
+
get filterInternal() {
|
|
61
|
+
return this._filterInternal$.value;
|
|
62
|
+
}
|
|
63
|
+
set filterInternal(value) {
|
|
64
|
+
const val = booleanAttribute(value);
|
|
65
|
+
this._filterInternal$.next(val);
|
|
66
|
+
if (!val) {
|
|
67
|
+
this._selectionModel.setFilter('');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this._selectionModel.setFilter(this._currentFilter);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
get loading() {
|
|
74
|
+
return this._loading$.value;
|
|
75
|
+
}
|
|
76
|
+
set loading(value) {
|
|
77
|
+
this._loading$.next(booleanAttribute(value));
|
|
78
|
+
}
|
|
79
|
+
get error() {
|
|
80
|
+
return this._error$.value;
|
|
81
|
+
}
|
|
82
|
+
set error(value) {
|
|
83
|
+
this._error$.next(value);
|
|
84
|
+
}
|
|
85
|
+
get placeholder() {
|
|
86
|
+
return this._placeholder$.value;
|
|
87
|
+
}
|
|
88
|
+
set placeholder(value) {
|
|
89
|
+
this._placeholder$.next(value);
|
|
90
|
+
}
|
|
91
|
+
set multiple(value) {
|
|
92
|
+
this._selectionModel.setAllowMultiple(booleanAttribute(value));
|
|
93
|
+
}
|
|
94
|
+
set bindLabel(value) {
|
|
95
|
+
this._selectionModel.setLabelBinding(value);
|
|
96
|
+
}
|
|
97
|
+
set bindValue(value) {
|
|
98
|
+
this._selectionModel.setValueBinding(value);
|
|
99
|
+
}
|
|
100
|
+
get allowCustomValues() {
|
|
101
|
+
return this._allowCustomValues$.value;
|
|
102
|
+
}
|
|
103
|
+
set allowCustomValues(value) {
|
|
104
|
+
this._allowCustomValues$.next(booleanAttribute(value));
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region Members
|
|
108
|
+
get _currentFilter() {
|
|
109
|
+
return this._currentFilter$.value;
|
|
110
|
+
}
|
|
111
|
+
get _isOpen() {
|
|
112
|
+
return this._animatedOverlay.isMounted;
|
|
113
|
+
}
|
|
114
|
+
set optionTemplate(value) {
|
|
115
|
+
this._optionTemplate$.next(value ?? null);
|
|
116
|
+
}
|
|
117
|
+
set selectedOptionTemplate(value) {
|
|
118
|
+
this._selectedOptionTemplate$.next(value ?? null);
|
|
119
|
+
}
|
|
120
|
+
//#endregion
|
|
121
|
+
//#region Lifecycle
|
|
122
|
+
constructor() {
|
|
123
|
+
//#region Injects
|
|
124
|
+
this._destroy$ = createDestroy();
|
|
125
|
+
this._input = inject(INPUT_TOKEN);
|
|
126
|
+
this._animatedOverlay = inject(AnimatedOverlayDirective);
|
|
127
|
+
this._filterInternal$ = new BehaviorSubject(false);
|
|
128
|
+
this._loading$ = new BehaviorSubject(false);
|
|
129
|
+
this.loading$ = this._loading$.asObservable();
|
|
130
|
+
this._error$ = new BehaviorSubject(null);
|
|
131
|
+
this.emptyText = 'No results found';
|
|
132
|
+
this._placeholder$ = new BehaviorSubject(null);
|
|
133
|
+
this._allowCustomValues$ = new BehaviorSubject(false);
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region Outputs
|
|
136
|
+
this.filterChange = new EventEmitter();
|
|
137
|
+
this._currentFilter$ = new BehaviorSubject('');
|
|
138
|
+
this._isOpen$ = this._animatedOverlay.isMounted$;
|
|
139
|
+
this._selectionModel = new SelectionModel();
|
|
140
|
+
this._activeSelectionModel = new ActiveSelectionModel();
|
|
141
|
+
this.selectedOptions$ = this._selectionModel.selection$;
|
|
142
|
+
this.multiple$ = this._selectionModel.allowMultiple$;
|
|
143
|
+
this.options$ = this._selectionModel.filteredOptions$;
|
|
144
|
+
this.rawOptions$ = this._selectionModel.options$;
|
|
145
|
+
this._optionTemplate$ = new BehaviorSubject(null);
|
|
146
|
+
this._selectedOptionTemplate$ = new BehaviorSubject(null);
|
|
147
|
+
this._bindings = createReactiveBindings({
|
|
148
|
+
attribute: 'class.et-combobox--loading',
|
|
149
|
+
observable: this._loading$,
|
|
150
|
+
}, {
|
|
151
|
+
attribute: 'class.et-combobox--error',
|
|
152
|
+
observable: this._error$.pipe(map((v) => !!v)),
|
|
153
|
+
}, {
|
|
154
|
+
attribute: 'class.et-combobox--open',
|
|
155
|
+
observable: this._isOpen$,
|
|
156
|
+
}, {
|
|
157
|
+
attribute: 'class.et-select-field--multiple',
|
|
158
|
+
observable: this.multiple$,
|
|
159
|
+
}, {
|
|
160
|
+
attribute: 'class.et-select-field--open',
|
|
161
|
+
observable: this._isOpen$,
|
|
162
|
+
});
|
|
163
|
+
this._comboboxBodyComponent = null;
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region Computes
|
|
166
|
+
this.customOptionTpl$ = this._optionTemplate$.asObservable();
|
|
167
|
+
this.customSelectedOptionTpl$ = this._selectedOptionTemplate$.asObservable();
|
|
168
|
+
this._activeSelectionModel.setSelectionModel(this._selectionModel);
|
|
169
|
+
this._animatedOverlay.placement = 'bottom';
|
|
170
|
+
this._animatedOverlay.fallbackPlacements = ['bottom', 'top'];
|
|
171
|
+
this._animatedOverlay.autoResize = true;
|
|
172
|
+
}
|
|
173
|
+
ngOnInit() {
|
|
174
|
+
this._initDispatchFilterChanges();
|
|
175
|
+
if (isDevMode()) {
|
|
176
|
+
this._debugValidateComboboxConfig();
|
|
177
|
+
}
|
|
178
|
+
this._selectionModel.value$
|
|
179
|
+
.pipe(takeUntil(this._destroy$), tap((value) => {
|
|
180
|
+
this._input._updateValue(value);
|
|
181
|
+
this._setFilterFromInputValue();
|
|
182
|
+
}))
|
|
183
|
+
.subscribe();
|
|
184
|
+
this._input.nativeInputRef$
|
|
185
|
+
.pipe(takeUntil(this._destroy$), debounceTime(0), filter((ref) => !!ref?.element.nativeElement), tap(() => this._updateFilter(this._currentFilter)), take(1))
|
|
186
|
+
.subscribe();
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region Public Methods
|
|
190
|
+
setBodyComponent(component) {
|
|
191
|
+
this._comboboxBodyComponent = component;
|
|
192
|
+
}
|
|
193
|
+
getOptionLabel(option) {
|
|
194
|
+
return this._selectionModel.getLabel$(option);
|
|
195
|
+
}
|
|
196
|
+
getOptionValue(option) {
|
|
197
|
+
return this._selectionModel.getValue$(option);
|
|
198
|
+
}
|
|
199
|
+
removeSelectedOption(option) {
|
|
200
|
+
this._selectionModel.removeSelectedOption(option);
|
|
201
|
+
this._input._markAsTouched();
|
|
202
|
+
}
|
|
203
|
+
open() {
|
|
204
|
+
assetComboboxBodyComponentSet(this._comboboxBodyComponent);
|
|
205
|
+
if (this._isOpen || this._input.disabled || this._animatedOverlay.isMounting)
|
|
206
|
+
return;
|
|
207
|
+
this._animatedOverlay.mount({
|
|
208
|
+
component: this._comboboxBodyComponent,
|
|
209
|
+
mirrorWidth: true,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
close() {
|
|
213
|
+
if (!this._isOpen || this._animatedOverlay.isUnmounting)
|
|
214
|
+
return;
|
|
215
|
+
this._animatedOverlay.unmount();
|
|
216
|
+
}
|
|
217
|
+
selectInputAndOpen() {
|
|
218
|
+
if (this._input.disabled)
|
|
219
|
+
return;
|
|
220
|
+
this._input.nativeInputRef?.element.nativeElement.select();
|
|
221
|
+
this.open();
|
|
222
|
+
}
|
|
223
|
+
writeValueFromOption(option) {
|
|
224
|
+
this._input._markAsTouched();
|
|
225
|
+
if (this._selectionModel.allowMultiple) {
|
|
226
|
+
this._selectionModel.toggleSelectedOption(option);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this._selectionModel.addSelectedOption(option);
|
|
230
|
+
}
|
|
231
|
+
if (!this._selectionModel.allowMultiple) {
|
|
232
|
+
this.close();
|
|
233
|
+
this._setFilterFromInputValue();
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this._updateFilter('');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
isOptionSelected(option) {
|
|
240
|
+
return this._selectionModel.isSelected$(option);
|
|
241
|
+
}
|
|
242
|
+
isOptionActive(option) {
|
|
243
|
+
return this._activeSelectionModel.activeOption$.pipe(map((activeOption) => activeOption === option));
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region Protected Methods
|
|
247
|
+
_processKeydownEvent(event) {
|
|
248
|
+
const keyCode = event.keyCode;
|
|
249
|
+
const isOpen = this._isOpen;
|
|
250
|
+
const isMultiple = this._selectionModel.allowMultiple;
|
|
251
|
+
const canAddCustomValue = this.allowCustomValues;
|
|
252
|
+
const value = event.target.value;
|
|
253
|
+
const hasFilterValue = !!value;
|
|
254
|
+
const result = {};
|
|
255
|
+
if (keyCode === ENTER) {
|
|
256
|
+
event.preventDefault();
|
|
257
|
+
event.stopPropagation();
|
|
258
|
+
// The user typed a custom value and pressed enter. Add it to the selected options.
|
|
259
|
+
// FIXME: Currently it is impossible to select the active option with the keyboard if canAddCustomValue is true.
|
|
260
|
+
// To fix this, the active option should also include the origin it got active from (keyboard or programmatic).
|
|
261
|
+
// The "value" changing should put the combobox into a "use the custom input on enter" mode.
|
|
262
|
+
// The "active option" changing via keyboard should put the combobox into a "use the active option on enter" mode.
|
|
263
|
+
if (canAddCustomValue && hasFilterValue) {
|
|
264
|
+
result.optionAction = { type: 'add', option: value };
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
const activeOption = this._activeSelectionModel.activeOption;
|
|
268
|
+
if (activeOption) {
|
|
269
|
+
if (isMultiple) {
|
|
270
|
+
result.optionAction = { type: 'toggle', option: activeOption };
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
result.optionAction = { type: 'add', option: activeOption };
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (isMultiple) {
|
|
278
|
+
result.setFilter = '';
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
result.overlayOperation = 'close';
|
|
282
|
+
}
|
|
283
|
+
return this._interpretKeyHandlerResult(result);
|
|
284
|
+
}
|
|
285
|
+
if (keyCode === ESCAPE) {
|
|
286
|
+
if (isOpen) {
|
|
287
|
+
result.overlayOperation = 'close';
|
|
288
|
+
}
|
|
289
|
+
else if (!isMultiple) {
|
|
290
|
+
result.setFilter = '';
|
|
291
|
+
result.optionAction = 'clear';
|
|
292
|
+
}
|
|
293
|
+
return this._interpretKeyHandlerResult(result);
|
|
294
|
+
}
|
|
295
|
+
if (keyCode === TAB) {
|
|
296
|
+
result.overlayOperation = 'close';
|
|
297
|
+
return this._interpretKeyHandlerResult(result);
|
|
298
|
+
}
|
|
299
|
+
if (!isOpen) {
|
|
300
|
+
result.overlayOperation = 'open';
|
|
301
|
+
}
|
|
302
|
+
this._activeSelectionModel.evaluateKeyboardEvent(event);
|
|
303
|
+
if (keyCode === A && event.ctrlKey && isMultiple) {
|
|
304
|
+
result.optionAction = 'toggleAll';
|
|
305
|
+
event.preventDefault();
|
|
306
|
+
}
|
|
307
|
+
return this._interpretKeyHandlerResult(result);
|
|
308
|
+
}
|
|
309
|
+
_processInputEvent(event) {
|
|
310
|
+
const value = event.target.value;
|
|
311
|
+
this._updateFilter(value);
|
|
312
|
+
}
|
|
313
|
+
_handleBlurEvent() {
|
|
314
|
+
this._input._markAsTouched();
|
|
315
|
+
this._input._setShouldDisplayError(true);
|
|
316
|
+
if (this._selectionModel.allowMultiple) {
|
|
317
|
+
this._updateFilter('');
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (this._currentFilter === '') {
|
|
321
|
+
this._selectionModel.clearSelectedOptions();
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this._setFilterFromInputValue();
|
|
325
|
+
}
|
|
326
|
+
//#endregion
|
|
327
|
+
//#region Private Methods
|
|
328
|
+
_initDispatchFilterChanges() {
|
|
329
|
+
this._currentFilter$
|
|
330
|
+
.pipe(skipWhile(() => this.filterInternal), debounceTime(300), distinctUntilChanged(), takeUntil(this._destroy$), tap((v) => this.filterChange.emit(v)))
|
|
331
|
+
.subscribe();
|
|
332
|
+
}
|
|
333
|
+
_updateFilter(value) {
|
|
334
|
+
if (this._input.nativeInputRef && this._input.nativeInputRef.element.nativeElement.value !== value) {
|
|
335
|
+
this._input.nativeInputRef.element.nativeElement.value = value;
|
|
336
|
+
}
|
|
337
|
+
if (this._currentFilter === value)
|
|
338
|
+
return;
|
|
339
|
+
this._currentFilter$.next(value);
|
|
340
|
+
if (this.filterInternal) {
|
|
341
|
+
this._selectionModel.setFilter(value);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
_setFilterFromInputValue() {
|
|
345
|
+
if (this._selectionModel.allowMultiple)
|
|
346
|
+
return;
|
|
347
|
+
const value = this._input.value;
|
|
348
|
+
if (!value || Array.isArray(value)) {
|
|
349
|
+
this._updateFilter('');
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const option = this._selectionModel.getOptionByValue(value);
|
|
353
|
+
if (!option)
|
|
354
|
+
return;
|
|
355
|
+
const label = this._selectionModel.getLabel(option);
|
|
356
|
+
if (typeof label !== 'string')
|
|
357
|
+
return;
|
|
358
|
+
this._updateFilter(label);
|
|
359
|
+
}
|
|
360
|
+
_interpretKeyHandlerResult(result) {
|
|
361
|
+
if (result.overlayOperation === 'close') {
|
|
362
|
+
this.close();
|
|
363
|
+
}
|
|
364
|
+
else if (result.overlayOperation === 'open') {
|
|
365
|
+
this.open();
|
|
366
|
+
}
|
|
367
|
+
if (result.setFilter !== undefined) {
|
|
368
|
+
this._updateFilter(result.setFilter);
|
|
369
|
+
}
|
|
370
|
+
if (result.optionAction) {
|
|
371
|
+
if (typeof result.optionAction === 'string') {
|
|
372
|
+
if (result.optionAction === 'clear') {
|
|
373
|
+
this._selectionModel.clearSelectedOptions();
|
|
374
|
+
}
|
|
375
|
+
else if (result.optionAction === 'toggleAll') {
|
|
376
|
+
this._selectionModel.toggleAllSelectedOptions();
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
const { type, option } = result.optionAction;
|
|
381
|
+
if (isOptionDisabled(option))
|
|
382
|
+
return;
|
|
383
|
+
if (type === 'add') {
|
|
384
|
+
this._selectionModel.addSelectedOption(option);
|
|
385
|
+
}
|
|
386
|
+
if (type === 'remove') {
|
|
387
|
+
this._selectionModel.removeSelectedOption(option);
|
|
388
|
+
}
|
|
389
|
+
if (type === 'toggle') {
|
|
390
|
+
this._selectionModel.toggleSelectedOption(option);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
//#endregion
|
|
396
|
+
//#region Dev mode
|
|
397
|
+
_debugValidateComboboxConfig(isRetry = false) {
|
|
398
|
+
combineLatest([this._selectionModel.labelBinding$, this._selectionModel.valueBinding$, this._allowCustomValues$])
|
|
399
|
+
.pipe(skip(isRetry ? 1 : 0), // Skip if retrying to avoid infinite loop
|
|
400
|
+
debounceTime(0), takeUntil(this._destroy$), map(([bindLabel, bindValue, allowCustomValues]) => {
|
|
401
|
+
const shouldBeObjects = bindLabel && bindValue && !allowCustomValues;
|
|
402
|
+
if (shouldBeObjects) {
|
|
403
|
+
return ComboboxOptionType.Object;
|
|
404
|
+
}
|
|
405
|
+
return ComboboxOptionType.Primitive;
|
|
406
|
+
}), tap((expectedOptionType) => {
|
|
407
|
+
const options = this._selectionModel.options;
|
|
408
|
+
if (isEmptyArray(options)) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (expectedOptionType === ComboboxOptionType.Object) {
|
|
412
|
+
if (!isObjectArray(options)) {
|
|
413
|
+
throw comboboxError(1, options);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else if (expectedOptionType === ComboboxOptionType.Primitive) {
|
|
417
|
+
if (!isPrimitiveArray(options)) {
|
|
418
|
+
throw comboboxError(2, options);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}), catchError((e) => {
|
|
422
|
+
this._debugValidateComboboxConfig(true);
|
|
423
|
+
return throwError(() => e);
|
|
424
|
+
}))
|
|
425
|
+
.subscribe();
|
|
426
|
+
}
|
|
427
|
+
_assetBodyComponent() {
|
|
428
|
+
if (!this._comboboxBodyComponent) {
|
|
429
|
+
throw new RuntimeError(1, 'Combobox body component is not set');
|
|
430
|
+
}
|
|
431
|
+
}
|
|
5
432
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ComboboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
6
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.0", type: ComboboxDirective, isStandalone: true, providers: [
|
|
433
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.0", type: ComboboxDirective, isStandalone: true, 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" }, providers: [
|
|
7
434
|
{
|
|
8
|
-
provide:
|
|
435
|
+
provide: COMBOBOX_TOKEN,
|
|
9
436
|
useExisting: ComboboxDirective,
|
|
10
437
|
},
|
|
11
|
-
], ngImport: i0 }); }
|
|
438
|
+
], 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 }], ngImport: i0 }); }
|
|
12
439
|
}
|
|
13
440
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: ComboboxDirective, decorators: [{
|
|
14
441
|
type: Directive,
|
|
@@ -16,10 +443,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
|
|
|
16
443
|
standalone: true,
|
|
17
444
|
providers: [
|
|
18
445
|
{
|
|
19
|
-
provide:
|
|
446
|
+
provide: COMBOBOX_TOKEN,
|
|
20
447
|
useExisting: ComboboxDirective,
|
|
21
448
|
},
|
|
22
449
|
],
|
|
23
450
|
}]
|
|
24
|
-
}]
|
|
25
|
-
|
|
451
|
+
}], ctorParameters: function () { return []; }, propDecorators: { options: [{
|
|
452
|
+
type: Input,
|
|
453
|
+
args: [{ required: true }]
|
|
454
|
+
}], initialValue: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], filterInternal: [{
|
|
457
|
+
type: Input
|
|
458
|
+
}], loading: [{
|
|
459
|
+
type: Input
|
|
460
|
+
}], error: [{
|
|
461
|
+
type: Input
|
|
462
|
+
}], emptyText: [{
|
|
463
|
+
type: Input
|
|
464
|
+
}], placeholder: [{
|
|
465
|
+
type: Input
|
|
466
|
+
}], multiple: [{
|
|
467
|
+
type: Input
|
|
468
|
+
}], bindLabel: [{
|
|
469
|
+
type: Input
|
|
470
|
+
}], bindValue: [{
|
|
471
|
+
type: Input
|
|
472
|
+
}], allowCustomValues: [{
|
|
473
|
+
type: Input
|
|
474
|
+
}], filterChange: [{
|
|
475
|
+
type: Output
|
|
476
|
+
}], optionTemplate: [{
|
|
477
|
+
type: ContentChild,
|
|
478
|
+
args: [COMBOBOX_OPTION_TEMPLATE_TOKEN, { read: TemplateRef }]
|
|
479
|
+
}], selectedOptionTemplate: [{
|
|
480
|
+
type: ContentChild,
|
|
481
|
+
args: [COMBOBOX_SELECTED_OPTION_TEMPLATE_TOKEN, { read: TemplateRef }]
|
|
482
|
+
}] } });
|
|
483
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvZGlyZWN0aXZlcy9jb21ib2JveC9jb21ib2JveC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sRUFDTixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG9CQUFvQixFQUVwQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLGNBQWMsRUFDZCxhQUFhLEVBQ2Isc0JBQXNCLEdBQ3ZCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLGFBQWEsRUFDYixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOztBQUUv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QVdGLEtBQUs7c0JBRFIsS0FBSztnQkFVTixTQUFTO3NCQURSLEtBQUs7Z0JBSUYsV0FBVztzQkFEZCxLQUFLO2dCQVVGLFFBQVE7c0JBRFgsS0FBSztnQkFNRixTQUFTO3NCQURaLEtBQUs7Z0JBTUYsU0FBUztzQkFEWixLQUFLO2dCQU1GLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFjYSxZQUFZO3NCQUQ5QixNQUFNO2dCQTBCSCxjQUFjO3NCQURqQixZQUFZO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPL0Qsc0JBQXNCO3NCQUR6QixZQUFZO3VCQUFDLHVDQUF1QyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEEsIEVOVEVSLCBFU0NBUEUsIFRBQiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtcbiAgQ29udGVudENoaWxkLFxuICBEaXJlY3RpdmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGluamVjdCxcbiAgaXNEZXZNb2RlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2ZVNlbGVjdGlvbk1vZGVsLFxuICBBbmltYXRlZE92ZXJsYXlDb21wb25lbnRCYXNlLFxuICBBbmltYXRlZE92ZXJsYXlEaXJlY3RpdmUsXG4gIFJ1bnRpbWVFcnJvcixcbiAgU2VsZWN0aW9uTW9kZWwsXG4gIGNyZWF0ZURlc3Ryb3ksXG4gIGNyZWF0ZVJlYWN0aXZlQmluZGluZ3MsXG59IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgc2tpcCxcbiAgc2tpcFdoaWxlLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJTlBVVF9UT0tFTiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgaXNPcHRpb25EaXNhYmxlZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENPTUJPQk9YX09QVElPTl9URU1QTEFURV9UT0tFTiB9IGZyb20gJy4uL2NvbWJvYm94LW9wdGlvbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBDT01CT0JPWF9TRUxFQ1RFRF9PUFRJT05fVEVNUExBVEVfVE9LRU4gfSBmcm9tICcuLi9jb21ib2JveC1zZWxlY3RlZC1vcHRpb24tdGVtcGxhdGUnO1xuXG5leHBvcnQgY29uc3QgQ09NQk9CT1hfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tYm9ib3hEaXJlY3RpdmU+KCdFVF9DT01CT0JPWF9JTlBVVF9UT0tFTicpO1xuXG5jb25zdCBDT01CT0JPWF9FUlJPUlMgPSB7XG4gIDE6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIG9iamVjdHMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgYmVpbmcgc2V0LicsXG4gIDI6ICdFeHBlY3RlZCBvcHRpb25zIHRvIGJlIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMuIFRoaXMgaXMgZHVlIHRvIFwiYmluZExhYmVsXCIgYW5kIFwiYmluZFZhbHVlXCIgbm90IGJlaW5nIHNldCBvciBcImFsbG93Q3VzdG9tVmFsdWVzXCIgYmVpbmcgc2V0IHRvIHRydWUuJyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNvbWJvYm94RXJyb3IgPSAoY29kZToga2V5b2YgdHlwZW9mIENPTUJPQk9YX0VSUk9SUywgZGF0YTogdW5rbm93bikgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gYDxldC1jb21ib2JveD46ICR7Q09NQk9CT1hfRVJST1JTW2NvZGVdfWA7XG5cbiAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihjb2RlLCBtZXNzYWdlLCBkYXRhKTtcbn07XG5cbmNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBmaXJzdCA9IHZhbHVlWzBdO1xuICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKCFmaXJzdCB8fCAhbGFzdCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0eXBlb2YgZmlyc3QgIT09ICdvYmplY3QnICYmIHR5cGVvZiBsYXN0ICE9PSAnb2JqZWN0Jztcbn07XG5cbmNvbnN0IGlzT2JqZWN0QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xuXG4gIGlmICghZmlyc3QgfHwgIWxhc3QpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCc7XG59O1xuXG5jb25zdCBpc0VtcHR5QXJyYXkgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBbXSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG59O1xuXG5jb25zdCBDb21ib2JveE9wdGlvblR5cGUgPSB7XG4gIFByaW1pdGl2ZTogJ3ByaW1pdGl2ZScsXG4gIE9iamVjdDogJ29iamVjdCcsXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgS2V5SGFuZGxlclJlc3VsdCB7XG4gIHNldEZpbHRlcj86IHN0cmluZztcbiAgb3ZlcmxheU9wZXJhdGlvbj86ICdvcGVuJyB8ICdjbG9zZSc7XG4gIG9wdGlvbkFjdGlvbj86XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdhZGQnO1xuICAgICAgICBvcHRpb246IHVua25vd247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZW1vdmUnO1xuICAgICAgICBvcHRpb246IHVua25vd247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd0b2dnbGUnO1xuICAgICAgICBvcHRpb246IHVua25vd247XG4gICAgICB9XG4gICAgfCAnY2xlYXInXG4gICAgfCAndG9nZ2xlQWxsJztcbn1cblxudHlwZSBUZW1wbGF0ZVJlZldpdGhPcHRpb24gPSBUZW1wbGF0ZVJlZjx7XG4gIG9wdGlvbjogdW5rbm93bjtcbn0+O1xuXG5mdW5jdGlvbiBhc3NldENvbWJvYm94Qm9keUNvbXBvbmVudFNldChcbiAgY29tcG9uZW50OiBDb21wb25lbnRUeXBlPEFuaW1hdGVkT3ZlcmxheUNvbXBvbmVudEJhc2U+IHwgbnVsbCxcbik6IGFzc2VydHMgY29tcG9uZW50IGlzIENvbXBvbmVudFR5cGU8QW5pbWF0ZWRPdmVybGF5Q29tcG9uZW50QmFzZT4ge1xuICBpZiAoIWNvbXBvbmVudCkge1xuICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoMSwgJ0NvbWJvYm94IGJvZHkgY29tcG9uZW50IGlzIG5vdCBzZXQnKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQ09NQk9CT1hfVE9LRU4sXG4gICAgICB1c2VFeGlzdGluZzogQ29tYm9ib3hEaXJlY3RpdmUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyNyZWdpb24gSW5qZWN0c1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gY3JlYXRlRGVzdHJveSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dCA9IGluamVjdChJTlBVVF9UT0tFTik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FuaW1hdGVkT3ZlcmxheSA9XG4gICAgaW5qZWN0PEFuaW1hdGVkT3ZlcmxheURpcmVjdGl2ZTxBbmltYXRlZE92ZXJsYXlDb21wb25lbnRCYXNlPj4oQW5pbWF0ZWRPdmVybGF5RGlyZWN0aXZlKTtcblxuICAvLyNyZWdpb24gSW5wdXRzXG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldEZpbHRlcmVkT3B0aW9ucygpO1xuICB9XG4gIHNldCBvcHRpb25zKHZhbHVlOiB1bmtub3duW10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRPcHRpb25zKHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBpbml0aWFsVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb24odmFsdWUpO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGZpbHRlckludGVybmFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJbnRlcm5hbCQudmFsdWU7XG4gIH1cbiAgc2V0IGZpbHRlckludGVybmFsKHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgdmFsID0gYm9vbGVhbkF0dHJpYnV0ZSh2YWx1ZSk7XG4gICAgdGhpcy5fZmlsdGVySW50ZXJuYWwkLm5leHQodmFsKTtcblxuICAgIGlmICghdmFsKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRGaWx0ZXIoJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZXRGaWx0ZXIodGhpcy5fY3VycmVudEZpbHRlcik7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2ZpbHRlckludGVybmFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC52YWx1ZTtcbiAgfVxuICBzZXQgbG9hZGluZyh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX2xvYWRpbmckLm5leHQoYm9vbGVhbkF0dHJpYnV0ZSh2YWx1ZSkpO1xuICB9XG4gIHByaXZhdGUgX2xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmckID0gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgQElucHV0KClcbiAgZ2V0IGVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLl9lcnJvciQudmFsdWU7XG4gIH1cbiAgc2V0IGVycm9yKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fZXJyb3IkLm5leHQodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bj4obnVsbCk7XG5cbiAgQElucHV0KClcbiAgZW1wdHlUZXh0ID0gJ05vIHJlc3VsdHMgZm91bmQnO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXIkLnZhbHVlO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNldEFsbG93TXVsdGlwbGUoYm9vbGVhbkF0dHJpYnV0ZSh2YWx1ZSkpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGJpbmRMYWJlbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNldExhYmVsQmluZGluZyh2YWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYmluZFZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0VmFsdWVCaW5kaW5nKHZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCBhbGxvd0N1c3RvbVZhbHVlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDdXN0b21WYWx1ZXMkLnZhbHVlO1xuICB9XG4gIHNldCBhbGxvd0N1c3RvbVZhbHVlcyh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX2FsbG93Q3VzdG9tVmFsdWVzJC5uZXh0KGJvb2xlYW5BdHRyaWJ1dGUodmFsdWUpKTtcbiAgfVxuICBwcml2YXRlIF9hbGxvd0N1c3RvbVZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gT3V0cHV0c1xuXG4gIEBPdXRwdXQoKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE1lbWJlcnNcblxuICBwcml2YXRlIGdldCBfY3VycmVudEZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEZpbHRlciQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudEZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIHByaXZhdGUgZ2V0IF9pc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQ7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNPcGVuJCA9IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50ZWQkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2ZVNlbGVjdGlvbk1vZGVsID0gbmV3IEFjdGl2ZVNlbGVjdGlvbk1vZGVsKCk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRPcHRpb25zJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbiQ7XG4gIHJlYWRvbmx5IG11bHRpcGxlJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmFsbG93TXVsdGlwbGUkO1xuICByZWFkb25seSBvcHRpb25zJCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmZpbHRlcmVkT3B0aW9ucyQ7XG4gIHJlYWRvbmx5IHJhd09wdGlvbnMkID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwub3B0aW9ucyQ7XG5cbiAgQENvbnRlbnRDaGlsZChDT01CT0JPWF9PUFRJT05fVEVNUExBVEVfVE9LRU4sIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgc2V0IG9wdGlvblRlbXBsYXRlKHZhbHVlOiBUZW1wbGF0ZVJlZldpdGhPcHRpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9vcHRpb25UZW1wbGF0ZSQubmV4dCh2YWx1ZSA/PyBudWxsKTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25UZW1wbGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRlbXBsYXRlUmVmV2l0aE9wdGlvbiB8IG51bGw+KG51bGwpO1xuXG4gIEBDb250ZW50Q2hpbGQoQ09NQk9CT1hfU0VMRUNURURfT1BUSU9OX1RFTVBMQVRFX1RPS0VOLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHNldCBzZWxlY3RlZE9wdGlvblRlbXBsYXRlKHZhbHVlOiBUZW1wbGF0ZVJlZldpdGhPcHRpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zZWxlY3RlZE9wdGlvblRlbXBsYXRlJC5uZXh0KHZhbHVlID8/IG51bGwpO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlbGVjdGVkT3B0aW9uVGVtcGxhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZW1wbGF0ZVJlZldpdGhPcHRpb24gfCBudWxsPihudWxsKTtcblxuICByZWFkb25seSBfYmluZGluZ3MgPSBjcmVhdGVSZWFjdGl2ZUJpbmRpbmdzKFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LWNvbWJvYm94LS1sb2FkaW5nJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2xvYWRpbmckLFxuICAgIH0sXG4gICAge1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtY29tYm9ib3gtLWVycm9yJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuX2Vycm9yJC5waXBlKG1hcCgodikgPT4gISF2KSksXG4gICAgfSxcbiAgICB7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC0tb3BlbicsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9pc09wZW4kLFxuICAgIH0sXG4gICAge1xuICAgICAgYXR0cmlidXRlOiAnY2xhc3MuZXQtc2VsZWN0LWZpZWxkLS1tdWx0aXBsZScsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLm11bHRpcGxlJCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZTogJ2NsYXNzLmV0LXNlbGVjdC1maWVsZC0tb3BlbicsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLl9pc09wZW4kLFxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBfY29tYm9ib3hCb2R5Q29tcG9uZW50OiBDb21wb25lbnRUeXBlPEFuaW1hdGVkT3ZlcmxheUNvbXBvbmVudEJhc2U+IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIENvbXB1dGVzXG5cbiAgcmVhZG9ubHkgY3VzdG9tT3B0aW9uVHBsJCA9IHRoaXMuX29wdGlvblRlbXBsYXRlJC5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY3VzdG9tU2VsZWN0ZWRPcHRpb25UcGwkID0gdGhpcy5fc2VsZWN0ZWRPcHRpb25UZW1wbGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMuX3NlbGVjdGlvbk1vZGVsKTtcblxuICAgIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5wbGFjZW1lbnQgPSAnYm90dG9tJztcbiAgICB0aGlzLl9hbmltYXRlZE92ZXJsYXkuZmFsbGJhY2tQbGFjZW1lbnRzID0gWydib3R0b20nLCAndG9wJ107XG4gICAgdGhpcy5fYW5pbWF0ZWRPdmVybGF5LmF1dG9SZXNpemUgPSB0cnVlO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdERpc3BhdGNoRmlsdGVyQ2hhbmdlcygpO1xuXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICB0aGlzLl9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC52YWx1ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5wdXQuX3VwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLl9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuX2lucHV0Lm5hdGl2ZUlucHV0UmVmJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgZmlsdGVyKChyZWYpID0+ICEhcmVmPy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fdXBkYXRlRmlsdGVyKHRoaXMuX2N1cnJlbnRGaWx0ZXIpKSxcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBQdWJsaWMgTWV0aG9kc1xuXG4gIHNldEJvZHlDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRUeXBlPEFuaW1hdGVkT3ZlcmxheUNvbXBvbmVudEJhc2U+KSB7XG4gICAgdGhpcy5fY29tYm9ib3hCb2R5Q29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9XG5cbiAgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldExhYmVsJChvcHRpb24pO1xuICB9XG5cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmdldFZhbHVlJChvcHRpb24pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcblxuICAgIHRoaXMuX2lucHV0Ll9tYXJrQXNUb3VjaGVkKCk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIGFzc2V0Q29tYm9ib3hCb2R5Q29tcG9uZW50U2V0KHRoaXMuX2NvbWJvYm94Qm9keUNvbXBvbmVudCk7XG5cbiAgICBpZiAodGhpcy5faXNPcGVuIHx8IHRoaXMuX2lucHV0LmRpc2FibGVkIHx8IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc01vdW50aW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9hbmltYXRlZE92ZXJsYXkubW91bnQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLl9jb21ib2JveEJvZHlDb21wb25lbnQsXG4gICAgICBtaXJyb3JXaWR0aDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICghdGhpcy5faXNPcGVuIHx8IHRoaXMuX2FuaW1hdGVkT3ZlcmxheS5pc1VubW91bnRpbmcpIHJldHVybjtcblxuICAgIHRoaXMuX2FuaW1hdGVkT3ZlcmxheS51bm1vdW50KCk7XG4gIH1cblxuICBzZWxlY3RJbnB1dEFuZE9wZW4oKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0LmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9pbnB1dC5uYXRpdmVJbnB1dFJlZj8uZWxlbWVudC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgIHRoaXMub3BlbigpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZUZyb21PcHRpb24ob3B0aW9uOiB1bmtub3duKSB7XG4gICAgdGhpcy5faW5wdXQuX21hcmtBc1RvdWNoZWQoKTtcblxuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hbGxvd011bHRpcGxlKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgdGhpcy5fc2V0RmlsdGVyRnJvbUlucHV0VmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBkYXRlRmlsdGVyKCcnKTtcbiAgICB9XG4gIH1cblxuICBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkJChvcHRpb24pO1xuICB9XG5cbiAgaXNPcHRpb25BY3RpdmUob3B0aW9uOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGVsLmFjdGl2ZU9wdGlvbiQucGlwZShtYXAoKGFjdGl2ZU9wdGlvbikgPT4gYWN0aXZlT3B0aW9uID09PSBvcHRpb24pKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBQcm90ZWN0ZWQgTWV0aG9kc1xuXG4gIF9wcm9jZXNzS2V5ZG93bkV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgY29uc3QgaXNPcGVuID0gdGhpcy5faXNPcGVuO1xuICAgIGNvbnN0IGlzTXVsdGlwbGUgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5hbGxvd011bHRpcGxlO1xuICAgIGNvbnN0IGNhbkFkZEN1c3RvbVZhbHVlID0gdGhpcy5hbGxvd0N1c3RvbVZhbHVlcztcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgY29uc3QgaGFzRmlsdGVyVmFsdWUgPSAhIXZhbHVlO1xuXG4gICAgY29uc3QgcmVzdWx0OiBLZXlIYW5kbGVyUmVzdWx0ID0ge307XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gRU5URVIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgLy8gVGhlIHVzZXIgdHlwZWQgYSBjdXN0b20gdmFsdWUgYW5kIHByZXNzZWQgZW50ZXIuIEFkZCBpdCB0byB0aGUgc2VsZWN0ZWQgb3B0aW9ucy5cbiAgICAgIC8vIEZJWE1FOiBDdXJyZW50bHkgaXQgaXMgaW1wb3NzaWJsZSB0byBzZWxlY3QgdGhlIGFjdGl2ZSBvcHRpb24gd2l0aCB0aGUga2V5Ym9hcmQgaWYgY2FuQWRkQ3VzdG9tVmFsdWUgaXMgdHJ1ZS5cbiAgICAgIC8vIFRvIGZpeCB0aGlzLCB0aGUgYWN0aXZlIG9wdGlvbiBzaG91bGQgYWxzbyBpbmNsdWRlIHRoZSBvcmlnaW4gaXQgZ290IGFjdGl2ZSBmcm9tIChrZXlib2FyZCBvciBwcm9ncmFtbWF0aWMpLlxuICAgICAgLy8gVGhlIFwidmFsdWVcIiBjaGFuZ2luZyBzaG91bGQgcHV0IHRoZSBjb21ib2JveCBpbnRvIGEgXCJ1c2UgdGhlIGN1c3RvbSBpbnB1dCBvbiBlbnRlclwiIG1vZGUuXG4gICAgICAvLyBUaGUgXCJhY3RpdmUgb3B0aW9uXCIgY2hhbmdpbmcgdmlhIGtleWJvYXJkIHNob3VsZCBwdXQgdGhlIGNvbWJvYm94IGludG8gYSBcInVzZSB0aGUgYWN0aXZlIG9wdGlvbiBvbiBlbnRlclwiIG1vZGUuXG4gICAgICBpZiAoY2FuQWRkQ3VzdG9tVmFsdWUgJiYgaGFzRmlsdGVyVmFsdWUpIHtcbiAgICAgICAgcmVzdWx0Lm9wdGlvbkFjdGlvbiA9IHsgdHlwZTogJ2FkZCcsIG9wdGlvbjogdmFsdWUgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGVsLmFjdGl2ZU9wdGlvbjtcblxuICAgICAgICBpZiAoYWN0aXZlT3B0aW9uKSB7XG4gICAgICAgICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25BY3Rpb24gPSB7IHR5cGU6ICd0b2dnbGUnLCBvcHRpb246IGFjdGl2ZU9wdGlvbiB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9uQWN0aW9uID0geyB0eXBlOiAnYWRkJywgb3B0aW9uOiBhY3RpdmVPcHRpb24gfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgICAgcmVzdWx0LnNldEZpbHRlciA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPSAnY2xvc2UnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5faW50ZXJwcmV0S2V5SGFuZGxlclJlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIGlmIChrZXlDb2RlID09PSBFU0NBUEUpIHtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgcmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPSAnY2xvc2UnO1xuICAgICAgfSBlbHNlIGlmICghaXNNdWx0aXBsZSkge1xuICAgICAgICByZXN1bHQuc2V0RmlsdGVyID0gJyc7XG4gICAgICAgIHJlc3VsdC5vcHRpb25BY3Rpb24gPSAnY2xlYXInO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5faW50ZXJwcmV0S2V5SGFuZGxlclJlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIGlmIChrZXlDb2RlID09PSBUQUIpIHtcbiAgICAgIHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID0gJ2Nsb3NlJztcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcnByZXRLZXlIYW5kbGVyUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc09wZW4pIHtcbiAgICAgIHJlc3VsdC5vdmVybGF5T3BlcmF0aW9uID0gJ29wZW4nO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGVsLmV2YWx1YXRlS2V5Ym9hcmRFdmVudChldmVudCk7XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gQSAmJiBldmVudC5jdHJsS2V5ICYmIGlzTXVsdGlwbGUpIHtcbiAgICAgIHJlc3VsdC5vcHRpb25BY3Rpb24gPSAndG9nZ2xlQWxsJztcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2ludGVycHJldEtleUhhbmRsZXJSZXN1bHQocmVzdWx0KTtcbiAgfVxuXG4gIF9wcm9jZXNzSW5wdXRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG5cbiAgICB0aGlzLl91cGRhdGVGaWx0ZXIodmFsdWUpO1xuICB9XG5cbiAgX2hhbmRsZUJsdXJFdmVudCgpIHtcbiAgICB0aGlzLl9pbnB1dC5fbWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuX2lucHV0Ll9zZXRTaG91bGREaXNwbGF5RXJyb3IodHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZSkge1xuICAgICAgdGhpcy5fdXBkYXRlRmlsdGVyKCcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY3VycmVudEZpbHRlciA9PT0gJycpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0ZWRPcHRpb25zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RmlsdGVyRnJvbUlucHV0VmFsdWUoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBQcml2YXRlIE1ldGhvZHNcblxuICBwcml2YXRlIF9pbml0RGlzcGF0Y2hGaWx0ZXJDaGFuZ2VzKCkge1xuICAgIHRoaXMuX2N1cnJlbnRGaWx0ZXIkXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcFdoaWxlKCgpID0+IHRoaXMuZmlsdGVySW50ZXJuYWwpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKCh2KSA9PiB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHYpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUZpbHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0Lm5hdGl2ZUlucHV0UmVmICYmIHRoaXMuX2lucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2lucHV0Lm5hdGl2ZUlucHV0UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jdXJyZW50RmlsdGVyID09PSB2YWx1ZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3VycmVudEZpbHRlciQubmV4dCh2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5maWx0ZXJJbnRlcm5hbCkge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2V0RmlsdGVyKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRGaWx0ZXJGcm9tSW5wdXRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwuYWxsb3dNdWx0aXBsZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9pbnB1dC52YWx1ZTtcblxuICAgIGlmICghdmFsdWUgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUZpbHRlcignJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuZ2V0T3B0aW9uQnlWYWx1ZSh2YWx1ZSk7XG5cbiAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5nZXRMYWJlbChvcHRpb24pO1xuXG4gICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIHRoaXMuX3VwZGF0ZUZpbHRlcihsYWJlbCk7XG4gIH1cblxuICBwcml2YXRlIF9pbnRlcnByZXRLZXlIYW5kbGVyUmVzdWx0KHJlc3VsdDogS2V5SGFuZGxlclJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQub3ZlcmxheU9wZXJhdGlvbiA9PT0gJ2Nsb3NlJykge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0Lm92ZXJsYXlPcGVyYXRpb24gPT09ICdvcGVuJykge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5zZXRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdXBkYXRlRmlsdGVyKHJlc3VsdC5zZXRGaWx0ZXIpO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQub3B0aW9uQWN0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdC5vcHRpb25BY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChyZXN1bHQub3B0aW9uQWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3RlZE9wdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQub3B0aW9uQWN0aW9uID09PSAndG9nZ2xlQWxsJykge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZUFsbFNlbGVjdGVkT3B0aW9ucygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHR5cGUsIG9wdGlvbiB9ID0gcmVzdWx0Lm9wdGlvbkFjdGlvbjtcblxuICAgICAgICBpZiAoaXNPcHRpb25EaXNhYmxlZChvcHRpb24pKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdhZGQnKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRPcHRpb24ob3B0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnJlbW92ZVNlbGVjdGVkT3B0aW9uKG9wdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGVTZWxlY3RlZE9wdGlvbihvcHRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIERldiBtb2RlXG5cbiAgcHJpdmF0ZSBfZGVidWdWYWxpZGF0ZUNvbWJvYm94Q29uZmlnKGlzUmV0cnkgPSBmYWxzZSkge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX3NlbGVjdGlvbk1vZGVsLmxhYmVsQmluZGluZyQsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnZhbHVlQmluZGluZyQsIHRoaXMuX2FsbG93Q3VzdG9tVmFsdWVzJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcChpc1JldHJ5ID8gMSA6IDApLCAvLyBTa2lwIGlmIHJldHJ5aW5nIHRvIGF2b2lkIGluZmluaXRlIGxvb3BcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICBtYXAoKFtiaW5kTGFiZWwsIGJpbmRWYWx1ZSwgYWxsb3dDdXN0b21WYWx1ZXNdKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkQmVPYmplY3RzID0gYmluZExhYmVsICYmIGJpbmRWYWx1ZSAmJiAhYWxsb3dDdXN0b21WYWx1ZXM7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkQmVPYmplY3RzKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tYm9ib3hPcHRpb25UeXBlLk9iamVjdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gQ29tYm9ib3hPcHRpb25UeXBlLlByaW1pdGl2ZTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoZXhwZWN0ZWRPcHRpb25UeXBlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLm9wdGlvbnM7XG5cbiAgICAgICAgICBpZiAoaXNFbXB0eUFycmF5KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkT3B0aW9uVHlwZSA9PT0gQ29tYm9ib3hPcHRpb25UeXBlLk9iamVjdCkge1xuICAgICAgICAgICAgaWYgKCFpc09iamVjdEFycmF5KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgIHRocm93IGNvbWJvYm94RXJyb3IoMSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZE9wdGlvblR5cGUgPT09IENvbWJvYm94T3B0aW9uVHlwZS5QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGlmICghaXNQcmltaXRpdmVBcnJheShvcHRpb25zKSkge1xuICAgICAgICAgICAgICB0aHJvdyBjb21ib2JveEVycm9yKDIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGUpID0+IHtcbiAgICAgICAgICB0aGlzLl9kZWJ1Z1ZhbGlkYXRlQ29tYm9ib3hDb25maWcodHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZSk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXNzZXRCb2R5Q29tcG9uZW50KCkge1xuICAgIGlmICghdGhpcy5fY29tYm9ib3hCb2R5Q29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKDEsICdDb21ib2JveCBib2R5IGNvbXBvbmVudCBpcyBub3Qgc2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './public-api';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9kaXJlY3RpdmVzL2NvbWJvYm94LW9wdGlvbi10ZW1wbGF0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './public-api';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9kaXJlY3RpdmVzL2NvbWJvYm94LXNlbGVjdGVkLW9wdGlvbi10ZW1wbGF0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|
|
@@ -2,7 +2,7 @@ import { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
|
2
2
|
import { ChangeDetectionStrategy, Component, InjectionToken, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
|
|
3
3
|
import { ANIMATED_LIFECYCLE_TOKEN, AnimatedLifecycleDirective, ClickOutsideDirective, LetDirective, createDestroy, createReactiveBindings, } from '@ethlete/core';
|
|
4
4
|
import { takeUntil, tap } from 'rxjs';
|
|
5
|
-
import { COMBOBOX_TOKEN } from '../../
|
|
5
|
+
import { COMBOBOX_TOKEN } from '../../directives';
|
|
6
6
|
import { ComboboxOptionComponent } from '../combobox-option';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "@ethlete/core";
|
|
@@ -56,4 +56,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
|
|
|
56
56
|
type: ViewChild,
|
|
57
57
|
args: [ANIMATED_LIFECYCLE_TOKEN, { static: true }]
|
|
58
58
|
}] } });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3gtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvY29tcG9uZW50cy9zZWxlY3QvY29tcG9uZW50cy9jb21ib2JveC9wYXJ0aWFscy9jb21ib2JveC1ib2R5L2NvbWJvYm94LWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jZGsvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm1zL2NvbXBvbmVudHMvc2VsZWN0L2NvbXBvbmVudHMvY29tYm9ib3gvcGFydGlhbHMvY29tYm9ib3gtYm9keS9jb21ib2JveC1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULGNBQWMsRUFHZCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLGFBQWEsRUFDYixzQkFBc0IsR0FDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFFN0QsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQXdCLHdCQUF3QixDQUFDLENBQUM7QUE0QnZHLE1BQU0sT0FBTyxxQkFBcUI7SUExQmxDO1FBMkJtQixjQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM1QyxhQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBSzVDLGNBQVMsR0FBRyxzQkFBc0IsQ0FDekM7WUFDRSxTQUFTLEVBQUUsaUNBQWlDO1lBQzVDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7U0FDbkMsRUFDRDtZQUNFLFNBQVMsRUFBRSxrQ0FBa0M7WUFDN0MsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztTQUNwQyxDQUNGLENBQUM7UUFFRixrQkFBYSxHQUFnQyxJQUFJLENBQUM7S0FVbkQ7SUFSQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjO2FBQzlCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN6QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUNqQzthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7OEdBNUJVLHFCQUFxQjtrR0FBckIscUJBQXFCLHVJQVByQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxtQkFBbUI7Z0JBQzVCLFdBQVcsRUFBRSxxQkFBcUI7YUFDbkM7U0FDRiw4RUFPVSx3QkFBd0IseUhDeERyQyw0WkFRQSw0Q0Q0QkksS0FBSyxtSEFDTCx1QkFBdUIsbUZBQ3ZCLFlBQVksa0VBQ1osU0FBUyw4Q0FDVCwwQkFBMEIscUdBQzFCLElBQUk7OzJGQVVLLHFCQUFxQjtrQkExQmpDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBRWhCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSixLQUFLLEVBQUUsNENBQTRDO3FCQUNwRCxXQUNRO3dCQUNQLGdCQUFnQjt3QkFDaEIsS0FBSzt3QkFDTCx1QkFBdUI7d0JBQ3ZCLFlBQVk7d0JBQ1osU0FBUzt3QkFDVCwwQkFBMEI7d0JBQzFCLElBQUk7cUJBQ0wsa0JBQ2UsQ0FBQyxxQkFBcUIsQ0FBQyxhQUM1Qjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLHVCQUF1Qjt5QkFDbkM7cUJBQ0Y7OEJBUVEsa0JBQWtCO3NCQUQxQixTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdGb3IsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBTklNQVRFRF9MSUZFQ1lDTEVfVE9LRU4sXG4gIEFuaW1hdGVkTGlmZWN5Y2xlRGlyZWN0aXZlLFxuICBDbGlja091dHNpZGVEaXJlY3RpdmUsXG4gIExldERpcmVjdGl2ZSxcbiAgY3JlYXRlRGVzdHJveSxcbiAgY3JlYXRlUmVhY3RpdmVCaW5kaW5ncyxcbn0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ09NQk9CT1hfVE9LRU4gfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7IENvbWJvYm94T3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tYm9ib3gtb3B0aW9uJztcblxuZXhwb3J0IGNvbnN0IENPTUJPQk9YX0JPRFlfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48Q29tYm9ib3hCb2R5Q29tcG9uZW50PignRVRfQ09NQk9CT1hfQk9EWV9UT0tFTicpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1jb21ib2JveC1ib2R5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbWJvYm94LWJvZHkuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZXQtY29tYm9ib3gtYm9keSBldC13aXRoLWRlZmF1bHQtYW5pbWF0aW9uJyxcbiAgfSxcbiAgaW1wb3J0czogW1xuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdGb3IsXG4gICAgQ29tYm9ib3hPcHRpb25Db21wb25lbnQsXG4gICAgTGV0RGlyZWN0aXZlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBBbmltYXRlZExpZmVjeWNsZURpcmVjdGl2ZSxcbiAgICBOZ0lmLFxuICBdLFxuICBob3N0RGlyZWN0aXZlczogW0NsaWNrT3V0c2lkZURpcmVjdGl2ZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENPTUJPQk9YX0JPRFlfVE9LRU4sXG4gICAgICB1c2VFeGlzdGluZzogQ29tYm9ib3hCb2R5Q29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Qm9keUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gY3JlYXRlRGVzdHJveSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja091dHNpZGUgPSBpbmplY3QoQ2xpY2tPdXRzaWRlRGlyZWN0aXZlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbWJvYm94ID0gaW5qZWN0KENPTUJPQk9YX1RPS0VOKTtcblxuICBAVmlld0NoaWxkKEFOSU1BVEVEX0xJRkVDWUNMRV9UT0tFTiwgeyBzdGF0aWM6IHRydWUgfSlcbiAgcmVhZG9ubHkgX2FuaW1hdGVkTGlmZWN5Y2xlPzogQW5pbWF0ZWRMaWZlY3ljbGVEaXJlY3RpdmU7XG5cbiAgcmVhZG9ubHkgX2JpbmRpbmdzID0gY3JlYXRlUmVhY3RpdmVCaW5kaW5ncyhcbiAgICB7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC1ib2R5LS1sb2FkaW5nJyxcbiAgICAgIG9ic2VydmFibGU6IHRoaXMuY29tYm9ib3gubG9hZGluZyQsXG4gICAgfSxcbiAgICB7XG4gICAgICBhdHRyaWJ1dGU6ICdjbGFzcy5ldC1jb21ib2JveC1ib2R5LS1tdWx0aXBsZScsXG4gICAgICBvYnNlcnZhYmxlOiB0aGlzLmNvbWJvYm94Lm11bHRpcGxlJCxcbiAgICB9LFxuICApO1xuXG4gIF9ib2R5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xpY2tPdXRzaWRlLmV0Q2xpY2tPdXRzaWRlXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuY29tYm9ib3guY2xvc2UoKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL3VzZS10cmFjay1ieS1mdW5jdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJldC1jb21ib2JveC1ib2R5LWNvbnRhaW5lclwiIGV0QW5pbWF0ZWRMaWZlY3ljbGU+XG4gIDxuZy1jb250YWluZXIgKmV0TGV0PVwiY29tYm9ib3gub3B0aW9ucyQgfCBhc3luYyBhcyBvcHRpb25zXCI+XG4gICAgPHAgKm5nSWY9XCIhb3B0aW9ucz8ubGVuZ3RoXCIgY2xhc3M9XCJldC1jb21ib2JveC1ib2R5LS1lbXB0eVwiPnt7IGNvbWJvYm94LmVtcHR5VGV4dCB9fTwvcD5cblxuICAgIDxldC1jb21ib2JveC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgW29wdGlvbl09XCJvcHRpb25cIiAvPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
|