@sumaris-net/ngx-components 2.11.2 → 2.11.4
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/doc/changelog.md +8 -1
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +1 -1
- package/esm2022/src/app/core/services/model/referential.model.mjs +4 -2
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +110 -80
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +6 -5
- package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +3 -3
- package/esm2022/src/app/shared/material/text/text-form.component.mjs +26 -6
- package/esm2022/src/app/shared/services/translate-context.service.mjs +2 -2
- package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +9 -6
- package/fesm2022/sumaris-net.ngx-components.mjs +148 -95
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/material/boolean/material.boolean.d.ts +22 -6
- package/src/app/shared/material/text/text-form.component.d.ts +13 -3
- package/src/app/shared/validator/form-error-adapter.class.d.ts +5 -2
- package/src/assets/manifest.json +1 -1
- package/src/theme/_ngx-components.forms.scss +47 -3
- package/src/theme/_ngx-components.globals.scss +1 -0
- package/src/theme/_theme.variables.scss +2 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Optional, Output, ViewChild, } from '@angular/core';
|
|
1
|
+
import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, numberAttribute, Optional, Output, ViewChild, } from '@angular/core';
|
|
2
2
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
3
|
import { isNil, isNotNil, toNumber } from '../../functions';
|
|
4
4
|
import { setTimeout } from '@rx-angular/cdk/zone-less/browser';
|
|
5
|
+
import { Subscription } from 'rxjs';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/forms";
|
|
7
8
|
import * as i2 from "@angular/common";
|
|
@@ -27,14 +28,17 @@ export class MatBooleanField {
|
|
|
27
28
|
formGroupDir;
|
|
28
29
|
_onChangeCallback = noop;
|
|
29
30
|
_onTouchedCallback = noop;
|
|
31
|
+
_subscription = new Subscription();
|
|
30
32
|
_writing = false;
|
|
31
33
|
_value;
|
|
32
34
|
_tabindex;
|
|
33
35
|
_showRadio = false; // Will be changed when focus in
|
|
34
36
|
_focused = false;
|
|
37
|
+
yesRadioButton;
|
|
38
|
+
noRadioButton;
|
|
39
|
+
checkboxButton;
|
|
35
40
|
yesButton;
|
|
36
41
|
noButton;
|
|
37
|
-
checkboxButton;
|
|
38
42
|
fakeInput;
|
|
39
43
|
disabled = false;
|
|
40
44
|
formControl;
|
|
@@ -107,6 +111,7 @@ export class MatBooleanField {
|
|
|
107
111
|
if (this.style === 'button') {
|
|
108
112
|
this.buttonsColCount = toNumber(this.buttonsColCount, 2);
|
|
109
113
|
}
|
|
114
|
+
this._subscription.add(this.formControl.valueChanges.subscribe((value) => this.writeValue(value)));
|
|
110
115
|
this.updateFakeInput();
|
|
111
116
|
this.updateTabIndex();
|
|
112
117
|
}
|
|
@@ -114,6 +119,7 @@ export class MatBooleanField {
|
|
|
114
119
|
this.blurred.complete();
|
|
115
120
|
}
|
|
116
121
|
writeValue(value, event) {
|
|
122
|
+
console.log('TODO writeValue');
|
|
117
123
|
if (this._writing)
|
|
118
124
|
return;
|
|
119
125
|
this._writing = true;
|
|
@@ -123,6 +129,18 @@ export class MatBooleanField {
|
|
|
123
129
|
this.formControl.patchValue(value, { emitEvent: false });
|
|
124
130
|
this._onChangeCallback(value);
|
|
125
131
|
}
|
|
132
|
+
if (this.yesRadioButton) {
|
|
133
|
+
this.yesRadioButton.checked = value === true;
|
|
134
|
+
this.noRadioButton.checked = value === false;
|
|
135
|
+
}
|
|
136
|
+
else if (this.checkboxButton) {
|
|
137
|
+
if (isNil(value)) {
|
|
138
|
+
this.checkboxButton.indeterminate = true;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.checkboxButton.checked = value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
126
144
|
setTimeout(() => {
|
|
127
145
|
this.updateFakeInput();
|
|
128
146
|
this.updateTabIndex();
|
|
@@ -149,33 +167,40 @@ export class MatBooleanField {
|
|
|
149
167
|
this.disabled = isDisabled;
|
|
150
168
|
}
|
|
151
169
|
onFocusFakeInput(event) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
this.fakeInput
|
|
170
|
+
if (!this.showRadio) {
|
|
171
|
+
event.preventDefault();
|
|
172
|
+
// Hide the fake input
|
|
173
|
+
this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');
|
|
156
174
|
}
|
|
157
175
|
// Focus on first button
|
|
158
176
|
this.focus();
|
|
159
177
|
}
|
|
160
178
|
focus() {
|
|
179
|
+
if (this._focused)
|
|
180
|
+
return; // Already focused
|
|
161
181
|
this._focused = true;
|
|
162
182
|
this._onTouchedCallback();
|
|
183
|
+
this.markForCheck();
|
|
163
184
|
setTimeout(() => {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
185
|
+
// Add a blur listener on each inputs
|
|
186
|
+
const inputElements = this.inputsElements;
|
|
187
|
+
inputElements.forEach((el) => (el.onblur = (e) => {
|
|
188
|
+
// Setup a one-time focus event handler
|
|
189
|
+
const focusListener = (focusEvent) => {
|
|
190
|
+
// Remove the event listener after it has been executed once
|
|
191
|
+
window.removeEventListener('focus', focusListener);
|
|
192
|
+
if (!inputElements.includes(focusEvent.target)) {
|
|
193
|
+
this._focused = false;
|
|
194
|
+
this.updateFakeInput();
|
|
195
|
+
this.updateTabIndex();
|
|
196
|
+
this.blurred.emit(focusEvent);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
window.addEventListener('focus', focusListener, true);
|
|
200
|
+
}));
|
|
175
201
|
this.updateFakeInput();
|
|
176
202
|
this.updateTabIndex();
|
|
177
203
|
});
|
|
178
|
-
this.markForCheck();
|
|
179
204
|
}
|
|
180
205
|
onRadioValueChanged(event) {
|
|
181
206
|
if (this._writing)
|
|
@@ -194,6 +219,24 @@ export class MatBooleanField {
|
|
|
194
219
|
this.checkIfTouched();
|
|
195
220
|
this._onChangeCallback(event.checked);
|
|
196
221
|
this._writing = false;
|
|
222
|
+
this.focus();
|
|
223
|
+
}
|
|
224
|
+
toggleValue(event) {
|
|
225
|
+
event?.preventDefault();
|
|
226
|
+
if (this._writing)
|
|
227
|
+
return; // Skip if call by self
|
|
228
|
+
this._writing = true;
|
|
229
|
+
this._value = !this._value;
|
|
230
|
+
if (this.yesRadioButton) {
|
|
231
|
+
this.yesRadioButton.checked = this._value;
|
|
232
|
+
this.noRadioButton.checked = !this._value;
|
|
233
|
+
}
|
|
234
|
+
else if (this.checkboxButton) {
|
|
235
|
+
this.checkboxButton.checked = this._value;
|
|
236
|
+
}
|
|
237
|
+
this.checkIfTouched();
|
|
238
|
+
this._onChangeCallback(this._value);
|
|
239
|
+
this._writing = false;
|
|
197
240
|
}
|
|
198
241
|
/* -- private method -- */
|
|
199
242
|
checkIfTouched() {
|
|
@@ -206,42 +249,22 @@ export class MatBooleanField {
|
|
|
206
249
|
* Show/Hide the fake input
|
|
207
250
|
*/
|
|
208
251
|
updateFakeInput() {
|
|
209
|
-
if (this.
|
|
210
|
-
|
|
211
|
-
this.fakeInput.nativeElement.classList.add('hidden');
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
this.fakeInput.nativeElement.classList.remove('hidden');
|
|
215
|
-
}
|
|
216
|
-
this.markForCheck();
|
|
252
|
+
if (this.showRadio || this.style === 'button') {
|
|
253
|
+
this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');
|
|
217
254
|
}
|
|
255
|
+
else {
|
|
256
|
+
this.fakeInput?.nativeElement.classList.remove('cdk-visually-hidden');
|
|
257
|
+
}
|
|
258
|
+
this.markForCheck();
|
|
218
259
|
}
|
|
219
260
|
/**
|
|
220
261
|
* This is a special case, because, this component has a temporary component displayed before the first focus event
|
|
221
262
|
*/
|
|
222
263
|
updateTabIndex() {
|
|
223
|
-
if (isNil(this._tabindex)
|
|
264
|
+
if (isNil(this._tabindex))
|
|
224
265
|
return;
|
|
225
266
|
if (this.fakeInput) {
|
|
226
|
-
|
|
227
|
-
this.fakeInput.nativeElement.tabIndex = -1;
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
this.fakeInput.nativeElement.tabIndex = this._tabindex;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
if (this.yesButton) {
|
|
234
|
-
if (this.showRadio) {
|
|
235
|
-
this.yesButton._inputElement.nativeElement.tabIndex = this._tabindex;
|
|
236
|
-
this.noButton._inputElement.nativeElement.tabIndex = this._tabindex + 1;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
this.yesButton._inputElement.nativeElement.tabIndex = -1;
|
|
240
|
-
this.noButton._inputElement.nativeElement.tabIndex = -1;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
else if (this.checkboxButton) {
|
|
244
|
-
this.checkboxButton._inputElement.nativeElement.tabIndex = this.showRadio ? this._tabindex : -1;
|
|
267
|
+
this.fakeInput.nativeElement.tabIndex = this._tabindex;
|
|
245
268
|
}
|
|
246
269
|
this.markForCheck();
|
|
247
270
|
}
|
|
@@ -252,47 +275,46 @@ export class MatBooleanField {
|
|
|
252
275
|
this.writeValue(null);
|
|
253
276
|
event?.stopPropagation();
|
|
254
277
|
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
this.updateFakeInput();
|
|
266
|
-
this.updateTabIndex();
|
|
267
|
-
this.blurred.emit(focusEvent);
|
|
268
|
-
}
|
|
269
|
-
// Remove the event listener after it has executed once
|
|
270
|
-
window.removeEventListener('focus', focusListener);
|
|
271
|
-
};
|
|
272
|
-
window.addEventListener('focus', focusListener, true);
|
|
278
|
+
get radioButtonElements() {
|
|
279
|
+
return this.yesRadioButton ? [this.yesRadioButton, this.noRadioButton].map((b) => b._inputElement.nativeElement) : [];
|
|
280
|
+
}
|
|
281
|
+
get inputsElements() {
|
|
282
|
+
return this.radioButtonElements
|
|
283
|
+
.concat(this.checkboxButton ? [this.checkboxButton._inputElement.nativeElement] : [])
|
|
284
|
+
.concat(this.fakeInput ? [this.fakeInput.nativeElement] : []);
|
|
285
|
+
}
|
|
286
|
+
get ionButtons() {
|
|
287
|
+
return [this.yesButton, this.noButton];
|
|
273
288
|
}
|
|
274
289
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatBooleanField, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
275
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MatBooleanField, selector: "mat-boolean-field", inputs: { disabled: "disabled", formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: "readonly", required: "required", compact: "compact", style: "style", buttonsColCount: "buttonsColCount", classList: ["class", "classList"], yesLabel: "yesLabel", noLabel: "noLabel", showButtonIcons: "showButtonIcons", yesIcon: "yesIcon", noIcon: "noIcon", clearable: "clearable", labelPosition: "labelPosition", tabindex: "tabindex", showRadio: "showRadio", value: "value" }, outputs: { keyupEnter: "keyup.enter", blurred: "blur" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "yesButton", first: true, predicate: ["yesButton"], descendants: true }, { propertyName: "noButton", first: true, predicate: ["noButton"], descendants: true }, { propertyName: "checkboxButton", first: true, predicate: ["checkboxButton"], descendants: true }, { propertyName: "fakeInput", first: true, predicate: ["fakeInput"], descendants: true }], ngImport: i0, template: "@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly [placeholder]=\"placeholder\" [formControl]=\"formControl\" />\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n} @else {\n @switch (style) {\n <!-- Radio -->\n @case ('radio') {\n <mat-form-field\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">\n {{ placeholder }}\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n </mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- radio button -->\n <mat-radio-group\n [class.cdk-visually-hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\"\n >\n <mat-radio-button #yesButton [value]=\"true\">\n <span>{{ yesLabel | translate }}</span>\n </mat-radio-button>\n \n <mat-radio-button #noButton [value]=\"false\">\n <span>{{ noLabel | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Checkbox -->\n @case ('checkbox') {\n <mat-form-field\n floatLabel=\"always\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #matInput\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- checkbox, when compact -->\n <mat-checkbox\n #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value === null || value === undefined\"\n [class.cdk-visually-hidden]=\"!showRadio\"\n [tabindex]=\"tabindex\"\n [labelPosition]=\"labelPosition\"\n [title]=\"placeholder || ''\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n {{ placeholder || '' }}\n }\n </mat-checkbox>\n\n @if (floatLabel === 'never' || !placeholder) {\n <mat-label> </mat-label>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Buttons -->\n @case ('button') {\n <mat-form-field\n [floatLabel]=\"'always'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\n } @else {\n <mat-label> </mat-label>\n }\n\n <input matInput type=\"text\" hidden [formControl]=\"formControl\" [required]=\"required\" />\n @if (formControl.disabled) {\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n } @else {\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\n <!-- yes -->\n <ion-button\n class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && yesIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ yesLabel | translate }}\n </ion-button>\n\n <!-- No button -->\n <ion-button\n class=\"mat-form-field-button\"\n [tabindex]=\"_tabindex !== undefined && _tabindex != -1 ? _tabindex + 1 : _tabindex\"\n (click)=\"writeValue(false, $event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && noIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ noLabel | translate }}\n </ion-button>\n </div>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <ion-button\n matSuffix\n fill=\"clear\"\n size=\"small\"\n color=\"medium\"\n tabindex=\"-1\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n </ion-button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);white-space:normal;padding:0 2px;height:var(--mat-mdc-form-field-height)}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i6.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i6.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i11.IsNilPipe, name: "isNil" }, { kind: "pipe", type: i12.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
290
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MatBooleanField, selector: "mat-boolean-field", inputs: { disabled: ["disabled", "disabled", booleanAttribute], formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: ["readonly", "readonly", booleanAttribute], required: ["required", "required", booleanAttribute], compact: ["compact", "compact", booleanAttribute], style: "style", buttonsColCount: ["buttonsColCount", "buttonsColCount", numberAttribute], classList: ["class", "classList"], yesLabel: "yesLabel", noLabel: "noLabel", showButtonIcons: ["showButtonIcons", "showButtonIcons", booleanAttribute], yesIcon: "yesIcon", noIcon: "noIcon", clearable: ["clearable", "clearable", booleanAttribute], labelPosition: "labelPosition", tabindex: ["tabindex", "tabindex", numberAttribute], showRadio: ["showRadio", "showRadio", booleanAttribute], value: "value" }, outputs: { keyupEnter: "keyup.enter", blurred: "blur" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "yesRadioButton", first: true, predicate: ["yesRadioButton"], descendants: true }, { propertyName: "noRadioButton", first: true, predicate: ["noRadioButton"], descendants: true }, { propertyName: "checkboxButton", first: true, predicate: ["checkboxButton"], descendants: true }, { propertyName: "yesButton", first: true, predicate: ["yesButton"], descendants: true }, { propertyName: "noButton", first: true, predicate: ["noButton"], descendants: true }, { propertyName: "fakeInput", first: true, predicate: ["fakeInput"], descendants: true }], ngImport: i0, template: "@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly [placeholder]=\"placeholder\" [formControl]=\"formControl\" />\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n} @else {\n @switch (style) {\n <!-- Radio -->\n @case ('radio') {\n <mat-form-field\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">\n {{ placeholder }}\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n </mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- radio button -->\n <mat-radio-group\n [class.cdk-visually-hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\"\n >\n <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\n <span>{{ yesLabel | translate }}</span>\n </mat-radio-button>\n \n <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\n <span>{{ noLabel | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Checkbox -->\n @case ('checkbox') {\n <mat-form-field\n floatLabel=\"always\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- checkbox, when compact -->\n <mat-checkbox\n #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value | isNil\"\n [class.cdk-visually-hidden]=\"!showRadio\"\n [labelPosition]=\"labelPosition\"\n [title]=\"placeholder || ''\"\n [tabIndex]=\"-1\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n {{ placeholder || '' }}\n }\n </mat-checkbox>\n\n @if (floatLabel === 'never' || !placeholder) {\n <mat-label> </mat-label>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Buttons -->\n @case ('button') {\n <mat-form-field\n [floatLabel]=\"'always'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\n } @else {\n <mat-label> </mat-label>\n }\n\n <input #fakeInput matInput\n type=\"text\" class=\"cdk-visually-hidden\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [tabindex]=\"_tabindex\"\n />\n @if (formControl.disabled) {\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n } @else {\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\n <!-- yes -->\n <ion-button\n #yesButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && yesIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ yesLabel | translate }}\n </ion-button>\n\n <!-- No button -->\n <ion-button\n #noButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(false, $event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && noIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ noLabel | translate }}\n </ion-button>\n </div>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <ion-button\n matSuffix\n fill=\"clear\"\n size=\"small\"\n color=\"medium\"\n tabindex=\"-1\"\n (click)=\"clearValue($event)\"\n [class.cdk-visually-hidden]=\"_value | isNil\"\n >\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n </ion-button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);white-space:normal;padding:0 2px;height:var(--mat-mdc-form-field-height)}\n"], dependencies: [{ kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i6.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i6.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i11.IsNilPipe, name: "isNil" }, { kind: "pipe", type: i12.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
276
291
|
}
|
|
277
292
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatBooleanField, decorators: [{
|
|
278
293
|
type: Component,
|
|
279
|
-
args: [{ selector: 'mat-boolean-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly [placeholder]=\"placeholder\" [formControl]=\"formControl\" />\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n} @else {\n @switch (style) {\n <!-- Radio -->\n @case ('radio') {\n <mat-form-field\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">\n {{ placeholder }}\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n </mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- radio button -->\n <mat-radio-group\n [class.cdk-visually-hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\"\n >\n <mat-radio-button #
|
|
294
|
+
args: [{ selector: 'mat-boolean-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input matInput hidden type=\"text\" readonly [placeholder]=\"placeholder\" [formControl]=\"formControl\" />\n <ion-text>\n {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n </ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n} @else {\n @switch (style) {\n <!-- Radio -->\n @case ('radio') {\n <mat-form-field\n [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">\n {{ placeholder }}\n <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n </mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n type=\"text\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- radio button -->\n <mat-radio-group\n [class.cdk-visually-hidden]=\"!showRadio\"\n [formControl]=\"formControl\"\n (change)=\"onRadioValueChanged($event)\"\n >\n <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\n <span>{{ yesLabel | translate }}</span>\n </mat-radio-button>\n \n <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\n <span>{{ noLabel | translate }}</span>\n </mat-radio-button>\n </mat-radio-group>\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Checkbox -->\n @case ('checkbox') {\n <mat-form-field\n floatLabel=\"always\"\n [appearance]=\"appearance\"\n class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <input\n matInput\n #fakeInput\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n [required]=\"required\"\n [class.cdk-visually-hidden]=\"showRadio\"\n [tabindex]=\"tabindex\"\n />\n\n <!-- checkbox, when compact -->\n <mat-checkbox\n #checkboxButton\n [formControl]=\"formControl\"\n (change)=\"onCheckboxValueChanged($event)\"\n [indeterminate]=\"value | isNil\"\n [class.cdk-visually-hidden]=\"!showRadio\"\n [labelPosition]=\"labelPosition\"\n [title]=\"placeholder || ''\"\n [tabIndex]=\"-1\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n {{ placeholder || '' }}\n }\n </mat-checkbox>\n\n @if (floatLabel === 'never' || !placeholder) {\n <mat-label> </mat-label>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearValue($event)\"\n [hidden]=\"_value | isNil\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n\n <!-- Buttons -->\n @case ('button') {\n <mat-form-field\n [floatLabel]=\"'always'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\n } @else {\n <mat-label> </mat-label>\n }\n\n <input #fakeInput matInput\n type=\"text\" class=\"cdk-visually-hidden\"\n readonly=\"true\"\n [formControl]=\"formControl\"\n (focus)=\"onFocusFakeInput($event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.arrowLeft)=\"toggleValue($event)\"\n (keyup.arrowRight)=\"toggleValue($event)\"\n (keyup.arrowUp)=\"toggleValue($event)\"\n (keyup.arrowDown)=\"toggleValue($event)\"\n [required]=\"required\"\n [tabindex]=\"_tabindex\"\n />\n @if (formControl.disabled) {\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n } @else {\n <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\n <!-- yes -->\n <ion-button\n #yesButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(true, $event)\"\n (keyup.enter)=\"writeValue(true, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && yesIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ yesLabel | translate }}\n </ion-button>\n\n <!-- No button -->\n <ion-button\n #noButton\n class=\"mat-form-field-button\"\n [tabIndex]=\"-1\"\n (click)=\"writeValue(false, $event)\"\n (keydown.space)=\"toggleValue($event)\"\n (keyup.enter)=\"writeValue(false, $event)\"\n [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\n >\n @if (showButtonIcons && noIcon; as icon) {\n <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n }\n {{ noLabel | translate }}\n </ion-button>\n </div>\n }\n\n @if (formControl.hasError('required')) {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n\n @if (clearable) {\n <ion-button\n matSuffix\n fill=\"clear\"\n size=\"small\"\n color=\"medium\"\n tabindex=\"-1\"\n (click)=\"clearValue($event)\"\n [class.cdk-visually-hidden]=\"_value | isNil\"\n >\n <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n </ion-button>\n }\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{width:100%}.mat-mdc-form-field .mat-form-field-buttons{width:100%;display:flex;flex-flow:row wrap;justify-content:flex-start;align-items:center}.mat-mdc-form-field .mat-form-field-buttons .mat-form-field-button{--button-padding-end: 4px;--flex-basis: calc(100% / var(--buttons-col-count, 2) - var(--button-padding-end, 0px));flex:0 1 var(--flex-basis);max-width:min(var(--flex-basis),150px);white-space:normal;padding:0 2px;height:var(--mat-mdc-form-field-height)}\n"] }]
|
|
280
295
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.FormGroupDirective, decorators: [{
|
|
281
296
|
type: Optional
|
|
282
|
-
}] }], propDecorators: {
|
|
297
|
+
}] }], propDecorators: { yesRadioButton: [{
|
|
283
298
|
type: ViewChild,
|
|
284
|
-
args: ['
|
|
285
|
-
}],
|
|
299
|
+
args: ['yesRadioButton']
|
|
300
|
+
}], noRadioButton: [{
|
|
286
301
|
type: ViewChild,
|
|
287
|
-
args: ['
|
|
302
|
+
args: ['noRadioButton']
|
|
288
303
|
}], checkboxButton: [{
|
|
289
304
|
type: ViewChild,
|
|
290
305
|
args: ['checkboxButton']
|
|
306
|
+
}], yesButton: [{
|
|
307
|
+
type: ViewChild,
|
|
308
|
+
args: ['yesButton']
|
|
309
|
+
}], noButton: [{
|
|
310
|
+
type: ViewChild,
|
|
311
|
+
args: ['noButton']
|
|
291
312
|
}], fakeInput: [{
|
|
292
313
|
type: ViewChild,
|
|
293
314
|
args: ['fakeInput']
|
|
294
315
|
}], disabled: [{
|
|
295
|
-
type: Input
|
|
316
|
+
type: Input,
|
|
317
|
+
args: [{ transform: booleanAttribute }]
|
|
296
318
|
}], formControl: [{
|
|
297
319
|
type: Input
|
|
298
320
|
}], formControlName: [{
|
|
@@ -306,15 +328,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
306
328
|
}], subscriptSizing: [{
|
|
307
329
|
type: Input
|
|
308
330
|
}], readonly: [{
|
|
309
|
-
type: Input
|
|
331
|
+
type: Input,
|
|
332
|
+
args: [{ transform: booleanAttribute }]
|
|
310
333
|
}], required: [{
|
|
311
|
-
type: Input
|
|
334
|
+
type: Input,
|
|
335
|
+
args: [{ transform: booleanAttribute }]
|
|
312
336
|
}], compact: [{
|
|
313
|
-
type: Input
|
|
337
|
+
type: Input,
|
|
338
|
+
args: [{ transform: booleanAttribute }]
|
|
314
339
|
}], style: [{
|
|
315
340
|
type: Input
|
|
316
341
|
}], buttonsColCount: [{
|
|
317
|
-
type: Input
|
|
342
|
+
type: Input,
|
|
343
|
+
args: [{ transform: numberAttribute }]
|
|
318
344
|
}], classList: [{
|
|
319
345
|
type: Input,
|
|
320
346
|
args: ['class']
|
|
@@ -323,19 +349,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
323
349
|
}], noLabel: [{
|
|
324
350
|
type: Input
|
|
325
351
|
}], showButtonIcons: [{
|
|
326
|
-
type: Input
|
|
352
|
+
type: Input,
|
|
353
|
+
args: [{ transform: booleanAttribute }]
|
|
327
354
|
}], yesIcon: [{
|
|
328
355
|
type: Input
|
|
329
356
|
}], noIcon: [{
|
|
330
357
|
type: Input
|
|
331
358
|
}], clearable: [{
|
|
332
|
-
type: Input
|
|
359
|
+
type: Input,
|
|
360
|
+
args: [{ transform: booleanAttribute }]
|
|
333
361
|
}], labelPosition: [{
|
|
334
362
|
type: Input
|
|
335
363
|
}], tabindex: [{
|
|
336
|
-
type: Input
|
|
364
|
+
type: Input,
|
|
365
|
+
args: [{ transform: numberAttribute }]
|
|
337
366
|
}], showRadio: [{
|
|
338
|
-
type: Input
|
|
367
|
+
type: Input,
|
|
368
|
+
args: [{ transform: booleanAttribute }]
|
|
339
369
|
}], value: [{
|
|
340
370
|
type: Input
|
|
341
371
|
}], keyupEnter: [{
|
|
@@ -345,4 +375,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
345
375
|
type: Output,
|
|
346
376
|
args: ['blur']
|
|
347
377
|
}] } });
|
|
348
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBNEMsaUJBQWlCLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFJakgsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQUUvRCxNQUFNLHNCQUFzQixHQUFhO0lBQ3ZDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDOUMsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0FBU3RCLE1BQU0sT0FBTyxlQUFlO0lBb0ZoQjtJQUNFO0lBQ1U7SUFyRmQsaUJBQWlCLEdBQXFCLElBQUksQ0FBQztJQUMzQyxrQkFBa0IsR0FBZSxJQUFJLENBQUM7SUFDdEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVmLE1BQU0sQ0FBVTtJQUNoQixTQUFTLENBQVM7SUFDbEIsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLGdDQUFnQztJQUNwRCxRQUFRLEdB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TUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUHJvdmlkZXIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRSYWRpb0J1dHRvbiwgTWF0UmFkaW9DaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRDaGVja2JveCwgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzTm90TmlsLCB0b051bWJlciB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBBcHBGbG9hdExhYmVsVHlwZSB9IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ0ByeC1hbmd1bGFyL2Nkay96b25lLWxlc3MvYnJvd3Nlcic7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0Qm9vbGVhbkZpZWxkKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1ib29sZWFuLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmJvb2xlYW4uaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmJvb2xlYW4uc2NzcyddLFxuICBwcm92aWRlcnM6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdEJvb2xlYW5GaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElucHV0RWxlbWVudCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfd3JpdGluZyA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBfdmFsdWU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfdGFiaW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9zaG93UmFkaW8gPSBmYWxzZTsgLy8gV2lsbCBiZSBjaGFuZ2VkIHdoZW4gZm9jdXMgaW5cbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgneWVzQnV0dG9uJykgeWVzQnV0dG9uOiBNYXRSYWRpb0J1dHRvbjtcbiAgQFZpZXdDaGlsZCgnbm9CdXR0b24nKSBub0J1dHRvbjogTWF0UmFkaW9CdXR0b247XG4gIEBWaWV3Q2hpbGQoJ2NoZWNrYm94QnV0dG9uJykgY2hlY2tib3hCdXR0b246IE1hdENoZWNrYm94O1xuICBAVmlld0NoaWxkKCdmYWtlSW5wdXQnKSBmYWtlSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlO1xuICBASW5wdXQoKSBzdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29tcGFjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBzdHlsZTogJ3JhZGlvJyB8ICdjaGVja2JveCcgfCAnYnV0dG9uJztcbiAgQElucHV0KCkgYnV0dG9uc0NvbENvdW50OiBudW1iZXI7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnY2xhc3MnKSBjbGFzc0xpc3Q6IHN0cmluZztcbiAgQElucHV0KCkgeWVzTGFiZWwgPSAnQ09NTU9OLllFUyc7XG4gIEBJbnB1dCgpIG5vTGFiZWwgPSAnQ09NTU9OLk5PJztcbiAgQElucHV0KCkgc2hvd0J1dHRvbkljb25zID0gdHJ1ZTtcbiAgQElucHV0KCkgeWVzSWNvbiA9ICdjaGVja21hcmsnO1xuICBASW5wdXQoKSBub0ljb24gPSAnY2xvc2UnO1xuICBASW5wdXQoKSBjbGVhcmFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ2FmdGVyJyB8ICdiZWZvcmUnID0gJ2FmdGVyJztcblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl90YWJpbmRleCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlVGFiSW5kZXgoKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmluZGV4O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHNob3dSYWRpbyh2OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5fc2hvd1JhZGlvKSB7XG4gICAgICB0aGlzLl9zaG93UmFkaW8gPSB2O1xuICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd1JhZGlvKCk6IGFueSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3Nob3dSYWRpbyB8fFxuICAgICAgdGhpcy5fZm9jdXNlZCB8fFxuICAgICAgdGhpcy5mbG9hdExhYmVsID09PSAnYWx3YXlzJyB8fFxuICAgICAgdGhpcy5mbG9hdExhYmVsID09PSAnbmV2ZXInIHx8XG4gICAgICB0aGlzLnN0eWxlID09PSAnY2hlY2tib3gnIHx8XG4gICAgICBpc05vdE5pbCh0aGlzLl92YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHY6IGFueSkge1xuICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4LEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ2tleXVwLmVudGVyJykga2V5dXBFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgfHwgKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWJvb2xlYW4tZmllbGQ+LlwiKTtcblxuICAgIHRoaXMuc3R5bGUgPSB0aGlzLnN0eWxlIHx8ICh0aGlzLmNvbXBhY3QgPyAnY2hlY2tib3gnIDogJ3JhZGlvJyk7XG5cbiAgICBpZiAodGhpcy5zdHlsZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIHRoaXMuYnV0dG9uc0NvbENvdW50ID0gdG9OdW1iZXIodGhpcy5idXR0b25zQ29sQ291bnQsIDIpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5ibHVycmVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnksIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5zdHlsZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQpIHRoaXMua2V5dXBFbnRlci5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIG9uRm9jdXNGYWtlSW5wdXQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gSGlkZSB0aGUgZmFrZSBpbnB1dFxuICAgIGlmICh0aGlzLmZha2VJbnB1dCkge1xuICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvLyBGb2N1cyBvbiBmaXJzdCBidXR0b25cbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMueWVzQnV0dG9uKSB7XG4gICAgICAgIHRoaXMueWVzQnV0dG9uLmZvY3VzKCk7XG5cbiAgICAgICAgLy8gQWRkIGEgYmx1ciBsaXN0ZW5lciBvbiBlYWNoIGlucHV0c1xuICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW3RoaXMueWVzQnV0dG9uLCB0aGlzLm5vQnV0dG9uXVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgIC5jb25jYXQodGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGlucHV0RWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IChlbC5vbmJsdXIgPSAoZSkgPT4gdGhpcy5vbkJsdXIoZSkpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2JveEJ1dHRvbikge1xuICAgICAgICB0aGlzLmNoZWNrYm94QnV0dG9uLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUZha2VJbnB1dCgpO1xuICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUmFkaW9WYWx1ZUNoYW5nZWQoZXZlbnQ6IE1hdFJhZGlvQ2hhbmdlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcCBpZiBjYWxsIGJ5IHNlbGZcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGV2ZW50LnZhbHVlKTtcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkNoZWNrYm94VmFsdWVDaGFuZ2VkKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG4gICAgdGhpcy5fdmFsdWUgPSBldmVudC5jaGVja2VkO1xuICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGV2ZW50LmNoZWNrZWQpO1xuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSBjaGVja0lmVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdy9IaWRlIHRoZSBmYWtlIGlucHV0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUZha2VJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5mYWtlSW5wdXQpIHtcbiAgICAgIGlmICh0aGlzLnNob3dSYWRpbykge1xuICAgICAgICB0aGlzLmZha2VJbnB1dC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSwgdGhpcyBjb21wb25lbnQgaGFzIGEgdGVtcG9yYXJ5IGNvbXBvbmVudCBkaXNwbGF5ZWQgYmVmb3JlIHRoZSBmaXJzdCBmb2N1cyBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUYWJJbmRleCgpIHtcbiAgICBpZiAoaXNOaWwodGhpcy5fdGFiaW5kZXgpIHx8IHRoaXMuX3RhYmluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZmFrZUlucHV0KSB7XG4gICAgICBpZiAodGhpcy5zaG93UmFkaW8pIHtcbiAgICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IHRoaXMuX3RhYmluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy55ZXNCdXR0b24pIHtcbiAgICAgIGlmICh0aGlzLnNob3dSYWRpbykge1xuICAgICAgICB0aGlzLnllc0J1dHRvbi5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudGFiSW5kZXggPSB0aGlzLl90YWJpbmRleDtcbiAgICAgICAgdGhpcy5ub0J1dHRvbi5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudGFiSW5kZXggPSB0aGlzLl90YWJpbmRleCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnllc0J1dHRvbi5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5ub0J1dHRvbi5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudGFiSW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY2hlY2tib3hCdXR0b24pIHtcbiAgICAgIHRoaXMuY2hlY2tib3hCdXR0b24uX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnRhYkluZGV4ID0gdGhpcy5zaG93UmFkaW8gPyB0aGlzLl90YWJpbmRleCA6IC0xO1xuICAgIH1cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoZXZlbnQ/OiBFdmVudCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CbHVyKGV2ZW50PzogRm9jdXNFdmVudCkge1xuICAgIGNvbnN0IGlucHV0RWxlbWVudHM6IEhUTUxFbGVtZW50W10gPSBbdGhpcy55ZXNCdXR0b24sIHRoaXMubm9CdXR0b25dXG4gICAgICAubWFwKChiKSA9PiBiLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudClcbiAgICAgIC5jb25jYXQodGhpcy5mYWtlSW5wdXQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAvLyBTZXR1cCBhIG9uZS10aW1lIGZvY3VzIGV2ZW50IGhhbmRsZXJcbiAgICBjb25zdCBmb2N1c0xpc3RlbmVyID0gKGZvY3VzRXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgIC8vIGNoYW5nZSBpZCBoZXJlIHRvIHlvdXIgYWN0dWFsIHJlcXVpcmVtZW50XG4gICAgICAvL2NvbnN0IGN1cnJlbnRJbnB1dCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPXJhZGlvXScpO1xuXG4gICAgICBpZiAoIWlucHV0RWxlbWVudHMuaW5jbHVkZXMoZm9jdXNFdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgICAgICB0aGlzLmJsdXJyZWQuZW1pdChmb2N1c0V2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciBhZnRlciBpdCBoYXMgZXhlY3V0ZWQgb25jZVxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZm9jdXNMaXN0ZW5lcik7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBmb2N1c0xpc3RlbmVyLCB0cnVlKTtcbiAgfVxufVxuIiwiQGlmIChyZWFkb25seSkge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge3sgY2xhc3NMaXN0IH19XCJcbiAgPlxuICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiIC8+XG4gICAgPGlvbi10ZXh0PlxuICAgICAge3sgKHZhbHVlID09PSBudWxsID8gJ0NPTU1PTi5FTVBUWV9PUFRJT04nIDogdmFsdWUgPT09IHRydWUgPyB5ZXNMYWJlbCA6IG5vTGFiZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgPC9pb24tdGV4dD5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L21hdC1mb3JtLWZpZWxkPlxufSBAZWxzZSB7XG4gIEBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgPCEtLSBSYWRpbyAtLT5cbiAgICBAY2FzZSAoJ3JhZGlvJykge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIFtmbG9hdExhYmVsXT1cInNob3dSYWRpbyAmJiAoIWZsb2F0TGFiZWwgfHwgZmxvYXRMYWJlbCA9PT0gJ2F1dG8nKSA/ICdhbHdheXMnIDogKGZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlKVwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgIGNsYXNzPVwibWF0LWJvb2xlYW4tZmllbGQgbWF0LWJvb2xlYW4tZmllbGQtcmFkaW8ge3sgY2xhc3NMaXN0IH19XCJcbiAgICAgID5cbiAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICA8bWF0LWxhYmVsIFt0aXRsZV09XCJwbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICAgICAgICAgIDxzcGFuIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInNob3dSYWRpb1wiPih7eyB5ZXNMYWJlbCB8IHRyYW5zbGF0ZSB9fS97eyBub0xhYmVsIHwgdHJhbnNsYXRlIH19KTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgI2Zha2VJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICByZWFkb25seT1cInRydWVcIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXNGYWtlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJzaG93UmFkaW9cIlxuICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPCEtLSByYWRpbyBidXR0b24gLS0+XG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhc2hvd1JhZGlvXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25SYWRpb1ZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uICN5ZXNCdXR0b24gW3ZhbHVlXT1cInRydWVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IHllc0xhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAjbm9CdXR0b24gW3ZhbHVlXT1cImZhbHNlXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBub0xhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG5cbiAgICAgICAgQGlmIChmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cIl92YWx1ZSB8IGlzTmlsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICB9XG5cbiAgICA8IS0tIENoZWNrYm94IC0tPlxuICAgIEBjYXNlICgnY2hlY2tib3gnKSB7XG4gICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgZmxvYXRMYWJlbD1cImFsd2F5c1wiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICBjbGFzcz1cIm1hdC1ib29sZWFuLWZpZWxkIG1hdC1ib29sZWFuLWZpZWxkLWNoZWNrYm94IHt7IGNsYXNzTGlzdCB9fVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzRmFrZUlucHV0KCRldmVudClcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwic2hvd1JhZGlvXCJcbiAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAvPlxuXG4gICAgICAgIDwhLS0gY2hlY2tib3gsIHdoZW4gY29tcGFjdCAtLT5cbiAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICNjaGVja2JveEJ1dHRvblxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFzaG93UmFkaW9cIlxuICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgW2xhYmVsUG9zaXRpb25dPVwibGFiZWxQb3NpdGlvblwiXG4gICAgICAgICAgW3RpdGxlXT1cInBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB7eyBwbGFjZWhvbGRlciB8fCAnJyB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtY2hlY2tib3g+XG5cbiAgICAgICAgQGlmIChmbG9hdExhYmVsID09PSAnbmV2ZXInIHx8ICFwbGFjZWhvbGRlcikge1xuICAgICAgICAgIDxtYXQtbGFiZWw+Jm5ic3A7PC9tYXQtbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2xlYXJhYmxlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiX3ZhbHVlIHwgaXNOaWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIH1cblxuICAgIDwhLS0gQnV0dG9ucyAtLT5cbiAgICBAY2FzZSAoJ2J1dHRvbicpIHtcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBbZmxvYXRMYWJlbF09XCInYWx3YXlzJ1wiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgIGNsYXNzPVwibWF0LWJvb2xlYW4tZmllbGQgbWF0LWJvb2xlYW4tZmllbGQtYnV0dG9uIHt7IGNsYXNzTGlzdCB9fVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgIDxtYXQtbGFiZWwgW3RpdGxlXT1cInBsYWNlaG9sZGVyXCI+e3sgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG1hdC1sYWJlbD4mbmJzcDs8L21hdC1sYWJlbD5cbiAgICAgICAgfVxuXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIGhpZGRlbiBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIiAvPlxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmRpc2FibGVkKSB7XG4gICAgICAgICAgPGlvbi1sYWJlbD48aSB0cmFuc2xhdGU+Q09NTU9OLkVNUFRZX09QVElPTjwvaT48L2lvbi1sYWJlbD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWJ1dHRvbnNcIiBbc3R5bGUuLS1idXR0b25zLWNvbC1jb3VudF09XCJidXR0b25zQ29sQ291bnRcIj5cbiAgICAgICAgICAgIDwhLS0geWVzIC0tPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1idXR0b25cIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiX3RhYmluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIndyaXRlVmFsdWUodHJ1ZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJ3cml0ZVZhbHVlKHRydWUsICRldmVudClcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiX3ZhbHVlID09PSBudWxsID8gJ3RlcnRpYXJ5JyA6IF92YWx1ZSA9PT0gdHJ1ZSA/ICdhY2NlbnQnIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkljb25zICYmIHllc0ljb247IGFzIGljb24pIHtcbiAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgW25hbWVdPVwiaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAge3sgeWVzTGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgPCEtLSBObyBidXR0b24gLS0+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJfdGFiaW5kZXggIT09IHVuZGVmaW5lZCAmJiBfdGFiaW5kZXggIT0gLTEgPyBfdGFiaW5kZXggKyAxIDogX3RhYmluZGV4XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIndyaXRlVmFsdWUoZmFsc2UsICRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwid3JpdGVWYWx1ZShmYWxzZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJfdmFsdWUgPT09IG51bGwgPyAndGVydGlhcnknIDogX3ZhbHVlID09PSBmYWxzZSA/ICdhY2NlbnQnIDogJ2xpZ2h0J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkljb25zICYmIG5vSWNvbjsgYXMgaWNvbikge1xuICAgICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBbbmFtZV09XCJpY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB7eyBub0xhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoY2xlYXJhYmxlKSB7XG4gICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICBjb2xvcj1cIm1lZGl1bVwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJfdmFsdWUgfCBpc05pbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvc2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgfVxuICB9XG59XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
378
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2Jvb2xlYW4vbWF0ZXJpYWwuYm9vbGVhbi5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFBRSxlQUFlLEVBR3RCLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBNEMsaUJBQWlCLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFJakgsT0FBTyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQWEsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBRWxDLE1BQU0sc0JBQXNCLEdBQWE7SUFDdkMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztJQUM5QyxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7QUFTdEIsTUFBTSxPQUFPLGVBQWU7SUF1RmhCO0lBQ0U7SUFDVTtJQXhGZCxpQkFBaUIsR0FBcUIsSUFBSSxDQUFDO0lBQzNDLGtCQUFrQixHQUFlLElBQUksQ0FBQztJQUM3QixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM1QyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWYsTUFBTSxDQUFVO0lBQ2hCLFNBQVMsQ0FBUztJQUNsQixVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsZ0NBQWdDO0lBQ3BELFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFRSxjQUFjLENBQWlCO0lBQ2hDLGFBQWEsQ0FBaUI7SUFDN0IsY0FBYyxDQUFjO0lBQ2pDLFNBQVMsQ0FBWTtJQUN0QixRQUFRLENBQVk7SUFDbkIsU0FBUyxDQUFhO0lBRVIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUM5QyxXQUFXLENBQXFCO0lBQ2hDLGVBQWUsQ0FBUztJQUN4QixXQUFXLENBQVM7SUFDcEIsVUFBVSxHQUFzQixNQUFNLENBQUM7SUFDdkMsVUFBVSxDQUF5QjtJQUNuQyxlQUFlLENBQWtCO0lBQ0osUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDN0MsS0FBSyxDQUFrQztJQUNYLGVBQWUsQ0FBUztJQUM3RCwyREFBMkQ7SUFDM0MsU0FBUyxDQUFTO0lBQ3pCLFFBQVEsR0FBRyxZQUFZLENBQUM7SUFDeEIsT0FBTyxHQUFHLFdBQVcsQ0FBQztJQUNPLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDcEQsT0FBTyxHQUFHLFdBQVcsQ0FBQztJQUN0QixNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ1ksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUMvQyxhQUFhLEdBQXVCLE9BQU8sQ0FBQztJQUVyRCxJQUF5QyxRQUFRLENBQUMsS0FBYTtRQUM3RCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUNJLFNBQVMsQ0FBQyxDQUFNO1FBQ2xCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLENBQ0wsSUFBSSxDQUFDLFVBQVU7WUFDZixJQUFJLENBQUMsUUFBUTtZQUNiLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUTtZQUM1QixJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU87WUFDM0IsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVO1lBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFDSSxLQUFLLENBQUMsQ0FBTTtRQUNkLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELGdHQUFnRztJQUN6RSxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUM1RCwrREFBK0Q7SUFDL0MsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFFekQsWUFDVSxFQUFxQixFQUNuQixFQUEyQixFQUNqQixZQUFnQztRQUY1QyxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNuQixPQUFFLEdBQUYsRUFBRSxDQUF5QjtRQUNqQixpQkFBWSxHQUFaLFlBQVksQ0FBb0I7SUFDbkQsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVztZQUNkLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQXdCLENBQUMsQ0FBQztRQUM5SSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdGQUF3RixDQUFDLENBQUM7UUFFakksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVqRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVUsRUFBRSxLQUFhO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUUxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFFcEIsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUssS0FBSyxLQUFLLENBQUM7WUFDL0MsQ0FBQztpQkFBTSxJQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMzQyxDQUFDO3FCQUNJLENBQUM7b0JBQ0osSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxDQUFDO1lBQ0gsQ0FBQztZQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksS0FBSztnQkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDN0IsQ0FBQztJQUVTLGdCQUFnQixDQUFDLEtBQWlCO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLENBQUMsa0JBQWtCO1FBRTdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QscUNBQXFDO1lBQ3JDLE1BQU0sYUFBYSxHQUFrQixJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3pELGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMvQyx1Q0FBdUM7Z0JBQ3ZDLE1BQU0sYUFBYSxHQUFHLENBQUMsVUFBc0IsRUFBRSxFQUFFO29CQUMvQyw0REFBNEQ7b0JBQzVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBRW5ELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFxQixDQUFDLEVBQUUsQ0FBQzt3QkFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztnQkFDSCxDQUFDLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVKLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBcUI7UUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sQ0FBQyx1QkFBdUI7UUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxLQUF3QjtRQUN2RCxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxDQUFDLHVCQUF1QjtRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxDQUFDLHVCQUF1QjtRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELDBCQUEwQjtJQUVsQixjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYztRQUNwQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTztRQUVsQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFjLG1CQUFtQjtRQUMvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDeEgsQ0FBQztJQUVELElBQWMsY0FBYztRQUMxQixPQUFPLElBQUksQ0FBQyxtQkFBbUI7YUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNwRixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDNUQ7SUFDTCxDQUFDO0lBRUQsSUFBYyxVQUFVO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxDQUFDO3dHQWpUVSxlQUFlOzRGQUFmLGVBQWUsOEVBa0JQLGdCQUFnQiwwTkFPaEIsZ0JBQWdCLHNDQUNoQixnQkFBZ0IsbUNBQ2hCLGdCQUFnQiwyRUFFaEIsZUFBZSx3SUFLZixnQkFBZ0IsK0VBR2hCLGdCQUFnQixzRUFHaEIsZUFBZSx5Q0FXZixnQkFBZ0IseUZBdER4QixDQUFDLHNCQUFzQixDQUFDLHlsQkN2Q3JDLDIxUkFvUUE7OzRGRDFOYSxlQUFlO2tCQVAzQixTQUFTOytCQUNFLG1CQUFtQixhQUdsQixDQUFDLHNCQUFzQixDQUFDLG1CQUNsQix1QkFBdUIsQ0FBQyxNQUFNOzswQkEyRjVDLFFBQVE7eUNBOUVrQixjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDQyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ0csY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0gsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNDLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDRyxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBRWdCLFFBQVE7c0JBQTdDLEtBQUs7dUJBQUMsRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUM7Z0JBQzNCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNnQyxRQUFRO3NCQUE3QyxLQUFLO3VCQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDO2dCQUNFLFFBQVE7c0JBQTdDLEtBQUs7dUJBQUMsRUFBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUM7Z0JBQ0UsT0FBTztzQkFBNUMsS0FBSzt1QkFBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQztnQkFDM0IsS0FBSztzQkFBYixLQUFLO2dCQUMrQixlQUFlO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBQztnQkFFbkIsU0FBUztzQkFBeEIsS0FBSzt1QkFBQyxPQUFPO2dCQUNMLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNnQyxlQUFlO3NCQUFwRCxLQUFLO3VCQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDO2dCQUMzQixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNnQyxTQUFTO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDO2dCQUMzQixhQUFhO3NCQUFyQixLQUFLO2dCQUVtQyxRQUFRO3NCQUFoRCxLQUFLO3VCQUFDLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBQztnQkFZL0IsU0FBUztzQkFEWixLQUFLO3VCQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDO2dCQW9CaEMsS0FBSztzQkFEUixLQUFLO2dCQVlpQixVQUFVO3NCQUFoQyxNQUFNO3VCQUFDLGFBQWE7Z0JBRUwsT0FBTztzQkFBdEIsTUFBTTt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsIG51bWJlckF0dHJpYnV0ZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFByb3ZpZGVyLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0UmFkaW9CdXR0b24sIE1hdFJhZGlvQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3gsIE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7aXNOaWwsIGlzTm90TmlsLCB0b0Jvb2xlYW4sIHRvTnVtYmVyfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQXBwRmxvYXRMYWJlbFR5cGUgfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuaW1wb3J0IHsgSW9uQnV0dG9uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG5jb25zdCBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdEJvb2xlYW5GaWVsZCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtYm9vbGVhbi1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC5ib29sZWFuLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5ib29sZWFuLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbREVGQVVMVF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRCb29sZWFuRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJbnB1dEVsZW1lbnQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfd3JpdGluZyA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBfdmFsdWU6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBfdGFiaW5kZXg6IG51bWJlcjtcbiAgcHJvdGVjdGVkIF9zaG93UmFkaW8gPSBmYWxzZTsgLy8gV2lsbCBiZSBjaGFuZ2VkIHdoZW4gZm9jdXMgaW5cbiAgcHJvdGVjdGVkIF9mb2N1c2VkID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgneWVzUmFkaW9CdXR0b24nKSB5ZXNSYWRpb0J1dHRvbjogTWF0UmFkaW9CdXR0b247XG4gIEBWaWV3Q2hpbGQoJ25vUmFkaW9CdXR0b24nKSBub1JhZGlvQnV0dG9uOiBNYXRSYWRpb0J1dHRvbjtcbiAgQFZpZXdDaGlsZCgnY2hlY2tib3hCdXR0b24nKSBjaGVja2JveEJ1dHRvbjogTWF0Q2hlY2tib3g7XG4gIEBWaWV3Q2hpbGQoJ3llc0J1dHRvbicpIHllc0J1dHRvbjogSW9uQnV0dG9uO1xuICBAVmlld0NoaWxkKCdub0J1dHRvbicpIG5vQnV0dG9uOiBJb25CdXR0b247XG4gIEBWaWV3Q2hpbGQoJ2Zha2VJbnB1dCcpIGZha2VJbnB1dDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoe3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgQElucHV0KCkgc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmc7XG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoe3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pIGNvbXBhY3QgPSBmYWxzZTtcbiAgQElucHV0KCkgc3R5bGU6ICdyYWRpbycgfCAnY2hlY2tib3gnIHwgJ2J1dHRvbic7XG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGV9KSBidXR0b25zQ29sQ291bnQ6IG51bWJlcjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdjbGFzcycpIGNsYXNzTGlzdDogc3RyaW5nO1xuICBASW5wdXQoKSB5ZXNMYWJlbCA9ICdDT01NT04uWUVTJztcbiAgQElucHV0KCkgbm9MYWJlbCA9ICdDT01NT04uTk8nO1xuICBASW5wdXQoe3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pIHNob3dCdXR0b25JY29ucyA9IHRydWU7XG4gIEBJbnB1dCgpIHllc0ljb24gPSAnY2hlY2ttYXJrJztcbiAgQElucHV0KCkgbm9JY29uID0gJ2Nsb3NlJztcbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KSBjbGVhcmFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ2FmdGVyJyB8ICdiZWZvcmUnID0gJ2FmdGVyJztcblxuICBASW5wdXQoe3RyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlfSkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fdGFiaW5kZXggIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVRhYkluZGV4KCkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIEBJbnB1dCh7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSlcbiAgc2V0IHNob3dSYWRpbyh2OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5fc2hvd1JhZGlvKSB7XG4gICAgICB0aGlzLl9zaG93UmFkaW8gPSB2O1xuICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd1JhZGlvKCk6IGFueSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX3Nob3dSYWRpbyB8fFxuICAgICAgdGhpcy5fZm9jdXNlZCB8fFxuICAgICAgdGhpcy5mbG9hdExhYmVsID09PSAnYWx3YXlzJyB8fFxuICAgICAgdGhpcy5mbG9hdExhYmVsID09PSAnbmV2ZXInIHx8XG4gICAgICB0aGlzLnN0eWxlID09PSAnY2hlY2tib3gnIHx8XG4gICAgICBpc05vdE5pbCh0aGlzLl92YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHY6IGFueSkge1xuICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4LEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ2tleXVwLmVudGVyJykga2V5dXBFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgQE91dHB1dCgnYmx1cicpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sID1cbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wgfHwgKHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmICh0aGlzLmZvcm1Hcm91cERpci5mb3JtLmdldCh0aGlzLmZvcm1Db250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sKSk7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBhdHRyaWJ1dGUgJ2Zvcm1Db250cm9sJyBvciAnZm9ybUNvbnRyb2xOYW1lJyBpbiA8bWF0LWJvb2xlYW4tZmllbGQ+LlwiKTtcblxuICAgIHRoaXMuc3R5bGUgPSB0aGlzLnN0eWxlIHx8ICh0aGlzLmNvbXBhY3QgPyAnY2hlY2tib3gnIDogJ3JhZGlvJyk7XG5cbiAgICBpZiAodGhpcy5zdHlsZSA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIHRoaXMuYnV0dG9uc0NvbENvdW50ID0gdG9OdW1iZXIodGhpcy5idXR0b25zQ29sQ291bnQsIDIpO1xuICAgIH1cblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQodGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy53cml0ZVZhbHVlKHZhbHVlKSkpO1xuXG4gICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmJsdXJyZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdUT0RPIHdyaXRlVmFsdWUnKVxuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMuZm9ybUNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5wYXRjaFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy55ZXNSYWRpb0J1dHRvbikge1xuICAgICAgICB0aGlzLnllc1JhZGlvQnV0dG9uLmNoZWNrZWQgPSB2YWx1ZSA9PT0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub1JhZGlvQnV0dG9uLmNoZWNrZWQgPSB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYodGhpcy5jaGVja2JveEJ1dHRvbikge1xuICAgICAgICBpZiAoaXNOaWwodmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5jaGVja2JveEJ1dHRvbi5pbmRldGVybWluYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94QnV0dG9uLmNoZWNrZWQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVGYWtlSW5wdXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnN0eWxlID09PSAnYnV0dG9uJykge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCkgdGhpcy5rZXl1cEVudGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRm9jdXNGYWtlSW5wdXQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2hvd1JhZGlvKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBIaWRlIHRoZSBmYWtlIGlucHV0XG4gICAgICB0aGlzLmZha2VJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7XG4gICAgfVxuXG4gICAgLy8gRm9jdXMgb24gZmlyc3QgYnV0dG9uXG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMuX2ZvY3VzZWQpIHJldHVybjsgLy8gQWxyZWFkeSBmb2N1c2VkXG5cbiAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIEFkZCBhIGJsdXIgbGlzdGVuZXIgb24gZWFjaCBpbnB1dHNcbiAgICAgIGNvbnN0IGlucHV0RWxlbWVudHM6IEhUTUxFbGVtZW50W10gPSB0aGlzLmlucHV0c0VsZW1lbnRzO1xuICAgICAgaW5wdXRFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4gKGVsLm9uYmx1ciA9IChlKSA9PiB7XG4gICAgICAgIC8vIFNldHVwIGEgb25lLXRpbWUgZm9jdXMgZXZlbnQgaGFuZGxlclxuICAgICAgICBjb25zdCBmb2N1c0xpc3RlbmVyID0gKGZvY3VzRXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIGFmdGVyIGl0IGhhcyBiZWVuIGV4ZWN1dGVkIG9uY2VcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBmb2N1c0xpc3RlbmVyKTtcblxuICAgICAgICAgIGlmICghaW5wdXRFbGVtZW50cy5pbmNsdWRlcyhmb2N1c0V2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmFrZUlucHV0KCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG4gICAgICAgICAgICB0aGlzLmJsdXJyZWQuZW1pdChmb2N1c0V2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZvY3VzTGlzdGVuZXIsIHRydWUpO1xuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUZha2VJbnB1dCgpO1xuICAgICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUmFkaW9WYWx1ZUNoYW5nZWQoZXZlbnQ6IE1hdFJhZGlvQ2hhbmdlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcCBpZiBjYWxsIGJ5IHNlbGZcbiAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGV2ZW50LnZhbHVlKTtcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGVja2JveFZhbHVlQ2hhbmdlZChldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gZXZlbnQuY2hlY2tlZDtcbiAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayhldmVudC5jaGVja2VkKTtcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICB0b2dnbGVWYWx1ZShldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gIXRoaXMuX3ZhbHVlO1xuICAgIGlmICh0aGlzLnllc1JhZGlvQnV0dG9uKSB7XG4gICAgICB0aGlzLnllc1JhZGlvQnV0dG9uLmNoZWNrZWQgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMubm9SYWRpb0J1dHRvbi5jaGVja2VkID0gIXRoaXMuX3ZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2JveEJ1dHRvbikge1xuICAgICAgdGhpcy5jaGVja2JveEJ1dHRvbi5jaGVja2VkID0gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAtLSAqL1xuXG4gIHByaXZhdGUgY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cvSGlkZSB0aGUgZmFrZSBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVGYWtlSW5wdXQoKSB7XG4gICAgaWYgKHRoaXMuc2hvd1JhZGlvIHx8IHRoaXMuc3R5bGUgPT09ICdidXR0b24nKSB7XG4gICAgICB0aGlzLmZha2VJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmFrZUlucHV0Py5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Nkay12aXN1YWxseS1oaWRkZW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGJlY2F1c2UsIHRoaXMgY29tcG9uZW50IGhhcyBhIHRlbXBvcmFyeSBjb21wb25lbnQgZGlzcGxheWVkIGJlZm9yZSB0aGUgZmlyc3QgZm9jdXMgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVGFiSW5kZXgoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX3RhYmluZGV4KSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZmFrZUlucHV0KSB7XG4gICAgICB0aGlzLmZha2VJbnB1dC5uYXRpdmVFbGVtZW50LnRhYkluZGV4ID0gdGhpcy5fdGFiaW5kZXg7XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjbGVhclZhbHVlKGV2ZW50PzogRXZlbnQpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByYWRpb0J1dHRvbkVsZW1lbnRzKCk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLnllc1JhZGlvQnV0dG9uID8gW3RoaXMueWVzUmFkaW9CdXR0b24sIHRoaXMubm9SYWRpb0J1dHRvbl0ubWFwKChiKSA9PiBiLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCkgOiBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaW5wdXRzRWxlbWVudHMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaW9CdXR0b25FbGVtZW50c1xuICAgICAgLmNvbmNhdCh0aGlzLmNoZWNrYm94QnV0dG9uID8gW3RoaXMuY2hlY2tib3hCdXR0b24uX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50XSA6IFtdKVxuICAgICAgLmNvbmNhdCh0aGlzLmZha2VJbnB1dCA/IFt0aGlzLmZha2VJbnB1dC5uYXRpdmVFbGVtZW50XSA6IFtdKVxuICAgICAgO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpb25CdXR0b25zKCk6IElvbkJ1dHRvbltdIHtcbiAgICByZXR1cm4gW3RoaXMueWVzQnV0dG9uLCB0aGlzLm5vQnV0dG9uXTtcbiAgfVxufVxuIiwiQGlmIChyZWFkb25seSkge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge3sgY2xhc3NMaXN0IH19XCJcbiAgPlxuICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiIC8+XG4gICAgPGlvbi10ZXh0PlxuICAgICAge3sgKHZhbHVlID09PSBudWxsID8gJ0NPTU1PTi5FTVBUWV9PUFRJT04nIDogdmFsdWUgPT09IHRydWUgPyB5ZXNMYWJlbCA6IG5vTGFiZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgPC9pb24tdGV4dD5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L21hdC1mb3JtLWZpZWxkPlxufSBAZWxzZSB7XG4gIEBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgPCEtLSBSYWRpbyAtLT5cbiAgICBAY2FzZSAoJ3JhZGlvJykge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIFtmbG9hdExhYmVsXT1cInNob3dSYWRpbyAmJiAoIWZsb2F0TGFiZWwgfHwgZmxvYXRMYWJlbCA9PT0gJ2F1dG8nKSA/ICdhbHdheXMnIDogKGZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlKVwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgIGNsYXNzPVwibWF0LWJvb2xlYW4tZmllbGQgbWF0LWJvb2xlYW4tZmllbGQtcmFkaW8ge3sgY2xhc3NMaXN0IH19XCJcbiAgICAgID5cbiAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICA8bWF0LWxhYmVsIFt0aXRsZV09XCJwbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICAgICAgICAgIDxzcGFuIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInNob3dSYWRpb1wiPih7eyB5ZXNMYWJlbCB8IHRyYW5zbGF0ZSB9fS97eyBub0xhYmVsIHwgdHJhbnNsYXRlIH19KTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgI2Zha2VJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICByZWFkb25seT1cInRydWVcIlxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXNGYWtlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmFycm93TGVmdCk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dSaWdodCk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dVcCk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwic2hvd1JhZGlvXCJcbiAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAvPlxuXG4gICAgICAgIDwhLS0gcmFkaW8gYnV0dG9uIC0tPlxuICAgICAgICA8bWF0LXJhZGlvLWdyb3VwXG4gICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIXNob3dSYWRpb1wiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uUmFkaW9WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAjeWVzUmFkaW9CdXR0b24gW3ZhbHVlXT1cInRydWVcIiB0YWJJbmRleD1cIi0xXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyB5ZXNMYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gI25vUmFkaW9CdXR0b24gW3ZhbHVlXT1cImZhbHNlXCIgdGFiSW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgbm9MYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuXG4gICAgICAgIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChjbGVhcmFibGUpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJfdmFsdWUgfCBpc05pbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgfVxuXG4gICAgPCEtLSBDaGVja2JveCAtLT5cbiAgICBAY2FzZSAoJ2NoZWNrYm94Jykge1xuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIGZsb2F0TGFiZWw9XCJhbHdheXNcIlxuICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgY2xhc3M9XCJtYXQtYm9vbGVhbi1maWVsZCBtYXQtYm9vbGVhbi1maWVsZC1jaGVja2JveCB7eyBjbGFzc0xpc3QgfX1cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgI2Zha2VJbnB1dFxuICAgICAgICAgIHJlYWRvbmx5PVwidHJ1ZVwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1c0Zha2VJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInNob3dSYWRpb1wiXG4gICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgLz5cblxuICAgICAgICA8IS0tIGNoZWNrYm94LCB3aGVuIGNvbXBhY3QgLS0+XG4gICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAjY2hlY2tib3hCdXR0b25cbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJ2YWx1ZSB8IGlzTmlsXCJcbiAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhc2hvd1JhZGlvXCJcbiAgICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCJsYWJlbFBvc2l0aW9uXCJcbiAgICAgICAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCItMVwiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAge3sgcGxhY2Vob2xkZXIgfHwgJycgfX1cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxuXG4gICAgICAgIEBpZiAoZmxvYXRMYWJlbCA9PT0gJ25ldmVyJyB8fCAhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICA8bWF0LWxhYmVsPiZuYnNwOzwvbWF0LWxhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cIl92YWx1ZSB8IGlzTmlsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICB9XG5cbiAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgQGNhc2UgKCdidXR0b24nKSB7XG4gICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwiJ2Fsd2F5cydcIlxuICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgICAgICBjbGFzcz1cIm1hdC1ib29sZWFuLWZpZWxkIG1hdC1ib29sZWFuLWZpZWxkLWJ1dHRvbiB7eyBjbGFzc0xpc3QgfX1cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICA8bWF0LWxhYmVsIFt0aXRsZV09XCJwbGFjZWhvbGRlclwiPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxtYXQtbGFiZWw+Jm5ic3A7PC9tYXQtbGFiZWw+XG4gICAgICAgIH1cblxuICAgICAgICA8aW5wdXQgI2Zha2VJbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIlxuICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1c0Zha2VJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgKGtleXVwLmFycm93TGVmdCk9XCJ0b2dnbGVWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChrZXl1cC5hcnJvd1JpZ2h0KT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgKGtleXVwLmFycm93VXApPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cInRvZ2dsZVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJfdGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgLz5cbiAgICAgICAgQGlmIChmb3JtQ29udHJvbC5kaXNhYmxlZCkge1xuICAgICAgICAgIDxpb24tbGFiZWw+PGkgdHJhbnNsYXRlPkNPTU1PTi5FTVBUWV9PUFRJT048L2k+PC9pb24tbGFiZWw+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1idXR0b25zXCIgW3N0eWxlLi0tYnV0dG9ucy1jb2wtY291bnRdPVwiYnV0dG9uc0NvbENvdW50XCI+XG4gICAgICAgICAgICA8IS0tIHllcyAtLT5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgICN5ZXNCdXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1idXR0b25cIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwid3JpdGVWYWx1ZSh0cnVlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIndyaXRlVmFsdWUodHJ1ZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJfdmFsdWUgPT09IG51bGwgPyAndGVydGlhcnknIDogX3ZhbHVlID09PSB0cnVlID8gJ2FjY2VudCcgOiAnbGlnaHQnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGlmIChzaG93QnV0dG9uSWNvbnMgJiYgeWVzSWNvbjsgYXMgaWNvbikge1xuICAgICAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBbbmFtZV09XCJpY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB7eyB5ZXNMYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgICAgICA8IS0tIE5vIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgICNub0J1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWJ1dHRvblwiXG4gICAgICAgICAgICAgIFt0YWJJbmRleF09XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ3cml0ZVZhbHVlKGZhbHNlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJ3cml0ZVZhbHVlKGZhbHNlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIl92YWx1ZSA9PT0gbnVsbCA/ICd0ZXJ0aWFyeScgOiBfdmFsdWUgPT09IGZhbHNlID8gJ2FjY2VudCcgOiAnbGlnaHQnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGlmIChzaG93QnV0dG9uSWNvbnMgJiYgbm9JY29uOyBhcyBpY29uKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIFtuYW1lXT1cImljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHt7IG5vTGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChjbGVhcmFibGUpIHtcbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIGNvbG9yPVwibWVkaXVtXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJfdmFsdWUgfCBpc05pbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvc2VcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgfVxuICB9XG59XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|