@angular/cdk-experimental 14.0.0-rc.2 → 14.1.0-next.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/esm2020/listbox/listbox.mjs +565 -314
- package/esm2020/version.mjs +1 -1
- package/fesm2015/cdk-experimental.mjs +1 -1
- package/fesm2015/cdk-experimental.mjs.map +1 -1
- package/fesm2015/listbox.mjs +569 -321
- package/fesm2015/listbox.mjs.map +1 -1
- package/fesm2020/cdk-experimental.mjs +1 -1
- package/fesm2020/cdk-experimental.mjs.map +1 -1
- package/fesm2020/listbox.mjs +566 -314
- package/fesm2020/listbox.mjs.map +1 -1
- package/listbox/index.d.ts +267 -131
- package/package.json +3 -3
|
@@ -5,128 +5,127 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
|
-
import { ContentChildren, Directive, ElementRef,
|
|
8
|
+
import { ChangeDetectorRef, ContentChildren, Directive, ElementRef, forwardRef, inject, InjectFlags, Input, Output, QueryList, } from '@angular/core';
|
|
9
9
|
import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';
|
|
10
10
|
import { DOWN_ARROW, ENTER, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW } from '@angular/cdk/keycodes';
|
|
11
11
|
import { coerceArray, coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
12
12
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
13
|
-
import { defer, merge, Subject } from 'rxjs';
|
|
14
|
-
import { startWith, switchMap, takeUntil } from 'rxjs/operators';
|
|
15
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
13
|
+
import { BehaviorSubject, combineLatest, defer, merge, Subject } from 'rxjs';
|
|
14
|
+
import { filter, mapTo, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
|
|
15
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators, } from '@angular/forms';
|
|
16
16
|
import { Directionality } from '@angular/cdk/bidi';
|
|
17
|
-
import {
|
|
17
|
+
import { CdkCombobox } from '@angular/cdk-experimental/combobox';
|
|
18
18
|
import * as i0 from "@angular/core";
|
|
19
|
-
|
|
20
|
-
import * as i2 from "@angular/cdk-experimental/combobox";
|
|
19
|
+
/** The next id to use for creating unique DOM IDs. */
|
|
21
20
|
let nextId = 0;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
multi: true,
|
|
27
|
-
};
|
|
21
|
+
// TODO(mmalerba):
|
|
22
|
+
// - should listbox wrap be configurable?
|
|
23
|
+
// - should skipping disabled options be configurable?
|
|
24
|
+
/** A selectable option in a listbox. */
|
|
28
25
|
export class CdkOption {
|
|
29
|
-
constructor(
|
|
30
|
-
this.
|
|
31
|
-
this.listbox = listbox;
|
|
32
|
-
this._selected = false;
|
|
26
|
+
constructor() {
|
|
27
|
+
this._generatedId = `cdk-option-${nextId++}`;
|
|
33
28
|
this._disabled = false;
|
|
29
|
+
/** The option's host element */
|
|
30
|
+
this.element = inject(ElementRef).nativeElement;
|
|
31
|
+
/** The parent listbox this option belongs to. */
|
|
32
|
+
this.listbox = inject(CdkListbox);
|
|
33
|
+
/** Emits when the option is destroyed. */
|
|
34
|
+
this.destroyed = new Subject();
|
|
35
|
+
/** Emits when the option is clicked. */
|
|
36
|
+
this._clicked = new Subject();
|
|
37
|
+
/** Whether the option is currently active. */
|
|
34
38
|
this._active = false;
|
|
35
|
-
/** The id of the option, set to a uniqueid if the user does not provide one. */
|
|
36
|
-
this.id = `cdk-option-${nextId++}`;
|
|
37
|
-
this.selectionChange = new EventEmitter();
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
/** The id of the option's host element. */
|
|
41
|
+
get id() {
|
|
42
|
+
return this._id || this._generatedId;
|
|
41
43
|
}
|
|
42
|
-
set
|
|
43
|
-
|
|
44
|
-
this._selected = coerceBooleanProperty(value);
|
|
45
|
-
}
|
|
44
|
+
set id(value) {
|
|
45
|
+
this._id = value;
|
|
46
46
|
}
|
|
47
|
+
/** Whether this option is disabled. */
|
|
47
48
|
get disabled() {
|
|
48
|
-
return this._disabled;
|
|
49
|
+
return this.listbox.disabled || this._disabled;
|
|
49
50
|
}
|
|
50
51
|
set disabled(value) {
|
|
51
52
|
this._disabled = coerceBooleanProperty(value);
|
|
52
53
|
}
|
|
53
|
-
/** The
|
|
54
|
-
get
|
|
55
|
-
return this.
|
|
54
|
+
/** The tabindex of the option when it is enabled. */
|
|
55
|
+
get enabledTabIndex() {
|
|
56
|
+
return this._enabledTabIndex === undefined
|
|
57
|
+
? this.listbox.enabledTabIndex
|
|
58
|
+
: this._enabledTabIndex;
|
|
56
59
|
}
|
|
57
|
-
set
|
|
58
|
-
|
|
59
|
-
this.deselect();
|
|
60
|
-
}
|
|
61
|
-
this._value = value;
|
|
60
|
+
set enabledTabIndex(value) {
|
|
61
|
+
this._enabledTabIndex = value;
|
|
62
62
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
this.selected = !this.selected;
|
|
67
|
-
this._emitSelectionChange(true);
|
|
68
|
-
}
|
|
63
|
+
ngOnDestroy() {
|
|
64
|
+
this.destroyed.next();
|
|
65
|
+
this.destroyed.complete();
|
|
69
66
|
}
|
|
70
|
-
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
this._active = true;
|
|
74
|
-
}
|
|
67
|
+
/** Whether this option is selected. */
|
|
68
|
+
isSelected() {
|
|
69
|
+
return this.listbox.isSelected(this.value);
|
|
75
70
|
}
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
this._active = false;
|
|
80
|
-
}
|
|
71
|
+
/** Whether this option is active. */
|
|
72
|
+
isActive() {
|
|
73
|
+
return this._active;
|
|
81
74
|
}
|
|
82
|
-
/**
|
|
75
|
+
/** Toggle the selected state of this option. */
|
|
76
|
+
toggle() {
|
|
77
|
+
this.listbox.toggle(this);
|
|
78
|
+
}
|
|
79
|
+
/** Select this option if it is not selected. */
|
|
83
80
|
select() {
|
|
84
|
-
|
|
85
|
-
this.selected = true;
|
|
86
|
-
this._emitSelectionChange();
|
|
87
|
-
}
|
|
81
|
+
this.listbox.select(this);
|
|
88
82
|
}
|
|
89
|
-
/**
|
|
83
|
+
/** Deselect this option if it is selected. */
|
|
90
84
|
deselect() {
|
|
91
|
-
|
|
92
|
-
this.selected = false;
|
|
93
|
-
this._emitSelectionChange();
|
|
94
|
-
}
|
|
85
|
+
this.listbox.deselect(this);
|
|
95
86
|
}
|
|
96
|
-
/**
|
|
87
|
+
/** Focus this option. */
|
|
97
88
|
focus() {
|
|
98
|
-
this.
|
|
99
|
-
}
|
|
100
|
-
/** Returns true if the option or listbox are disabled, and false otherwise. */
|
|
101
|
-
_isInteractionDisabled() {
|
|
102
|
-
return this.listbox.disabled || this._disabled;
|
|
103
|
-
}
|
|
104
|
-
/** Emits a change event extending the Option Selection Change Event interface. */
|
|
105
|
-
_emitSelectionChange(isUserInput = false) {
|
|
106
|
-
this.selectionChange.emit({
|
|
107
|
-
source: this,
|
|
108
|
-
isUserInput: isUserInput,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
/** Returns the tab index which depends on the disabled property. */
|
|
112
|
-
_getTabIndex() {
|
|
113
|
-
return this._isInteractionDisabled() ? null : '-1';
|
|
89
|
+
this.element.focus();
|
|
114
90
|
}
|
|
115
91
|
/** Get the label for this element which is required by the FocusableOption interface. */
|
|
116
92
|
getLabel() {
|
|
117
|
-
return (this.
|
|
93
|
+
return (this.typeaheadLabel ?? this.element.textContent?.trim()) || '';
|
|
118
94
|
}
|
|
119
|
-
/**
|
|
95
|
+
/**
|
|
96
|
+
* Set the option as active.
|
|
97
|
+
* @docs-private
|
|
98
|
+
*/
|
|
120
99
|
setActiveStyles() {
|
|
121
100
|
this._active = true;
|
|
122
101
|
}
|
|
123
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* Set the option as inactive.
|
|
104
|
+
* @docs-private
|
|
105
|
+
*/
|
|
124
106
|
setInactiveStyles() {
|
|
125
107
|
this._active = false;
|
|
126
108
|
}
|
|
109
|
+
/** Handle focus events on the option. */
|
|
110
|
+
_handleFocus() {
|
|
111
|
+
// Options can wind up getting focused in active descendant mode if the user clicks on them.
|
|
112
|
+
// In this case, we push focus back to the parent listbox to prevent an extra tab stop when
|
|
113
|
+
// the user performs a shift+tab.
|
|
114
|
+
if (this.listbox.useActiveDescendant) {
|
|
115
|
+
this.listbox._setActiveOption(this);
|
|
116
|
+
this.listbox.focus();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Get the tabindex for this option. */
|
|
120
|
+
_getTabIndex() {
|
|
121
|
+
if (this.listbox.useActiveDescendant || this.disabled) {
|
|
122
|
+
return -1;
|
|
123
|
+
}
|
|
124
|
+
return this.isActive() ? this.enabledTabIndex : -1;
|
|
125
|
+
}
|
|
127
126
|
}
|
|
128
|
-
CdkOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: CdkOption, deps: [
|
|
129
|
-
CdkOption.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.0-rc.1", type: CdkOption, selector: "[cdkOption]", inputs: { id: "id",
|
|
127
|
+
CdkOption.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: CdkOption, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
128
|
+
CdkOption.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.0-rc.1", type: CdkOption, selector: "[cdkOption]", inputs: { id: "id", value: ["cdkOption", "value"], typeaheadLabel: ["cdkOptionTypeaheadLabel", "typeaheadLabel"], disabled: ["cdkOptionDisabled", "disabled"], enabledTabIndex: ["tabindex", "enabledTabIndex"] }, host: { attributes: { "role": "option" }, listeners: { "click": "_clicked.next()", "focus": "_handleFocus()" }, properties: { "id": "id", "attr.aria-selected": "isSelected() || null", "attr.tabindex": "_getTabIndex()", "attr.aria-disabled": "disabled", "class.cdk-option-disabled": "disabled", "class.cdk-option-active": "isActive()", "class.cdk-option-selected": "isSelected()" }, classAttribute: "cdk-option" }, exportAs: ["cdkOption"], ngImport: i0 });
|
|
130
129
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: CdkOption, decorators: [{
|
|
131
130
|
type: Directive,
|
|
132
131
|
args: [{
|
|
@@ -135,70 +134,134 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-rc.1", ng
|
|
|
135
134
|
host: {
|
|
136
135
|
'role': 'option',
|
|
137
136
|
'class': 'cdk-option',
|
|
138
|
-
'(click)': 'toggle()',
|
|
139
|
-
'(focus)': 'activate()',
|
|
140
|
-
'(blur)': 'deactivate()',
|
|
141
137
|
'[id]': 'id',
|
|
142
|
-
'[attr.aria-selected]': '
|
|
138
|
+
'[attr.aria-selected]': 'isSelected() || null',
|
|
143
139
|
'[attr.tabindex]': '_getTabIndex()',
|
|
144
|
-
'[attr.aria-disabled]': '
|
|
145
|
-
'[class.cdk-option-disabled]': '
|
|
146
|
-
'[class.cdk-option-active]': '
|
|
147
|
-
'[class.cdk-option-selected]': '
|
|
140
|
+
'[attr.aria-disabled]': 'disabled',
|
|
141
|
+
'[class.cdk-option-disabled]': 'disabled',
|
|
142
|
+
'[class.cdk-option-active]': 'isActive()',
|
|
143
|
+
'[class.cdk-option-selected]': 'isSelected()',
|
|
144
|
+
'(click)': '_clicked.next()',
|
|
145
|
+
'(focus)': '_handleFocus()',
|
|
148
146
|
},
|
|
149
147
|
}]
|
|
150
|
-
}],
|
|
151
|
-
type: Inject,
|
|
152
|
-
args: [forwardRef(() => CdkListbox)]
|
|
153
|
-
}] }]; }, propDecorators: { id: [{
|
|
154
|
-
type: Input
|
|
155
|
-
}], selected: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], disabled: [{
|
|
148
|
+
}], propDecorators: { id: [{
|
|
158
149
|
type: Input
|
|
159
150
|
}], value: [{
|
|
160
|
-
type: Input
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
151
|
+
type: Input,
|
|
152
|
+
args: ['cdkOption']
|
|
153
|
+
}], typeaheadLabel: [{
|
|
154
|
+
type: Input,
|
|
155
|
+
args: ['cdkOptionTypeaheadLabel']
|
|
156
|
+
}], disabled: [{
|
|
157
|
+
type: Input,
|
|
158
|
+
args: ['cdkOptionDisabled']
|
|
159
|
+
}], enabledTabIndex: [{
|
|
160
|
+
type: Input,
|
|
161
|
+
args: ['tabindex']
|
|
165
162
|
}] } });
|
|
166
163
|
export class CdkListbox {
|
|
167
|
-
constructor(
|
|
168
|
-
this.
|
|
169
|
-
this._dir = _dir;
|
|
170
|
-
this._tabIndex = 0;
|
|
171
|
-
/** `View -> model callback called when select has been touched` */
|
|
172
|
-
this._onTouched = () => { };
|
|
173
|
-
/** `View -> model callback called when value changes` */
|
|
174
|
-
this._onChange = () => { };
|
|
175
|
-
this.optionSelectionChanges = defer(() => {
|
|
176
|
-
const options = this._options;
|
|
177
|
-
return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.selectionChange))));
|
|
178
|
-
});
|
|
179
|
-
this._disabled = false;
|
|
164
|
+
constructor() {
|
|
165
|
+
this._generatedId = `cdk-listbox-${nextId++}`;
|
|
180
166
|
this._multiple = false;
|
|
167
|
+
this._disabled = false;
|
|
181
168
|
this._useActiveDescendant = false;
|
|
182
|
-
|
|
183
|
-
this._destroyed = new Subject();
|
|
184
|
-
this.selectionChange = new EventEmitter();
|
|
185
|
-
this.id = `cdk-listbox-${listboxId++}`;
|
|
186
|
-
/** Determines the orientation for the list key manager. Affects keyboard interaction. */
|
|
169
|
+
/** The orientation of the listbox. Only affects keyboard interaction, not visual layout. */
|
|
187
170
|
this.orientation = 'vertical';
|
|
188
|
-
|
|
171
|
+
/** Emits when the selected value(s) in the listbox change. */
|
|
172
|
+
this.valueChange = new Subject();
|
|
173
|
+
// TODO(mmalerba): Refactor SelectionModel so that its not necessary to create new instances
|
|
174
|
+
/** The selection model used by the listbox. */
|
|
175
|
+
this.selectionModelSubject = new BehaviorSubject(new SelectionModel(this.multiple, [], true, this._compareWith));
|
|
176
|
+
/** Emits when the listbox is destroyed. */
|
|
177
|
+
this.destroyed = new Subject();
|
|
178
|
+
/** The host element of the listbox. */
|
|
179
|
+
this.element = inject(ElementRef).nativeElement;
|
|
180
|
+
/** The change detector for this listbox. */
|
|
181
|
+
this.changeDetectorRef = inject(ChangeDetectorRef);
|
|
182
|
+
/** Callback called when the listbox has been touched */
|
|
183
|
+
this._onTouched = () => { };
|
|
184
|
+
/** Callback called when the listbox value changes */
|
|
185
|
+
this._onChange = () => { };
|
|
186
|
+
/** Callback called when the form validator changes. */
|
|
187
|
+
this._onValidatorChange = () => { };
|
|
188
|
+
/** Emits when an option has been clicked. */
|
|
189
|
+
this._optionClicked = defer(() => this.options.changes.pipe(startWith(this.options), switchMap(options => merge(...options.map(option => option._clicked.pipe(mapTo(option)))))));
|
|
190
|
+
/** The directionality of the page. */
|
|
191
|
+
this._dir = inject(Directionality, InjectFlags.Optional);
|
|
192
|
+
// TODO(mmalerba): Should not depend on combobox
|
|
193
|
+
this._combobox = inject(CdkCombobox, InjectFlags.Optional);
|
|
194
|
+
/**
|
|
195
|
+
* Validator that produces an error if multiple values are selected in a single selection
|
|
196
|
+
* listbox.
|
|
197
|
+
* @param control The control to validate
|
|
198
|
+
* @return A validation error or null
|
|
199
|
+
*/
|
|
200
|
+
this._validateMultipleValues = (control) => {
|
|
201
|
+
const controlValue = this._coerceValue(control.value);
|
|
202
|
+
if (!this.multiple && controlValue.length > 1) {
|
|
203
|
+
return { 'cdkListboxMultipleValues': true };
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Validator that produces an error if any selected values are not valid options for this listbox.
|
|
209
|
+
* @param control The control to validate
|
|
210
|
+
* @return A validation error or null
|
|
211
|
+
*/
|
|
212
|
+
this._validateInvalidValues = (control) => {
|
|
213
|
+
const controlValue = this._coerceValue(control.value);
|
|
214
|
+
const invalidValues = this._getValuesWithValidity(controlValue, false);
|
|
215
|
+
if (invalidValues.length) {
|
|
216
|
+
return { 'cdkListboxInvalidValues': { 'values': invalidValues } };
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
};
|
|
220
|
+
/** The combined set of validators for this listbox. */
|
|
221
|
+
this._validators = Validators.compose([
|
|
222
|
+
this._validateMultipleValues,
|
|
223
|
+
this._validateInvalidValues,
|
|
224
|
+
]);
|
|
225
|
+
this.selectionModelSubject
|
|
226
|
+
.pipe(switchMap(selectionModel => selectionModel.changed), takeUntil(this.destroyed))
|
|
227
|
+
.subscribe(() => {
|
|
228
|
+
this._updateInternalValue();
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/** The id of the option's host element. */
|
|
232
|
+
get id() {
|
|
233
|
+
return this._id || this._generatedId;
|
|
234
|
+
}
|
|
235
|
+
set id(value) {
|
|
236
|
+
this._id = value;
|
|
237
|
+
}
|
|
238
|
+
/** The tabindex to use when the listbox is enabled. */
|
|
239
|
+
get enabledTabIndex() {
|
|
240
|
+
return this._enabledTabIndex === undefined ? 0 : this._enabledTabIndex;
|
|
241
|
+
}
|
|
242
|
+
set enabledTabIndex(value) {
|
|
243
|
+
this._enabledTabIndex = value;
|
|
244
|
+
}
|
|
245
|
+
/** The value selected in the listbox, represented as an array of option values. */
|
|
246
|
+
get value() {
|
|
247
|
+
return this.selectionModel().selected;
|
|
248
|
+
}
|
|
249
|
+
set value(value) {
|
|
250
|
+
this._setSelection(value);
|
|
189
251
|
}
|
|
190
252
|
/**
|
|
191
|
-
* Whether the listbox allows multiple options to be selected.
|
|
192
|
-
*
|
|
253
|
+
* Whether the listbox allows multiple options to be selected. If the value switches from `true`
|
|
254
|
+
* to `false`, and more than one option is selected, all options are deselected.
|
|
193
255
|
*/
|
|
194
256
|
get multiple() {
|
|
195
257
|
return this._multiple;
|
|
196
258
|
}
|
|
197
259
|
set multiple(value) {
|
|
198
|
-
|
|
199
|
-
this.
|
|
200
|
-
this.
|
|
260
|
+
this._multiple = coerceBooleanProperty(value);
|
|
261
|
+
this._updateSelectionModel();
|
|
262
|
+
this._onValidatorChange();
|
|
201
263
|
}
|
|
264
|
+
/** Whether the listbox is disabled. */
|
|
202
265
|
get disabled() {
|
|
203
266
|
return this._disabled;
|
|
204
267
|
}
|
|
@@ -212,226 +275,400 @@ export class CdkListbox {
|
|
|
212
275
|
set useActiveDescendant(shouldUseActiveDescendant) {
|
|
213
276
|
this._useActiveDescendant = coerceBooleanProperty(shouldUseActiveDescendant);
|
|
214
277
|
}
|
|
215
|
-
/**
|
|
216
|
-
get
|
|
217
|
-
return this.
|
|
278
|
+
/** The function used to compare option values. */
|
|
279
|
+
get compareWith() {
|
|
280
|
+
return this._compareWith;
|
|
218
281
|
}
|
|
219
|
-
set
|
|
220
|
-
this.
|
|
221
|
-
|
|
222
|
-
ngOnInit() {
|
|
223
|
-
this._selectionModel = new SelectionModel(this.multiple);
|
|
282
|
+
set compareWith(fn) {
|
|
283
|
+
this._compareWith = fn;
|
|
284
|
+
this._updateSelectionModel();
|
|
224
285
|
}
|
|
225
286
|
ngAfterContentInit() {
|
|
287
|
+
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
288
|
+
this._verifyNoOptionValueCollisions();
|
|
289
|
+
}
|
|
226
290
|
this._initKeyManager();
|
|
227
|
-
this._initSelectionModel();
|
|
228
291
|
this._combobox?._registerContent(this.id, 'listbox');
|
|
229
|
-
this.
|
|
230
|
-
this.
|
|
231
|
-
this.
|
|
232
|
-
this.setActiveOption(event.source);
|
|
233
|
-
this._updatePanelForSelection(event.source);
|
|
292
|
+
this.options.changes.pipe(takeUntil(this.destroyed)).subscribe(() => {
|
|
293
|
+
this._updateInternalValue();
|
|
294
|
+
this._onValidatorChange();
|
|
234
295
|
});
|
|
296
|
+
this._optionClicked
|
|
297
|
+
.pipe(filter(option => !option.disabled), takeUntil(this.destroyed))
|
|
298
|
+
.subscribe(option => this._handleOptionClicked(option));
|
|
235
299
|
}
|
|
236
300
|
ngOnDestroy() {
|
|
237
|
-
this.
|
|
238
|
-
this.
|
|
239
|
-
this.
|
|
301
|
+
this.listKeyManager.change.complete();
|
|
302
|
+
this.destroyed.next();
|
|
303
|
+
this.destroyed.complete();
|
|
240
304
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
305
|
+
/**
|
|
306
|
+
* Toggle the selected state of the given option.
|
|
307
|
+
* @param option The option to toggle
|
|
308
|
+
*/
|
|
309
|
+
toggle(option) {
|
|
310
|
+
this.toggleValue(option.value);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Toggle the selected state of the given value.
|
|
314
|
+
* @param value The value to toggle
|
|
315
|
+
*/
|
|
316
|
+
toggleValue(value) {
|
|
317
|
+
this.selectionModel().toggle(value);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Select the given option.
|
|
321
|
+
* @param option The option to select
|
|
322
|
+
*/
|
|
323
|
+
select(option) {
|
|
324
|
+
this.selectValue(option.value);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Select the given value.
|
|
328
|
+
* @param value The value to select
|
|
329
|
+
*/
|
|
330
|
+
selectValue(value) {
|
|
331
|
+
this.selectionModel().select(value);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Deselect the given option.
|
|
335
|
+
* @param option The option to deselect
|
|
336
|
+
*/
|
|
337
|
+
deselect(option) {
|
|
338
|
+
this.deselectValue(option.value);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Deselect the given value.
|
|
342
|
+
* @param value The value to deselect
|
|
343
|
+
*/
|
|
344
|
+
deselectValue(value) {
|
|
345
|
+
this.selectionModel().deselect(value);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Set the selected state of all options.
|
|
349
|
+
* @param isSelected The new selected state to set
|
|
350
|
+
*/
|
|
351
|
+
setAllSelected(isSelected) {
|
|
352
|
+
if (!isSelected) {
|
|
353
|
+
this.selectionModel().clear();
|
|
249
354
|
}
|
|
250
355
|
else {
|
|
251
|
-
this.
|
|
356
|
+
this.selectionModel().select(...this.options.toArray().map(option => option.value));
|
|
252
357
|
}
|
|
253
|
-
this._listKeyManager.change.pipe(takeUntil(this._destroyed)).subscribe(() => {
|
|
254
|
-
this._updateActiveOption();
|
|
255
|
-
});
|
|
256
358
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
359
|
+
/**
|
|
360
|
+
* Get whether the given option is selected.
|
|
361
|
+
* @param option The option to get the selected state of
|
|
362
|
+
*/
|
|
363
|
+
isSelected(option) {
|
|
364
|
+
return this.selectionModel().isSelected(option instanceof CdkOption ? option.value : option);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Registers a callback to be invoked when the listbox's value changes from user input.
|
|
368
|
+
* @param fn The callback to register
|
|
369
|
+
* @docs-private
|
|
370
|
+
*/
|
|
371
|
+
registerOnChange(fn) {
|
|
372
|
+
this._onChange = fn;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Registers a callback to be invoked when the listbox is blurred by the user.
|
|
376
|
+
* @param fn The callback to register
|
|
377
|
+
* @docs-private
|
|
378
|
+
*/
|
|
379
|
+
registerOnTouched(fn) {
|
|
380
|
+
this._onTouched = fn;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Sets the listbox's value.
|
|
384
|
+
* @param value The new value of the listbox
|
|
385
|
+
* @docs-private
|
|
386
|
+
*/
|
|
387
|
+
writeValue(value) {
|
|
388
|
+
this._setSelection(value);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Sets the disabled state of the listbox.
|
|
392
|
+
* @param isDisabled The new disabled state
|
|
393
|
+
* @docs-private
|
|
394
|
+
*/
|
|
395
|
+
setDisabledState(isDisabled) {
|
|
396
|
+
this.disabled = isDisabled;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Validate the given control
|
|
400
|
+
* @docs-private
|
|
401
|
+
*/
|
|
402
|
+
validate(control) {
|
|
403
|
+
return this._validators(control);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Registers a callback to be called when the form validator changes.
|
|
407
|
+
* @param fn The callback to call
|
|
408
|
+
* @docs-private
|
|
409
|
+
*/
|
|
410
|
+
registerOnValidatorChange(fn) {
|
|
411
|
+
this._onValidatorChange = fn;
|
|
412
|
+
}
|
|
413
|
+
/** Focus the listbox's host element. */
|
|
414
|
+
focus() {
|
|
415
|
+
this.element.focus();
|
|
416
|
+
}
|
|
417
|
+
/** The selection model used to track the listbox's value. */
|
|
418
|
+
selectionModel() {
|
|
419
|
+
return this.selectionModelSubject.value;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Triggers the given option in response to user interaction.
|
|
423
|
+
* - In single selection mode: selects the option and deselects any other selected option.
|
|
424
|
+
* - In multi selection mode: toggles the selected state of the option.
|
|
425
|
+
* @param option The option to trigger
|
|
426
|
+
*/
|
|
427
|
+
triggerOption(option) {
|
|
428
|
+
if (option && !option.disabled) {
|
|
429
|
+
let changed = false;
|
|
430
|
+
this.selectionModel()
|
|
431
|
+
.changed.pipe(take(1), takeUntil(this.destroyed))
|
|
432
|
+
.subscribe(() => (changed = true));
|
|
433
|
+
if (this.multiple) {
|
|
434
|
+
this.toggle(option);
|
|
263
435
|
}
|
|
264
|
-
|
|
265
|
-
option
|
|
436
|
+
else {
|
|
437
|
+
this.select(option);
|
|
266
438
|
}
|
|
267
|
-
|
|
439
|
+
if (changed) {
|
|
440
|
+
this._onChange(this.value);
|
|
441
|
+
this.valueChange.next({
|
|
442
|
+
value: this.value,
|
|
443
|
+
listbox: this,
|
|
444
|
+
option: option,
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Sets the given option as active.
|
|
451
|
+
* @param option The option to make active
|
|
452
|
+
*/
|
|
453
|
+
_setActiveOption(option) {
|
|
454
|
+
this.listKeyManager.setActiveItem(option);
|
|
268
455
|
}
|
|
269
|
-
|
|
456
|
+
/** Called when the listbox receives focus. */
|
|
457
|
+
_handleFocus() {
|
|
458
|
+
if (!this.useActiveDescendant) {
|
|
459
|
+
this.listKeyManager.setNextItemActive();
|
|
460
|
+
this._focusActiveOption();
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/** Called when the user presses keydown on the listbox. */
|
|
464
|
+
_handleKeydown(event) {
|
|
270
465
|
if (this._disabled) {
|
|
271
466
|
return;
|
|
272
467
|
}
|
|
273
|
-
const manager = this._listKeyManager;
|
|
274
468
|
const { keyCode } = event;
|
|
275
|
-
const previousActiveIndex =
|
|
469
|
+
const previousActiveIndex = this.listKeyManager.activeItemIndex;
|
|
276
470
|
if (keyCode === SPACE || keyCode === ENTER) {
|
|
277
|
-
|
|
278
|
-
this._toggleActiveOption();
|
|
279
|
-
}
|
|
471
|
+
this.triggerOption(this.listKeyManager.activeItem);
|
|
280
472
|
event.preventDefault();
|
|
281
473
|
}
|
|
282
474
|
else {
|
|
283
|
-
|
|
475
|
+
this.listKeyManager.onKeydown(event);
|
|
284
476
|
}
|
|
285
477
|
/** Will select an option if shift was pressed while navigating to the option */
|
|
286
478
|
const isArrow = keyCode === UP_ARROW ||
|
|
287
479
|
keyCode === DOWN_ARROW ||
|
|
288
480
|
keyCode === LEFT_ARROW ||
|
|
289
481
|
keyCode === RIGHT_ARROW;
|
|
290
|
-
if (isArrow && event.shiftKey && previousActiveIndex !== this.
|
|
291
|
-
this.
|
|
482
|
+
if (isArrow && event.shiftKey && previousActiveIndex !== this.listKeyManager.activeItemIndex) {
|
|
483
|
+
this.triggerOption(this.listKeyManager.activeItem);
|
|
292
484
|
}
|
|
293
485
|
}
|
|
294
|
-
/**
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
486
|
+
/**
|
|
487
|
+
* Called when the focus leaves an element in the listbox.
|
|
488
|
+
* @param event The focusout event
|
|
489
|
+
*/
|
|
490
|
+
_handleFocusOut(event) {
|
|
491
|
+
const otherElement = event.relatedTarget;
|
|
492
|
+
if (this.element !== otherElement && !this.element.contains(otherElement)) {
|
|
493
|
+
this._onTouched();
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/** Get the id of the active option if active descendant is being used. */
|
|
497
|
+
_getAriaActiveDescendant() {
|
|
498
|
+
return this._useActiveDescendant ? this.listKeyManager?.activeItem?.id : null;
|
|
300
499
|
}
|
|
301
|
-
/**
|
|
302
|
-
|
|
303
|
-
if (
|
|
304
|
-
|
|
305
|
-
|
|
500
|
+
/** Get the tabindex for the listbox. */
|
|
501
|
+
_getTabIndex() {
|
|
502
|
+
if (this.disabled) {
|
|
503
|
+
return -1;
|
|
504
|
+
}
|
|
505
|
+
return this.useActiveDescendant || !this.listKeyManager.activeItem ? this.enabledTabIndex : -1;
|
|
506
|
+
}
|
|
507
|
+
/** Initialize the key manager. */
|
|
508
|
+
_initKeyManager() {
|
|
509
|
+
this.listKeyManager = new ActiveDescendantKeyManager(this.options)
|
|
510
|
+
.withWrap()
|
|
511
|
+
.withTypeAhead()
|
|
512
|
+
.withHomeAndEnd()
|
|
513
|
+
.withAllowedModifierKeys(['shiftKey']);
|
|
514
|
+
if (this.orientation === 'vertical') {
|
|
515
|
+
this.listKeyManager.withVerticalOrientation();
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
this.listKeyManager.withHorizontalOrientation(this._dir?.value || 'ltr');
|
|
306
519
|
}
|
|
307
|
-
|
|
520
|
+
this.listKeyManager.change
|
|
521
|
+
.pipe(takeUntil(this.destroyed))
|
|
522
|
+
.subscribe(() => this._focusActiveOption());
|
|
308
523
|
}
|
|
524
|
+
// TODO(mmalerba): Should not depend on combobox.
|
|
309
525
|
_updatePanelForSelection(option) {
|
|
310
526
|
if (this._combobox) {
|
|
311
527
|
if (!this.multiple) {
|
|
312
|
-
this._combobox.updateAndClose(option.
|
|
528
|
+
this._combobox.updateAndClose(option.isSelected() ? option.value : []);
|
|
313
529
|
}
|
|
314
530
|
else {
|
|
315
|
-
this._combobox.updateAndClose(this.
|
|
531
|
+
this._combobox.updateAndClose(this.value);
|
|
316
532
|
}
|
|
317
533
|
}
|
|
318
534
|
}
|
|
319
|
-
/**
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
if (activeOption && !activeOption.disabled) {
|
|
323
|
-
activeOption.toggle();
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/** Returns the id of the active option if active descendant is being used. */
|
|
327
|
-
_getAriaActiveDescendant() {
|
|
328
|
-
return this._useActiveDescendant ? this._listKeyManager?.activeItem?.id : null;
|
|
329
|
-
}
|
|
330
|
-
/** Updates the activeOption and the active and focus properties of the option. */
|
|
331
|
-
_updateActiveOption() {
|
|
332
|
-
if (!this._listKeyManager.activeItem) {
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
this._activeOption?.deactivate();
|
|
336
|
-
this._activeOption = this._listKeyManager.activeItem;
|
|
337
|
-
this._activeOption.activate();
|
|
338
|
-
if (!this.useActiveDescendant) {
|
|
339
|
-
this._activeOption.focus();
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
/** Updates selection states of options when the 'multiple' property changes. */
|
|
343
|
-
_updateSelectionOnMultiSelectionChange(value) {
|
|
344
|
-
if (this.multiple && !value) {
|
|
345
|
-
// Deselect all options instead of arbitrarily keeping one of the selected options.
|
|
346
|
-
this.setAllSelected(false);
|
|
347
|
-
}
|
|
348
|
-
else if (!this.multiple && value) {
|
|
349
|
-
this._selectionModel = new SelectionModel(value, this._selectionModel?.selected);
|
|
350
|
-
}
|
|
535
|
+
/** Update the selection mode when the 'multiple' property changes. */
|
|
536
|
+
_updateSelectionModel() {
|
|
537
|
+
this.selectionModelSubject.next(new SelectionModel(this.multiple, !this.multiple && this.value.length > 1 ? [] : this.value.slice(), true, this._compareWith));
|
|
351
538
|
}
|
|
539
|
+
/** Focus the active option. */
|
|
352
540
|
_focusActiveOption() {
|
|
353
|
-
if (!this.
|
|
354
|
-
|
|
355
|
-
}
|
|
356
|
-
if (this._listKeyManager.activeItem) {
|
|
357
|
-
this.setActiveOption(this._listKeyManager.activeItem);
|
|
358
|
-
}
|
|
359
|
-
else if (this._options.first) {
|
|
360
|
-
this.setActiveOption(this._options.first);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
/** Selects the given option if the option and listbox aren't disabled. */
|
|
364
|
-
select(option) {
|
|
365
|
-
if (!this.disabled && !option.disabled) {
|
|
366
|
-
option.select();
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
/** Deselects the given option if the option and listbox aren't disabled. */
|
|
370
|
-
deselect(option) {
|
|
371
|
-
if (!this.disabled && !option.disabled) {
|
|
372
|
-
option.deselect();
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
/** Sets the selected state of all options to be the given value. */
|
|
376
|
-
setAllSelected(isSelected) {
|
|
377
|
-
for (const option of this._options.toArray()) {
|
|
378
|
-
isSelected ? this.select(option) : this.deselect(option);
|
|
541
|
+
if (!this.useActiveDescendant) {
|
|
542
|
+
this.listKeyManager.activeItem?.focus();
|
|
379
543
|
}
|
|
380
|
-
|
|
381
|
-
/** Updates the key manager's active item to the given option. */
|
|
382
|
-
setActiveOption(option) {
|
|
383
|
-
this._listKeyManager.updateActiveItem(option);
|
|
384
|
-
this._updateActiveOption();
|
|
544
|
+
this.changeDetectorRef.markForCheck();
|
|
385
545
|
}
|
|
386
546
|
/**
|
|
387
|
-
*
|
|
388
|
-
*
|
|
547
|
+
* Set the selected values.
|
|
548
|
+
* @param value The list of new selected values.
|
|
389
549
|
*/
|
|
390
|
-
|
|
391
|
-
|
|
550
|
+
_setSelection(value) {
|
|
551
|
+
const coercedValue = this._coerceValue(value);
|
|
552
|
+
this.selectionModel().setSelection(...(!this.multiple && coercedValue.length > 1
|
|
553
|
+
? []
|
|
554
|
+
: this._getValuesWithValidity(coercedValue, true)));
|
|
555
|
+
}
|
|
556
|
+
/** Update the internal value of the listbox based on the selection model. */
|
|
557
|
+
_updateInternalValue() {
|
|
558
|
+
const indexCache = new Map();
|
|
559
|
+
// Check if we need to remove any values due to them becoming invalid
|
|
560
|
+
// (e.g. if the option was removed from the DOM.)
|
|
561
|
+
const selected = this.selectionModel().selected;
|
|
562
|
+
const validSelected = this._getValuesWithValidity(selected, true);
|
|
563
|
+
if (validSelected.length != selected.length) {
|
|
564
|
+
this.selectionModel().setSelection(...validSelected);
|
|
565
|
+
}
|
|
566
|
+
this.selectionModel().sort((a, b) => {
|
|
567
|
+
const aIndex = this._getIndexForValue(indexCache, a);
|
|
568
|
+
const bIndex = this._getIndexForValue(indexCache, b);
|
|
569
|
+
return aIndex - bIndex;
|
|
570
|
+
});
|
|
571
|
+
this.changeDetectorRef.markForCheck();
|
|
392
572
|
}
|
|
393
573
|
/**
|
|
394
|
-
*
|
|
395
|
-
*
|
|
574
|
+
* Gets the index of the given value in the given list of options.
|
|
575
|
+
* @param cache The cache of indices found so far
|
|
576
|
+
* @param value The value to find
|
|
577
|
+
* @return The index of the value in the options list
|
|
396
578
|
*/
|
|
397
|
-
|
|
398
|
-
this.
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
579
|
+
_getIndexForValue(cache, value) {
|
|
580
|
+
const isEqual = this.compareWith || Object.is;
|
|
581
|
+
if (!cache.has(value)) {
|
|
582
|
+
let index = -1;
|
|
583
|
+
for (let i = 0; i < this.options.length; i++) {
|
|
584
|
+
if (isEqual(value, this.options.get(i).value)) {
|
|
585
|
+
index = i;
|
|
586
|
+
break;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
cache.set(value, index);
|
|
404
590
|
}
|
|
591
|
+
return cache.get(value);
|
|
405
592
|
}
|
|
406
|
-
/**
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
const
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
this.
|
|
426
|
-
|
|
593
|
+
/**
|
|
594
|
+
* Handle the user clicking an option.
|
|
595
|
+
* @param option The option that was clicked.
|
|
596
|
+
*/
|
|
597
|
+
_handleOptionClicked(option) {
|
|
598
|
+
this.listKeyManager.setActiveItem(option);
|
|
599
|
+
this.triggerOption(option);
|
|
600
|
+
this._updatePanelForSelection(option);
|
|
601
|
+
}
|
|
602
|
+
/** Verifies that no two options represent the same value under the compareWith function. */
|
|
603
|
+
_verifyNoOptionValueCollisions() {
|
|
604
|
+
combineLatest([
|
|
605
|
+
this.selectionModelSubject,
|
|
606
|
+
this.options.changes.pipe(startWith(this.options)),
|
|
607
|
+
]).subscribe(() => {
|
|
608
|
+
const isEqual = this.compareWith ?? Object.is;
|
|
609
|
+
for (let i = 0; i < this.options.length; i++) {
|
|
610
|
+
const option = this.options.get(i);
|
|
611
|
+
let duplicate = null;
|
|
612
|
+
for (let j = i + 1; j < this.options.length; j++) {
|
|
613
|
+
const other = this.options.get(j);
|
|
614
|
+
if (isEqual(option.value, other.value)) {
|
|
615
|
+
duplicate = other;
|
|
616
|
+
break;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
if (duplicate) {
|
|
620
|
+
// TODO(mmalerba): Link to docs about this.
|
|
621
|
+
if (this.compareWith) {
|
|
622
|
+
console.warn(`Found multiple CdkOption representing the same value under the given compareWith function`, {
|
|
623
|
+
option1: option.element,
|
|
624
|
+
option2: duplicate.element,
|
|
625
|
+
compareWith: this.compareWith,
|
|
626
|
+
});
|
|
627
|
+
}
|
|
628
|
+
else {
|
|
629
|
+
console.warn(`Found multiple CdkOption with the same value`, {
|
|
630
|
+
option1: option.element,
|
|
631
|
+
option2: duplicate.element,
|
|
632
|
+
});
|
|
633
|
+
}
|
|
427
634
|
return;
|
|
428
635
|
}
|
|
429
636
|
}
|
|
430
|
-
}
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Coerces a value into an array representing a listbox selection.
|
|
641
|
+
* @param value The value to coerce
|
|
642
|
+
* @return An array
|
|
643
|
+
*/
|
|
644
|
+
_coerceValue(value) {
|
|
645
|
+
return value == null ? [] : coerceArray(value);
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Get the sublist of values with the given validity.
|
|
649
|
+
* @param values The list of values
|
|
650
|
+
* @param valid Whether to get valid values
|
|
651
|
+
* @return The sublist of values with the requested validity
|
|
652
|
+
*/
|
|
653
|
+
_getValuesWithValidity(values, valid) {
|
|
654
|
+
const isEqual = this.compareWith || Object.is;
|
|
655
|
+
const validValues = (this.options || []).map(option => option.value);
|
|
656
|
+
return values.filter(value => valid === validValues.some(validValue => isEqual(value, validValue)));
|
|
431
657
|
}
|
|
432
658
|
}
|
|
433
|
-
CdkListbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: CdkListbox, deps: [
|
|
434
|
-
CdkListbox.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.0-rc.1", type: CdkListbox, selector: "[cdkListbox]", inputs: { id: "id", multiple: "multiple", disabled: "disabled", useActiveDescendant: "
|
|
659
|
+
CdkListbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: CdkListbox, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
660
|
+
CdkListbox.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.0-rc.1", type: CdkListbox, selector: "[cdkListbox]", inputs: { id: "id", enabledTabIndex: ["tabindex", "enabledTabIndex"], value: ["cdkListboxValue", "value"], multiple: ["cdkListboxMultiple", "multiple"], disabled: ["cdkListboxDisabled", "disabled"], useActiveDescendant: ["cdkListboxUseActiveDescendant", "useActiveDescendant"], orientation: ["cdkListboxOrientation", "orientation"], compareWith: ["cdkListboxCompareWith", "compareWith"] }, outputs: { valueChange: "cdkListboxValueChange" }, host: { attributes: { "role": "listbox" }, listeners: { "focus": "_handleFocus()", "keydown": "_handleKeydown($event)", "focusout": "_handleFocusOut($event)" }, properties: { "id": "id", "attr.tabindex": "_getTabIndex()", "attr.aria-disabled": "disabled", "attr.aria-multiselectable": "multiple", "attr.aria-activedescendant": "_getAriaActiveDescendant()", "attr.aria-orientation": "orientation" }, classAttribute: "cdk-listbox" }, providers: [
|
|
661
|
+
{
|
|
662
|
+
provide: NG_VALUE_ACCESSOR,
|
|
663
|
+
useExisting: forwardRef(() => CdkListbox),
|
|
664
|
+
multi: true,
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
provide: NG_VALIDATORS,
|
|
668
|
+
useExisting: forwardRef(() => CdkListbox),
|
|
669
|
+
multi: true,
|
|
670
|
+
},
|
|
671
|
+
], queries: [{ propertyName: "options", predicate: CdkOption, descendants: true }], exportAs: ["cdkListbox"], ngImport: i0 });
|
|
435
672
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-rc.1", ngImport: i0, type: CdkListbox, decorators: [{
|
|
436
673
|
type: Directive,
|
|
437
674
|
args: [{
|
|
@@ -441,42 +678,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-rc.1", ng
|
|
|
441
678
|
'role': 'listbox',
|
|
442
679
|
'class': 'cdk-listbox',
|
|
443
680
|
'[id]': 'id',
|
|
444
|
-
'
|
|
445
|
-
'(keydown)': '_keydown($event)',
|
|
446
|
-
'[attr.tabindex]': '_tabIndex',
|
|
681
|
+
'[attr.tabindex]': '_getTabIndex()',
|
|
447
682
|
'[attr.aria-disabled]': 'disabled',
|
|
448
683
|
'[attr.aria-multiselectable]': 'multiple',
|
|
449
684
|
'[attr.aria-activedescendant]': '_getAriaActiveDescendant()',
|
|
450
685
|
'[attr.aria-orientation]': 'orientation',
|
|
686
|
+
'(focus)': '_handleFocus()',
|
|
687
|
+
'(keydown)': '_handleKeydown($event)',
|
|
688
|
+
'(focusout)': '_handleFocusOut($event)',
|
|
451
689
|
},
|
|
452
|
-
providers: [
|
|
690
|
+
providers: [
|
|
691
|
+
{
|
|
692
|
+
provide: NG_VALUE_ACCESSOR,
|
|
693
|
+
useExisting: forwardRef(() => CdkListbox),
|
|
694
|
+
multi: true,
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
provide: NG_VALIDATORS,
|
|
698
|
+
useExisting: forwardRef(() => CdkListbox),
|
|
699
|
+
multi: true,
|
|
700
|
+
},
|
|
701
|
+
],
|
|
453
702
|
}]
|
|
454
|
-
}], ctorParameters: function () { return [
|
|
455
|
-
type: Optional
|
|
456
|
-
}, {
|
|
457
|
-
type: Inject,
|
|
458
|
-
args: [CDK_COMBOBOX]
|
|
459
|
-
}] }, { type: i1.Directionality, decorators: [{
|
|
460
|
-
type: Optional
|
|
461
|
-
}] }]; }, propDecorators: { _options: [{
|
|
462
|
-
type: ContentChildren,
|
|
463
|
-
args: [CdkOption, { descendants: true }]
|
|
464
|
-
}], selectionChange: [{
|
|
465
|
-
type: Output
|
|
466
|
-
}], id: [{
|
|
703
|
+
}], ctorParameters: function () { return []; }, propDecorators: { id: [{
|
|
467
704
|
type: Input
|
|
705
|
+
}], enabledTabIndex: [{
|
|
706
|
+
type: Input,
|
|
707
|
+
args: ['tabindex']
|
|
708
|
+
}], value: [{
|
|
709
|
+
type: Input,
|
|
710
|
+
args: ['cdkListboxValue']
|
|
468
711
|
}], multiple: [{
|
|
469
|
-
type: Input
|
|
712
|
+
type: Input,
|
|
713
|
+
args: ['cdkListboxMultiple']
|
|
470
714
|
}], disabled: [{
|
|
471
|
-
type: Input
|
|
715
|
+
type: Input,
|
|
716
|
+
args: ['cdkListboxDisabled']
|
|
472
717
|
}], useActiveDescendant: [{
|
|
473
|
-
type: Input
|
|
474
|
-
|
|
475
|
-
type: Input
|
|
718
|
+
type: Input,
|
|
719
|
+
args: ['cdkListboxUseActiveDescendant']
|
|
476
720
|
}], orientation: [{
|
|
477
721
|
type: Input,
|
|
478
|
-
args: ['
|
|
722
|
+
args: ['cdkListboxOrientation']
|
|
479
723
|
}], compareWith: [{
|
|
480
|
-
type: Input
|
|
724
|
+
type: Input,
|
|
725
|
+
args: ['cdkListboxCompareWith']
|
|
726
|
+
}], valueChange: [{
|
|
727
|
+
type: Output,
|
|
728
|
+
args: ['cdkListboxValueChange']
|
|
729
|
+
}], options: [{
|
|
730
|
+
type: ContentChildren,
|
|
731
|
+
args: [CdkOption, { descendants: true }]
|
|
481
732
|
}] } });
|
|
482
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGstZXhwZXJpbWVudGFsL2xpc3Rib3gvbGlzdGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBRUwsZUFBZSxFQUNmLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywwQkFBMEIsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQWUsV0FBVyxFQUFFLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFrQixjQUFjLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUF1QixpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBQyxNQUFNLG9DQUFvQyxDQUFDOzs7O0FBRTdFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNmLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVsQixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUN4QyxPQUFP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LEVBQUUsSUFBSTt3QkFDWixTQUFTLEVBQUUsc0JBQXNCO3dCQUNqQyxXQUFXLEVBQUUsa0JBQWtCO3dCQUMvQixpQkFBaUIsRUFBRSxXQUFXO3dCQUM5QixzQkFBc0IsRUFBRSxVQUFVO3dCQUNsQyw2QkFBNkIsRUFBRSxVQUFVO3dCQUN6Qyw4QkFBOEIsRUFBRSw0QkFBNEI7d0JBQzVELHlCQUF5QixFQUFFLGFBQWE7cUJBQ3pDO29CQUNELFNBQVMsRUFBRSxDQUFDLDBCQUEwQixDQUFDO2lCQUN4Qzs7MEJBZ0ZJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsWUFBWTs7MEJBQy9CLFFBQVE7NENBckRzQyxRQUFRO3NCQUF4RCxlQUFlO3VCQUFDLFNBQVMsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7Z0JBRTVCLGVBQWU7c0JBQWpDLE1BQU07Z0JBRUUsRUFBRTtzQkFBVixLQUFLO2dCQU9GLFFBQVE7c0JBRFgsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBVUYsbUJBQW1CO3NCQUR0QixLQUFLO2dCQVVGLFNBQVM7c0JBRFosS0FBSztnQkFTdUIsV0FBVztzQkFBdkMsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBRWxCLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyLCBIaWdobGlnaHRhYmxlLCBMaXN0S2V5TWFuYWdlck9wdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHtET1dOX0FSUk9XLCBFTlRFUiwgTEVGVF9BUlJPVywgUklHSFRfQVJST1csIFNQQUNFLCBVUF9BUlJPV30gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7Qm9vbGVhbklucHV0LCBjb2VyY2VBcnJheSwgY29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtTZWxlY3Rpb25DaGFuZ2UsIFNlbGVjdGlvbk1vZGVsfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtkZWZlciwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEaXJlY3Rpb25hbGl0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHtDREtfQ09NQk9CT1gsIENka0NvbWJvYm94fSBmcm9tICdAYW5ndWxhci9jZGstZXhwZXJpbWVudGFsL2NvbWJvYm94JztcblxubGV0IG5leHRJZCA9IDA7XG5sZXQgbGlzdGJveElkID0gMDtcblxuZXhwb3J0IGNvbnN0IENES19MSVNUQk9YX1ZBTFVFX0FDQ0VTU09SID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2RrTGlzdGJveCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2Nka09wdGlvbl0nLFxuICBleHBvcnRBczogJ2Nka09wdGlvbicsXG4gIGhvc3Q6IHtcbiAgICAncm9sZSc6ICdvcHRpb24nLFxuICAgICdjbGFzcyc6ICdjZGstb3B0aW9uJyxcbiAgICAnKGNsaWNrKSc6ICd0b2dnbGUoKScsXG4gICAgJyhmb2N1cyknOiAnYWN0aXZhdGUoKScsXG4gICAgJyhibHVyKSc6ICdkZWFjdGl2YXRlKCknLFxuICAgICdbaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIuYXJpYS1zZWxlY3RlZF0nOiAnc2VsZWN0ZWQgfHwgbnVsbCcsXG4gICAgJ1thdHRyLnRhYmluZGV4XSc6ICdfZ2V0VGFiSW5kZXgoKScsXG4gICAgJ1thdHRyLmFyaWEtZGlzYWJsZWRdJzogJ19pc0ludGVyYWN0aW9uRGlzYWJsZWQoKScsXG4gICAgJ1tjbGFzcy5jZGstb3B0aW9uLWRpc2FibGVkXSc6ICdfaXNJbnRlcmFjdGlvbkRpc2FibGVkKCknLFxuICAgICdbY2xhc3MuY2RrLW9wdGlvbi1hY3RpdmVdJzogJ19hY3RpdmUnLFxuICAgICdbY2xhc3MuY2RrLW9wdGlvbi1zZWxlY3RlZF0nOiAnc2VsZWN0ZWQnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDZGtPcHRpb248VCA9IHVua25vd24+IGltcGxlbWVudHMgTGlzdEtleU1hbmFnZXJPcHRpb24sIEhpZ2hsaWdodGFibGUge1xuICBwcml2YXRlIF9zZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF92YWx1ZTogVDtcbiAgX2FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgaWQgb2YgdGhlIG9wdGlvbiwgc2V0IHRvIGEgdW5pcXVlaWQgaWYgdGhlIHVzZXIgZG9lcyBub3QgcHJvdmlkZSBvbmUuICovXG4gIEBJbnB1dCgpIGlkID0gYGNkay1vcHRpb24tJHtuZXh0SWQrK31gO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cbiAgc2V0IHNlbGVjdGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgZm9ybSB2YWx1ZSBvZiB0aGUgb3B0aW9uLiAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogVCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkICYmIHZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5kZXNlbGVjdCgpO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHVzZWQgdG8gbG9jYXRlIHRoaXMgaXRlbSBkdXJpbmcgbWVudSB0eXBlYWhlYWQuIElmIG5vdCBzcGVjaWZpZWQsXG4gICAqIHRoZSBgdGV4dENvbnRlbnRgIG9mIHRoZSBpdGVtIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIEBJbnB1dCgpIHR5cGVhaGVhZDogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9wdGlvblNlbGVjdGlvbkNoYW5nZUV2ZW50PFQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IENka0xpc3Rib3gpKSByZWFkb25seSBsaXN0Ym94OiBDZGtMaXN0Ym94PFQ+LFxuICApIHt9XG5cbiAgLyoqIFRvZ2dsZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBlbWl0cyBhIGNoYW5nZSBldmVudCB0aHJvdWdoIHRoZSBpbmplY3RlZCBsaXN0Ym94LiAqL1xuICB0b2dnbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0ludGVyYWN0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkO1xuICAgICAgdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyB0aGUgYWN0aXZlIHByb3BlcnR5IHRydWUgaWYgdGhlIG9wdGlvbiBhbmQgbGlzdGJveCBhcmVuJ3QgZGlzYWJsZWQuICovXG4gIGFjdGl2YXRlKCkge1xuICAgIGlmICghdGhpcy5faXNJbnRlcmFjdGlvbkRpc2FibGVkKCkpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGFjdGl2ZSBwcm9wZXJ0eSBmYWxzZS4gKi9cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzSW50ZXJhY3Rpb25EaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0cyB0aGUgc2VsZWN0ZWQgcHJvcGVydHkgdHJ1ZSBpZiBpdCB3YXMgZmFsc2UuICovXG4gIHNlbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBzZWxlY3RlZCBwcm9wZXJ0eSBmYWxzZSBpZiBpdCB3YXMgdHJ1ZS4gKi9cbiAgZGVzZWxlY3QoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQXBwbGllcyBmb2N1cyB0byB0aGUgb3B0aW9uLiAqL1xuICBmb2N1cygpIHtcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9wdGlvbiBvciBsaXN0Ym94IGFyZSBkaXNhYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZS4gKi9cbiAgX2lzSW50ZXJhY3Rpb25EaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5saXN0Ym94LmRpc2FibGVkIHx8IHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqIEVtaXRzIGEgY2hhbmdlIGV2ZW50IGV4dGVuZGluZyB0aGUgT3B0aW9uIFNlbGVjdGlvbiBDaGFuZ2UgRXZlbnQgaW50ZXJmYWNlLiAqL1xuICBwcml2YXRlIF9lbWl0U2VsZWN0aW9uQ2hhbmdlKGlzVXNlcklucHV0ID0gZmFsc2UpIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGlzVXNlcklucHV0OiBpc1VzZXJJbnB1dCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSB0YWIgaW5kZXggd2hpY2ggZGVwZW5kcyBvbiB0aGUgZGlzYWJsZWQgcHJvcGVydHkuICovXG4gIF9nZXRUYWJJbmRleCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnRlcmFjdGlvbkRpc2FibGVkKCkgPyBudWxsIDogJy0xJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGxhYmVsIGZvciB0aGlzIGVsZW1lbnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgdGhlIEZvY3VzYWJsZU9wdGlvbiBpbnRlcmZhY2UuICovXG4gIGdldExhYmVsKCkge1xuICAgIHJldHVybiAodGhpcy50eXBlYWhlYWQgPz8gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50Py50cmltKCkpIHx8ICcnO1xuICB9XG5cbiAgLyoqIFNldHMgdGhlIGFjdGl2ZSBwcm9wZXJ0eSB0byB0cnVlIHRvIGVuYWJsZSB0aGUgYWN0aXZlIGNzcyBjbGFzcy4gKi9cbiAgc2V0QWN0aXZlU3R5bGVzKCkge1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgYWN0aXZlIHByb3BlcnR5IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhlIGFjdGl2ZSBjc3MgY2xhc3MuICovXG4gIHNldEluYWN0aXZlU3R5bGVzKCkge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjZGtMaXN0Ym94XScsXG4gIGV4cG9ydEFzOiAnY2RrTGlzdGJveCcsXG4gIGhvc3Q6IHtcbiAgICAncm9sZSc6ICdsaXN0Ym94JyxcbiAgICAnY2xhc3MnOiAnY2RrLWxpc3Rib3gnLFxuICAgICdbaWRdJzogJ2lkJyxcbiAgICAnKGZvY3VzKSc6ICdfZm9jdXNBY3RpdmVPcHRpb24oKScsXG4gICAgJyhrZXlkb3duKSc6ICdfa2V5ZG93bigkZXZlbnQpJyxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ190YWJJbmRleCcsXG4gICAgJ1thdHRyLmFyaWEtZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdJzogJ211bHRpcGxlJyxcbiAgICAnW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XSc6ICdfZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKScsXG4gICAgJ1thdHRyLmFyaWEtb3JpZW50YXRpb25dJzogJ29yaWVudGF0aW9uJyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbQ0RLX0xJU1RCT1hfVkFMVUVfQUNDRVNTT1JdLFxufSlcbmV4cG9ydCBjbGFzcyBDZGtMaXN0Ym94PFQ+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgX2xpc3RLZXlNYW5hZ2VyOiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxDZGtPcHRpb248VD4+O1xuICBfc2VsZWN0aW9uTW9kZWw6IFNlbGVjdGlvbk1vZGVsPENka09wdGlvbjxUPj47XG4gIF90YWJJbmRleCA9IDA7XG5cbiAgLyoqIGBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkYCAqL1xuICBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgLyoqIGBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXNgICovXG4gIF9vbkNoYW5nZTogKHZhbHVlOiBUKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgcmVhZG9ubHkgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlczogT2JzZXJ2YWJsZTxPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudDxUPj4gPSBkZWZlcigoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnM7XG5cbiAgICByZXR1cm4gb3B0aW9ucy5jaGFuZ2VzLnBpcGUoXG4gICAgICBzdGFydFdpdGgob3B0aW9ucyksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gbWVyZ2UoLi4ub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5zZWxlY3Rpb25DaGFuZ2UpKSksXG4gICAgKTtcbiAgfSkgYXMgT2JzZXJ2YWJsZTxPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudDxUPj47XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdXNlQWN0aXZlRGVzY2VuZGFudDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hdXRvRm9jdXM6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9hY3RpdmVPcHRpb246IENka09wdGlvbjxUPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKENka09wdGlvbiwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgX29wdGlvbnM6IFF1ZXJ5TGlzdDxDZGtPcHRpb248VD4+O1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExpc3Rib3hTZWxlY3Rpb25DaGFuZ2VFdmVudDxUPj4oKTtcblxuICBASW5wdXQoKSBpZCA9IGBjZGstbGlzdGJveC0ke2xpc3Rib3hJZCsrfWA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpc3Rib3ggYWxsb3dzIG11bHRpcGxlIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuXG4gICAqIElmIGBtdWx0aXBsZWAgc3dpdGNoZXMgZnJvbSBgdHJ1ZWAgdG8gYGZhbHNlYCwgYWxsIG9wdGlvbnMgYXJlIGRlc2VsZWN0ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgY29uc3QgY29lcmNlZFZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25Pbk11bHRpU2VsZWN0aW9uQ2hhbmdlKGNvZXJjZWRWYWx1ZSk7XG4gICAgdGhpcy5fbXVsdGlwbGUgPSBjb2VyY2VkVmFsdWU7XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGxpc3Rib3ggd2lsbCB1c2UgYWN0aXZlIGRlc2NlbmRhbnQgb3Igd2lsbCBtb3ZlIGZvY3VzIG9udG8gdGhlIG9wdGlvbnMuICovXG4gIEBJbnB1dCgpXG4gIGdldCB1c2VBY3RpdmVEZXNjZW5kYW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VBY3RpdmVEZXNjZW5kYW50O1xuICB9XG4gIHNldCB1c2VBY3RpdmVEZXNjZW5kYW50KHNob3VsZFVzZUFjdGl2ZURlc2NlbmRhbnQ6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3VzZUFjdGl2ZURlc2NlbmRhbnQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoc2hvdWxkVXNlQWN0aXZlRGVzY2VuZGFudCk7XG4gIH1cblxuICAvKiogV2hldGhlciBvbiBmb2N1cyB0aGUgbGlzdGJveCB3aWxsIGZvY3VzIGl0cyBhY3RpdmUgb3B0aW9uLCBkZWZhdWx0IHRvIHRydWUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBhdXRvRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Gb2N1cztcbiAgfVxuICBzZXQgYXV0b0ZvY3VzKHNob3VsZEF1dG9Gb2N1czogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fYXV0b0ZvY3VzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHNob3VsZEF1dG9Gb2N1cyk7XG4gIH1cblxuICAvKiogRGV0ZXJtaW5lcyB0aGUgb3JpZW50YXRpb24gZm9yIHRoZSBsaXN0IGtleSBtYW5hZ2VyLiBBZmZlY3RzIGtleWJvYXJkIGludGVyYWN0aW9uLiAqL1xuICBASW5wdXQoJ2xpc3Rib3hPcmllbnRhdGlvbicpIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnID0gJ3ZlcnRpY2FsJztcblxuICBASW5wdXQoKSBjb21wYXJlV2l0aDogKG8xOiBULCBvMjogVCkgPT4gYm9vbGVhbiA9IChhMSwgYTIpID0+IGExID09PSBhMjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENES19DT01CT0JPWCkgcHJpdmF0ZSByZWFkb25seSBfY29tYm9ib3g6IENka0NvbWJvYm94LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgX2Rpcj86IERpcmVjdGlvbmFsaXR5LFxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8Q2RrT3B0aW9uPFQ+Pih0aGlzLm11bHRpcGxlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9pbml0S2V5TWFuYWdlcigpO1xuICAgIHRoaXMuX2luaXRTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHRoaXMuX2NvbWJvYm94Py5fcmVnaXN0ZXJDb250ZW50KHRoaXMuaWQsICdsaXN0Ym94Jyk7XG5cbiAgICB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudChldmVudC5zb3VyY2UpO1xuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uTW9kZWwoZXZlbnQuc291cmNlKTtcbiAgICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKGV2ZW50LnNvdXJjZSk7XG4gICAgICB0aGlzLl91cGRhdGVQYW5lbEZvclNlbGVjdGlvbihldmVudC5zb3VyY2UpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fbGlzdEtleU1hbmFnZXIuY2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRLZXlNYW5hZ2VyKCkge1xuICAgIHRoaXMuX2xpc3RLZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyKHRoaXMuX29wdGlvbnMpXG4gICAgICAud2l0aFdyYXAoKVxuICAgICAgLndpdGhUeXBlQWhlYWQoKVxuICAgICAgLndpdGhIb21lQW5kRW5kKClcbiAgICAgIC53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbJ3NoaWZ0S2V5J10pO1xuXG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHRoaXMuX2xpc3RLZXlNYW5hZ2VyLndpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RLZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5fZGlyPy52YWx1ZSB8fCAnbHRyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdEtleU1hbmFnZXIuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVBY3RpdmVPcHRpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRTZWxlY3Rpb25Nb2RlbCgpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBTZWxlY3Rpb25DaGFuZ2U8Q2RrT3B0aW9uPFQ+PikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBldmVudC5hZGRlZCkge1xuICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBldmVudC5yZW1vdmVkKSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgX2tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5fbGlzdEtleU1hbmFnZXI7XG4gICAgY29uc3Qge2tleUNvZGV9ID0gZXZlbnQ7XG4gICAgY29uc3QgcHJldmlvdXNBY3RpdmVJbmRleCA9IG1hbmFnZXIuYWN0aXZlSXRlbUluZGV4O1xuXG4gICAgaWYgKGtleUNvZGUgPT09IFNQQUNFIHx8IGtleUNvZGUgPT09IEVOVEVSKSB7XG4gICAgICBpZiAobWFuYWdlci5hY3RpdmVJdGVtICYmICFtYW5hZ2VyLmlzVHlwaW5nKCkpIHtcbiAgICAgICAgdGhpcy5fdG9nZ2xlQWN0aXZlT3B0aW9uKCk7XG4gICAgICB9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIFdpbGwgc2VsZWN0IGFuIG9wdGlvbiBpZiBzaGlmdCB3YXMgcHJlc3NlZCB3aGlsZSBuYXZpZ2F0aW5nIHRvIHRoZSBvcHRpb24gKi9cbiAgICBjb25zdCBpc0Fycm93ID1cbiAgICAgIGtleUNvZGUgPT09IFVQX0FSUk9XIHx8XG4gICAgICBrZXlDb2RlID09PSBET1dOX0FSUk9XIHx8XG4gICAgICBrZXlDb2RlID09PSBMRUZUX0FSUk9XIHx8XG4gICAgICBrZXlDb2RlID09PSBSSUdIVF9BUlJPVztcbiAgICBpZiAoaXNBcnJvdyAmJiBldmVudC5zaGlmdEtleSAmJiBwcmV2aW91c0FjdGl2ZUluZGV4ICE9PSB0aGlzLl9saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXgpIHtcbiAgICAgIHRoaXMuX3RvZ2dsZUFjdGl2ZU9wdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQsIGNhbGxlZCB3aGVuIGFuIG9wdGlvbiBoYXMgaXRzIHNlbGVjdGVkIHN0YXRlIGNoYW5nZWQuICovXG4gIF9lbWl0Q2hhbmdlRXZlbnQob3B0aW9uOiBDZGtPcHRpb248VD4pIHtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlbCBhZnRlciBhIHRvZ2dsZS4gKi9cbiAgX3VwZGF0ZVNlbGVjdGlvbk1vZGVsKG9wdGlvbjogQ2RrT3B0aW9uPFQ+KSB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlICYmIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgcHJldmlvdXNseVNlbGVjdGVkID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF07XG4gICAgICB0aGlzLmRlc2VsZWN0KHByZXZpb3VzbHlTZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgb3B0aW9uLnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KG9wdGlvbikgOiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChvcHRpb24pO1xuICB9XG5cbiAgX3VwZGF0ZVBhbmVsRm9yU2VsZWN0aW9uKG9wdGlvbjogQ2RrT3B0aW9uPFQ+KSB7XG4gICAgaWYgKHRoaXMuX2NvbWJvYm94KSB7XG4gICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5fY29tYm9ib3gudXBkYXRlQW5kQ2xvc2Uob3B0aW9uLnNlbGVjdGVkID8gb3B0aW9uLnZhbHVlIDogW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tYm9ib3gudXBkYXRlQW5kQ2xvc2UodGhpcy5nZXRTZWxlY3RlZFZhbHVlcygpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogVG9nZ2xlcyB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIGFjdGl2ZSBvcHRpb24gaWYgbm90IGRpc2FibGVkLiAqL1xuICBwcml2YXRlIF90b2dnbGVBY3RpdmVPcHRpb24oKSB7XG4gICAgY29uc3QgYWN0aXZlT3B0aW9uID0gdGhpcy5fbGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbTtcbiAgICBpZiAoYWN0aXZlT3B0aW9uICYmICFhY3RpdmVPcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgIGFjdGl2ZU9wdGlvbi50b2dnbGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGFjdGl2ZSBvcHRpb24gaWYgYWN0aXZlIGRlc2NlbmRhbnQgaXMgYmVpbmcgdXNlZC4gKi9cbiAgX2dldEFyaWFBY3RpdmVEZXNjZW5kYW50KCk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VBY3RpdmVEZXNjZW5kYW50ID8gdGhpcy5fbGlzdEtleU1hbmFnZXI/LmFjdGl2ZUl0ZW0/LmlkIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBVcGRhdGVzIHRoZSBhY3RpdmVPcHRpb24gYW5kIHRoZSBhY3RpdmUgYW5kIGZvY3VzIHByb3BlcnRpZXMgb2YgdGhlIG9wdGlvbi4gKi9cbiAgcHJpdmF0ZSBfdXBkYXRlQWN0aXZlT3B0aW9uKCkge1xuICAgIGlmICghdGhpcy5fbGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZU9wdGlvbj8uZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2FjdGl2ZU9wdGlvbiA9IHRoaXMuX2xpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW07XG4gICAgdGhpcy5fYWN0aXZlT3B0aW9uLmFjdGl2YXRlKCk7XG5cbiAgICBpZiAoIXRoaXMudXNlQWN0aXZlRGVzY2VuZGFudCkge1xuICAgICAgdGhpcy5fYWN0aXZlT3B0aW9uLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVwZGF0ZXMgc2VsZWN0aW9uIHN0YXRlcyBvZiBvcHRpb25zIHdoZW4gdGhlICdtdWx0aXBsZScgcHJvcGVydHkgY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0aW9uT25NdWx0aVNlbGVjdGlvbkNoYW5nZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLm11bHRpcGxlICYmICF2YWx1ZSkge1xuICAgICAgLy8gRGVzZWxlY3QgYWxsIG9wdGlvbnMgaW5zdGVhZCBvZiBhcmJpdHJhcmlseSBrZWVwaW5nIG9uZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9ucy5cbiAgICAgIHRoaXMuc2V0QWxsU2VsZWN0ZWQoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdmFsdWUpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPENka09wdGlvbjxUPj4oXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbD8uc2VsZWN0ZWQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIF9mb2N1c0FjdGl2ZU9wdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuYXV0b0ZvY3VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKHRoaXMuX2xpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fb3B0aW9ucy5maXJzdCkge1xuICAgICAgdGhpcy5zZXRBY3RpdmVPcHRpb24odGhpcy5fb3B0aW9ucy5maXJzdCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbGVjdHMgdGhlIGdpdmVuIG9wdGlvbiBpZiB0aGUgb3B0aW9uIGFuZCBsaXN0Ym94IGFyZW4ndCBkaXNhYmxlZC4gKi9cbiAgc2VsZWN0KG9wdGlvbjogQ2RrT3B0aW9uPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgIG9wdGlvbi5zZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKiogRGVzZWxlY3RzIHRoZSBnaXZlbiBvcHRpb24gaWYgdGhlIG9wdGlvbiBhbmQgbGlzdGJveCBhcmVuJ3QgZGlzYWJsZWQuICovXG4gIGRlc2VsZWN0KG9wdGlvbjogQ2RrT3B0aW9uPFQ+KSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgIG9wdGlvbi5kZXNlbGVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiBhbGwgb3B0aW9ucyB0byBiZSB0aGUgZ2l2ZW4gdmFsdWUuICovXG4gIHNldEFsbFNlbGVjdGVkKGlzU2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLl9vcHRpb25zLnRvQXJyYXkoKSkge1xuICAgICAgaXNTZWxlY3RlZCA/IHRoaXMuc2VsZWN0KG9wdGlvbikgOiB0aGlzLmRlc2VsZWN0KG9wdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVwZGF0ZXMgdGhlIGtleSBtYW5hZ2VyJ3MgYWN0aXZlIGl0ZW0gdG8gdGhlIGdpdmVuIG9wdGlvbi4gKi9cbiAgc2V0QWN0aXZlT3B0aW9uKG9wdGlvbjogQ2RrT3B0aW9uPFQ+KSB7XG4gICAgdGhpcy5fbGlzdEtleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbShvcHRpb24pO1xuICAgIHRoaXMuX3VwZGF0ZUFjdGl2ZU9wdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZVxuICAgKiBjaGFuZ2VzIGZyb20gdXNlciBpbnB1dC4gUmVxdWlyZWQgdG8gaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKi9cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICogYnkgdGhlIHVzZXIuIFJlcXVpcmVkIHRvIGltcGxlbWVudCBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB7fSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqIFNldHMgdGhlIHNlbGVjdCdzIHZhbHVlLiBSZXF1aXJlZCB0byBpbXBsZW1lbnQgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHdyaXRlVmFsdWUodmFsdWVzOiBUIHwgVFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMpIHtcbiAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICAvKiogRGlzYWJsZXMgdGhlIHNlbGVjdC4gUmVxdWlyZWQgdG8gaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb25zLiAqL1xuICBnZXRTZWxlY3RlZFZhbHVlcygpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS5tYXAob3B0aW9uID0+IG9wdGlvbi52YWx1ZSk7XG4gIH1cblxuICAvKiogU2VsZWN0cyBhbiBvcHRpb24gdGhhdCBoYXMgdGhlIGNvcnJlc3BvbmRpbmcgZ2l2ZW4gdmFsdWUuICovXG4gIHByaXZhdGUgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWVzOiBUIHwgVFtdKSB7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5fb3B0aW9ucy50b0FycmF5KCkpIHtcbiAgICAgIHRoaXMuZGVzZWxlY3Qob3B0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXNBcnJheSA9IGNvZXJjZUFycmF5KHZhbHVlcyk7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXNBcnJheSkge1xuICAgICAgY29uc3QgY29ycmVzcG9uZGluZ09wdGlvbiA9IHRoaXMuX29wdGlvbnMuZmluZCgob3B0aW9uOiBDZGtPcHRpb248VD4pID0+IHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZSAhPSBudWxsICYmIHRoaXMuY29tcGFyZVdpdGgob3B0aW9uLnZhbHVlLCB2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNvcnJlc3BvbmRpbmdPcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWxlY3QoY29ycmVzcG9uZGluZ09wdGlvbik7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiogQ2hhbmdlIGV2ZW50IHRoYXQgaXMgYmVpbmcgZmlyZWQgd2hlbmV2ZXIgdGhlIHNlbGVjdGVkIHN0YXRlIG9mIGFuIG9wdGlvbiBjaGFuZ2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0Ym94U2VsZWN0aW9uQ2hhbmdlRXZlbnQ8VD4ge1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBsaXN0Ym94IHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuICovXG4gIHJlYWRvbmx5IHNvdXJjZTogQ2RrTGlzdGJveDxUPjtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBvcHRpb24gdGhhdCBoYXMgYmVlbiBjaGFuZ2VkLiAqL1xuICByZWFkb25seSBvcHRpb246IENka09wdGlvbjxUPjtcbn1cblxuLyoqIEV2ZW50IG9iamVjdCBlbWl0dGVkIGJ5IE1hdE9wdGlvbiB3aGVuIHNlbGVjdGVkIG9yIGRlc2VsZWN0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvblNlbGVjdGlvbkNoYW5nZUV2ZW50PFQ+IHtcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgb3B0aW9uIHRoYXQgZW1pdHRlZCB0aGUgZXZlbnQuICovXG4gIHNvdXJjZTogQ2RrT3B0aW9uPFQ+O1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjaGFuZ2UgaW4gdGhlIG9wdGlvbidzIHZhbHVlIHdhcyBhIHJlc3VsdCBvZiBhIHVzZXIgYWN0aW9uLiAqL1xuICBpc1VzZXJJbnB1dDogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
733
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGstZXhwZXJpbWVudGFsL2xpc3Rib3gvbGlzdGJveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixNQUFNLEVBQ04sV0FBVyxFQUNYLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywwQkFBMEIsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQWUsV0FBVyxFQUFFLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEVBSWpCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sb0NBQW9DLENBQUM7O0FBRS9ELHNEQUFzRDtBQUN0RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7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QUFFO3NCQURMLEtBQUs7Z0JBWUYsZUFBZTtzQkFEbEIsS0FBSzt1QkFBQyxVQUFVO2dCQVdiLEtBQUs7c0JBRFIsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBYXBCLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBYXZCLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBV3ZCLG1CQUFtQjtzQkFEdEIsS0FBSzt1QkFBQywrQkFBK0I7Z0JBVU4sV0FBVztzQkFBMUMsS0FBSzt1QkFBQyx1QkFBdUI7Z0JBSTFCLFdBQVc7c0JBRGQsS0FBSzt1QkFBQyx1QkFBdUI7Z0JBV1ksV0FBVztzQkFBcEQsTUFBTTt1QkFBQyx1QkFBdUI7Z0JBRzRCLE9BQU87c0JBQWpFLGVBQWU7dUJBQUMsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5qZWN0RmxhZ3MsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIsIEhpZ2hsaWdodGFibGUsIExpc3RLZXlNYW5hZ2VyT3B0aW9ufSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge0RPV05fQVJST1csIEVOVEVSLCBMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgU1BBQ0UsIFVQX0FSUk9XfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtCb29sZWFuSW5wdXQsIGNvZXJjZUFycmF5LCBjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1NlbGVjdGlvbk1vZGVsfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRlZmVyLCBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwVG8sIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWx9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge0Nka0NvbWJvYm94fSBmcm9tICdAYW5ndWxhci9jZGstZXhwZXJpbWVudGFsL2NvbWJvYm94JztcblxuLyoqIFRoZSBuZXh0IGlkIHRvIHVzZSBmb3IgY3JlYXRpbmcgdW5pcXVlIERPTSBJRHMuICovXG5sZXQgbmV4dElkID0gMDtcblxuLy8gVE9ETyhtbWFsZXJiYSk6XG4vLyAgIC0gc2hvdWxkIGxpc3Rib3ggd3JhcCBiZSBjb25maWd1cmFibGU/XG4vLyAgIC0gc2hvdWxkIHNraXBwaW5nIGRpc2FibGVkIG9wdGlvbnMgYmUgY29uZmlndXJhYmxlP1xuXG4vKiogQSBzZWxlY3RhYmxlIG9wdGlvbiBpbiBhIGxpc3Rib3guICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2RrT3B0aW9uXScsXG4gIGV4cG9ydEFzOiAnY2RrT3B0aW9uJyxcbiAgaG9zdDoge1xuICAgICdyb2xlJzogJ29wdGlvbicsXG4gICAgJ2NsYXNzJzogJ2Nkay1vcHRpb24nLFxuICAgICdbaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIuYXJpYS1zZWxlY3RlZF0nOiAnaXNTZWxlY3RlZCgpIHx8IG51bGwnLFxuICAgICdbYXR0ci50YWJpbmRleF0nOiAnX2dldFRhYkluZGV4KCknLFxuICAgICdbYXR0ci5hcmlhLWRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5jZGstb3B0aW9uLWRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgJ1tjbGFzcy5jZGstb3B0aW9uLWFjdGl2ZV0nOiAnaXNBY3RpdmUoKScsXG4gICAgJ1tjbGFzcy5jZGstb3B0aW9uLXNlbGVjdGVkXSc6ICdpc1NlbGVjdGVkKCknLFxuICAgICcoY2xpY2spJzogJ19jbGlja2VkLm5leHQoKScsXG4gICAgJyhmb2N1cyknOiAnX2hhbmRsZUZvY3VzKCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDZGtPcHRpb248VCA9IHVua25vd24+IGltcGxlbWVudHMgTGlzdEtleU1hbmFnZXJPcHRpb24sIEhpZ2hsaWdodGFibGUsIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIG9wdGlvbidzIGhvc3QgZWxlbWVudC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLl9pZCB8fCB0aGlzLl9nZW5lcmF0ZWRJZDtcbiAgfVxuICBzZXQgaWQodmFsdWUpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX2dlbmVyYXRlZElkID0gYGNkay1vcHRpb24tJHtuZXh0SWQrK31gO1xuXG4gIC8qKiBUaGUgdmFsdWUgb2YgdGhpcyBvcHRpb24uICovXG4gIEBJbnB1dCgnY2RrT3B0aW9uJykgdmFsdWU6IFQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHVzZWQgdG8gbG9jYXRlIHRoaXMgaXRlbSBkdXJpbmcgbGlzdGJveCB0eXBlYWhlYWQuIElmIG5vdCBzcGVjaWZpZWQsXG4gICAqIHRoZSBgdGV4dENvbnRlbnRgIG9mIHRoZSBpdGVtIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIEBJbnB1dCgnY2RrT3B0aW9uVHlwZWFoZWFkTGFiZWwnKSB0eXBlYWhlYWRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBXaGV0aGVyIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLiAqL1xuICBASW5wdXQoJ2Nka09wdGlvbkRpc2FibGVkJylcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxpc3Rib3guZGlzYWJsZWQgfHwgdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIHRhYmluZGV4IG9mIHRoZSBvcHRpb24gd2hlbiBpdCBpcyBlbmFibGVkLiAqL1xuICBASW5wdXQoJ3RhYmluZGV4JylcbiAgZ2V0IGVuYWJsZWRUYWJJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZFRhYkluZGV4ID09PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5saXN0Ym94LmVuYWJsZWRUYWJJbmRleFxuICAgICAgOiB0aGlzLl9lbmFibGVkVGFiSW5kZXg7XG4gIH1cbiAgc2V0IGVuYWJsZWRUYWJJbmRleCh2YWx1ZSkge1xuICAgIHRoaXMuX2VuYWJsZWRUYWJJbmRleCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2VuYWJsZWRUYWJJbmRleD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSBvcHRpb24ncyBob3N0IGVsZW1lbnQgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZikubmF0aXZlRWxlbWVudDtcblxuICAvKiogVGhlIHBhcmVudCBsaXN0Ym94IHRoaXMgb3B0aW9uIGJlbG9uZ3MgdG8uICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaXN0Ym94OiBDZGtMaXN0Ym94PFQ+ID0gaW5qZWN0KENka0xpc3Rib3gpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBvcHRpb24gaXMgZGVzdHJveWVkLiAqL1xuICBwcm90ZWN0ZWQgZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgb3B0aW9uIGlzIGNsaWNrZWQuICovXG4gIHJlYWRvbmx5IF9jbGlja2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogV2hldGhlciB0aGUgb3B0aW9uIGlzIGN1cnJlbnRseSBhY3RpdmUuICovXG4gIHByaXZhdGUgX2FjdGl2ZSA9IGZhbHNlO1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuICovXG4gIGlzU2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdGJveC5pc1NlbGVjdGVkKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBvcHRpb24gaXMgYWN0aXZlLiAqL1xuICBpc0FjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhpcyBvcHRpb24uICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmxpc3Rib3gudG9nZ2xlKHRoaXMpO1xuICB9XG5cbiAgLyoqIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiBpdCBpcyBub3Qgc2VsZWN0ZWQuICovXG4gIHNlbGVjdCgpIHtcbiAgICB0aGlzLmxpc3Rib3guc2VsZWN0KHRoaXMpO1xuICB9XG5cbiAgLyoqIERlc2VsZWN0IHRoaXMgb3B0aW9uIGlmIGl0IGlzIHNlbGVjdGVkLiAqL1xuICBkZXNlbGVjdCgpIHtcbiAgICB0aGlzLmxpc3Rib3guZGVzZWxlY3QodGhpcyk7XG4gIH1cblxuICAvKiogRm9jdXMgdGhpcyBvcHRpb24uICovXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuZWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbGFiZWwgZm9yIHRoaXMgZWxlbWVudCB3aGljaCBpcyByZXF1aXJlZCBieSB0aGUgRm9jdXNhYmxlT3B0aW9uIGludGVyZmFjZS4gKi9cbiAgZ2V0TGFiZWwoKSB7XG4gICAgcmV0dXJuICh0aGlzLnR5cGVhaGVhZExhYmVsID8/IHRoaXMuZWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpKSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG9wdGlvbiBhcyBhY3RpdmUuXG4gICAqIEBkb2NzLXByaXZhdGVcbiAgICovXG4gIHNldEFjdGl2ZVN0eWxlcygpIHtcbiAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb3B0aW9uIGFzIGluYWN0aXZlLlxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICBzZXRJbmFjdGl2ZVN0eWxlcygpIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBIYW5kbGUgZm9jdXMgZXZlbnRzIG9uIHRoZSBvcHRpb24uICovXG4gIHByb3RlY3RlZCBfaGFuZGxlRm9jdXMoKSB7XG4gICAgLy8gT3B0aW9ucyBjYW4gd2luZCB1cCBnZXR0aW5nIGZvY3VzZWQgaW4gYWN0aXZlIGRlc2NlbmRhbnQgbW9kZSBpZiB0aGUgdXNlciBjbGlja3Mgb24gdGhlbS5cbiAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHB1c2ggZm9jdXMgYmFjayB0byB0aGUgcGFyZW50IGxpc3Rib3ggdG8gcHJldmVudCBhbiBleHRyYSB0YWIgc3RvcCB3aGVuXG4gICAgLy8gdGhlIHVzZXIgcGVyZm9ybXMgYSBzaGlmdCt0YWIuXG4gICAgaWYgKHRoaXMubGlzdGJveC51c2VBY3RpdmVEZXNjZW5kYW50KSB7XG4gICAgICB0aGlzLmxpc3Rib3guX3NldEFjdGl2ZU9wdGlvbih0aGlzKTtcbiAgICAgIHRoaXMubGlzdGJveC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHRhYmluZGV4IGZvciB0aGlzIG9wdGlvbi4gKi9cbiAgcHJvdGVjdGVkIF9nZXRUYWJJbmRleCgpIHtcbiAgICBpZiAodGhpcy5saXN0Ym94LnVzZUFjdGl2ZURlc2NlbmRhbnQgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0FjdGl2ZSgpID8gdGhpcy5lbmFibGVkVGFiSW5kZXggOiAtMTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2RrTGlzdGJveF0nLFxuICBleHBvcnRBczogJ2Nka0xpc3Rib3gnLFxuICBob3N0OiB7XG4gICAgJ3JvbGUnOiAnbGlzdGJveCcsXG4gICAgJ2NsYXNzJzogJ2Nkay1saXN0Ym94JyxcbiAgICAnW2lkXSc6ICdpZCcsXG4gICAgJ1thdHRyLnRhYmluZGV4XSc6ICdfZ2V0VGFiSW5kZXgoKScsXG4gICAgJ1thdHRyLmFyaWEtZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdJzogJ211bHRpcGxlJyxcbiAgICAnW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XSc6ICdfZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKScsXG4gICAgJ1thdHRyLmFyaWEtb3JpZW50YXRpb25dJzogJ29yaWVudGF0aW9uJyxcbiAgICAnKGZvY3VzKSc6ICdfaGFuZGxlRm9jdXMoKScsXG4gICAgJyhrZXlkb3duKSc6ICdfaGFuZGxlS2V5ZG93bigkZXZlbnQpJyxcbiAgICAnKGZvY3Vzb3V0KSc6ICdfaGFuZGxlRm9jdXNPdXQoJGV2ZW50KScsXG4gIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2RrTGlzdGJveCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDZGtMaXN0Ym94KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENka0xpc3Rib3g8VCA9IHVua25vd24+XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yXG57XG4gIC8qKiBUaGUgaWQgb2YgdGhlIG9wdGlvbidzIGhvc3QgZWxlbWVudC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLl9pZCB8fCB0aGlzLl9nZW5lcmF0ZWRJZDtcbiAgfVxuICBzZXQgaWQodmFsdWUpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX2dlbmVyYXRlZElkID0gYGNkay1saXN0Ym94LSR7bmV4dElkKyt9YDtcblxuICAvKiogVGhlIHRhYmluZGV4IHRvIHVzZSB3aGVuIHRoZSBsaXN0Ym94IGlzIGVuYWJsZWQuICovXG4gIEBJbnB1dCgndGFiaW5kZXgnKVxuICBnZXQgZW5hYmxlZFRhYkluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkVGFiSW5kZXggPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLl9lbmFibGVkVGFiSW5kZXg7XG4gIH1cbiAgc2V0IGVuYWJsZWRUYWJJbmRleCh2YWx1ZSkge1xuICAgIHRoaXMuX2VuYWJsZWRUYWJJbmRleCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2VuYWJsZWRUYWJJbmRleD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSB2YWx1ZSBzZWxlY3RlZCBpbiB0aGUgbGlzdGJveCwgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2Ygb3B0aW9uIHZhbHVlcy4gKi9cbiAgQElucHV0KCdjZGtMaXN0Ym94VmFsdWUnKVxuICBnZXQgdmFsdWUoKTogcmVhZG9ubHkgVFtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbCgpLnNlbGVjdGVkO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogcmVhZG9ubHkgVFtdKSB7XG4gICAgdGhpcy5fc2V0U2VsZWN0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaXN0Ym94IGFsbG93cyBtdWx0aXBsZSBvcHRpb25zIHRvIGJlIHNlbGVjdGVkLiBJZiB0aGUgdmFsdWUgc3dpdGNoZXMgZnJvbSBgdHJ1ZWBcbiAgICogdG8gYGZhbHNlYCwgYW5kIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHNlbGVjdGVkLCBhbGwgb3B0aW9ucyBhcmUgZGVzZWxlY3RlZC5cbiAgICovXG4gIEBJbnB1dCgnY2RrTGlzdGJveE11bHRpcGxlJylcbiAgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgfVxuICBzZXQgbXVsdGlwbGUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgIHRoaXMuX29uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cbiAgcHJpdmF0ZSBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0aGUgbGlzdGJveCBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KCdjZGtMaXN0Ym94RGlzYWJsZWQnKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGxpc3Rib3ggd2lsbCB1c2UgYWN0aXZlIGRlc2NlbmRhbnQgb3Igd2lsbCBtb3ZlIGZvY3VzIG9udG8gdGhlIG9wdGlvbnMuICovXG4gIEBJbnB1dCgnY2RrTGlzdGJveFVzZUFjdGl2ZURlc2NlbmRhbnQnKVxuICBnZXQgdXNlQWN0aXZlRGVzY2VuZGFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlQWN0aXZlRGVzY2VuZGFudDtcbiAgfVxuICBzZXQgdXNlQWN0aXZlRGVzY2VuZGFudChzaG91bGRVc2VBY3RpdmVEZXNjZW5kYW50OiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl91c2VBY3RpdmVEZXNjZW5kYW50ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHNob3VsZFVzZUFjdGl2ZURlc2NlbmRhbnQpO1xuICB9XG4gIHByaXZhdGUgX3VzZUFjdGl2ZURlc2NlbmRhbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsaXN0Ym94LiBPbmx5IGFmZmVjdHMga2V5Ym9hcmQgaW50ZXJhY3Rpb24sIG5vdCB2aXN1YWwgbGF5b3V0LiAqL1xuICBASW5wdXQoJ2Nka0xpc3Rib3hPcmllbnRhdGlvbicpIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnID0gJ3ZlcnRpY2FsJztcblxuICAvKiogVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSBvcHRpb24gdmFsdWVzLiAqL1xuICBASW5wdXQoJ2Nka0xpc3Rib3hDb21wYXJlV2l0aCcpXG4gIGdldCBjb21wYXJlV2l0aCgpOiB1bmRlZmluZWQgfCAoKG8xOiBULCBvMjogVCkgPT4gYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLl9jb21wYXJlV2l0aDtcbiAgfVxuICBzZXQgY29tcGFyZVdpdGgoZm46IHVuZGVmaW5lZCB8ICgobzE6IFQsIG8yOiBUKSA9PiBib29sZWFuKSkge1xuICAgIHRoaXMuX2NvbXBhcmVXaXRoID0gZm47XG4gICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uTW9kZWwoKTtcbiAgfVxuICBwcml2YXRlIF9jb21wYXJlV2l0aD86IChvMTogVCwgbzI6IFQpID0+IGJvb2xlYW47XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIHNlbGVjdGVkIHZhbHVlKHMpIGluIHRoZSBsaXN0Ym94IGNoYW5nZS4gKi9cbiAgQE91dHB1dCgnY2RrTGlzdGJveFZhbHVlQ2hhbmdlJykgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgU3ViamVjdDxMaXN0Ym94VmFsdWVDaGFuZ2VFdmVudDxUPj4oKTtcblxuICAvKiogVGhlIGNoaWxkIG9wdGlvbnMgaW4gdGhpcyBsaXN0Ym94LiAqL1xuICBAQ29udGVudENoaWxkcmVuKENka09wdGlvbiwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgcHJvdGVjdGVkIG9wdGlvbnM6IFF1ZXJ5TGlzdDxDZGtPcHRpb248VD4+O1xuXG4gIC8vIFRPRE8obW1hbGVyYmEpOiBSZWZhY3RvciBTZWxlY3Rpb25Nb2RlbCBzbyB0aGF0IGl0cyBub3QgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzXG4gIC8qKiBUaGUgc2VsZWN0aW9uIG1vZGVsIHVzZWQgYnkgdGhlIGxpc3Rib3guICovXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25Nb2RlbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgIG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0aGlzLm11bHRpcGxlLCBbXSwgdHJ1ZSwgdGhpcy5fY29tcGFyZVdpdGgpLFxuICApO1xuXG4gIC8qKiBUaGUga2V5IG1hbmFnZXIgdGhhdCBtYW5hZ2VzIGtleWJvYXJkIG5hdmlnYXRpb24gZm9yIHRoaXMgbGlzdGJveC4gKi9cbiAgcHJvdGVjdGVkIGxpc3RLZXlNYW5hZ2VyOiBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxDZGtPcHRpb248VD4+O1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBsaXN0Ym94IGlzIGRlc3Ryb3llZC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIFRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGxpc3Rib3guICovXG4gIHByb3RlY3RlZCByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGluamVjdChFbGVtZW50UmVmKS5uYXRpdmVFbGVtZW50O1xuXG4gIC8qKiBUaGUgY2hhbmdlIGRldGVjdG9yIGZvciB0aGlzIGxpc3Rib3guICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBsaXN0Ym94IGhhcyBiZWVuIHRvdWNoZWQgKi9cbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgLyoqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBsaXN0Ym94IHZhbHVlIGNoYW5nZXMgKi9cbiAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogcmVhZG9ubHkgVFtdKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgLyoqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBmb3JtIHZhbGlkYXRvciBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9vblZhbGlkYXRvckNoYW5nZSA9ICgpID0+IHt9O1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFuIG9wdGlvbiBoYXMgYmVlbiBjbGlja2VkLiAqL1xuICBwcml2YXRlIF9vcHRpb25DbGlja2VkID0gZGVmZXIoKCkgPT5cbiAgICAodGhpcy5vcHRpb25zLmNoYW5nZXMgYXMgT2JzZXJ2YWJsZTxDZGtPcHRpb248VD5bXT4pLnBpcGUoXG4gICAgICBzdGFydFdpdGgodGhpcy5vcHRpb25zKSxcbiAgICAgIHN3aXRjaE1hcChvcHRpb25zID0+IG1lcmdlKC4uLm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24uX2NsaWNrZWQucGlwZShtYXBUbyhvcHRpb24pKSkpKSxcbiAgICApLFxuICApO1xuXG4gIC8qKiBUaGUgZGlyZWN0aW9uYWxpdHkgb2YgdGhlIHBhZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpciA9IGluamVjdChEaXJlY3Rpb25hbGl0eSwgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpO1xuXG4gIC8vIFRPRE8obW1hbGVyYmEpOiBTaG91bGQgbm90IGRlcGVuZCBvbiBjb21ib2JveFxuICBwcml2YXRlIHJlYWRvbmx5IF9jb21ib2JveCA9IGluamVjdChDZGtDb21ib2JveCwgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0b3IgdGhhdCBwcm9kdWNlcyBhbiBlcnJvciBpZiBtdWx0aXBsZSB2YWx1ZXMgYXJlIHNlbGVjdGVkIGluIGEgc2luZ2xlIHNlbGVjdGlvblxuICAgKiBsaXN0Ym94LlxuICAgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiBlcnJvciBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF92YWxpZGF0ZU11bHRpcGxlVmFsdWVzOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLl9jb2VyY2VWYWx1ZShjb250cm9sLnZhbHVlKTtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgY29udHJvbFZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB7J2Nka0xpc3Rib3hNdWx0aXBsZVZhbHVlcyc6IHRydWV9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdG9yIHRoYXQgcHJvZHVjZXMgYW4gZXJyb3IgaWYgYW55IHNlbGVjdGVkIHZhbHVlcyBhcmUgbm90IHZhbGlkIG9wdGlvbnMgZm9yIHRoaXMgbGlzdGJveC5cbiAgICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybiBBIHZhbGlkYXRpb24gZXJyb3Igb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVJbnZhbGlkVmFsdWVzOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLl9jb2VyY2VWYWx1ZShjb250cm9sLnZhbHVlKTtcbiAgICBjb25zdCBpbnZhbGlkVmFsdWVzID0gdGhpcy5fZ2V0VmFsdWVzV2l0aFZhbGlkaXR5KGNvbnRyb2xWYWx1ZSwgZmFsc2UpO1xuICAgIGlmIChpbnZhbGlkVmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsnY2RrTGlzdGJveEludmFsaWRWYWx1ZXMnOiB7J3ZhbHVlcyc6IGludmFsaWRWYWx1ZXN9fTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqIFRoZSBjb21iaW5lZCBzZXQgb2YgdmFsaWRhdG9ycyBmb3IgdGhpcyBsaXN0Ym94LiAqL1xuICBwcml2YXRlIF92YWxpZGF0b3JzID0gVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICB0aGlzLl92YWxpZGF0ZU11bHRpcGxlVmFsdWVzLFxuICAgIHRoaXMuX3ZhbGlkYXRlSW52YWxpZFZhbHVlcyxcbiAgXSkhO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHNlbGVjdGlvbk1vZGVsID0+IHNlbGVjdGlvbk1vZGVsLmNoYW5nZWQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVybmFsVmFsdWUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpIHtcbiAgICAgIHRoaXMuX3ZlcmlmeU5vT3B0aW9uVmFsdWVDb2xsaXNpb25zKCk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRLZXlNYW5hZ2VyKCk7XG4gICAgdGhpcy5fY29tYm9ib3g/Ll9yZWdpc3RlckNvbnRlbnQodGhpcy5pZCwgJ2xpc3Rib3gnKTtcbiAgICB0aGlzLm9wdGlvbnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVJbnRlcm5hbFZhbHVlKCk7XG4gICAgICB0aGlzLl9vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgIH0pO1xuICAgIHRoaXMuX29wdGlvbkNsaWNrZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIob3B0aW9uID0+ICFvcHRpb24uZGlzYWJsZWQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShvcHRpb24gPT4gdGhpcy5faGFuZGxlT3B0aW9uQ2xpY2tlZChvcHRpb24pKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubGlzdEtleU1hbmFnZXIuY2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gb3B0aW9uLlxuICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdG8gdG9nZ2xlXG4gICAqL1xuICB0b2dnbGUob3B0aW9uOiBDZGtPcHRpb248VD4pIHtcbiAgICB0aGlzLnRvZ2dsZVZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdmFsdWUuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdG9nZ2xlXG4gICAqL1xuICB0b2dnbGVWYWx1ZSh2YWx1ZTogVCkge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwoKS50b2dnbGUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgZ2l2ZW4gb3B0aW9uLlxuICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdG8gc2VsZWN0XG4gICAqL1xuICBzZWxlY3Qob3B0aW9uOiBDZGtPcHRpb248VD4pIHtcbiAgICB0aGlzLnNlbGVjdFZhbHVlKG9wdGlvbi52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBnaXZlbiB2YWx1ZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZWxlY3RcbiAgICovXG4gIHNlbGVjdFZhbHVlKHZhbHVlOiBUKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbCgpLnNlbGVjdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZWxlY3QgdGhlIGdpdmVuIG9wdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRvIGRlc2VsZWN0XG4gICAqL1xuICBkZXNlbGVjdChvcHRpb246IENka09wdGlvbjxUPikge1xuICAgIHRoaXMuZGVzZWxlY3RWYWx1ZShvcHRpb24udmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0IHRoZSBnaXZlbiB2YWx1ZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBkZXNlbGVjdFxuICAgKi9cbiAgZGVzZWxlY3RWYWx1ZSh2YWx1ZTogVCkge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwoKS5kZXNlbGVjdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiBhbGwgb3B0aW9ucy5cbiAgICogQHBhcmFtIGlzU2VsZWN0ZWQgVGhlIG5ldyBzZWxlY3RlZCBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHNldEFsbFNlbGVjdGVkKGlzU2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwoKS5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsKCkuc2VsZWN0KC4uLnRoaXMub3B0aW9ucy50b0FycmF5KCkubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIGdpdmVuIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRvIGdldCB0aGUgc2VsZWN0ZWQgc3RhdGUgb2ZcbiAgICovXG4gIGlzU2VsZWN0ZWQob3B0aW9uOiBDZGtPcHRpb248VD4gfCBUKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZWwoKS5pc1NlbGVjdGVkKG9wdGlvbiBpbnN0YW5jZW9mIENka09wdGlvbiA/IG9wdGlvbi52YWx1ZSA6IG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBsaXN0Ym94J3MgdmFsdWUgY2hhbmdlcyBmcm9tIHVzZXIgaW5wdXQuXG4gICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgdG8gcmVnaXN0ZXJcbiAgICogQGRvY3MtcHJpdmF0ZVxuICAgKi9cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiByZWFkb25seSBUW10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgbGlzdGJveCBpcyBibHVycmVkIGJ5IHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIHRvIHJlZ2lzdGVyXG4gICAqIEBkb2NzLXByaXZhdGVcbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB7fSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxpc3Rib3gncyB2YWx1ZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGxpc3Rib3hcbiAgICogQGRvY3MtcHJpdmF0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogcmVhZG9ubHkgVFtdKTogdm9pZCB7XG4gICAgdGhpcy5fc2V0U2VsZWN0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgbGlzdGJveC5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgVGhlIG5ldyBkaXNhYmxlZCBzdGF0ZVxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gY29udHJvbFxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+KTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3JzKGNvbnRyb2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmb3JtIHZhbGlkYXRvciBjaGFuZ2VzLlxuICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIHRvIGNhbGxcbiAgICogQGRvY3MtcHJpdmF0ZVxuICAgKi9cbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuX29uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogRm9jdXMgdGhlIGxpc3Rib3gncyBob3N0IGVsZW1lbnQuICovXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuZWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqIFRoZSBzZWxlY3Rpb24gbW9kZWwgdXNlZCB0byB0cmFjayB0aGUgbGlzdGJveCdzIHZhbHVlLiAqL1xuICBwcm90ZWN0ZWQgc2VsZWN0aW9uTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHRoZSBnaXZlbiBvcHRpb24gaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbi5cbiAgICogLSBJbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGU6IHNlbGVjdHMgdGhlIG9wdGlvbiBhbmQgZGVzZWxlY3RzIGFueSBvdGhlciBzZWxlY3RlZCBvcHRpb24uXG4gICAqIC0gSW4gbXVsdGkgc2VsZWN0aW9uIG1vZGU6IHRvZ2dsZXMgdGhlIHNlbGVjdGVkIHN0YXRlIG9mIHRoZSBvcHRpb24uXG4gICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0byB0cmlnZ2VyXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJpZ2dlck9wdGlvbihvcHRpb246IENka09wdGlvbjxUPiB8IG51bGwpIHtcbiAgICBpZiAob3B0aW9uICYmICFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsKClcbiAgICAgICAgLmNoYW5nZWQucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IChjaGFuZ2VkID0gdHJ1ZSkpO1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy50b2dnbGUob3B0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0KG9wdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5uZXh0KHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgICBsaXN0Ym94OiB0aGlzLFxuICAgICAgICAgIG9wdGlvbjogb3B0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gb3B0aW9uIGFzIGFjdGl2ZS5cbiAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRvIG1ha2UgYWN0aXZlXG4gICAqL1xuICBfc2V0QWN0aXZlT3B0aW9uKG9wdGlvbjogQ2RrT3B0aW9uPFQ+KSB7XG4gICAgdGhpcy5saXN0S2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG9wdGlvbik7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdGhlIGxpc3Rib3ggcmVjZWl2ZXMgZm9jdXMuICovXG4gIHByb3RlY3RlZCBfaGFuZGxlRm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLnVzZUFjdGl2ZURlc2NlbmRhbnQpIHtcbiAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICAgIHRoaXMuX2ZvY3VzQWN0aXZlT3B0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHByZXNzZXMga2V5ZG93biBvbiB0aGUgbGlzdGJveC4gKi9cbiAgcHJvdGVjdGVkIF9oYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2tleUNvZGV9ID0gZXZlbnQ7XG4gICAgY29uc3QgcHJldmlvdXNBY3RpdmVJbmRleCA9IHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4O1xuXG4gICAgaWYgKGtleUNvZGUgPT09IFNQQUNFIHx8IGtleUNvZGUgPT09IEVOVEVSKSB7XG4gICAgICB0aGlzLnRyaWdnZXJPcHRpb24odGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogV2lsbCBzZWxlY3QgYW4gb3B0aW9uIGlmIHNoaWZ0IHdhcyBwcmVzc2VkIHdoaWxlIG5hdmlnYXRpbmcgdG8gdGhlIG9wdGlvbiAqL1xuICAgIGNvbnN0IGlzQXJyb3cgPVxuICAgICAga2V5Q29kZSA9PT0gVVBfQVJST1cgfHxcbiAgICAgIGtleUNvZGUgPT09IERPV05fQVJST1cgfHxcbiAgICAgIGtleUNvZGUgPT09IExFRlRfQVJST1cgfHxcbiAgICAgIGtleUNvZGUgPT09IFJJR0hUX0FSUk9XO1xuICAgIGlmIChpc0Fycm93ICYmIGV2ZW50LnNoaWZ0S2V5ICYmIHByZXZpb3VzQWN0aXZlSW5kZXggIT09IHRoaXMubGlzdEtleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJPcHRpb24odGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGZvY3VzIGxlYXZlcyBhbiBlbGVtZW50IGluIHRoZSBsaXN0Ym94LlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGZvY3Vzb3V0IGV2ZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgX2hhbmRsZUZvY3VzT3V0KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgY29uc3Qgb3RoZXJFbGVtZW50ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBFbGVtZW50O1xuICAgIGlmICh0aGlzLmVsZW1lbnQgIT09IG90aGVyRWxlbWVudCAmJiAhdGhpcy5lbGVtZW50LmNvbnRhaW5zKG90aGVyRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGlkIG9mIHRoZSBhY3RpdmUgb3B0aW9uIGlmIGFjdGl2ZSBkZXNjZW5kYW50IGlzIGJlaW5nIHVzZWQuICovXG4gIHByb3RlY3RlZCBfZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZUFjdGl2ZURlc2NlbmRhbnQgPyB0aGlzLmxpc3RLZXlNYW5hZ2VyPy5hY3RpdmVJdGVtPy5pZCA6IG51bGw7XG4gIH1cblxuICAvKiogR2V0IHRoZSB0YWJpbmRleCBmb3IgdGhlIGxpc3Rib3guICovXG4gIHByb3RlY3RlZCBfZ2V0VGFiSW5kZXgoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXNlQWN0aXZlRGVzY2VuZGFudCB8fCAhdGhpcy5saXN0S2V5TWFuYWdlci5hY3RpdmVJdGVtID8gdGhpcy5lbmFibGVkVGFiSW5kZXggOiAtMTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplIHRoZSBrZXkgbWFuYWdlci4gKi9cbiAgcHJpdmF0ZSBfaW5pdEtleU1hbmFnZXIoKSB7XG4gICAgdGhpcy5saXN0S2V5TWFuYWdlciA9IG5ldyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcih0aGlzLm9wdGlvbnMpXG4gICAgICAud2l0aFdyYXAoKVxuICAgICAgLndpdGhUeXBlQWhlYWQoKVxuICAgICAgLndpdGhIb21lQW5kRW5kKClcbiAgICAgIC53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbJ3NoaWZ0S2V5J10pO1xuXG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHRoaXMubGlzdEtleU1hbmFnZXIud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saXN0S2V5TWFuYWdlci53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2Rpcj8udmFsdWUgfHwgJ2x0cicpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEtleU1hbmFnZXIuY2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mb2N1c0FjdGl2ZU9wdGlvbigpKTtcbiAgfVxuXG4gIC8vIFRPRE8obW1hbGVyYmEpOiBTaG91bGQgbm90IGRlcGVuZCBvbiBjb21ib2JveC5cbiAgcHJpdmF0ZSBfdXBkYXRlUGFuZWxGb3JTZWxlY3Rpb24ob3B0aW9uOiBDZGtPcHRpb248VD4pIHtcbiAgICBpZiAodGhpcy5fY29tYm9ib3gpIHtcbiAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLl9jb21ib2JveC51cGRhdGVBbmRDbG9zZShvcHRpb24uaXNTZWxlY3RlZCgpID8gb3B0aW9uLnZhbHVlIDogW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tYm9ib3gudXBkYXRlQW5kQ2xvc2UodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG1vZGUgd2hlbiB0aGUgJ211bHRpcGxlJyBwcm9wZXJ0eSBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF91cGRhdGVTZWxlY3Rpb25Nb2RlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsU3ViamVjdC5uZXh0KFxuICAgICAgbmV3IFNlbGVjdGlvbk1vZGVsKFxuICAgICAgICB0aGlzLm11bHRpcGxlLFxuICAgICAgICAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDEgPyBbXSA6IHRoaXMudmFsdWUuc2xpY2UoKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5fY29tcGFyZVdpdGgsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKiogRm9jdXMgdGhlIGFjdGl2ZSBvcHRpb24uICovXG4gIHByaXZhdGUgX2ZvY3VzQWN0aXZlT3B0aW9uKCkge1xuICAgIGlmICghdGhpcy51c2VBY3RpdmVEZXNjZW5kYW50KSB7XG4gICAgICB0aGlzLmxpc3RLZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0/LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzZWxlY3RlZCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbGlzdCBvZiBuZXcgc2VsZWN0ZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0U2VsZWN0aW9uKHZhbHVlOiByZWFkb25seSBUW10pIHtcbiAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSB0aGlzLl9jb2VyY2VWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGlvbihcbiAgICAgIC4uLighdGhpcy5tdWx0aXBsZSAmJiBjb2VyY2VkVmFsdWUubGVuZ3RoID4gMVxuICAgICAgICA/IFtdXG4gICAgICAgIDogdGhpcy5fZ2V0VmFsdWVzV2l0aFZhbGlkaXR5KGNvZXJjZWRWYWx1ZSwgdHJ1ZSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogVXBkYXRlIHRoZSBpbnRlcm5hbCB2YWx1ZSBvZiB0aGUgbGlzdGJveCBiYXNlZCBvbiB0aGUgc2VsZWN0aW9uIG1vZGVsLiAqL1xuICBwcml2YXRlIF91cGRhdGVJbnRlcm5hbFZhbHVlKCkge1xuICAgIGNvbnN0IGluZGV4Q2FjaGUgPSBuZXcgTWFwPFQsIG51bWJlcj4oKTtcbiAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlbW92ZSBhbnkgdmFsdWVzIGR1ZSB0byB0aGVtIGJlY29taW5nIGludmFsaWRcbiAgICAvLyAoZS5nLiBpZiB0aGUgb3B0aW9uIHdhcyByZW1vdmVkIGZyb20gdGhlIERPTS4pXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbk1vZGVsKCkuc2VsZWN0ZWQ7XG4gICAgY29uc3QgdmFsaWRTZWxlY3RlZCA9IHRoaXMuX2dldFZhbHVlc1dpdGhWYWxpZGl0eShzZWxlY3RlZCwgdHJ1ZSk7XG4gICAgaWYgKHZhbGlkU2VsZWN0ZWQubGVuZ3RoICE9IHNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGlvbiguLi52YWxpZFNlbGVjdGVkKTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbCgpLnNvcnQoKGE6IFQsIGI6IFQpID0+IHtcbiAgICAgIGNvbnN0IGFJbmRleCA9IHRoaXMuX2dldEluZGV4Rm9yVmFsdWUoaW5kZXhDYWNoZSwgYSk7XG4gICAgICBjb25zdCBiSW5kZXggPSB0aGlzLl9nZXRJbmRleEZvclZhbHVlKGluZGV4Q2FjaGUsIGIpO1xuICAgICAgcmV0dXJuIGFJbmRleCAtIGJJbmRleDtcbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiB2YWx1ZSBpbiB0aGUgZ2l2ZW4gbGlzdCBvZiBvcHRpb25zLlxuICAgKiBAcGFyYW0gY2FjaGUgVGhlIGNhY2hlIG9mIGluZGljZXMgZm91bmQgc28gZmFyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmluZFxuICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIG9wdGlvbnMgbGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0SW5kZXhGb3JWYWx1ZShjYWNoZTogTWFwPFQsIG51bWJlcj4sIHZhbHVlOiBUKSB7XG4gICAgY29uc3QgaXNFcXVhbCA9IHRoaXMuY29tcGFyZVdpdGggfHwgT2JqZWN0LmlzO1xuICAgIGlmICghY2FjaGUuaGFzKHZhbHVlKSkge1xuICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXNFcXVhbCh2YWx1ZSwgdGhpcy5vcHRpb25zLmdldChpKSEudmFsdWUpKSB7XG4gICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWNoZS5zZXQodmFsdWUsIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlLmdldCh2YWx1ZSkhO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgdXNlciBjbGlja2luZyBhbiBvcHRpb24uXG4gICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0aGF0IHdhcyBjbGlja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlT3B0aW9uQ2xpY2tlZChvcHRpb246IENka09wdGlvbjxUPikge1xuICAgIHRoaXMubGlzdEtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShvcHRpb24pO1xuICAgIHRoaXMudHJpZ2dlck9wdGlvbihvcHRpb24pO1xuICAgIHRoaXMuX3VwZGF0ZVBhbmVsRm9yU2VsZWN0aW9uKG9wdGlvbik7XG4gIH1cblxuICAvKiogVmVyaWZpZXMgdGhhdCBubyB0d28gb3B0aW9ucyByZXByZXNlbnQgdGhlIHNhbWUgdmFsdWUgdW5kZXIgdGhlIGNvbXBhcmVXaXRoIGZ1bmN0aW9uLiAqL1xuICBwcml2YXRlIF92ZXJpZnlOb09wdGlvblZhbHVlQ29sbGlzaW9ucygpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWxTdWJqZWN0LFxuICAgICAgdGhpcy5vcHRpb25zLmNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5vcHRpb25zKSksXG4gICAgXSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IGlzRXF1YWwgPSB0aGlzLmNvbXBhcmVXaXRoID8/IE9iamVjdC5pcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5nZXQoaSkhO1xuICAgICAgICBsZXQgZHVwbGljYXRlOiBDZGtPcHRpb248VD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSB0aGlzLm9wdGlvbnMuZ2V0KGopITtcbiAgICAgICAgICBpZiAoaXNFcXVhbChvcHRpb24udmFsdWUsIG90aGVyLnZhbHVlKSkge1xuICAgICAgICAgICAgZHVwbGljYXRlID0gb3RoZXI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgIC8vIFRPRE8obW1hbGVyYmEpOiBMaW5rIHRvIGRvY3MgYWJvdXQgdGhpcy5cbiAgICAgICAgICBpZiAodGhpcy5jb21wYXJlV2l0aCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBgRm91bmQgbXVsdGlwbGUgQ2RrT3B0aW9uIHJlcHJlc2VudGluZyB0aGUgc2FtZSB2YWx1ZSB1bmRlciB0aGUgZ2l2ZW4gY29tcGFyZVdpdGggZnVuY3Rpb25gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3B0aW9uMTogb3B0aW9uLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgb3B0aW9uMjogZHVwbGljYXRlLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgY29tcGFyZVdpdGg6IHRoaXMuY29tcGFyZVdpdGgsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvdW5kIG11bHRpcGxlIENka09wdGlvbiB3aXRoIHRoZSBzYW1lIHZhbHVlYCwge1xuICAgICAgICAgICAgICBvcHRpb24xOiBvcHRpb24uZWxlbWVudCxcbiAgICAgICAgICAgICAgb3B0aW9uMjogZHVwbGljYXRlLmVsZW1lbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29lcmNlcyBhIHZhbHVlIGludG8gYW4gYXJyYXkgcmVwcmVzZW50aW5nIGEgbGlzdGJveCBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29lcmNlXG4gICAqIEByZXR1cm4gQW4gYXJyYXlcbiAgICovXG4gIHByaXZhdGUgX2NvZXJjZVZhbHVlKHZhbHVlOiByZWFkb25seSBUW10pIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFtdIDogY29lcmNlQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3VibGlzdCBvZiB2YWx1ZXMgd2l0aCB0aGUgZ2l2ZW4gdmFsaWRpdHkuXG4gICAqIEBwYXJhbSB2YWx1ZXMgVGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAqIEBwYXJhbSB2YWxpZCBXaGV0aGVyIHRvIGdldCB2YWxpZCB2YWx1ZXNcbiAgICogQHJldHVybiBUaGUgc3VibGlzdCBvZiB2YWx1ZXMgd2l0aCB0aGUgcmVxdWVzdGVkIHZhbGlkaXR5XG4gICAqL1xuICBwcml2YXRlIF9nZXRWYWx1ZXNXaXRoVmFsaWRpdHkodmFsdWVzOiByZWFkb25seSBUW10sIHZhbGlkOiBib29sZWFuKSB7XG4gICAgY29uc3QgaXNFcXVhbCA9IHRoaXMuY29tcGFyZVdpdGggfHwgT2JqZWN0LmlzO1xuICAgIGNvbnN0IHZhbGlkVmFsdWVzID0gKHRoaXMub3B0aW9ucyB8fCBbXSkubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKFxuICAgICAgdmFsdWUgPT4gdmFsaWQgPT09IHZhbGlkVmFsdWVzLnNvbWUodmFsaWRWYWx1ZSA9PiBpc0VxdWFsKHZhbHVlLCB2YWxpZFZhbHVlKSksXG4gICAgKTtcbiAgfVxufVxuXG4vKiogQ2hhbmdlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbmV2ZXIgdGhlIHZhbHVlIG9mIHRoZSBsaXN0Ym94IGNoYW5nZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3Rib3hWYWx1ZUNoYW5nZUV2ZW50PFQ+IHtcbiAgLyoqIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGxpc3Rib3guICovXG4gIHJlYWRvbmx5IHZhbHVlOiByZWFkb25seSBUW107XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgbGlzdGJveCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LiAqL1xuICByZWFkb25seSBsaXN0Ym94OiBDZGtMaXN0Ym94PFQ+O1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIG9wdGlvbiB0aGF0IHdhcyB0cmlnZ2VyZWQuICovXG4gIHJlYWRvbmx5IG9wdGlvbjogQ2RrT3B0aW9uPFQ+O1xufVxuIl19
|