@impartner/design-components 2.0.1 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/esm2022/lib/badge/badge.component.mjs +17 -1
- package/esm2022/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.mjs +105 -0
- package/esm2022/lib/datetime-picker/components/datepicker-nav/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.mjs +30 -0
- package/esm2022/lib/datetime-picker/components/datepicker-template-host/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker/datetime-picker.component.mjs +370 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.mjs +367 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.mjs +68 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/index.mjs +6 -0
- package/esm2022/lib/datetime-picker/constants/datetime-picker-defaults.mjs +12 -0
- package/esm2022/lib/datetime-picker/constants/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/datetime-picker.module.mjs +22 -0
- package/esm2022/lib/datetime-picker/index.mjs +4 -0
- package/esm2022/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.mjs +40 -0
- package/esm2022/lib/datetime-picker/services/datetime-formatter/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/services/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/types/datetime-picker-value.interface.mjs +2 -0
- package/esm2022/lib/datetime-picker/types/index.mjs +2 -0
- package/esm2022/lib/design-components.module.mjs +20 -7
- package/esm2022/lib/form-field/component/directives/corner-hint.directive.mjs +15 -0
- package/esm2022/lib/form-field/component/directives/error.directive.mjs +27 -0
- package/esm2022/lib/form-field/component/directives/form-root.directive.mjs +93 -0
- package/esm2022/lib/form-field/component/directives/hint.directive.mjs +25 -0
- package/esm2022/lib/form-field/component/directives/index.mjs +25 -0
- package/esm2022/lib/form-field/component/directives/label.directive.mjs +15 -0
- package/esm2022/lib/form-field/component/directives/prefix.directive.mjs +25 -0
- package/esm2022/lib/form-field/component/directives/suffix.directive.mjs +25 -0
- package/esm2022/lib/form-field/component/form-field.component.mjs +131 -0
- package/esm2022/lib/form-field/component/form-field.module.mjs +24 -0
- package/esm2022/lib/form-field/component/index.mjs +4 -0
- package/esm2022/lib/form-field/controls/checkbox/checkbox.component.mjs +14 -6
- package/esm2022/lib/form-field/controls/checkbox/checkbox.module.mjs +4 -7
- package/esm2022/lib/form-field/controls/index.mjs +2 -1
- package/esm2022/lib/form-field/controls/input/input.directive.mjs +4 -3
- package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +6 -4
- package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +4 -3
- package/esm2022/lib/form-field/controls/radio/radio.module.mjs +4 -7
- package/esm2022/lib/form-field/controls/select/index.mjs +6 -3
- package/esm2022/lib/form-field/controls/select/interfaces/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/interfaces/select-option.interface.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/option/index.mjs +2 -2
- package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +33 -128
- package/esm2022/lib/form-field/controls/select/option-display/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/option-display/select-option-display.component.mjs +162 -0
- package/esm2022/lib/form-field/controls/select/option-group/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/option-group/select-option-group.component.mjs +35 -0
- package/esm2022/lib/form-field/controls/select/option-parent.mjs +2 -1
- package/esm2022/lib/form-field/controls/select/select.component.mjs +348 -148
- package/esm2022/lib/form-field/controls/select/select.module.mjs +20 -13
- package/esm2022/lib/form-field/controls/select/value-tags-display/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.mjs +91 -0
- package/esm2022/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +3 -3
- package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +19 -3
- package/esm2022/lib/form-field/controls/shared/toggle/toggle.module.mjs +4 -6
- package/esm2022/lib/form-field/controls/tag-select/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/tag-select/tag-select.component.mjs +146 -0
- package/esm2022/lib/form-field/impdc-forms.mjs +2 -3
- package/esm2022/lib/form-field/impdc-forms.module.mjs +32 -47
- package/esm2022/lib/form-field/shared/error-state.mixin.mjs +1 -1
- package/esm2022/lib/icon/icon.component.mjs +12 -5
- package/esm2022/lib/index.mjs +3 -1
- package/esm2022/lib/pagination/pagination.component.mjs +6 -6
- package/esm2022/lib/select-icon/select-icon.component.mjs +6 -6
- package/esm2022/lib/select-icon/select-icon.module.mjs +5 -1
- package/esm2022/lib/table/containers/table.component.mjs +3 -3
- package/esm2022/lib/tag/index.mjs +2 -0
- package/esm2022/lib/tag/tag.component.mjs +104 -0
- package/esm2022/lib/text-highlight/text-highlight.component.mjs +52 -37
- package/esm2022/lib/text-highlight/text-highlight.module.mjs +4 -6
- package/fesm2022/impartner-design-components.mjs +5620 -3983
- package/fesm2022/impartner-design-components.mjs.map +1 -1
- package/lib/badge/badge.component.d.ts +15 -1
- package/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.d.ts +31 -0
- package/lib/datetime-picker/components/datepicker-nav/index.d.ts +1 -0
- package/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.d.ts +14 -0
- package/lib/datetime-picker/components/datepicker-template-host/index.d.ts +1 -0
- package/lib/datetime-picker/components/datetime-picker/datetime-picker.component.d.ts +157 -0
- package/lib/datetime-picker/components/datetime-picker/index.d.ts +1 -0
- package/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.d.ts +160 -0
- package/lib/datetime-picker/components/datetime-picker-input/index.d.ts +1 -0
- package/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.d.ts +24 -0
- package/lib/datetime-picker/components/datetime-picker-input-footer/index.d.ts +1 -0
- package/lib/datetime-picker/components/index.d.ts +5 -0
- package/lib/datetime-picker/constants/datetime-picker-defaults.d.ts +4 -0
- package/lib/datetime-picker/constants/index.d.ts +1 -0
- package/lib/datetime-picker/datetime-picker.module.d.ts +8 -0
- package/lib/datetime-picker/index.d.ts +4 -0
- package/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.d.ts +20 -0
- package/lib/datetime-picker/services/datetime-formatter/index.d.ts +1 -0
- package/lib/datetime-picker/services/index.d.ts +1 -0
- package/lib/datetime-picker/types/datetime-picker-value.interface.d.ts +5 -0
- package/lib/datetime-picker/types/index.d.ts +1 -0
- package/lib/design-components.module.d.ts +14 -12
- package/lib/form-field/{directives → component/directives}/corner-hint.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/error.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/form-root.directive.d.ts +2 -2
- package/lib/form-field/{directives → component/directives}/hint.directive.d.ts +1 -1
- package/lib/form-field/component/directives/index.d.ts +15 -0
- package/lib/form-field/{directives → component/directives}/label.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/prefix.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/suffix.directive.d.ts +1 -1
- package/lib/form-field/{form-field.component.d.ts → component/form-field.component.d.ts} +3 -5
- package/lib/form-field/component/form-field.module.d.ts +14 -0
- package/lib/form-field/component/index.d.ts +3 -0
- package/lib/form-field/controls/checkbox/checkbox.component.d.ts +6 -2
- package/lib/form-field/controls/checkbox/checkbox.module.d.ts +1 -3
- package/lib/form-field/controls/index.d.ts +1 -0
- package/lib/form-field/controls/input/input.directive.d.ts +2 -2
- package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +1 -1
- package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +2 -2
- package/lib/form-field/controls/radio/radio.module.d.ts +1 -3
- package/lib/form-field/controls/select/index.d.ts +6 -2
- package/lib/form-field/controls/select/interfaces/index.d.ts +1 -0
- package/lib/form-field/controls/select/interfaces/select-option.interface.d.ts +6 -0
- package/lib/form-field/controls/select/option/index.d.ts +1 -1
- package/lib/form-field/controls/select/option/select-option.component.d.ts +10 -49
- package/lib/form-field/controls/select/option-display/index.d.ts +1 -0
- package/lib/form-field/controls/select/option-display/select-option-display.component.d.ts +64 -0
- package/lib/form-field/controls/select/option-group/index.d.ts +1 -0
- package/lib/form-field/controls/select/option-group/select-option-group.component.d.ts +11 -0
- package/lib/form-field/controls/select/option-parent.d.ts +12 -1
- package/lib/form-field/controls/select/select.component.d.ts +113 -51
- package/lib/form-field/controls/select/select.module.d.ts +5 -6
- package/lib/form-field/controls/select/value-tags-display/index.d.ts +1 -0
- package/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.d.ts +46 -0
- package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +1 -1
- package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +4 -1
- package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +1 -2
- package/lib/form-field/controls/tag-select/index.d.ts +1 -0
- package/lib/form-field/controls/tag-select/tag-select.component.d.ts +43 -0
- package/lib/form-field/impdc-forms.d.ts +1 -2
- package/lib/form-field/impdc-forms.module.d.ts +8 -14
- package/lib/form-field/shared/error-state.mixin.d.ts +4 -4
- package/lib/icon/icon.component.d.ts +5 -3
- package/lib/index.d.ts +2 -0
- package/lib/select-icon/select-icon.module.d.ts +4 -3
- package/lib/tag/index.d.ts +1 -0
- package/lib/tag/tag.component.d.ts +54 -0
- package/lib/text-highlight/text-highlight.component.d.ts +12 -6
- package/lib/text-highlight/text-highlight.module.d.ts +1 -2
- package/package.json +2 -2
- package/esm2022/lib/form-field/directives/corner-hint.directive.mjs +0 -14
- package/esm2022/lib/form-field/directives/error.directive.mjs +0 -26
- package/esm2022/lib/form-field/directives/form-root.directive.mjs +0 -91
- package/esm2022/lib/form-field/directives/hint.directive.mjs +0 -24
- package/esm2022/lib/form-field/directives/index.mjs +0 -8
- package/esm2022/lib/form-field/directives/label.directive.mjs +0 -14
- package/esm2022/lib/form-field/directives/prefix.directive.mjs +0 -24
- package/esm2022/lib/form-field/directives/suffix.directive.mjs +0 -24
- package/esm2022/lib/form-field/form-field.component.mjs +0 -132
- package/lib/form-field/directives/index.d.ts +0 -7
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
/* eslint-disable @angular-eslint/no-conflicting-lifecycle */
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { AsyncPipe, CommonModule } from '@angular/common';
|
|
3
|
+
import { Attribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, Directive, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, ViewChildren, booleanAttribute, inject, numberAttribute } from '@angular/core';
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
6
|
+
import { NgbDropdown, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
|
|
5
7
|
import { nanoid } from 'nanoid';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
8
|
+
import { BehaviorSubject, combineLatest, debounceTime, defer, distinctUntilChanged, map, merge, startWith, Subject, switchMap, take, takeUntil, tap } from 'rxjs';
|
|
9
|
+
import { ComponentTheme } from '../../../../types';
|
|
10
|
+
import { lc } from '../../../../utilities';
|
|
11
|
+
import { BadgeModule } from '../../../badge';
|
|
12
|
+
import { IconModule } from '../../../icon';
|
|
13
|
+
import { ErrorStateMatcher } from '../../services';
|
|
14
|
+
import { IMPDC_FORM_ROOT, FormFieldModule } from '../../component';
|
|
9
15
|
import { ImpdcFormFieldControl, mixinDisabled, mixinErrorState, mixinTabIndex } from '../../shared';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
16
|
+
import { InputDirective } from '../input';
|
|
17
|
+
import { IMPDC_SELECT_OPTION_PARENT_COMPONENT, IMPDC_SELECT_VALUE_BADGES_PARENT_COMPONENT } from './option-parent';
|
|
18
|
+
import { SelectOptionDisplayComponent } from './option-display';
|
|
12
19
|
import { SelectModel } from './select-model';
|
|
20
|
+
import { SelectOptionComponent } from './option';
|
|
21
|
+
import { SelectValueTagsDisplayComponent } from './value-tags-display';
|
|
13
22
|
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "
|
|
23
|
+
import * as i1 from "@angular/common";
|
|
15
24
|
import * as i2 from "@angular/forms";
|
|
16
|
-
import * as i3 from "@
|
|
17
|
-
import * as i4 from "
|
|
25
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
26
|
+
import * as i4 from "../../../icon/icon.component";
|
|
27
|
+
import * as i5 from "../../component/form-field.component";
|
|
28
|
+
import * as i6 from "../../component/directives/prefix.directive";
|
|
29
|
+
import * as i7 from "../../component/directives/suffix.directive";
|
|
30
|
+
export const ON_OPEN_AUTO_SCROLL_TIMEOUT_MS = 50;
|
|
18
31
|
export class SelectChangeEvent {
|
|
19
32
|
constructor(
|
|
20
33
|
/** The specific SelectComponent that changed. */
|
|
@@ -50,7 +63,8 @@ export function getImpdcSelectNonFunctionValueError() {
|
|
|
50
63
|
export function getImpdcSelectDynamicMultipleError() {
|
|
51
64
|
return Error('Cannot change `multiple` mode of select after initialization.');
|
|
52
65
|
}
|
|
53
|
-
const
|
|
66
|
+
const DEFAULT_ACTIVE_INDEX = -1;
|
|
67
|
+
const __SelectComponentBase = mixinTabIndex(mixinDisabled(mixinErrorState(class {
|
|
54
68
|
constructor(_defaultErrorStateMatcher, _formRoot, _parentForm, _parentFormGroup, ngControl) {
|
|
55
69
|
this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
|
|
56
70
|
this._formRoot = _formRoot;
|
|
@@ -60,12 +74,22 @@ const _SelectComponentBase = mixinTabIndex(mixinDisabled(mixinErrorState(class {
|
|
|
60
74
|
this.stateChanges = new Subject();
|
|
61
75
|
}
|
|
62
76
|
})));
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
77
|
+
export class _SelectComponentBase extends __SelectComponentBase {
|
|
78
|
+
/**
|
|
79
|
+
* Set whether or not an input field will appear for searching and
|
|
80
|
+
* filtering visible options.
|
|
81
|
+
*
|
|
82
|
+
* - `'none'`: No search control will be displayed, and all select options are provided via projected `<impdc-select-option>` elements.
|
|
83
|
+
* - `'static'`: A search control will be displayed, select options are provided via projected `<impdc-select-option>` elements, and
|
|
84
|
+
* filtering is performed against the `[label]` attribute value.
|
|
85
|
+
* @default 'none'
|
|
86
|
+
*/
|
|
87
|
+
get search() {
|
|
88
|
+
return this._searchSubject.value;
|
|
89
|
+
}
|
|
90
|
+
set search(value) {
|
|
91
|
+
this._searchSubject.next(value);
|
|
92
|
+
}
|
|
69
93
|
/**
|
|
70
94
|
* The placeholder text that will be displayed when no selection has been made.
|
|
71
95
|
*
|
|
@@ -88,24 +112,18 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
88
112
|
false);
|
|
89
113
|
}
|
|
90
114
|
set required(value) {
|
|
91
|
-
this._required =
|
|
115
|
+
this._required = value;
|
|
92
116
|
this.stateChanges.next();
|
|
93
117
|
}
|
|
94
118
|
/**
|
|
95
|
-
*
|
|
119
|
+
* Whether the control is a single-select or multiple-select. Cannot be changed after component initialization.
|
|
96
120
|
*/
|
|
97
121
|
get multiple() {
|
|
98
122
|
return this._multiple;
|
|
99
123
|
}
|
|
100
|
-
set multiple(value) {
|
|
101
|
-
if (this._selectionModel) {
|
|
102
|
-
throw getImpdcSelectDynamicMultipleError();
|
|
103
|
-
}
|
|
104
|
-
this._multiple = coerceBooleanPropertyValue(value);
|
|
105
|
-
}
|
|
106
124
|
/**
|
|
107
125
|
* Function used to compare option values with selected values. The first arg is a
|
|
108
|
-
* value from an option, and the second arg is a value from the selection.
|
|
126
|
+
* `value` from an option, and the second arg is a `value` from the selection or another option.
|
|
109
127
|
*
|
|
110
128
|
* @returns Boolean indicating if the values are equivalent.
|
|
111
129
|
*/
|
|
@@ -117,33 +135,91 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
117
135
|
throw getImpdcSelectNonFunctionValueError();
|
|
118
136
|
}
|
|
119
137
|
this._compareWith = fn;
|
|
120
|
-
if (this.
|
|
138
|
+
if (this.selectionModel) {
|
|
121
139
|
// Changing the comparator function means the visual selection may have changed.
|
|
122
140
|
this._initializeSelection();
|
|
123
141
|
}
|
|
124
142
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
this.
|
|
131
|
-
this.
|
|
143
|
+
constructor(uid, tabIndex) {
|
|
144
|
+
super(inject(ErrorStateMatcher), inject(IMPDC_FORM_ROOT, { optional: true }), inject(NgForm, { optional: true }), inject(FormGroupDirective, { optional: true }), inject(NgControl, { optional: true, self: true }));
|
|
145
|
+
this._ngDestroy = new Subject();
|
|
146
|
+
this._searchSubject = new BehaviorSubject('none');
|
|
147
|
+
this._compareWith = (o1, o2) => o1 === o2;
|
|
148
|
+
this._cvaOnChange = () => { };
|
|
149
|
+
this._cvaOnTouched = () => { };
|
|
150
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
151
|
+
this.ngZone = inject(NgZone);
|
|
152
|
+
this.searchControl = new FormControl(null);
|
|
153
|
+
this.BadgeTheme = ComponentTheme;
|
|
154
|
+
this.filteredOptions$ = this._searchSubject.pipe(switchMap(searchMode => {
|
|
155
|
+
switch (searchMode) {
|
|
156
|
+
case 'none':
|
|
157
|
+
return this.staticOptions.changes.pipe(startWith(this.staticOptions.toArray()), map(options => options.map(opt => ({
|
|
158
|
+
groupLabel: opt.groupLabel,
|
|
159
|
+
get label() {
|
|
160
|
+
return opt.label;
|
|
161
|
+
},
|
|
162
|
+
value: opt.value,
|
|
163
|
+
get disabled() {
|
|
164
|
+
return opt.disabled;
|
|
165
|
+
},
|
|
166
|
+
selected: this.selectionModel.isSelected(opt)
|
|
167
|
+
}))));
|
|
168
|
+
case 'static':
|
|
169
|
+
return combineLatest([
|
|
170
|
+
this.staticOptions.changes.pipe(startWith(this.staticOptions.toArray())),
|
|
171
|
+
this.searchTextChanges.pipe(startWith(''))
|
|
172
|
+
]).pipe(tap(([, searchText]) => {
|
|
173
|
+
this.activeIndex = !!searchText ? 0 : DEFAULT_ACTIVE_INDEX;
|
|
174
|
+
}), map(([options, searchText]) => {
|
|
175
|
+
const renderedOptions = options.map(opt => ({
|
|
176
|
+
groupLabel: opt.groupLabel,
|
|
177
|
+
get label() {
|
|
178
|
+
return opt.label;
|
|
179
|
+
},
|
|
180
|
+
value: opt.value,
|
|
181
|
+
get disabled() {
|
|
182
|
+
return opt.disabled;
|
|
183
|
+
},
|
|
184
|
+
selected: this.selectionModel.isSelected(opt)
|
|
185
|
+
}));
|
|
186
|
+
return !!searchText
|
|
187
|
+
? renderedOptions.filter(opt => lc(opt.label).indexOf(lc(searchText)) !== -1)
|
|
188
|
+
: renderedOptions;
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
}), map(options => Object.entries(options.reduce((result, opt) => {
|
|
192
|
+
const resolvedGroupLabel = opt.groupLabel?.trim() || '';
|
|
193
|
+
let showGroupLabel = false;
|
|
194
|
+
if (!(resolvedGroupLabel in result)) {
|
|
195
|
+
result[resolvedGroupLabel] = [];
|
|
196
|
+
showGroupLabel = true;
|
|
197
|
+
}
|
|
198
|
+
result[resolvedGroupLabel].push({
|
|
199
|
+
...opt,
|
|
200
|
+
showGroupLabel
|
|
201
|
+
});
|
|
202
|
+
return result;
|
|
203
|
+
}, {})).flatMap(([, groupOptions]) => groupOptions)));
|
|
204
|
+
this.activeIndex = DEFAULT_ACTIVE_INDEX;
|
|
132
205
|
/** @ignore */
|
|
133
206
|
this.optionSelectionChanges = defer(() => {
|
|
134
207
|
const options = this.options;
|
|
135
208
|
if (options) {
|
|
136
209
|
return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.onSelectionChange))));
|
|
137
210
|
}
|
|
138
|
-
return this.
|
|
211
|
+
return this.ngZone.onStable.pipe(take(1), switchMap(() => this.optionSelectionChanges));
|
|
139
212
|
});
|
|
140
|
-
this._uid = `impdc-select-${nanoid()}`;
|
|
141
|
-
this._ngDestroy = new Subject();
|
|
142
|
-
this._compareWith = (o1, o2) => o1 === o2;
|
|
143
|
-
this._cvaOnChange = () => { };
|
|
144
|
-
this._cvaOnTouched = () => { };
|
|
145
213
|
this._placeholder = '- Select -';
|
|
146
214
|
this._multiple = false;
|
|
215
|
+
/**
|
|
216
|
+
* Document element that the select dropdown will be attached to in the DOM - either the
|
|
217
|
+
* document's `<body>` tag, or as a child of the component tag.
|
|
218
|
+
*
|
|
219
|
+
* The default value (`'body'`) is generally the correct choice, and should only be
|
|
220
|
+
* overridden when absolutely certain that the result behavior is what's desired.
|
|
221
|
+
*/
|
|
222
|
+
this.dropdownContainer = 'body';
|
|
147
223
|
/** Events fire when selection has been changed by the user. */
|
|
148
224
|
this.selectionChange = new EventEmitter();
|
|
149
225
|
/**
|
|
@@ -152,59 +228,71 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
152
228
|
* @ignore
|
|
153
229
|
*/
|
|
154
230
|
this.valueChange = new EventEmitter();
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
231
|
+
/**
|
|
232
|
+
* Events fire when the text value of the option search input control has changed.
|
|
233
|
+
*/
|
|
234
|
+
this.searchTextChanges = this.searchControl.valueChanges.pipe(takeUntilDestroyed(), startWith(''), debounceTime(200), distinctUntilChanged());
|
|
158
235
|
this._focused = false;
|
|
236
|
+
this.uid = uid;
|
|
159
237
|
if (this.ngControl) {
|
|
160
238
|
this.ngControl.valueAccessor = this;
|
|
161
239
|
}
|
|
162
240
|
this.id = this.id;
|
|
163
|
-
this.tabIndex = parseInt(tabIndex) || 0;
|
|
241
|
+
this.tabIndex = parseInt(tabIndex ?? '') || 0;
|
|
164
242
|
}
|
|
165
|
-
get
|
|
166
|
-
return
|
|
243
|
+
get dropdownOpen() {
|
|
244
|
+
return this.ngbDropdown?.isOpen() ?? false;
|
|
167
245
|
}
|
|
168
|
-
get
|
|
169
|
-
|
|
170
|
-
return '';
|
|
171
|
-
}
|
|
172
|
-
if (!this._multiple) {
|
|
173
|
-
return this._selectionModel.selected[0].label;
|
|
174
|
-
}
|
|
175
|
-
return this._selectionModel.selected.map(opt => opt.label).join(', ');
|
|
246
|
+
get empty() {
|
|
247
|
+
return !this.selectionModel || this.selectionModel.isEmpty();
|
|
176
248
|
}
|
|
177
249
|
get selected() {
|
|
178
|
-
return this.
|
|
179
|
-
? this.
|
|
180
|
-
: this.
|
|
250
|
+
return this._multiple
|
|
251
|
+
? this.selectionModel?.selected || []
|
|
252
|
+
: this.selectionModel?.selected[0];
|
|
181
253
|
}
|
|
182
254
|
/** @ignore */
|
|
183
255
|
focus(options) {
|
|
184
|
-
this.
|
|
256
|
+
this.toggleButtonRef?.nativeElement.focus(options);
|
|
185
257
|
}
|
|
186
|
-
|
|
258
|
+
handleOpenChange(isOpen) {
|
|
187
259
|
if (isOpen) {
|
|
188
|
-
this.
|
|
260
|
+
this.onFocus();
|
|
261
|
+
if (this.search !== 'none' && !!this.searchInputRef) {
|
|
262
|
+
setTimeout(() => {
|
|
263
|
+
this.searchInputRef?.nativeElement.focus();
|
|
264
|
+
}, ON_OPEN_AUTO_SCROLL_TIMEOUT_MS);
|
|
265
|
+
}
|
|
266
|
+
if (!this._multiple && !!this.value) {
|
|
267
|
+
this._scrollToSelectedOption();
|
|
268
|
+
}
|
|
189
269
|
}
|
|
190
270
|
else {
|
|
191
|
-
this.
|
|
271
|
+
this.onBlur();
|
|
192
272
|
}
|
|
273
|
+
this.activeIndex = DEFAULT_ACTIVE_INDEX;
|
|
274
|
+
this.searchControl.reset();
|
|
193
275
|
this.stateChanges.next();
|
|
194
276
|
}
|
|
195
277
|
/* Angular lifecycle hooks */
|
|
196
278
|
/** @ignore */
|
|
197
279
|
ngOnInit() {
|
|
198
|
-
this.
|
|
280
|
+
this.selectionModel = new SelectModel(this._multiple, undefined, undefined, (a, b) => {
|
|
281
|
+
return this.compareWith(a.value, b.value);
|
|
282
|
+
});
|
|
199
283
|
this.stateChanges.next();
|
|
200
284
|
}
|
|
201
285
|
/** @ignore */
|
|
202
|
-
|
|
203
|
-
this.
|
|
286
|
+
ngAfterViewInit() {
|
|
287
|
+
this.selectionModel.changed$
|
|
204
288
|
.pipe(takeUntil(this._ngDestroy))
|
|
205
289
|
.subscribe(changeEvent => {
|
|
206
|
-
changeEvent.added.forEach(option =>
|
|
207
|
-
|
|
290
|
+
changeEvent.added.forEach(option => this.options
|
|
291
|
+
.find(o => this.compareWith(o.value, option.value))
|
|
292
|
+
?.select());
|
|
293
|
+
changeEvent.removed.forEach(option => this.options
|
|
294
|
+
.find(o => this.compareWith(o.value, option.value))
|
|
295
|
+
?.deselect());
|
|
208
296
|
});
|
|
209
297
|
this.options.changes
|
|
210
298
|
.pipe(startWith(null), takeUntil(this._ngDestroy))
|
|
@@ -214,10 +302,6 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
214
302
|
});
|
|
215
303
|
}
|
|
216
304
|
/** @ignore */
|
|
217
|
-
ngAfterViewInit() {
|
|
218
|
-
this._ngbDropdownMenu.menuItems = this.options;
|
|
219
|
-
}
|
|
220
|
-
/** @ignore */
|
|
221
305
|
ngDoCheck() {
|
|
222
306
|
const ngControl = this.ngControl;
|
|
223
307
|
if (!ngControl) {
|
|
@@ -260,7 +344,7 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
260
344
|
return this._id;
|
|
261
345
|
}
|
|
262
346
|
set id(value) {
|
|
263
|
-
this._id = value || this.
|
|
347
|
+
this._id = value || this.uid;
|
|
264
348
|
this.stateChanges.next();
|
|
265
349
|
}
|
|
266
350
|
get focused() {
|
|
@@ -282,11 +366,11 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
282
366
|
/** @ignore */
|
|
283
367
|
setDisabledState(isDisabled) {
|
|
284
368
|
this.disabled = isDisabled;
|
|
285
|
-
this.
|
|
369
|
+
this.changeDetector.markForCheck();
|
|
286
370
|
this.stateChanges.next();
|
|
287
371
|
}
|
|
288
372
|
/* Internals */
|
|
289
|
-
|
|
373
|
+
onFocus() {
|
|
290
374
|
if (!this.disabled) {
|
|
291
375
|
this._focused = true;
|
|
292
376
|
this.stateChanges.next();
|
|
@@ -295,14 +379,52 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
295
379
|
/**
|
|
296
380
|
* Calls the CVA touched callback only if the dropdown is closed.
|
|
297
381
|
*/
|
|
298
|
-
|
|
382
|
+
onBlur() {
|
|
299
383
|
this._focused = false;
|
|
300
384
|
if (!this.disabled && !this.dropdownOpen) {
|
|
301
385
|
this._cvaOnTouched();
|
|
302
|
-
this.
|
|
386
|
+
this.changeDetector.markForCheck();
|
|
303
387
|
this.stateChanges.next();
|
|
304
388
|
}
|
|
305
389
|
}
|
|
390
|
+
clearSelection() {
|
|
391
|
+
this.value = null;
|
|
392
|
+
this.focus();
|
|
393
|
+
}
|
|
394
|
+
handleSearchSubmit(evt) {
|
|
395
|
+
evt.preventDefault();
|
|
396
|
+
evt.stopPropagation();
|
|
397
|
+
if (this.activeIndex < 0 || this.activeIndex >= this.options.length)
|
|
398
|
+
return;
|
|
399
|
+
this.options.get(this.activeIndex)?.nativeElement.click();
|
|
400
|
+
}
|
|
401
|
+
handleSearchUpDown(evt, direction) {
|
|
402
|
+
evt.preventDefault();
|
|
403
|
+
if (direction === 'up') {
|
|
404
|
+
if (this.activeIndex === this.options.length - 1) {
|
|
405
|
+
this.activeIndex = (this.activeIndex + 1) % this.options.length;
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
this.activeIndex++;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
if (this.activeIndex <= 0) {
|
|
413
|
+
this.activeIndex = this.options.length - 1;
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
this.activeIndex--;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
this.changeDetector.markForCheck();
|
|
420
|
+
}
|
|
421
|
+
markActive(index) {
|
|
422
|
+
this.activeIndex = index;
|
|
423
|
+
this.changeDetector.markForCheck();
|
|
424
|
+
}
|
|
425
|
+
selectedIsSingle(selected) {
|
|
426
|
+
return !Array.isArray(selected);
|
|
427
|
+
}
|
|
306
428
|
_initializeSelection() {
|
|
307
429
|
// We defer this work into a promise in order to avoid tripping Angular's
|
|
308
430
|
// "Expression has changed after it was checked" error.
|
|
@@ -315,8 +437,10 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
315
437
|
});
|
|
316
438
|
}
|
|
317
439
|
_setSelectionByValue(value) {
|
|
318
|
-
this.
|
|
319
|
-
|
|
440
|
+
if (this.search === 'none') {
|
|
441
|
+
this.selectionModel.clear();
|
|
442
|
+
}
|
|
443
|
+
if (this._multiple && value) {
|
|
320
444
|
if (!Array.isArray(value)) {
|
|
321
445
|
throw getImpdcSelectNonArrayValueError();
|
|
322
446
|
}
|
|
@@ -326,11 +450,11 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
326
450
|
else {
|
|
327
451
|
this._selectOptionByValue(value);
|
|
328
452
|
}
|
|
329
|
-
this.
|
|
453
|
+
this.changeDetector.detectChanges();
|
|
330
454
|
}
|
|
331
455
|
_selectOptionByValue(value) {
|
|
332
456
|
const correspondingOption = this.options.find((option) => {
|
|
333
|
-
if (this.
|
|
457
|
+
if (this.selectionModel.isSelected(option)) {
|
|
334
458
|
return false;
|
|
335
459
|
}
|
|
336
460
|
try {
|
|
@@ -342,7 +466,7 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
342
466
|
}
|
|
343
467
|
});
|
|
344
468
|
if (correspondingOption) {
|
|
345
|
-
this.
|
|
469
|
+
this.selectionModel.select(correspondingOption);
|
|
346
470
|
}
|
|
347
471
|
return correspondingOption;
|
|
348
472
|
}
|
|
@@ -353,6 +477,7 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
353
477
|
if (newValue !== this._value ||
|
|
354
478
|
(this._multiple && Array.isArray(newValue))) {
|
|
355
479
|
if (this.options) {
|
|
480
|
+
this.selectionModel.clear();
|
|
356
481
|
this._setSelectionByValue(newValue);
|
|
357
482
|
}
|
|
358
483
|
this._value = newValue;
|
|
@@ -366,23 +491,23 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
366
491
|
.pipe(takeUntil(changedOrDestroyed))
|
|
367
492
|
.subscribe(event => {
|
|
368
493
|
this._onSelect(event.source, event.isUserInput);
|
|
369
|
-
if (event.isUserInput && !this.
|
|
370
|
-
this.
|
|
494
|
+
if (event.isUserInput && !this._multiple && this.dropdownOpen) {
|
|
495
|
+
this.ngbDropdown.close();
|
|
371
496
|
this.focus();
|
|
372
497
|
}
|
|
373
498
|
});
|
|
374
499
|
merge(...this.options.map(option => option.stateChanges))
|
|
375
500
|
.pipe(takeUntil(changedOrDestroyed))
|
|
376
501
|
.subscribe(() => {
|
|
377
|
-
this.
|
|
502
|
+
this.changeDetector.detectChanges();
|
|
378
503
|
this.stateChanges.next();
|
|
379
504
|
});
|
|
380
505
|
}
|
|
381
506
|
_onSelect(option, isUserInput) {
|
|
382
|
-
const wasSelected = this.
|
|
507
|
+
const wasSelected = this.selectionModel.isSelected(option);
|
|
383
508
|
if (option.value == null && !this._multiple) {
|
|
384
509
|
option.deselect();
|
|
385
|
-
this.
|
|
510
|
+
this.selectionModel.clear();
|
|
386
511
|
if (this.value != null) {
|
|
387
512
|
this._propagateChanges(option.value);
|
|
388
513
|
}
|
|
@@ -390,34 +515,33 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
390
515
|
else {
|
|
391
516
|
if (wasSelected !== option.selected) {
|
|
392
517
|
option.selected
|
|
393
|
-
? this.
|
|
394
|
-
: this.
|
|
518
|
+
? this.selectionModel.select(option)
|
|
519
|
+
: this.selectionModel.deselect(option);
|
|
395
520
|
}
|
|
396
|
-
if (this.
|
|
521
|
+
if (this._multiple) {
|
|
397
522
|
this._sortValues();
|
|
398
|
-
if (isUserInput) {
|
|
399
|
-
this.focus();
|
|
400
|
-
}
|
|
401
523
|
}
|
|
402
524
|
}
|
|
403
|
-
if (wasSelected !== this.
|
|
525
|
+
if (wasSelected !== this.selectionModel.isSelected(option)) {
|
|
404
526
|
this._propagateChanges();
|
|
405
527
|
}
|
|
406
|
-
this.
|
|
528
|
+
this.changeDetector.markForCheck();
|
|
407
529
|
this.stateChanges.next();
|
|
408
530
|
}
|
|
409
531
|
_sortValues() {
|
|
410
|
-
if (this.
|
|
411
|
-
|
|
412
|
-
this.
|
|
413
|
-
|
|
532
|
+
if (this._multiple &&
|
|
533
|
+
(this.search === 'none' || this.search === 'static')) {
|
|
534
|
+
const options = this.staticOptions.toArray();
|
|
535
|
+
this.selectionModel.sort((a, b) => {
|
|
536
|
+
return (options.findIndex(o => this.compareWith(o.value, a.value)) -
|
|
537
|
+
options.findIndex(o => this.compareWith(o.value, b.value)));
|
|
414
538
|
});
|
|
415
539
|
this.stateChanges.next();
|
|
416
540
|
}
|
|
417
541
|
}
|
|
418
542
|
_propagateChanges(fallbackValue) {
|
|
419
543
|
let valToEmit = null;
|
|
420
|
-
if (this.
|
|
544
|
+
if (this._multiple) {
|
|
421
545
|
valToEmit = this.selected.map(option => option.value);
|
|
422
546
|
}
|
|
423
547
|
else {
|
|
@@ -433,8 +557,91 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
433
557
|
_buildChangeEvent(value) {
|
|
434
558
|
return new SelectChangeEvent(this, value);
|
|
435
559
|
}
|
|
436
|
-
|
|
437
|
-
|
|
560
|
+
/** @ignore */
|
|
561
|
+
_deselectOption(option, markTouched = true) {
|
|
562
|
+
if (this._multiple && this.selectionModel.isSelected(option)) {
|
|
563
|
+
this.selectionModel.deselect(option);
|
|
564
|
+
this._propagateChanges();
|
|
565
|
+
if (markTouched) {
|
|
566
|
+
this._cvaOnTouched();
|
|
567
|
+
}
|
|
568
|
+
this.changeDetector.markForCheck();
|
|
569
|
+
this.stateChanges.next();
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
_scrollToSelectedOption() {
|
|
573
|
+
setTimeout(() => {
|
|
574
|
+
if (this.dropdownOpen && this.selected && !Array.isArray(this.selected)) {
|
|
575
|
+
const selectedOptionElement = this.options.find(o => !Array.isArray(this.selected) &&
|
|
576
|
+
this.compareWith(o.value, this.selected.value));
|
|
577
|
+
selectedOptionElement?.nativeElement.scrollIntoView({
|
|
578
|
+
block: 'nearest',
|
|
579
|
+
inline: 'nearest',
|
|
580
|
+
behavior: 'instant'
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
}, ON_OPEN_AUTO_SCROLL_TIMEOUT_MS);
|
|
584
|
+
}
|
|
585
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: _SelectComponentBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
|
|
586
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.1", type: _SelectComponentBase, inputs: { value: "value", id: "id" }, outputs: { searchTextChanges: "searchTextChanges" }, queries: [{ propertyName: "staticOptions", predicate: SelectOptionComponent, descendants: true }], viewQueries: [{ propertyName: "ngbDropdown", first: true, predicate: NgbDropdown, descendants: true }, { propertyName: "toggleButtonRef", first: true, predicate: ["toggleButton"], descendants: true, read: ElementRef }, { propertyName: "searchInputRef", first: true, predicate: ["searchInput"], descendants: true, read: (ElementRef) }, { propertyName: "options", predicate: SelectOptionDisplayComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
|
|
587
|
+
}
|
|
588
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: _SelectComponentBase, decorators: [{
|
|
589
|
+
type: Directive
|
|
590
|
+
}], ctorParameters: () => [{ type: undefined }, { type: undefined }], propDecorators: { staticOptions: [{
|
|
591
|
+
type: ContentChildren,
|
|
592
|
+
args: [SelectOptionComponent, { descendants: true }]
|
|
593
|
+
}], options: [{
|
|
594
|
+
type: ViewChildren,
|
|
595
|
+
args: [SelectOptionDisplayComponent]
|
|
596
|
+
}], ngbDropdown: [{
|
|
597
|
+
type: ViewChild,
|
|
598
|
+
args: [NgbDropdown]
|
|
599
|
+
}], toggleButtonRef: [{
|
|
600
|
+
type: ViewChild,
|
|
601
|
+
args: ['toggleButton', { read: ElementRef }]
|
|
602
|
+
}], searchInputRef: [{
|
|
603
|
+
type: ViewChild,
|
|
604
|
+
args: ['searchInput', { read: (ElementRef) }]
|
|
605
|
+
}], searchTextChanges: [{
|
|
606
|
+
type: Output
|
|
607
|
+
}], value: [{
|
|
608
|
+
type: Input
|
|
609
|
+
}], id: [{
|
|
610
|
+
type: Input
|
|
611
|
+
}] } });
|
|
612
|
+
/**
|
|
613
|
+
* The `SelectComponent` (`<impdc-select`) is a select-style dropdown input where an item (or multiple items) can be picked
|
|
614
|
+
* from a list of *unique* available options. This component can be used within a `FormFieldComponent` (`<impdc-form-field`).
|
|
615
|
+
* To use, add `SelectModule` to the `imports` array of the relevant `NgModule` or standalone component.
|
|
616
|
+
*/
|
|
617
|
+
export class SelectComponent extends _SelectComponentBase {
|
|
618
|
+
constructor(tabIndex) {
|
|
619
|
+
super(`impdc-select-${nanoid()}`, tabIndex);
|
|
620
|
+
this.controlType = 'impdc-select';
|
|
621
|
+
this.supportsAffixes = true;
|
|
622
|
+
/**
|
|
623
|
+
* Allow the user to click a button inside of the select control and clear their selection(s);
|
|
624
|
+
*
|
|
625
|
+
* @default true
|
|
626
|
+
*/
|
|
627
|
+
this.allowClear = true;
|
|
628
|
+
this.multipleDisplay = 'inside';
|
|
629
|
+
}
|
|
630
|
+
get multiple() {
|
|
631
|
+
return this._multiple;
|
|
632
|
+
}
|
|
633
|
+
set multiple(value) {
|
|
634
|
+
if (this.selectionModel) {
|
|
635
|
+
throw getImpdcSelectDynamicMultipleError();
|
|
636
|
+
}
|
|
637
|
+
this._multiple = value;
|
|
638
|
+
}
|
|
639
|
+
/** @ignore */
|
|
640
|
+
deselectOption(option) {
|
|
641
|
+
this._deselectOption(option);
|
|
642
|
+
}
|
|
643
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: SelectComponent, deps: [{ token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
644
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.1", type: SelectComponent, isStandalone: true, selector: "impdc-select", inputs: { disabled: "disabled", tabIndex: ["tabIndex", "tabIndex", numberAttribute], search: "search", placeholder: "placeholder", required: ["required", "required", booleanAttribute], compareWith: "compareWith", dropdownContainer: "dropdownContainer", errorStateMatcher: "errorStateMatcher", allowClear: ["allowClear", "allowClear", booleanAttribute], multiple: ["multiple", "multiple", booleanAttribute], multipleDisplay: "multipleDisplay" }, outputs: { selectionChange: "selectionChange", valueChange: "valueChange", searchTextChanges: "searchTextChanges" }, host: { listeners: { "focus": "onFocus(); focus()" }, properties: { "attr.id": "id", "attr.tabindex": "tabIndex", "attr.aria-required": "required.toString()", "attr.aria-disabled": "disabled.toString()", "attr.aria-invalid": "errorState", "class.form-select": "true", "class.is-invalid": "errorState", "class.impdc-form-field-control": "true", "class.impdc-select--required": "required", "class.impdc-select--disabled": "disabled", "class.impdc-select--invalid": "errorState", "class.impdc-select--empty": "empty", "class.impdc-select--multiple": "multiple" } }, providers: [
|
|
438
645
|
{
|
|
439
646
|
provide: ImpdcFormFieldControl,
|
|
440
647
|
useExisting: SelectComponent
|
|
@@ -442,12 +649,36 @@ export class SelectComponent extends _SelectComponentBase {
|
|
|
442
649
|
{
|
|
443
650
|
provide: IMPDC_SELECT_OPTION_PARENT_COMPONENT,
|
|
444
651
|
useExisting: SelectComponent
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
provide: IMPDC_SELECT_VALUE_BADGES_PARENT_COMPONENT,
|
|
655
|
+
useExisting: SelectComponent
|
|
445
656
|
}
|
|
446
|
-
],
|
|
657
|
+
], exportAs: ["impdcSelect"], usesInheritance: true, ngImport: i0, template: "<div\n ngbDropdown\n #dropdown=\"ngbDropdown\"\n [autoClose]=\"multiple ? 'outside' : true\"\n [container]=\"dropdownContainer\"\n [dropdownClass]=\"dropdownContainer === 'body' ? 'impartner-hex' : ''\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"h-100 w-100\">\n <button\n #toggleButton\n class=\"impdc-select--toggle btn border-0 h-100 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n ngbDropdownToggle>\n @if (empty) {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @else { @if (selectedIsSingle(selected)) {\n <span class=\"impdc-select--text impdc-select--value-text\">\n {{ selected.label }}\n </span>\n } @else if (multipleDisplay === 'inside') {\n <impdc-select-value-tags-display />\n } @else {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @if (!disabled && allowClear) {\n <button\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"$event.stopPropagation(); dropdown.close(); clearSelection()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n } }\n </button>\n <div\n ngbDropdownMenu\n class=\"impdc-select--dropdown-menu bg-white text-gray-600\"\n role=\"listbox\"\n tabindex=\"-1\">\n <div *ngIf=\"search !== 'none'\" class=\"impdc-select--search\">\n <impdc-form-field>\n <span impdcTextPrefix (click)=\"searchInput.focus()\">\n <impdc-icon name=\"search\"></impdc-icon>\n </span>\n <input\n #searchInput\n impdcInput\n [formControl]=\"searchControl\"\n class=\"impdc-select--search-input\"\n type=\"search\"\n (keydown.enter)=\"handleSearchSubmit($event)\"\n (keydown.arrowdown)=\"handleSearchUpDown($event, 'up')\"\n (keydown.arrowup)=\"handleSearchUpDown($event, 'down')\" />\n <span impdcTextSuffix>\n <button\n *ngIf=\"searchControl.value\"\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"searchControl.reset(); searchInput.focus()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n </span>\n </impdc-form-field>\n </div>\n <div class=\"impdc-select--options\">\n @for (option of filteredOptions$ | async; track option.value; let idx =\n $index; let first = $first) { @if (option.groupLabel &&\n option.showGroupLabel) {\n <div class=\"impdc-select--option-group-label\">\n {{ option.groupLabel }}\n </div>\n }\n <impdc-select-option-display\n [class.impdc-select-option--active]=\"idx === activeIndex\"\n [class.impdc-select-option--grouped]=\"!!option.groupLabel\"\n [groupLabel]=\"option.groupLabel\"\n [label]=\"option.label\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [selected]=\"option.selected\"\n [highlightText]=\"searchControl.value\"\n (mouseenter)=\"markActive(idx)\"\n (focus)=\"markActive(idx)\" />\n }\n </div>\n </div>\n</div>\n", styles: [".impdc-select--clear-btn{align-items:center;color:var(--impd-color-gray-400);display:inline-flex;justify-content:center;padding:0;height:2rem;width:2rem;box-shadow:none!important}.impdc-select--clear-btn:focus-visible{box-shadow:var(--impartner-hex-btn-box-shadow),var(--impartner-hex-btn-focus-box-shadow)!important}.impdc-select--clear-btn impdc-icon{line-height:1}.impdc-select--dropdown-menu{overflow:hidden}.impdc-select--search{padding-left:var(--impd-size-2);padding-right:var(--impd-size-2)}.impdc-select--search [impdcTextSuffix]{min-width:3.4rem;width:3.4rem}.impdc-select--options{overflow-y:auto;overflow-x:hidden;max-height:var(--impd-size-72)}.impdc-select--option-group-label{color:var(--impd-color-gray-600);font-size:var(--impd-size-2_5);font-weight:var(--impd-font-weight-semibold);line-height:var(--impd-size-4);padding:var(--impd-size-1) var(--impd-size-4);text-transform:uppercase;white-space:nowrap}.impdc-select--option-group-label:not(:first-child){margin-top:var(--impd-size-2)}button[ngbDropdownToggle].dropdown-toggle:after{display:none}:host{padding:0!important;position:relative}:host.impdc-select--disabled{background-color:var(--impd-color-gray-100)}:host.no-caret{--impartner-hex-form-select-bg-img: none}:host:not(.no-caret) .impdc-select--toggle{padding-right:3.6rem}:host:not(.no-caret).is-invalid .impdc-select--toggle{padding-right:6.6rem}.impdc-select--toggle{font-weight:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;gap:var(--impd-size-1)}.impdc-select--toggle:disabled{cursor:default}.impdc-select--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.impdc-select--value-badges{display:flex;flex-wrap:wrap;gap:var(--impd-size-1);width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "component", type: SelectOptionDisplayComponent, selector: "impdc-select-option-display", inputs: ["selected", "value", "label", "groupLabel", "highlightText", "id", "disabled"], outputs: ["onSelectionChange"] }, { kind: "component", type: SelectValueTagsDisplayComponent, selector: "impdc-select-value-tags-display", inputs: ["rounded", "select", "readonly", "truncateThreshold", "showMoreLabel", "showLessLabel"] }, { kind: "ngmodule", type: FormFieldModule }, { kind: "component", type: i5.FormFieldComponent, selector: "impdc-form-field", exportAs: ["impdcFormField"] }, { kind: "directive", type: i6.PrefixDirective, selector: "[impdcPrefix], [impdcTextPrefix]", inputs: ["impdcTextPrefix"] }, { kind: "directive", type: i7.SuffixDirective, selector: "[impdcSuffix], [impdcTextSuffix]", inputs: ["impdcTextSuffix"] }, { kind: "directive", type: InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "ngmodule", type: BadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
447
658
|
}
|
|
448
659
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: SelectComponent, decorators: [{
|
|
449
660
|
type: Component,
|
|
450
|
-
args: [{ selector: 'impdc-select', exportAs: 'impdcSelect',
|
|
661
|
+
args: [{ selector: 'impdc-select', exportAs: 'impdcSelect', standalone: true, imports: [
|
|
662
|
+
CommonModule,
|
|
663
|
+
AsyncPipe,
|
|
664
|
+
ReactiveFormsModule,
|
|
665
|
+
NgbDropdownModule,
|
|
666
|
+
IconModule,
|
|
667
|
+
SelectOptionDisplayComponent,
|
|
668
|
+
SelectValueTagsDisplayComponent,
|
|
669
|
+
FormFieldModule,
|
|
670
|
+
InputDirective,
|
|
671
|
+
BadgeModule
|
|
672
|
+
], inputs: [
|
|
673
|
+
'disabled',
|
|
674
|
+
{ name: 'tabIndex', transform: numberAttribute },
|
|
675
|
+
'search',
|
|
676
|
+
'placeholder',
|
|
677
|
+
{ name: 'required', transform: booleanAttribute },
|
|
678
|
+
'compareWith',
|
|
679
|
+
'dropdownContainer',
|
|
680
|
+
'errorStateMatcher'
|
|
681
|
+
], outputs: ['selectionChange', 'valueChange', 'searchTextChanges'], changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
451
682
|
'[attr.id]': 'id',
|
|
452
683
|
'[attr.tabindex]': 'tabIndex',
|
|
453
684
|
'[attr.aria-required]': 'required.toString()',
|
|
@@ -461,7 +692,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
|
|
|
461
692
|
'[class.impdc-select--invalid]': 'errorState',
|
|
462
693
|
'[class.impdc-select--empty]': 'empty',
|
|
463
694
|
'[class.impdc-select--multiple]': 'multiple',
|
|
464
|
-
'(focus)': '
|
|
695
|
+
'(focus)': 'onFocus(); focus()'
|
|
465
696
|
}, providers: [
|
|
466
697
|
{
|
|
467
698
|
provide: ImpdcFormFieldControl,
|
|
@@ -470,53 +701,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
|
|
|
470
701
|
{
|
|
471
702
|
provide: IMPDC_SELECT_OPTION_PARENT_COMPONENT,
|
|
472
703
|
useExisting: SelectComponent
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
provide: IMPDC_SELECT_VALUE_BADGES_PARENT_COMPONENT,
|
|
707
|
+
useExisting: SelectComponent
|
|
473
708
|
}
|
|
474
|
-
], template: "<div\n ngbDropdown\n [autoClose]=\"multiple ? 'outside' : true\"\n container=\"
|
|
475
|
-
}], ctorParameters: () => [{ type:
|
|
709
|
+
], template: "<div\n ngbDropdown\n #dropdown=\"ngbDropdown\"\n [autoClose]=\"multiple ? 'outside' : true\"\n [container]=\"dropdownContainer\"\n [dropdownClass]=\"dropdownContainer === 'body' ? 'impartner-hex' : ''\"\n (openChange)=\"handleOpenChange($event)\"\n class=\"h-100 w-100\">\n <button\n #toggleButton\n class=\"impdc-select--toggle btn border-0 h-100 text-start\"\n type=\"button\"\n role=\"combobox\"\n [disabled]=\"disabled\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n ngbDropdownToggle>\n @if (empty) {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @else { @if (selectedIsSingle(selected)) {\n <span class=\"impdc-select--text impdc-select--value-text\">\n {{ selected.label }}\n </span>\n } @else if (multipleDisplay === 'inside') {\n <impdc-select-value-tags-display />\n } @else {\n <span class=\"impdc-select--text impdc-select--placeholder\">{{\n placeholder\n }}</span>\n } @if (!disabled && allowClear) {\n <button\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"$event.stopPropagation(); dropdown.close(); clearSelection()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n } }\n </button>\n <div\n ngbDropdownMenu\n class=\"impdc-select--dropdown-menu bg-white text-gray-600\"\n role=\"listbox\"\n tabindex=\"-1\">\n <div *ngIf=\"search !== 'none'\" class=\"impdc-select--search\">\n <impdc-form-field>\n <span impdcTextPrefix (click)=\"searchInput.focus()\">\n <impdc-icon name=\"search\"></impdc-icon>\n </span>\n <input\n #searchInput\n impdcInput\n [formControl]=\"searchControl\"\n class=\"impdc-select--search-input\"\n type=\"search\"\n (keydown.enter)=\"handleSearchSubmit($event)\"\n (keydown.arrowdown)=\"handleSearchUpDown($event, 'up')\"\n (keydown.arrowup)=\"handleSearchUpDown($event, 'down')\" />\n <span impdcTextSuffix>\n <button\n *ngIf=\"searchControl.value\"\n type=\"button\"\n class=\"impdc-select--clear-btn btn btn-xs btn-link text-gray-400 ms-auto\"\n (click)=\"searchControl.reset(); searchInput.focus()\">\n <impdc-icon name=\"times\" [size]=\"16\"></impdc-icon>\n </button>\n </span>\n </impdc-form-field>\n </div>\n <div class=\"impdc-select--options\">\n @for (option of filteredOptions$ | async; track option.value; let idx =\n $index; let first = $first) { @if (option.groupLabel &&\n option.showGroupLabel) {\n <div class=\"impdc-select--option-group-label\">\n {{ option.groupLabel }}\n </div>\n }\n <impdc-select-option-display\n [class.impdc-select-option--active]=\"idx === activeIndex\"\n [class.impdc-select-option--grouped]=\"!!option.groupLabel\"\n [groupLabel]=\"option.groupLabel\"\n [label]=\"option.label\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [selected]=\"option.selected\"\n [highlightText]=\"searchControl.value\"\n (mouseenter)=\"markActive(idx)\"\n (focus)=\"markActive(idx)\" />\n }\n </div>\n </div>\n</div>\n", styles: [".impdc-select--clear-btn{align-items:center;color:var(--impd-color-gray-400);display:inline-flex;justify-content:center;padding:0;height:2rem;width:2rem;box-shadow:none!important}.impdc-select--clear-btn:focus-visible{box-shadow:var(--impartner-hex-btn-box-shadow),var(--impartner-hex-btn-focus-box-shadow)!important}.impdc-select--clear-btn impdc-icon{line-height:1}.impdc-select--dropdown-menu{overflow:hidden}.impdc-select--search{padding-left:var(--impd-size-2);padding-right:var(--impd-size-2)}.impdc-select--search [impdcTextSuffix]{min-width:3.4rem;width:3.4rem}.impdc-select--options{overflow-y:auto;overflow-x:hidden;max-height:var(--impd-size-72)}.impdc-select--option-group-label{color:var(--impd-color-gray-600);font-size:var(--impd-size-2_5);font-weight:var(--impd-font-weight-semibold);line-height:var(--impd-size-4);padding:var(--impd-size-1) var(--impd-size-4);text-transform:uppercase;white-space:nowrap}.impdc-select--option-group-label:not(:first-child){margin-top:var(--impd-size-2)}button[ngbDropdownToggle].dropdown-toggle:after{display:none}:host{padding:0!important;position:relative}:host.impdc-select--disabled{background-color:var(--impd-color-gray-100)}:host.no-caret{--impartner-hex-form-select-bg-img: none}:host:not(.no-caret) .impdc-select--toggle{padding-right:3.6rem}:host:not(.no-caret).is-invalid .impdc-select--toggle{padding-right:6.6rem}.impdc-select--toggle{font-weight:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;gap:var(--impd-size-1)}.impdc-select--toggle:disabled{cursor:default}.impdc-select--text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.impdc-select--value-badges{display:flex;flex-wrap:wrap;gap:var(--impd-size-1);width:100%}\n"] }]
|
|
710
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
476
711
|
type: Attribute,
|
|
477
712
|
args: ['tabindex']
|
|
478
|
-
}] },
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
type: Inject,
|
|
482
|
-
args: [IMPDC_FORM_ROOT]
|
|
483
|
-
}] }, { type: i2.NgForm, decorators: [{
|
|
484
|
-
type: Optional
|
|
485
|
-
}] }, { type: i2.FormGroupDirective, decorators: [{
|
|
486
|
-
type: Optional
|
|
487
|
-
}] }, { type: i2.NgControl, decorators: [{
|
|
488
|
-
type: Self
|
|
489
|
-
}, {
|
|
490
|
-
type: Optional
|
|
491
|
-
}] }], propDecorators: { options: [{
|
|
492
|
-
type: ContentChildren,
|
|
493
|
-
args: [SelectOptionComponent, { descendants: true }]
|
|
494
|
-
}], _ngbDropdown: [{
|
|
495
|
-
type: ViewChild,
|
|
496
|
-
args: [NgbDropdown]
|
|
497
|
-
}], _ngbDropdownMenu: [{
|
|
498
|
-
type: ViewChild,
|
|
499
|
-
args: [NgbDropdownMenu]
|
|
500
|
-
}], _toggleButtonRef: [{
|
|
501
|
-
type: ViewChild,
|
|
502
|
-
args: ['toggleButton', { static: true, read: ElementRef }]
|
|
503
|
-
}], placeholder: [{
|
|
504
|
-
type: Input
|
|
505
|
-
}], required: [{
|
|
506
|
-
type: Input
|
|
713
|
+
}] }], propDecorators: { allowClear: [{
|
|
714
|
+
type: Input,
|
|
715
|
+
args: [{ transform: booleanAttribute }]
|
|
507
716
|
}], multiple: [{
|
|
508
|
-
type: Input
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
}], errorStateMatcher: [{
|
|
512
|
-
type: Input
|
|
513
|
-
}], selectionChange: [{
|
|
514
|
-
type: Output
|
|
515
|
-
}], valueChange: [{
|
|
516
|
-
type: Output
|
|
517
|
-
}], value: [{
|
|
518
|
-
type: Input
|
|
519
|
-
}], id: [{
|
|
717
|
+
type: Input,
|
|
718
|
+
args: [{ transform: booleanAttribute }]
|
|
719
|
+
}], multipleDisplay: [{
|
|
520
720
|
type: Input
|
|
521
721
|
}] } });
|
|
522
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZm9ybS1maWVsZC9jb250cm9scy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZm9ybS1maWVsZC9jb250cm9scy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBR0wsU0FBUyxFQUNULHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFLTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLElBQUksRUFFSixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQU1MLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBRUwsMEJBQTBCLEVBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLEtBQUssRUFDTCxLQUFLLEVBRUwsU0FBUyxFQUNULE9BQU8sRUFDUCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBaUIsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUtMLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsZUFBZSxFQUNmLGFBQWEsRUFDZCxNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsb0NBQW9D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VTt3QkFDNUMsU0FBUyxFQUFFLHFCQUFxQjtxQkFDakMsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUscUJBQXFCOzRCQUM5QixXQUFXLGlCQUFpQjt5QkFDN0I7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLG9DQUFvQzs0QkFDN0MsV0FBVyxpQkFBaUI7eUJBQzdCO3FCQUNGOzswQkEySkUsU0FBUzsyQkFBQyxVQUFVOzswQkFFcEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlOzswQkFDbEMsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsSUFBSTs7MEJBQUksUUFBUTt5Q0E1SVosT0FBTztzQkFEYixlQUFlO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJbkQsWUFBWTtzQkFEckIsU0FBUzt1QkFBQyxXQUFXO2dCQUlaLGdCQUFnQjtzQkFEekIsU0FBUzt1QkFBQyxlQUFlO2dCQUloQixnQkFBZ0I7c0JBRHpCLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXNDbEQsV0FBVztzQkFEckIsS0FBSztnQkFlSyxRQUFRO3NCQURsQixLQUFLO2dCQWtCSyxRQUFRO3NCQURsQixLQUFLO2dCQW9CSyxXQUFXO3NCQURyQixLQUFLO2dCQWtCVSxpQkFBaUI7c0JBRGhDLEtBQUs7Z0JBS1UsZUFBZTtzQkFEOUIsTUFBTTtnQkFVUyxXQUFXO3NCQUQxQixNQUFNO2dCQW1KSSxLQUFLO3NCQURmLEtBQUs7Z0JBY0ssRUFBRTtzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L25vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZSAqL1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEb0NoZWNrLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5nQ29udHJvbCxcbiAgTmdGb3JtLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5nYkRyb3Bkb3duLCBOZ2JEcm9wZG93bk1lbnUgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHtcbiAgQm9vbGVhbklucHV0LFxuICBjb2VyY2VCb29sZWFuUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMnO1xuaW1wb3J0IHtcbiAgZGVmZXIsXG4gIG1lcmdlLFxuICBPYnNlcnZhYmxlLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBJbXBkY0Zvcm1Sb290LCBJTVBEQ19GT1JNX1JPT1QgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7XG4gIENhbkRpc2FibGUsXG4gIEhhc1RhYkluZGV4LFxuICBJQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcbiAgSUhhc0Vycm9yU3RhdGUsXG4gIEltcGRjRm9ybUZpZWxkQ29udHJvbCxcbiAgbWl4aW5EaXNhYmxlZCxcbiAgbWl4aW5FcnJvclN0YXRlLFxuICBtaXhpblRhYkluZGV4XG59IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBJTVBEQ19TRUxFQ1RfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQgfSBmcm9tICcuL29wdGlvbi1wYXJlbnQnO1xuaW1wb3J0IHtcbiAgU2VsZWN0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlRXZlbnQsXG4gIFNlbGVjdE9wdGlvbkNvbXBvbmVudFxufSBmcm9tICcuL29wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWxlY3RNb2RlbCB9IGZyb20gJy4vc2VsZWN0LW1vZGVsJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdENoYW5nZUV2ZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIFRoZSBzcGVjaWZpYyBTZWxlY3RDb21wb25lbnQgdGhhdCBjaGFuZ2VkLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IFNlbGVjdENvbXBvbmVudCxcbiAgICAvKiogVGhlIHNlbGVjdGVkIHZhbHVlKHMpICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBhbnlcbiAgKSB7fVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gYXNzaWduIGEgbm9uLWFycmF5IHZhbHVlIHRvIGEgc2VsZWN0XG4gKiBpbiBgbXVsdGlwbGVgIG1vZGUuIE5vdGUgdGhhdCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIGFyZSBzdGlsbCB2YWxpZCB2YWx1ZXMgdG8gYWxsb3cgZm9yXG4gKiByZXNldHRpbmcgdGhlIHZhbHVlLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wZGNTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKTogRXJyb3Ige1xuICByZXR1cm4gRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gYXNzaWduaW5nIGEgbm9uLWZ1bmN0aW9uIHZhbHVlIHRvIHRoZSBjb21wYXJhdG9yXG4gKiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGFuIG9wdGlvbi4gTm90ZSB0aGF0IHdoZXRoZXIgdGhlIGZ1bmN0aW9uXG4gKiBhY3R1YWxseSB0YWtlcyB0d28gdmFsdWVzIGFuZCByZXR1cm5zIGEgYm9vbGVhbiBpcyBub3QgY2hlY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGRjU2VsZWN0Tm9uRnVuY3Rpb25WYWx1ZUVycm9yKCk6IEVycm9yIHtcbiAgcmV0dXJuIEVycm9yKCdgY29tcGFyZVdpdGhgIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBhIHNlbGVjdCdzIGBtdWx0aXBsZWAgb3B0aW9uXG4gKiBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGRjU2VsZWN0RHluYW1pY011bHRpcGxlRXJyb3IoKTogRXJyb3Ige1xuICByZXR1cm4gRXJyb3IoJ0Nhbm5vdCBjaGFuZ2UgYG11bHRpcGxlYCBtb2RlIG9mIHNlbGVjdCBhZnRlciBpbml0aWFsaXphdGlvbi4nKTtcbn1cblxuY29uc3QgX1NlbGVjdENvbXBvbmVudEJhc2UgPSBtaXhpblRhYkluZGV4KFxuICBtaXhpbkRpc2FibGVkKFxuICAgIG1peGluRXJyb3JTdGF0ZShcbiAgICAgIGNsYXNzIHtcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgICAgcHVibGljIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgICAgICAgIHB1YmxpYyBfZm9ybVJvb3Q6IEltcGRjRm9ybVJvb3QsXG4gICAgICAgICAgcHVibGljIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgICAgICAgcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICAgICAgICBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsXG4gICAgICAgICkge31cbiAgICAgIH1cbiAgICApXG4gIClcbik7XG5cbi8qKlxuICogVGhlIGBTZWxlY3RDb21wb25lbnRgIChgPGltcGRjLXNlbGVjdGApIGlzIGEgc2VsZWN0LXN0eWxlIGRyb3Bkb3duIGlucHV0IHdoZXJlIGFuIGl0ZW0gKG9yIG11bHRpcGxlIGl0ZW1zKSBjYW4gYmUgcGlja2VkXG4gKiBmcm9tIGEgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucy4gVGhpcyBjb21wb25lbnQgY2FuIGJlIHVzZWQgd2l0aGluIGEgYEZvcm1GaWVsZENvbXBvbmVudGAgKGA8aW1wZGMtZm9ybS1maWVsZGApLlxuICogVG8gdXNlLCBpbXBvcnQgYFNlbGVjdE1vZHVsZWAgb3IgYW5vdGhlciBtb2R1bGUgdGhhdCBpbXBvcnRzIGFuZCBleHBvcnRzIHRoYXQgbW9kdWxlIGZyb20gYEBpbXBhcnRuZXIvZGVzaWduLWNvbXBvbmVudHNgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbXBkYy1zZWxlY3QnLFxuICBleHBvcnRBczogJ2ltcGRjU2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0cy1tZXRhZGF0YS1wcm9wZXJ0eVxuICBpbnB1dHM6IFsnZGlzYWJsZWQnLCAndGFiSW5kZXgnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taG9zdC1tZXRhZGF0YS1wcm9wZXJ0eVxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICdpZCcsXG4gICAgJ1thdHRyLnRhYmluZGV4XSc6ICd0YWJJbmRleCcsXG4gICAgJ1thdHRyLmFyaWEtcmVxdWlyZWRdJzogJ3JlcXVpcmVkLnRvU3RyaW5nKCknLFxuICAgICdbYXR0ci5hcmlhLWRpc2FibGVkXSc6ICdkaXNhYmxlZC50b1N0cmluZygpJyxcbiAgICAnW2F0dHIuYXJpYS1pbnZhbGlkXSc6ICdlcnJvclN0YXRlJyxcbiAgICAnW2NsYXNzLmZvcm0tc2VsZWN0XSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmlzLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbY2xhc3MuaW1wZGMtZm9ybS1maWVsZC1jb250cm9sXSc6ICd0cnVlJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0tcmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0tZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0taW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5pbXBkYy1zZWxlY3QtLWVtcHR5XSc6ICdlbXB0eScsXG4gICAgJ1tjbGFzcy5pbXBkYy1zZWxlY3QtLW11bHRpcGxlXSc6ICdtdWx0aXBsZScsXG4gICAgJyhmb2N1cyknOiAnX29uRm9jdXMoKTsgZm9jdXMoKSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogSW1wZGNGb3JtRmllbGRDb250cm9sLFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlbGVjdENvbXBvbmVudFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogSU1QRENfU0VMRUNUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlbGVjdENvbXBvbmVudFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnRcbiAgZXh0ZW5kcyBfU2VsZWN0Q29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzXG4gICAgT25Jbml0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgRG9DaGVjayxcbiAgICBPbkRlc3Ryb3ksXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgSGFzVGFiSW5kZXgsXG4gICAgSW1wZGNGb3JtRmllbGRDb250cm9sPGFueT4sXG4gICAgQ2FuRGlzYWJsZSxcbiAgICBJQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcbiAgICBJSGFzRXJyb3JTdGF0ZVxue1xuICAvKiogQGlnbm9yZSAqL1xuICBAQ29udGVudENoaWxkcmVuKFNlbGVjdE9wdGlvbkNvbXBvbmVudCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwdWJsaWMgb3B0aW9ucyE6IFF1ZXJ5TGlzdDxTZWxlY3RPcHRpb25Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoTmdiRHJvcGRvd24pXG4gIHByb3RlY3RlZCBfbmdiRHJvcGRvd24hOiBOZ2JEcm9wZG93bjtcblxuICBAVmlld0NoaWxkKE5nYkRyb3Bkb3duTWVudSlcbiAgcHJvdGVjdGVkIF9uZ2JEcm9wZG93bk1lbnUhOiBOZ2JEcm9wZG93bk1lbnU7XG5cbiAgQFZpZXdDaGlsZCgndG9nZ2xlQnV0dG9uJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJvdGVjdGVkIF90b2dnbGVCdXR0b25SZWYhOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlczogT2JzZXJ2YWJsZTxTZWxlY3RPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudD4gPVxuICAgIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgob3B0aW9ucyksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICBtZXJnZSguLi5vcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLm9uU2VsZWN0aW9uQ2hhbmdlKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUub25TdGFibGUucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF91aWQgPSBgaW1wZGMtc2VsZWN0LSR7bmFub2lkKCl9YDtcbiAgcHJvdGVjdGVkIF9zZWxlY3Rpb25Nb2RlbCE6IFNlbGVjdE1vZGVsPFNlbGVjdE9wdGlvbkNvbXBvbmVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmdEZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfcHJldmlvdXNDb250cm9sPzogQWJzdHJhY3RDb250cm9sIHwgbnVsbDtcbiAgcHJpdmF0ZSBfY29tcGFyZVdpdGggPSAobzE6IGFueSwgbzI6IGFueSkgPT4gbzEgPT09IG8yO1xuICBwcml2YXRlIF9jdmFPbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBfY3ZhT25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciB0ZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBubyBzZWxlY3Rpb24gaGFzIGJlZW4gbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXFwtIFNlbGVjdCAtXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyID0gJy0gU2VsZWN0IC0nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCByZXF1aXJlZG5lc3Mgb2YgY29udHJvbCBpbiBhIHRlbXBsYXRlLWJhc2VkIG1hbm5lcjtcbiAgICogbm90IG5lY2Vzc2FyeSB3aGVuIHVzaW5nIHRoZSBBbmd1bGFyIHJlYWN0aXZlIGZvcm1zIEFQSSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0b3IuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9yZXF1aXJlZCA/P1xuICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/Lmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSA/P1xuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5VmFsdWUodmFsdWUpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGEgc2luZ2xlLXNlbGVjdCBvciBtdWx0aXBsZS1zZWxlY3QuIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgbXVsdGlwbGUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Nb2RlbCkge1xuICAgICAgdGhyb3cgZ2V0SW1wZGNTZWxlY3REeW5hbWljTXVsdGlwbGVFcnJvcigpO1xuICAgIH1cblxuICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5VmFsdWUodmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBfbXVsdGlwbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIG9wdGlvbiB2YWx1ZXMgd2l0aCBzZWxlY3RlZCB2YWx1ZXMuIFRoZSBmaXJzdCBhcmcgaXMgYVxuICAgKiB2YWx1ZSBmcm9tIGFuIG9wdGlvbiwgYW5kIHRoZSBzZWNvbmQgYXJnIGlzIGEgdmFsdWUgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgY29tcGFyZVdpdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhcmVXaXRoO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGFyZVdpdGgoZm46IChhOiBhbnksIGI6IGFueSkgPT4gYm9vbGVhbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGdldEltcGRjU2VsZWN0Tm9uRnVuY3Rpb25WYWx1ZUVycm9yKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjtcblxuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Nb2RlbCkge1xuICAgICAgLy8gQ2hhbmdpbmcgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gbWVhbnMgdGhlIHZpc3VhbCBzZWxlY3Rpb24gbWF5IGhhdmUgY2hhbmdlZC5cbiAgICAgIHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgb3ZlcnJpZGUgZXJyb3JTdGF0ZU1hdGNoZXIhOiBFcnJvclN0YXRlTWF0Y2hlcjtcblxuICAvKiogRXZlbnRzIGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCBieSB0aGUgdXNlci4gKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxTZWxlY3RDaGFuZ2VFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Q2hhbmdlRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50cyBmaXJlIHdoZW4gcmF3IHZhbHVlIG9mIHNlbGVjdCBjaGFuZ2VzLiBNYWlubHkgZXhpc3RzIHRvIGhhbmRsZVxuICAgKiB0d28td2F5IGJpbmRpbmcgb2YgYHZhbHVlYCBpbnB1dCBwcm9wZXJ0eS5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbmdiRHJvcGRvd24/LmlzT3BlbigpID8/IGZhbHNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBfbmdab25lOiBOZ1pvbmUsXG4gICAgQEF0dHJpYnV0ZSgndGFiaW5kZXgnKSB0YWJJbmRleDogc3RyaW5nLFxuICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSU1QRENfRk9STV9ST09UKSBfZm9ybVJvb3Q6IEltcGRjRm9ybVJvb3QsXG4gICAgQE9wdGlvbmFsKCkgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w6IE5nQ29udHJvbFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICBfZm9ybVJvb3QsXG4gICAgICBfcGFyZW50Rm9ybSxcbiAgICAgIF9wYXJlbnRGb3JtR3JvdXAsXG4gICAgICBuZ0NvbnRyb2xcbiAgICApO1xuXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmlkID0gdGhpcy5pZDtcbiAgICB0aGlzLnRhYkluZGV4ID0gcGFyc2VJbnQodGFiSW5kZXgpIHx8IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fc2VsZWN0aW9uTW9kZWwgfHwgdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNwbGF5ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdLmxhYmVsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5tYXAob3B0ID0+IG9wdC5sYWJlbCkuam9pbignLCAnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogU2VsZWN0T3B0aW9uQ29tcG9uZW50IHwgU2VsZWN0T3B0aW9uQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGxlXG4gICAgICA/IHRoaXMuX3NlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCB8fCBbXVxuICAgICAgOiB0aGlzLl9zZWxlY3Rpb25Nb2RlbD8uc2VsZWN0ZWRbMF07XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX3RvZ2dsZUJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKG9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9oYW5kbGVPcGVuQ2hhbmdlKGlzT3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc09wZW4pIHtcbiAgICAgIHRoaXMuX29uRm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25CbHVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgLyogQW5ndWxhciBsaWZlY3ljbGUgaG9va3MgKi9cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0TW9kZWw8U2VsZWN0T3B0aW9uQ29tcG9uZW50PihcbiAgICAgIHRoaXMubXVsdGlwbGVcbiAgICApO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2hhbmdlZCRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9uZ0Rlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZShjaGFuZ2VFdmVudCA9PiB7XG4gICAgICAgIGNoYW5nZUV2ZW50LmFkZGVkLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5zZWxlY3QoKSk7XG4gICAgICAgIGNoYW5nZUV2ZW50LnJlbW92ZWQuZm9yRWFjaChvcHRpb24gPT4gb3B0aW9uLmRlc2VsZWN0KCkpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm9wdGlvbnMuY2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fbmdEZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZXNldE9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX25nYkRyb3Bkb3duTWVudS5tZW51SXRlbXMgPSB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMubmdDb250cm9sO1xuXG4gICAgaWYgKCFuZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcHJldmlvdXNDb250cm9sICE9PSBuZ0NvbnRyb2wuY29udHJvbCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbnRyb2wgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBuZ0NvbnRyb2wuZGlzYWJsZWQgIT09IG51bGwgJiZcbiAgICAgICAgbmdDb250cm9sLmRpc2FibGVkICE9PSB0aGlzLmRpc2FibGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IG5nQ29udHJvbD8uZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ByZXZpb3VzQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBNYW5hZ2luZyBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIHZpYSB0aGUgYG1peGluRGlzYWJsZWRgIG1peGluL2dlbmVyYXRvciwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc2lnbmFsXG4gICAgLy8gdG8gdGhlIHBhcmVudCBmb3JtIGZpZWxkIHNvIGl0IGNhbiBydW4gY2hhbmdlIGRldGVjdGlvbiB3aGVuIGRpc2FibGVkIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbmdEZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLl9uZ0Rlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyogSW1wZGNGb3JtRmllbGRDb250cm9sICovXG4gIHB1YmxpYyByZWFkb25seSBjb250cm9sVHlwZTogc3RyaW5nID0gJ2ltcGRjLXNlbGVjdCc7XG5cbiAgcHVibGljIHJlYWRvbmx5IHN1cHBvcnRzQWZmaXhlczogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBoYXNBc3NpZ25lZCA9IHRoaXMuX2Fzc2lnblZhbHVlKHZhbHVlKTtcblxuICAgIGlmIChoYXNBc3NpZ25lZCkge1xuICAgICAgdGhpcy5fY3ZhT25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlIHx8IHRoaXMuX3VpZDtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9pZCE6IHN0cmluZztcblxuICBwdWJsaWMgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWQgfHwgdGhpcy5kcm9wZG93bk9wZW47XG4gIH1cbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG5cbiAgLyogQ29udHJvbFZhbHVlQWNjZXNzb3IgKi9cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2lnblZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2N2YU9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHt9KTogdm9pZCB7XG4gICAgdGhpcy5fY3ZhT25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgLyogSW50ZXJuYWxzICovXG5cbiAgcHJvdGVjdGVkIF9vbkZvY3VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBDVkEgdG91Y2hlZCBjYWxsYmFjayBvbmx5IGlmIHRoZSBkcm9wZG93biBpcyBjbG9zZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX29uQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuZHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLl9jdmFPblRvdWNoZWQoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gV2UgZGVmZXIgdGhpcyB3b3JrIGludG8gYSBwcm9taXNlIGluIG9yZGVyIHRvIGF2b2lkIHRyaXBwaW5nIEFuZ3VsYXInc1xuICAgIC8vIFwiRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZFwiIGVycm9yLlxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5uZ0NvbnRyb2wudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2VsZWN0aW9uQnlWYWx1ZSh2YWx1ZTogYW55IHwgYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdmFsdWUpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgZ2V0SW1wZGNTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUuZm9yRWFjaChjdXJyZW50VmFsdWUgPT4gdGhpcy5fc2VsZWN0T3B0aW9uQnlWYWx1ZShjdXJyZW50VmFsdWUpKTtcbiAgICAgIHRoaXMuX3NvcnRWYWx1ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0T3B0aW9uQnlWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0T3B0aW9uQnlWYWx1ZSh2YWx1ZTogYW55KTogU2VsZWN0T3B0aW9uQ29tcG9uZW50IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAob3B0aW9uOiBTZWxlY3RPcHRpb25Db21wb25lbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZSAhPSBudWxsICYmIHRoaXMuX2NvbXBhcmVXaXRoKG9wdGlvbi52YWx1ZSwgdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmIChjb3JyZXNwb25kaW5nT3B0aW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoY29ycmVzcG9uZGluZ09wdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdPcHRpb247XG4gIH1cblxuICAvKiogQXNzaWducyBhIHZhbHVlIHRvIHRoZSBzZWxlY3QgY29udHJvbC4gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdFxuICAgKiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIF9hc3NpZ25WYWx1ZShuZXdWYWx1ZTogYW55IHwgYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSAhPT0gdGhpcy5fdmFsdWUgfHxcbiAgICAgICh0aGlzLl9tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSlcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldE9wdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlZE9yRGVzdHJveWVkID0gbWVyZ2UodGhpcy5vcHRpb25zLmNoYW5nZXMsIHRoaXMuX25nRGVzdHJveSk7XG5cbiAgICB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIHRoaXMuX29uU2VsZWN0KGV2ZW50LnNvdXJjZSwgZXZlbnQuaXNVc2VySW5wdXQpO1xuXG4gICAgICAgIGlmIChldmVudC5pc1VzZXJJbnB1dCAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLmRyb3Bkb3duT3Blbikge1xuICAgICAgICAgIHRoaXMuX25nYkRyb3Bkb3duLmNsb3NlKCk7XG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIG1lcmdlKC4uLnRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5zdGF0ZUNoYW5nZXMpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0KG9wdGlvbjogU2VsZWN0T3B0aW9uQ29tcG9uZW50LCBpc1VzZXJJbnB1dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pO1xuXG4gICAgaWYgKG9wdGlvbi52YWx1ZSA9PSBudWxsICYmICF0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgb3B0aW9uLmRlc2VsZWN0KCk7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuXG4gICAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMob3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdhc1NlbGVjdGVkICE9PSBvcHRpb24uc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkXG4gICAgICAgICAgPyB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3Qob3B0aW9uKVxuICAgICAgICAgIDogdGhpcy5fc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3Qob3B0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5fc29ydFZhbHVlcygpO1xuXG4gICAgICAgIGlmIChpc1VzZXJJbnB1dCkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3YXNTZWxlY3RlZCAhPT0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc29ydFZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy50b0FycmF5KCk7XG5cbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW5kZXhPZihhKSAtIG9wdGlvbnMuaW5kZXhPZihiKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlcyhmYWxsYmFja1ZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgbGV0IHZhbFRvRW1pdDogYW55ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB2YWxUb0VtaXQgPSAodGhpcy5zZWxlY3RlZCBhcyBTZWxlY3RPcHRpb25Db21wb25lbnRbXSkubWFwKFxuICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnZhbHVlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxUb0VtaXQgPSB0aGlzLnNlbGVjdGVkXG4gICAgICAgID8gKHRoaXMuc2VsZWN0ZWQgYXMgU2VsZWN0T3B0aW9uQ29tcG9uZW50KS52YWx1ZVxuICAgICAgICA6IGZhbGxiYWNrVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWUgPSB2YWxUb0VtaXQ7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbFRvRW1pdCk7XG4gICAgdGhpcy5fY3ZhT25DaGFuZ2UodmFsVG9FbWl0KTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2J1aWxkQ2hhbmdlRXZlbnQodmFsVG9FbWl0KSk7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZENoYW5nZUV2ZW50KHZhbHVlOiBhbnkpOiBTZWxlY3RDaGFuZ2VFdmVudCB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RDaGFuZ2VFdmVudCh0aGlzLCB2YWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgbmdiRHJvcGRvd25cbiAgW2F1dG9DbG9zZV09XCJtdWx0aXBsZSA/ICdvdXRzaWRlJyA6IHRydWVcIlxuICBjb250YWluZXI9XCJib2R5XCJcbiAgZHJvcGRvd25DbGFzcz1cImltcGFydG5lci1oZXhcIlxuICAob3BlbkNoYW5nZSk9XCJfaGFuZGxlT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgY2xhc3M9XCJ3LTEwMFwiPlxuICA8YnV0dG9uXG4gICAgI3RvZ2dsZUJ1dHRvblxuICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LS10b2dnbGUgYnRuIGJvcmRlci0wIHRleHQtc3RhcnRcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAoZm9jdXMpPVwiX29uRm9jdXMoKVwiXG4gICAgKGJsdXIpPVwiX29uQmx1cigpXCJcbiAgICBuZ2JEcm9wZG93blRvZ2dsZT5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbXB0eVwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLXRleHQgaW1wZGMtc2VsZWN0LS1wbGFjZWhvbGRlclwiXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCJcbiAgICAgICAgPnt7IHBsYWNlaG9sZGVyIH19PC9zcGFuXG4gICAgICA+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImltcGRjLXNlbGVjdC0tdGV4dCBpbXBkYy1zZWxlY3QtLXZhbHVlLXRleHRcIlxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIlxuICAgICAgICA+e3sgZGlzcGxheWVkVmFsdWUgfX08L3NwYW5cbiAgICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9idXR0b24+XG4gIDxkaXZcbiAgICBuZ2JEcm9wZG93bk1lbnVcbiAgICBjbGFzcz1cInctMTAwIGJnLXdoaXRlIHRleHQtZ3JheS02MDBcIlxuICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
722
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZm9ybS1maWVsZC9jb250cm9scy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvZm9ybS1maWVsZC9jb250cm9scy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFFTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBSU4sTUFBTSxFQUdOLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixlQUFlLEVBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxNQUFNLEVBQ04sbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLEdBQUcsRUFDSCxLQUFL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RUFBRSxZQUFZO3dCQUNsQyxrQ0FBa0MsRUFBRSxNQUFNO3dCQUMxQyxnQ0FBZ0MsRUFBRSxVQUFVO3dCQUM1QyxnQ0FBZ0MsRUFBRSxVQUFVO3dCQUM1QywrQkFBK0IsRUFBRSxZQUFZO3dCQUM3Qyw2QkFBNkIsRUFBRSxPQUFPO3dCQUN0QyxnQ0FBZ0MsRUFBRSxVQUFVO3dCQUM1QyxTQUFTLEVBQUUsb0JBQW9CO3FCQUNoQyxhQUNVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxxQkFBcUI7NEJBQzlCLFdBQVcsaUJBQWlCO3lCQUM3Qjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsb0NBQW9DOzRCQUM3QyxXQUFXLGlCQUFpQjt5QkFDN0I7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLDBDQUEwQzs0QkFDbkQsV0FBVyxpQkFBaUI7eUJBQzdCO3FCQUNGOzswQkFTWSxTQUFTOzJCQUFDLFVBQVU7eUNBVTFCLFVBQVU7c0JBRGhCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSWxCLFFBQVE7c0JBRDNCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBYS9CLGVBQWU7c0JBRHJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tY29uZmxpY3RpbmctbGlmZWN5Y2xlICovXG5pbXBvcnQgeyBBc3luY1BpcGUsIENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBBdHRyaWJ1dGUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGluamVjdCxcbiAgbnVtYmVyQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgTmdDb250cm9sLFxuICBOZ0Zvcm0sXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmdiRHJvcGRvd24sIE5nYkRyb3Bkb3duTW9kdWxlIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkZWZlcixcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50VGhlbWUgfSBmcm9tICcuLi8uLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBsYyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCYWRnZU1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2JhZGdlJztcbmltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9pY29uJztcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgSW1wZGNGb3JtUm9vdCxcbiAgSU1QRENfRk9STV9ST09ULFxuICBGb3JtRmllbGRNb2R1bGVcbn0gZnJvbSAnLi4vLi4vY29tcG9uZW50JztcbmltcG9ydCB7XG4gIENhbkRpc2FibGUsXG4gIEhhc1RhYkluZGV4LFxuICBJQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcbiAgSUhhc0Vycm9yU3RhdGUsXG4gIEltcGRjRm9ybUZpZWxkQ29udHJvbCxcbiAgbWl4aW5EaXNhYmxlZCxcbiAgbWl4aW5FcnJvclN0YXRlLFxuICBtaXhpblRhYkluZGV4XG59IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2lucHV0JztcbmltcG9ydCB7XG4gIElNUERDX1NFTEVDVF9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCxcbiAgSU1QRENfU0VMRUNUX1ZBTFVFX0JBREdFU19QQVJFTlRfQ09NUE9ORU5ULFxuICBJU2VsZWN0T3B0aW9uUGFyZW50Q29tcG9uZW50LFxuICBJU2VsZWN0VmFsdWVCYWRnZXNQYXJlbnRDb21wb25lbnRcbn0gZnJvbSAnLi9vcHRpb24tcGFyZW50JztcbmltcG9ydCB7XG4gIFNlbGVjdE9wdGlvblNlbGVjdGlvbkNoYW5nZUV2ZW50LFxuICBTZWxlY3RPcHRpb25EaXNwbGF5Q29tcG9uZW50XG59IGZyb20gJy4vb3B0aW9uLWRpc3BsYXknO1xuaW1wb3J0IHsgU2VsZWN0TW9kZWwgfSBmcm9tICcuL3NlbGVjdC1tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL29wdGlvbic7XG5pbXBvcnQgeyBJU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNlbGVjdFZhbHVlVGFnc0Rpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuL3ZhbHVlLXRhZ3MtZGlzcGxheSc7XG5cbmV4cG9ydCBjb25zdCBPTl9PUEVOX0FVVE9fU0NST0xMX1RJTUVPVVRfTVMgPSA1MDtcblxuZXhwb3J0IGNsYXNzIFNlbGVjdENoYW5nZUV2ZW50PFRDb21wb25lbnQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIFRoZSBzcGVjaWZpYyBTZWxlY3RDb21wb25lbnQgdGhhdCBjaGFuZ2VkLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IFRDb21wb25lbnQsXG4gICAgLyoqIFRoZSBzZWxlY3RlZCB2YWx1ZShzKSAqL1xuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZTogYW55XG4gICkge31cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGFzc2lnbiBhIG5vbi1hcnJheSB2YWx1ZSB0byBhIHNlbGVjdFxuICogaW4gYG11bHRpcGxlYCBtb2RlLiBOb3RlIHRoYXQgYHVuZGVmaW5lZGAgYW5kIGBudWxsYCBhcmUgc3RpbGwgdmFsaWQgdmFsdWVzIHRvIGFsbG93IGZvclxuICogcmVzZXR0aW5nIHRoZSB2YWx1ZS5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGRjU2VsZWN0Tm9uQXJyYXlWYWx1ZUVycm9yKCk6IEVycm9yIHtcbiAgcmV0dXJuIEVycm9yKCdWYWx1ZSBtdXN0IGJlIGFuIGFycmF5IGluIG11bHRpcGxlLXNlbGVjdGlvbiBtb2RlLicpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIGFzc2lnbmluZyBhIG5vbi1mdW5jdGlvbiB2YWx1ZSB0byB0aGUgY29tcGFyYXRvclxuICogdXNlZCB0byBkZXRlcm1pbmUgaWYgYSB2YWx1ZSBjb3JyZXNwb25kcyB0byBhbiBvcHRpb24uIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBmdW5jdGlvblxuICogYWN0dWFsbHkgdGFrZXMgdHdvIHZhbHVlcyBhbmQgcmV0dXJucyBhIGJvb2xlYW4gaXMgbm90IGNoZWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBkY1NlbGVjdE5vbkZ1bmN0aW9uVmFsdWVFcnJvcigpOiBFcnJvciB7XG4gIHJldHVybiBFcnJvcignYGNvbXBhcmVXaXRoYCBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBjaGFuZ2UgYSBzZWxlY3QncyBgbXVsdGlwbGVgIG9wdGlvblxuICogYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBkY1NlbGVjdER5bmFtaWNNdWx0aXBsZUVycm9yKCk6IEVycm9yIHtcbiAgcmV0dXJuIEVycm9yKCdDYW5ub3QgY2hhbmdlIGBtdWx0aXBsZWAgbW9kZSBvZiBzZWxlY3QgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uJyk7XG59XG5cbmNvbnN0IERFRkFVTFRfQUNUSVZFX0lOREVYID0gLTE7XG5cbmludGVyZmFjZSBJUmVuZGVyZWRTZWxlY3RPcHRpb24gZXh0ZW5kcyBJU2VsZWN0T3B0aW9uIHtcbiAgcmVhZG9ubHkgc2VsZWN0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBzaG93R3JvdXBMYWJlbD86IGJvb2xlYW47XG59XG5cbmNvbnN0IF9fU2VsZWN0Q29tcG9uZW50QmFzZSA9IG1peGluVGFiSW5kZXgoXG4gIG1peGluRGlzYWJsZWQoXG4gICAgbWl4aW5FcnJvclN0YXRlKFxuICAgICAgY2xhc3Mge1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgICBwdWJsaWMgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgICAgICAgcHVibGljIF9mb3JtUm9vdDogSW1wZGNGb3JtUm9vdCB8IG51bGwsXG4gICAgICAgICAgcHVibGljIF9wYXJlbnRGb3JtOiBOZ0Zvcm0gfCBudWxsLFxuICAgICAgICAgIHB1YmxpYyBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUgfCBudWxsLFxuICAgICAgICAgIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGxcbiAgICAgICAgKSB7fVxuICAgICAgfVxuICAgIClcbiAgKVxuKTtcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgX1NlbGVjdENvbXBvbmVudEJhc2VcbiAgZXh0ZW5kcyBfX1NlbGVjdENvbXBvbmVudEJhc2VcbiAgaW1wbGVtZW50c1xuICAgIElTZWxlY3RPcHRpb25QYXJlbnRDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIERvQ2hlY2ssXG4gICAgT25EZXN0cm95LFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEhhc1RhYkluZGV4LFxuICAgIEltcGRjRm9ybUZpZWxkQ29udHJvbDxhbnk+LFxuICAgIENhbkRpc2FibGUsXG4gICAgSUNhblVwZGF0ZUVycm9yU3RhdGUsXG4gICAgSUhhc0Vycm9yU3RhdGVcbntcbiAgQENvbnRlbnRDaGlsZHJlbihTZWxlY3RPcHRpb25Db21wb25lbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJvdGVjdGVkIHN0YXRpY09wdGlvbnMhOiBRdWVyeUxpc3Q8U2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcblxuICBAVmlld0NoaWxkcmVuKFNlbGVjdE9wdGlvbkRpc3BsYXlDb21wb25lbnQpXG4gIHByb3RlY3RlZCBvcHRpb25zITogUXVlcnlMaXN0PFNlbGVjdE9wdGlvbkRpc3BsYXlDb21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoTmdiRHJvcGRvd24pXG4gIHByb3RlY3RlZCBuZ2JEcm9wZG93biE6IE5nYkRyb3Bkb3duO1xuXG4gIEBWaWV3Q2hpbGQoJ3RvZ2dsZUJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcm90ZWN0ZWQgdG9nZ2xlQnV0dG9uUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gfSlcbiAgcHJvdGVjdGVkIHNlYXJjaElucHV0UmVmPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9uZ0Rlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWFyY2hTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDwnbm9uZScgfCAnc3RhdGljJz4oXG4gICAgJ25vbmUnXG4gICk7XG4gIHByaXZhdGUgX3ByZXZpb3VzQ29udHJvbD86IEFic3RyYWN0Q29udHJvbCB8IG51bGw7XG4gIHByaXZhdGUgX2NvbXBhcmVXaXRoID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IG8xID09PSBvMjtcbiAgcHJpdmF0ZSBfY3ZhT25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgX2N2YU9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB1aWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VhcmNoQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEJhZGdlVGhlbWUgPSBDb21wb25lbnRUaGVtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlcmVkT3B0aW9ucyQ6IE9ic2VydmFibGU8SVJlbmRlcmVkU2VsZWN0T3B0aW9uW10+ID1cbiAgICB0aGlzLl9zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoc2VhcmNoTW9kZSA9PiB7XG4gICAgICAgIHN3aXRjaCAoc2VhcmNoTW9kZSkge1xuICAgICAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgdGhpcy5zdGF0aWNPcHRpb25zLmNoYW5nZXMgYXMgT2JzZXJ2YWJsZTxJU2VsZWN0T3B0aW9uW10+XG4gICAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICAgIHN0YXJ0V2l0aCh0aGlzLnN0YXRpY09wdGlvbnMudG9BcnJheSgpIGFzIElTZWxlY3RPcHRpb25bXSksXG4gICAgICAgICAgICAgIG1hcChvcHRpb25zID0+XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5tYXAob3B0ID0+ICh7XG4gICAgICAgICAgICAgICAgICBncm91cExhYmVsOiBvcHQuZ3JvdXBMYWJlbCxcbiAgICAgICAgICAgICAgICAgIGdldCBsYWJlbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdC5sYWJlbDtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LmRpc2FibGVkO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0KVxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgJ3N0YXRpYyc6XG4gICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICAgICh0aGlzLnN0YXRpY09wdGlvbnMuY2hhbmdlcyBhcyBPYnNlcnZhYmxlPElTZWxlY3RPcHRpb25bXT4pLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuc3RhdGljT3B0aW9ucy50b0FycmF5KCkgYXMgSVNlbGVjdE9wdGlvbltdKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRleHRDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCcnKSlcbiAgICAgICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoWywgc2VhcmNoVGV4dF0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gISFzZWFyY2hUZXh0ID8gMCA6IERFRkFVTFRfQUNUSVZFX0lOREVYO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbWFwKChbb3B0aW9ucywgc2VhcmNoVGV4dF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZE9wdGlvbnMgPSBvcHRpb25zLm1hcChvcHQgPT4gKHtcbiAgICAgICAgICAgICAgICAgIGdyb3VwTGFiZWw6IG9wdC5ncm91cExhYmVsLFxuICAgICAgICAgICAgICAgICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LmxhYmVsO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHQuZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHQpXG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICEhc2VhcmNoVGV4dFxuICAgICAgICAgICAgICAgICAgPyByZW5kZXJlZE9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgIG9wdCA9PiBsYyhvcHQubGFiZWwpLmluZGV4T2YobGMoc2VhcmNoVGV4dCkpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IHJlbmRlcmVkT3B0aW9ucztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKG9wdGlvbnMgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgb3B0aW9ucy5yZWR1Y2UoKHJlc3VsdCwgb3B0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEdyb3VwTGFiZWwgPSBvcHQuZ3JvdXBMYWJlbD8udHJpbSgpIHx8ICcnO1xuICAgICAgICAgICAgbGV0IHNob3dHcm91cExhYmVsID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICghKHJlc29sdmVkR3JvdXBMYWJlbCBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFtyZXNvbHZlZEdyb3VwTGFiZWxdID0gW107XG4gICAgICAgICAgICAgIHNob3dHcm91cExhYmVsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3Jlc29sdmVkR3JvdXBMYWJlbF0ucHVzaCh7XG4gICAgICAgICAgICAgIC4uLm9wdCxcbiAgICAgICAgICAgICAgc2hvd0dyb3VwTGFiZWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9LCB7fSBhcyB7IFtrZXk6IHN0cmluZ106IElSZW5kZXJlZFNlbGVjdE9wdGlvbltdIH0pXG4gICAgICAgICkuZmxhdE1hcCgoWywgZ3JvdXBPcHRpb25zXSkgPT4gZ3JvdXBPcHRpb25zKVxuICAgICAgKVxuICAgICk7XG4gIHByb3RlY3RlZCBzZWxlY3Rpb25Nb2RlbCE6IFNlbGVjdE1vZGVsPElTZWxlY3RPcHRpb24+O1xuICBwcm90ZWN0ZWQgYWN0aXZlSW5kZXggPSBERUZBVUxUX0FDVElWRV9JTkRFWDtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlczogT2JzZXJ2YWJsZTxTZWxlY3RPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudD4gPVxuICAgIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgob3B0aW9ucyksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICBtZXJnZSguLi5vcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLm9uU2VsZWN0aW9uQ2hhbmdlKSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5vcHRpb25TZWxlY3Rpb25DaGFuZ2VzKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAvKipcbiAgICogU2V0IHdoZXRoZXIgb3Igbm90IGFuIGlucHV0IGZpZWxkIHdpbGwgYXBwZWFyIGZvciBzZWFyY2hpbmcgYW5kXG4gICAqIGZpbHRlcmluZyB2aXNpYmxlIG9wdGlvbnMuXG4gICAqXG4gICAqIC0gYCdub25lJ2A6IE5vIHNlYXJjaCBjb250cm9sIHdpbGwgYmUgZGlzcGxheWVkLCBhbmQgYWxsIHNlbGVjdCBvcHRpb25zIGFyZSBwcm92aWRlZCB2aWEgcHJvamVjdGVkIGA8aW1wZGMtc2VsZWN0LW9wdGlvbj5gIGVsZW1lbnRzLlxuICAgKiAtIGAnc3RhdGljJ2A6IEEgc2VhcmNoIGNvbnRyb2wgd2lsbCBiZSBkaXNwbGF5ZWQsIHNlbGVjdCBvcHRpb25zIGFyZSBwcm92aWRlZCB2aWEgcHJvamVjdGVkIGA8aW1wZGMtc2VsZWN0LW9wdGlvbj5gIGVsZW1lbnRzLCBhbmRcbiAgICogZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSBgW2xhYmVsXWAgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VhcmNoKCk6ICdub25lJyB8ICdzdGF0aWMnIHtcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoU3ViamVjdC52YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlYXJjaCh2YWx1ZTogJ25vbmUnIHwgJ3N0YXRpYycpIHtcbiAgICB0aGlzLl9zZWFyY2hTdWJqZWN0Lm5leHQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciB0ZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBubyBzZWxlY3Rpb24gaGFzIGJlZW4gbWFkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXFwtIFNlbGVjdCAtXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByb3RlY3RlZCBfcGxhY2Vob2xkZXIgPSAnLSBTZWxlY3QgLSc7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHJlcXVpcmVkbmVzcyBvZiBjb250cm9sIGluIGEgdGVtcGxhdGUtYmFzZWQgbWFubmVyO1xuICAgKiBub3QgbmVjZXNzYXJ5IHdoZW4gdXNpbmcgdGhlIEFuZ3VsYXIgcmVhY3RpdmUgZm9ybXMgQVBJIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRvci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3JlcXVpcmVkID8/XG4gICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpID8/XG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWU7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb250cm9sIGlzIGEgc2luZ2xlLXNlbGVjdCBvciBtdWx0aXBsZS1zZWxlY3QuIENhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG4gIHByb3RlY3RlZCBfbXVsdGlwbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIG9wdGlvbiB2YWx1ZXMgd2l0aCBzZWxlY3RlZCB2YWx1ZXMuIFRoZSBmaXJzdCBhcmcgaXMgYVxuICAgKiBgdmFsdWVgIGZyb20gYW4gb3B0aW9uLCBhbmQgdGhlIHNlY29uZCBhcmcgaXMgYSBgdmFsdWVgIGZyb20gdGhlIHNlbGVjdGlvbiBvciBhbm90aGVyIG9wdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBhcmVXaXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb21wYXJlV2l0aDtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBhcmVXaXRoKGZuOiAoYTogYW55LCBiOiBhbnkpID0+IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBnZXRJbXBkY1NlbGVjdE5vbkZ1bmN0aW9uVmFsdWVFcnJvcigpO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbXBhcmVXaXRoID0gZm47XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbCkge1xuICAgICAgLy8gQ2hhbmdpbmcgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gbWVhbnMgdGhlIHZpc3VhbCBzZWxlY3Rpb24gbWF5IGhhdmUgY2hhbmdlZC5cbiAgICAgIHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9jdW1lbnQgZWxlbWVudCB0aGF0IHRoZSBzZWxlY3QgZHJvcGRvd24gd2lsbCBiZSBhdHRhY2hlZCB0byBpbiB0aGUgRE9NIC0gZWl0aGVyIHRoZVxuICAgKiBkb2N1bWVudCdzIGA8Ym9keT5gIHRhZywgb3IgYXMgYSBjaGlsZCBvZiB0aGUgY29tcG9uZW50IHRhZy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgKGAnYm9keSdgKSBpcyBnZW5lcmFsbHkgdGhlIGNvcnJlY3QgY2hvaWNlLCBhbmQgc2hvdWxkIG9ubHkgYmVcbiAgICogb3ZlcnJpZGRlbiB3aGVuIGFic29sdXRlbHkgY2VydGFpbiB0aGF0IHRoZSByZXN1bHQgYmVoYXZpb3IgaXMgd2hhdCdzIGRlc2lyZWQuXG4gICAqL1xuICBwdWJsaWMgZHJvcGRvd25Db250YWluZXI6ICdib2R5JyB8IG51bGwgPSAnYm9keSc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGVycm9yU3RhdGVNYXRjaGVyITogRXJyb3JTdGF0ZU1hdGNoZXI7XG5cbiAgLyoqIEV2ZW50cyBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgYnkgdGhlIHVzZXIuICovXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxTZWxlY3RDaGFuZ2VFdmVudDx0aGlzPj4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Q2hhbmdlRXZlbnQ8dGhpcz4+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50cyBmaXJlIHdoZW4gcmF3IHZhbHVlIG9mIHNlbGVjdCBjaGFuZ2VzLiBNYWlubHkgZXhpc3RzIHRvIGhhbmRsZVxuICAgKiB0d28td2F5IGJpbmRpbmcgb2YgYHZhbHVlYCBpbnB1dCBwcm9wZXJ0eS5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudHMgZmlyZSB3aGVuIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBvcHRpb24gc2VhcmNoIGlucHV0IGNvbnRyb2wgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaFRleHRDaGFuZ2VzOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+ID1cbiAgICB0aGlzLnNlYXJjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKHVpZDogc3RyaW5nLCB0YWJJbmRleD86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0KEVycm9yU3RhdGVNYXRjaGVyKSxcbiAgICAgIGluamVjdChJTVBEQ19GT1JNX1JPT1QsIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICBpbmplY3QoTmdGb3JtLCB7IG9wdGlvbmFsOiB0cnVlIH0pLFxuICAgICAgaW5qZWN0KEZvcm1Hcm91cERpcmVjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KSxcbiAgICAgIGluamVjdChOZ0NvbnRyb2wsIHsgb3B0aW9uYWw6IHRydWUsIHNlbGY6IHRydWUgfSlcbiAgICApO1xuXG4gICAgdGhpcy51aWQgPSB1aWQ7XG5cbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuaWQgPSB0aGlzLmlkO1xuXG4gICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4ID8/ICcnKSB8fCAwO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93bk9wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmdiRHJvcGRvd24/LmlzT3BlbigpID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc2VsZWN0aW9uTW9kZWwgfHwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCk6IElTZWxlY3RPcHRpb24gfCBJU2VsZWN0T3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZVxuICAgICAgPyB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCB8fCBbXVxuICAgICAgOiB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZFswXTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVCdXR0b25SZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlT3BlbkNoYW5nZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICB0aGlzLm9uRm9jdXMoKTtcblxuICAgICAgaWYgKHRoaXMuc2VhcmNoICE9PSAnbm9uZScgJiYgISF0aGlzLnNlYXJjaElucHV0UmVmKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSwgT05fT1BFTl9BVVRPX1NDUk9MTF9USU1FT1VUX01TKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9tdWx0aXBsZSAmJiAhIXRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uQmx1cigpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlSW5kZXggPSBERUZBVUxUX0FDVElWRV9JTkRFWDtcbiAgICB0aGlzLnNlYXJjaENvbnRyb2wucmVzZXQoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICAvKiBBbmd1bGFyIGxpZmVjeWNsZSBob29rcyAqL1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdE1vZGVsPElTZWxlY3RPcHRpb24+KFxuICAgICAgdGhpcy5fbXVsdGlwbGUsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlV2l0aChhLnZhbHVlLCBiLnZhbHVlKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX25nRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKGNoYW5nZUV2ZW50ID0+IHtcbiAgICAgICAgY2hhbmdlRXZlbnQuYWRkZWQuZm9yRWFjaChvcHRpb24gPT5cbiAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgIC5maW5kKG8gPT4gdGhpcy5jb21wYXJlV2l0aChvLnZhbHVlLCBvcHRpb24udmFsdWUpKVxuICAgICAgICAgICAgPy5zZWxlY3QoKVxuICAgICAgICApO1xuICAgICAgICBjaGFuZ2VFdmVudC5yZW1vdmVkLmZvckVhY2gob3B0aW9uID0+XG4gICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgICAuZmluZChvID0+IHRoaXMuY29tcGFyZVdpdGgoby52YWx1ZSwgb3B0aW9uLnZhbHVlKSlcbiAgICAgICAgICAgID8uZGVzZWxlY3QoKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm9wdGlvbnMuY2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fbmdEZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZXNldE9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IG5nQ29udHJvbCA9IHRoaXMubmdDb250cm9sO1xuXG4gICAgaWYgKCFuZ0NvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcHJldmlvdXNDb250cm9sICE9PSBuZ0NvbnRyb2wuY29udHJvbCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9wcmV2aW91c0NvbnRyb2wgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBuZ0NvbnRyb2wuZGlzYWJsZWQgIT09IG51bGwgJiZcbiAgICAgICAgbmdDb250cm9sLmRpc2FibGVkICE9PSB0aGlzLmRpc2FibGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IG5nQ29udHJvbD8uZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ByZXZpb3VzQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBNYW5hZ2luZyBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIHZpYSB0aGUgYG1peGluRGlzYWJsZWRgIG1peGluL2dlbmVyYXRvciwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc2lnbmFsXG4gICAgLy8gdG8gdGhlIHBhcmVudCBmb3JtIGZpZWxkIHNvIGl0IGNhbiBydW4gY2hhbmdlIGRldGVjdGlvbiB3aGVuIGRpc2FibGVkIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fbmdEZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLl9uZ0Rlc3Ryb3kuY29tcGxldGUoKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyogSW1wZGNGb3JtRmllbGRDb250cm9sICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjb250cm9sVHlwZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzdXBwb3J0c0FmZml4ZXM6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBoYXNBc3NpZ25lZCA9IHRoaXMuX2Fzc2lnblZhbHVlKHZhbHVlKTtcblxuICAgIGlmIChoYXNBc3NpZ25lZCkge1xuICAgICAgdGhpcy5fY3ZhT25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlIHx8IHRoaXMudWlkO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgX2lkITogc3RyaW5nO1xuXG4gIHB1YmxpYyBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZCB8fCB0aGlzLmRyb3Bkb3duT3BlbjtcbiAgfVxuICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAvKiBDb250cm9sVmFsdWVBY2Nlc3NvciAqL1xuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fYXNzaWduVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY3ZhT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9jdmFPblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIC8qIEludGVybmFscyAqL1xuXG4gIHByb3RlY3RlZCBvbkZvY3VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBDVkEgdG91Y2hlZCBjYWxsYmFjayBvbmx5IGlmIHRoZSBkcm9wZG93biBpcyBjbG9zZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuX2N2YU9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVNlYXJjaFN1Ym1pdChldnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPCAwIHx8IHRoaXMuYWN0aXZlSW5kZXggPj0gdGhpcy5vcHRpb25zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5vcHRpb25zLmdldCh0aGlzLmFjdGl2ZUluZGV4KT8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVNlYXJjaFVwRG93bihldnQ6IEV2ZW50LCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gKHRoaXMuYWN0aXZlSW5kZXggKyAxKSAlIHRoaXMub3B0aW9ucy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4Kys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4IDw9IDApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMub3B0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleC0tO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0FjdGl2ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0ZWRJc1NpbmdsZShcbiAgICBzZWxlY3RlZDogSVNlbGVjdE9wdGlvbiB8IElTZWxlY3RPcHRpb25bXVxuICApOiBzZWxlY3RlZCBpcyBJU2VsZWN0T3B0aW9uIHtcbiAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBXZSBkZWZlciB0aGlzIHdvcmsgaW50byBhIHByb21pc2UgaW4gb3JkZXIgdG8gYXZvaWQgdHJpcHBpbmcgQW5ndWxhcidzXG4gICAgLy8gXCJFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkXCIgZXJyb3IuXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm5nQ29udHJvbC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlOiBhbnkgfCBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlYXJjaCA9PT0gJ25vbmUnKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX211bHRpcGxlICYmIHZhbHVlKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IGdldEltcGRjU2VsZWN0Tm9uQXJyYXlWYWx1ZUVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlLmZvckVhY2goY3VycmVudFZhbHVlID0+IHRoaXMuX3NlbGVjdE9wdGlvbkJ5VmFsdWUoY3VycmVudFZhbHVlKSk7XG4gICAgICB0aGlzLl9zb3J0VmFsdWVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdE9wdGlvbkJ5VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0T3B0aW9uQnlWYWx1ZShcbiAgICB2YWx1ZTogYW55XG4gICk6IFNlbGVjdE9wdGlvbkRpc3BsYXlDb21wb25lbnQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChcbiAgICAgIChvcHRpb246IFNlbGVjdE9wdGlvbkRpc3BsYXlDb21wb25lbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlICE9IG51bGwgJiYgdGhpcy5fY29tcGFyZVdpdGgob3B0aW9uLnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNvcnJlc3BvbmRpbmdPcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGNvcnJlc3BvbmRpbmdPcHRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBjb3JyZXNwb25kaW5nT3B0aW9uO1xuICB9XG5cbiAgLyoqIEFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgc2VsZWN0IGNvbnRyb2wuIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3RcbiAgICogdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXNzaWduVmFsdWUobmV3VmFsdWU6IGFueSB8IGFueVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgbmV3VmFsdWUgIT09IHRoaXMuX3ZhbHVlIHx8XG4gICAgICAodGhpcy5fbXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldE9wdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbmdlZE9yRGVzdHJveWVkID0gbWVyZ2UodGhpcy5vcHRpb25zLmNoYW5nZXMsIHRoaXMuX25nRGVzdHJveSk7XG5cbiAgICB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIHRoaXMuX29uU2VsZWN0KGV2ZW50LnNvdXJjZSwgZXZlbnQuaXNVc2VySW5wdXQpO1xuXG4gICAgICAgIGlmIChldmVudC5pc1VzZXJJbnB1dCAmJiAhdGhpcy5fbXVsdGlwbGUgJiYgdGhpcy5kcm9wZG93bk9wZW4pIHtcbiAgICAgICAgICB0aGlzLm5nYkRyb3Bkb3duLmNsb3NlKCk7XG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIG1lcmdlKC4uLnRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5zdGF0ZUNoYW5nZXMpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3QoXG4gICAgb3B0aW9uOiBTZWxlY3RPcHRpb25EaXNwbGF5Q29tcG9uZW50LFxuICAgIGlzVXNlcklucHV0OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbik7XG5cbiAgICBpZiAob3B0aW9uLnZhbHVlID09IG51bGwgJiYgIXRoaXMuX211bHRpcGxlKSB7XG4gICAgICBvcHRpb24uZGVzZWxlY3QoKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcblxuICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKG9wdGlvbi52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh3YXNTZWxlY3RlZCAhPT0gb3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZFxuICAgICAgICAgID8gdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3Qob3B0aW9uKVxuICAgICAgICAgIDogdGhpcy5zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChvcHRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5fc29ydFZhbHVlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3YXNTZWxlY3RlZCAhPT0gdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRWYWx1ZXMoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fbXVsdGlwbGUgJiZcbiAgICAgICh0aGlzLnNlYXJjaCA9PT0gJ25vbmUnIHx8IHRoaXMuc2VhcmNoID09PSAnc3RhdGljJylcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnN0YXRpY09wdGlvbnMudG9BcnJheSgpO1xuXG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBvcHRpb25zLmZpbmRJbmRleChvID0+IHRoaXMuY29tcGFyZVdpdGgoby52YWx1ZSwgYS52YWx1ZSkpIC1cbiAgICAgICAgICBvcHRpb25zLmZpbmRJbmRleChvID0+IHRoaXMuY29tcGFyZVdpdGgoby52YWx1ZSwgYi52YWx1ZSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfcHJvcGFnYXRlQ2hhbmdlcyhmYWxsYmFja1ZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgbGV0IHZhbFRvRW1pdDogYW55ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgdmFsVG9FbWl0ID0gKHRoaXMuc2VsZWN0ZWQgYXMgSVNlbGVjdE9wdGlvbltdKS5tYXAoXG4gICAgICAgIG9wdGlvbiA9PiBvcHRpb24udmFsdWVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbFRvRW1pdCA9IHRoaXMuc2VsZWN0ZWRcbiAgICAgICAgPyAodGhpcy5zZWxlY3RlZCBhcyBJU2VsZWN0T3B0aW9uKS52YWx1ZVxuICAgICAgICA6IGZhbGxiYWNrVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWUgPSB2YWxUb0VtaXQ7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbFRvRW1pdCk7XG4gICAgdGhpcy5fY3ZhT25DaGFuZ2UodmFsVG9FbWl0KTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2J1aWxkQ2hhbmdlRXZlbnQodmFsVG9FbWl0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2J1aWxkQ2hhbmdlRXZlbnQodmFsdWU6IGFueSk6IFNlbGVjdENoYW5nZUV2ZW50PHRoaXM+IHtcbiAgICByZXR1cm4gbmV3IFNlbGVjdENoYW5nZUV2ZW50KHRoaXMsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByb3RlY3RlZCBfZGVzZWxlY3RPcHRpb24oXG4gICAgb3B0aW9uOiBJU2VsZWN0T3B0aW9uLFxuICAgIG1hcmtUb3VjaGVkOiBib29sZWFuID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbXVsdGlwbGUgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3Qob3B0aW9uKTtcbiAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMoKTtcblxuICAgICAgaWYgKG1hcmtUb3VjaGVkKSB7XG4gICAgICAgIHRoaXMuX2N2YU9uVG91Y2hlZCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kcm9wZG93bk9wZW4gJiYgdGhpcy5zZWxlY3RlZCAmJiAhQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkKSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbkVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuZmluZChcbiAgICAgICAgICBvID0+XG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkKSAmJlxuICAgICAgICAgICAgdGhpcy5jb21wYXJlV2l0aChvLnZhbHVlLCB0aGlzLnNlbGVjdGVkLnZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBzZWxlY3RlZE9wdGlvbkVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgIGJsb2NrOiAnbmVhcmVzdCcsXG4gICAgICAgICAgaW5saW5lOiAnbmVhcmVzdCcsXG4gICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50J1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBPTl9PUEVOX0FVVE9fU0NST0xMX1RJTUVPVVRfTVMpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBTZWxlY3RDb21wb25lbnRgIChgPGltcGRjLXNlbGVjdGApIGlzIGEgc2VsZWN0LXN0eWxlIGRyb3Bkb3duIGlucHV0IHdoZXJlIGFuIGl0ZW0gKG9yIG11bHRpcGxlIGl0ZW1zKSBjYW4gYmUgcGlja2VkXG4gKiBmcm9tIGEgbGlzdCBvZiAqdW5pcXVlKiBhdmFpbGFibGUgb3B0aW9ucy4gVGhpcyBjb21wb25lbnQgY2FuIGJlIHVzZWQgd2l0aGluIGEgYEZvcm1GaWVsZENvbXBvbmVudGAgKGA8aW1wZGMtZm9ybS1maWVsZGApLlxuICogVG8gdXNlLCBhZGQgYFNlbGVjdE1vZHVsZWAgdG8gdGhlIGBpbXBvcnRzYCBhcnJheSBvZiB0aGUgcmVsZXZhbnQgYE5nTW9kdWxlYCBvciBzdGFuZGFsb25lIGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW1wZGMtc2VsZWN0JyxcbiAgZXhwb3J0QXM6ICdpbXBkY1NlbGVjdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQXN5bmNQaXBlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdiRHJvcGRvd25Nb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBTZWxlY3RPcHRpb25EaXNwbGF5Q29tcG9uZW50LFxuICAgIFNlbGVjdFZhbHVlVGFnc0Rpc3BsYXlDb21wb25lbnQsXG4gICAgRm9ybUZpZWxkTW9kdWxlLFxuICAgIElucHV0RGlyZWN0aXZlLFxuICAgIEJhZGdlTW9kdWxlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dHMtbWV0YWRhdGEtcHJvcGVydHlcbiAgaW5wdXRzOiBbXG4gICAgJ2Rpc2FibGVkJyxcbiAgICB7IG5hbWU6ICd0YWJJbmRleCcsIHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0sXG4gICAgJ3NlYXJjaCcsXG4gICAgJ3BsYWNlaG9sZGVyJyxcbiAgICB7IG5hbWU6ICdyZXF1aXJlZCcsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9LFxuICAgICdjb21wYXJlV2l0aCcsXG4gICAgJ2Ryb3Bkb3duQ29udGFpbmVyJyxcbiAgICAnZXJyb3JTdGF0ZU1hdGNoZXInXG4gIF0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0cy1tZXRhZGF0YS1wcm9wZXJ0eVxuICBvdXRwdXRzOiBbJ3NlbGVjdGlvbkNoYW5nZScsICd2YWx1ZUNoYW5nZScsICdzZWFyY2hUZXh0Q2hhbmdlcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1ob3N0LW1ldGFkYXRhLXByb3BlcnR5XG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ3RhYkluZGV4JyxcbiAgICAnW2F0dHIuYXJpYS1yZXF1aXJlZF0nOiAncmVxdWlyZWQudG9TdHJpbmcoKScsXG4gICAgJ1thdHRyLmFyaWEtZGlzYWJsZWRdJzogJ2Rpc2FibGVkLnRvU3RyaW5nKCknLFxuICAgICdbYXR0ci5hcmlhLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbY2xhc3MuZm9ybS1zZWxlY3RdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuaXMtaW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5pbXBkYy1mb3JtLWZpZWxkLWNvbnRyb2xdJzogJ3RydWUnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LS1yZXF1aXJlZF0nOiAncmVxdWlyZWQnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdbY2xhc3MuaW1wZGMtc2VsZWN0LS1pbnZhbGlkXSc6ICdlcnJvclN0YXRlJyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0tZW1wdHldJzogJ2VtcHR5JyxcbiAgICAnW2NsYXNzLmltcGRjLXNlbGVjdC0tbXVsdGlwbGVdJzogJ211bHRpcGxlJyxcbiAgICAnKGZvY3VzKSc6ICdvbkZvY3VzKCk7IGZvY3VzKCknXG4gIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IEltcGRjRm9ybUZpZWxkQ29udHJvbCxcbiAgICAgIHVzZUV4aXN0aW5nOiBTZWxlY3RDb21wb25lbnRcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IElNUERDX1NFTEVDVF9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBTZWxlY3RDb21wb25lbnRcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IElNUERDX1NFTEVDVF9WQUxVRV9CQURHRVNfUEFSRU5UX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBTZWxlY3RDb21wb25lbnRcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50XG4gIGV4dGVuZHMgX1NlbGVjdENvbXBvbmVudEJhc2VcbiAgaW1wbGVtZW50cyBJU2VsZWN0VmFsdWVCYWRnZXNQYXJlbnRDb21wb25lbnRcbntcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnaW1wZGMtc2VsZWN0JztcbiAgcHVibGljIHJlYWRvbmx5IHN1cHBvcnRzQWZmaXhlczogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoQEF0dHJpYnV0ZSgndGFiaW5kZXgnKSB0YWJJbmRleD86IHN0cmluZykge1xuICAgIHN1cGVyKGBpbXBkYy1zZWxlY3QtJHtuYW5vaWQoKX1gLCB0YWJJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdGhlIHVzZXIgdG8gY2xpY2sgYSBidXR0b24gaW5zaWRlIG9mIHRoZSBzZWxlY3QgY29udHJvbCBhbmQgY2xlYXIgdGhlaXIgc2VsZWN0aW9uKHMpO1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIGFsbG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgIHRocm93IGdldEltcGRjU2VsZWN0RHluYW1pY011bHRpcGxlRXJyb3IoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tdWx0aXBsZSA9IHZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIG11bHRpcGxlRGlzcGxheTogJ2luc2lkZScgfCAnb3V0c2lkZScgPSAnaW5zaWRlJztcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZGVzZWxlY3RPcHRpb24ob3B0aW9uOiBJU2VsZWN0T3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgfVxufVxuIiwiPGRpdlxuICBuZ2JEcm9wZG93blxuICAjZHJvcGRvd249XCJuZ2JEcm9wZG93blwiXG4gIFthdXRvQ2xvc2VdPVwibXVsdGlwbGUgPyAnb3V0c2lkZScgOiB0cnVlXCJcbiAgW2NvbnRhaW5lcl09XCJkcm9wZG93bkNvbnRhaW5lclwiXG4gIFtkcm9wZG93bkNsYXNzXT1cImRyb3Bkb3duQ29udGFpbmVyID09PSAnYm9keScgPyAnaW1wYXJ0bmVyLWhleCcgOiAnJ1wiXG4gIChvcGVuQ2hhbmdlKT1cImhhbmRsZU9wZW5DaGFuZ2UoJGV2ZW50KVwiXG4gIGNsYXNzPVwiaC0xMDAgdy0xMDBcIj5cbiAgPGJ1dHRvblxuICAgICN0b2dnbGVCdXR0b25cbiAgICBjbGFzcz1cImltcGRjLXNlbGVjdC0tdG9nZ2xlIGJ0biBib3JkZXItMCBoLTEwMCB0ZXh0LXN0YXJ0XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgIG5nYkRyb3Bkb3duVG9nZ2xlPlxuICAgIEBpZiAoZW1wdHkpIHtcbiAgICA8c3BhbiBjbGFzcz1cImltcGRjLXNlbGVjdC0tdGV4dCBpbXBkYy1zZWxlY3QtLXBsYWNlaG9sZGVyXCI+e3tcbiAgICAgIHBsYWNlaG9sZGVyXG4gICAgfX08L3NwYW4+XG4gICAgfSBAZWxzZSB7IEBpZiAoc2VsZWN0ZWRJc1NpbmdsZShzZWxlY3RlZCkpIHtcbiAgICA8c3BhbiBjbGFzcz1cImltcGRjLXNlbGVjdC0tdGV4dCBpbXBkYy1zZWxlY3QtLXZhbHVlLXRleHRcIj5cbiAgICAgIHt7IHNlbGVjdGVkLmxhYmVsIH19XG4gICAgPC9zcGFuPlxuICAgIH0gQGVsc2UgaWYgKG11bHRpcGxlRGlzcGxheSA9PT0gJ2luc2lkZScpIHtcbiAgICA8aW1wZGMtc2VsZWN0LXZhbHVlLXRhZ3MtZGlzcGxheSAvPlxuICAgIH0gQGVsc2Uge1xuICAgIDxzcGFuIGNsYXNzPVwiaW1wZGMtc2VsZWN0LS10ZXh0IGltcGRjLXNlbGVjdC0tcGxhY2Vob2xkZXJcIj57e1xuICAgICAgcGxhY2Vob2xkZXJcbiAgICB9fTwvc3Bhbj5cbiAgICB9IEBpZiAoIWRpc2FibGVkICYmIGFsbG93Q2xlYXIpIHtcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LS1jbGVhci1idG4gYnRuIGJ0bi14cyBidG4tbGluayB0ZXh0LWdyYXktNDAwIG1zLWF1dG9cIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZHJvcGRvd24uY2xvc2UoKTsgY2xlYXJTZWxlY3Rpb24oKVwiPlxuICAgICAgPGltcGRjLWljb24gbmFtZT1cInRpbWVzXCIgW3NpemVdPVwiMTZcIj48L2ltcGRjLWljb24+XG4gICAgPC9idXR0b24+XG4gICAgfSB9XG4gIDwvYnV0dG9uPlxuICA8ZGl2XG4gICAgbmdiRHJvcGRvd25NZW51XG4gICAgY2xhc3M9XCJpbXBkYy1zZWxlY3QtLWRyb3Bkb3duLW1lbnUgYmctd2hpdGUgdGV4dC1ncmF5LTYwMFwiXG4gICAgcm9sZT1cImxpc3Rib3hcIlxuICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoICE9PSAnbm9uZSdcIiBjbGFzcz1cImltcGRjLXNlbGVjdC0tc2VhcmNoXCI+XG4gICAgICA8aW1wZGMtZm9ybS1maWVsZD5cbiAgICAgICAgPHNwYW4gaW1wZGNUZXh0UHJlZml4IChjbGljayk9XCJzZWFyY2hJbnB1dC5mb2N1cygpXCI+XG4gICAgICAgICAgPGltcGRjLWljb24gbmFtZT1cInNlYXJjaFwiPjwvaW1wZGMtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICBpbXBkY0lucHV0XG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaENvbnRyb2xcIlxuICAgICAgICAgIGNsYXNzPVwiaW1wZGMtc2VsZWN0LS1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZVNlYXJjaFN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwiaGFuZGxlU2VhcmNoVXBEb3duKCRldmVudCwgJ3VwJylcIlxuICAgICAgICAgIChrZXlkb3duLmFycm93dXApPVwiaGFuZGxlU2VhcmNoVXBEb3duKCRldmVudCwgJ2Rvd24nKVwiIC8+XG4gICAgICAgIDxzcGFuIGltcGRjVGV4dFN1ZmZpeD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNlYXJjaENvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImltcGRjLXNlbGVjdC0tY2xlYXItYnRuIGJ0biBidG4teHMgYnRuLWxpbmsgdGV4dC1ncmF5LTQwMCBtcy1hdXRvXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hDb250cm9sLnJlc2V0KCk7IHNlYXJjaElucHV0LmZvY3VzKClcIj5cbiAgICAgICAgICAgIDxpbXBkYy1pY29uIG5hbWU9XCJ0aW1lc1wiIFtzaXplXT1cIjE2XCI+PC9pbXBkYy1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2ltcGRjLWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImltcGRjLXNlbGVjdC0tb3B0aW9uc1wiPlxuICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucyQgfCBhc3luYzsgdHJhY2sgb3B0aW9uLnZhbHVlOyBsZXQgaWR4ID1cbiAgICAgICRpbmRleDsgbGV0IGZpcnN0ID0gJGZpcnN0KSB7IEBpZiAob3B0aW9uLmdyb3VwTGFiZWwgJiZcbiAgICAgIG9wdGlvbi5zaG93R3JvdXBMYWJlbCkge1xuICAgICAgPGRpdiBjbGFzcz1cImltcGRjLXNlbGVjdC0tb3B0aW9uLWdyb3VwLWxhYmVsXCI+XG4gICAgICAgIHt7IG9wdGlvbi5ncm91cExhYmVsIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxpbXBkYy1zZWxlY3Qtb3B0aW9uLWRpc3BsYXlcbiAgICAgICAgW2NsYXNzLmltcGRjLXNlbGVjdC1vcHRpb24tLWFjdGl2ZV09XCJpZHggPT09IGFjdGl2ZUluZGV4XCJcbiAgICAgICAgW2NsYXNzLmltcGRjLXNlbGVjdC1vcHRpb24tLWdyb3VwZWRdPVwiISFvcHRpb24uZ3JvdXBMYWJlbFwiXG4gICAgICAgIFtncm91cExhYmVsXT1cIm9wdGlvbi5ncm91cExhYmVsXCJcbiAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiISFvcHRpb24uZGlzYWJsZWRcIlxuICAgICAgICBbc2VsZWN0ZWRdPVwib3B0aW9uLnNlbGVjdGVkXCJcbiAgICAgICAgW2hpZ2hsaWdodFRleHRdPVwic2VhcmNoQ29udHJvbC52YWx1ZVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cIm1hcmtBY3RpdmUoaWR4KVwiXG4gICAgICAgIChmb2N1cyk9XCJtYXJrQWN0aXZlKGlkeClcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|