@sumaris-net/ngx-components 18.3.29 → 18.3.30-alpha2
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/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
- package/esm2022/src/app/shared/forms.mjs +2 -1
- package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +42 -27
- package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +359 -0
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +110 -402
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +6 -5
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +1 -1
- package/esm2022/src/app/shared/material/material.module.mjs +2 -2
- package/esm2022/src/app/shared/material/material.testing.module.mjs +14 -3
- package/esm2022/src/app/shared/material/test/test-component.mjs +240 -0
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +3 -3
- package/fesm2022/sumaris-net.ngx-components.mjs +990 -676
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/shared/inputs.d.ts +1 -1
- package/src/app/shared/material/latlong/latlong.utils.d.ts +33 -6
- package/src/app/shared/material/latlong/material.latlong-input.d.ts +80 -0
- package/src/app/shared/material/latlong/material.latlong.d.ts +21 -66
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +15 -14
- package/src/app/shared/material/material.testing.module.d.ts +2 -1
- package/src/app/shared/material/test/test-component.d.ts +75 -0
- package/src/assets/i18n/en-US.json +12 -20
- package/src/assets/i18n/en.json +8 -16
- package/src/assets/i18n/fr.json +8 -16
- package/src/theme/_material.scss +3 -10
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, Inject, inject, Input, Optional, Self, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormBuilder, Validators } from '@angular/forms';
|
|
3
|
+
import { isNil, isNilOrBlank, isNotNil } from '../../functions';
|
|
4
|
+
import { computeDecimalDegrees, computeDecimalPart, splitDegreesToDDArray, splitDegreesToDDMMArray, splitDegreesToDDMMSSArray, } from './latlong.utils';
|
|
5
|
+
import { MAT_FORM_FIELD, MatFormFieldControl } from '@angular/material/form-field';
|
|
6
|
+
import { Subject } from 'rxjs';
|
|
7
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
import * as i2 from "@maskito/angular";
|
|
11
|
+
import * as i3 from "@angular/material/select";
|
|
12
|
+
import * as i4 from "@angular/material/core";
|
|
13
|
+
import * as i5 from "@ngx-translate/core";
|
|
14
|
+
import * as i6 from "@angular/material/form-field";
|
|
15
|
+
export class MatLatLongFieldInput {
|
|
16
|
+
_elementRef;
|
|
17
|
+
_formField;
|
|
18
|
+
ngControl;
|
|
19
|
+
static nextId = 0;
|
|
20
|
+
degreesInput;
|
|
21
|
+
minutesInput;
|
|
22
|
+
secondsInput;
|
|
23
|
+
signInput;
|
|
24
|
+
parts = inject(FormBuilder).group({
|
|
25
|
+
degrees: ['', [Validators.required]],
|
|
26
|
+
minutes: [''],
|
|
27
|
+
seconds: [''],
|
|
28
|
+
sign: [null, [Validators.required]],
|
|
29
|
+
});
|
|
30
|
+
stateChanges = new Subject();
|
|
31
|
+
focused = false;
|
|
32
|
+
touched = false;
|
|
33
|
+
controlType = 'mat-latlong-input';
|
|
34
|
+
id = `mat-latlong-input-${MatLatLongFieldInput.nextId++}`;
|
|
35
|
+
onChange = (_) => { };
|
|
36
|
+
onTouched = () => { };
|
|
37
|
+
get empty() {
|
|
38
|
+
const { value: { degrees, minutes, seconds }, } = this.parts;
|
|
39
|
+
return !degrees && !minutes && !seconds;
|
|
40
|
+
}
|
|
41
|
+
get shouldLabelFloat() {
|
|
42
|
+
return this.focused || !this.empty;
|
|
43
|
+
}
|
|
44
|
+
userAriaDescribedBy;
|
|
45
|
+
placeholder; // Not used
|
|
46
|
+
get required() {
|
|
47
|
+
return this._required;
|
|
48
|
+
}
|
|
49
|
+
set required(value) {
|
|
50
|
+
this._required = coerceBooleanProperty(value);
|
|
51
|
+
this.stateChanges.next();
|
|
52
|
+
}
|
|
53
|
+
_required = false;
|
|
54
|
+
get disabled() {
|
|
55
|
+
return this._disabled;
|
|
56
|
+
}
|
|
57
|
+
set disabled(value) {
|
|
58
|
+
this._disabled = coerceBooleanProperty(value);
|
|
59
|
+
if (this._disabled) {
|
|
60
|
+
this.parts.disable();
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.parts.enable();
|
|
64
|
+
}
|
|
65
|
+
this.stateChanges.next();
|
|
66
|
+
}
|
|
67
|
+
_disabled = false;
|
|
68
|
+
get value() {
|
|
69
|
+
if (this.parts.valid) {
|
|
70
|
+
const degrees = parseFloat(this.parts.value.degrees);
|
|
71
|
+
const minutes = parseFloat(this.parts.value.minutes);
|
|
72
|
+
const seconds = parseFloat(this.parts.value.seconds);
|
|
73
|
+
const sign = this.parts.value.sign;
|
|
74
|
+
return this.parts.valid
|
|
75
|
+
? isNil(degrees) || this.pattern === 'DD'
|
|
76
|
+
? degrees
|
|
77
|
+
: computeDecimalDegrees(degrees, minutes, seconds, sign, this.maxDecimals)
|
|
78
|
+
: null;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
set value(value) {
|
|
83
|
+
const result = this.computeLatLongFormGroupValue(value);
|
|
84
|
+
console.debug(`${this.logPrefix} Setting value`, value, result);
|
|
85
|
+
this.parts.setValue({
|
|
86
|
+
degrees: result.degrees?.toString() || null,
|
|
87
|
+
minutes: result.minutes?.toString() || null,
|
|
88
|
+
seconds: result.seconds?.toString() || null,
|
|
89
|
+
sign: result.sign,
|
|
90
|
+
});
|
|
91
|
+
this.stateChanges.next();
|
|
92
|
+
}
|
|
93
|
+
get errorState() {
|
|
94
|
+
return this.parts.invalid && this.touched;
|
|
95
|
+
}
|
|
96
|
+
type;
|
|
97
|
+
pattern;
|
|
98
|
+
degreesSymbolUnit;
|
|
99
|
+
minutesSymbolUnit;
|
|
100
|
+
secondsSymbolUnit;
|
|
101
|
+
defaultSign;
|
|
102
|
+
maxDecimals;
|
|
103
|
+
showMinutes;
|
|
104
|
+
showSeconds;
|
|
105
|
+
showSign;
|
|
106
|
+
degreesMask;
|
|
107
|
+
minutesMask;
|
|
108
|
+
secondsMask;
|
|
109
|
+
degreesPlaceholder;
|
|
110
|
+
minutesPlaceholder;
|
|
111
|
+
secondsPlaceholder;
|
|
112
|
+
lastInputMaxDecimals;
|
|
113
|
+
logPrefix = '[mat-latlong-input]';
|
|
114
|
+
constructor(_elementRef, _formField, ngControl) {
|
|
115
|
+
this._elementRef = _elementRef;
|
|
116
|
+
this._formField = _formField;
|
|
117
|
+
this.ngControl = ngControl;
|
|
118
|
+
if (this.ngControl != null) {
|
|
119
|
+
this.ngControl.valueAccessor = this;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
ngOnInit() {
|
|
123
|
+
if (this.showMinutes) {
|
|
124
|
+
this.parts.controls.minutes.addValidators(Validators.required);
|
|
125
|
+
}
|
|
126
|
+
if (this.showSeconds) {
|
|
127
|
+
this.parts.controls.seconds.addValidators(Validators.required);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
ngOnDestroy() {
|
|
131
|
+
this.stateChanges.complete();
|
|
132
|
+
}
|
|
133
|
+
onFocusIn(event) {
|
|
134
|
+
if (!this.focused) {
|
|
135
|
+
this.focused = true;
|
|
136
|
+
this.stateChanges.next();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
onFocusOut(event) {
|
|
140
|
+
if (!this._elementRef.nativeElement.contains(event.relatedTarget)) {
|
|
141
|
+
this.touched = true;
|
|
142
|
+
this.focused = false;
|
|
143
|
+
this.onTouched();
|
|
144
|
+
this.stateChanges.next();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
handleInput(controlName, nextControlName) {
|
|
148
|
+
// Can autofocus next control ?
|
|
149
|
+
let focusNext = false;
|
|
150
|
+
switch (controlName) {
|
|
151
|
+
case 'degrees': {
|
|
152
|
+
const degrees = parseFloat(this.parts.value.degrees);
|
|
153
|
+
if (this.type === 'latitude' && (degrees === 0 || degrees > 9)) {
|
|
154
|
+
focusNext = true;
|
|
155
|
+
}
|
|
156
|
+
else if (this.type === 'longitude' && (degrees === 0 || degrees > 18)) {
|
|
157
|
+
focusNext = true;
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case 'minutes': {
|
|
162
|
+
const minutes = parseFloat(this.parts.value.minutes);
|
|
163
|
+
if (minutes === 0 || minutes > 6) {
|
|
164
|
+
focusNext = true;
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case 'seconds': {
|
|
169
|
+
// focusNext = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (focusNext) {
|
|
174
|
+
this.autoFocusNext(controlName, nextControlName);
|
|
175
|
+
}
|
|
176
|
+
this.onChange(this.value);
|
|
177
|
+
}
|
|
178
|
+
autoFocusNext(controlName, nextControlName) {
|
|
179
|
+
if (!this.parts.controls[controlName].errors && nextControlName) {
|
|
180
|
+
this.getElementByName(nextControlName).focus();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
autoFocusPrev(controlName, prevControlName) {
|
|
184
|
+
if (isNilOrBlank(this.parts.controls[controlName].value)) {
|
|
185
|
+
this.getElementByName(prevControlName).focus();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
getElementByName(name) {
|
|
189
|
+
switch (name) {
|
|
190
|
+
case 'degrees':
|
|
191
|
+
return this.degreesInput.nativeElement;
|
|
192
|
+
case 'minutes':
|
|
193
|
+
return this.minutesInput.nativeElement;
|
|
194
|
+
case 'seconds':
|
|
195
|
+
return this.secondsInput.nativeElement;
|
|
196
|
+
case 'sign':
|
|
197
|
+
return this.signInput.nativeElement;
|
|
198
|
+
default:
|
|
199
|
+
throw new Error(`${this.logPrefix} No HTMLElement with name '${name}'`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
setDescribedByIds(ids) {
|
|
203
|
+
const controlElement = this._elementRef.nativeElement.querySelector('.mat-latlong-input-container');
|
|
204
|
+
controlElement.setAttribute('aria-describedby', ids.join(' '));
|
|
205
|
+
}
|
|
206
|
+
onContainerClick() {
|
|
207
|
+
console.debug(`${this.logPrefix} DEBUG onContainerClick`);
|
|
208
|
+
if (this.empty) {
|
|
209
|
+
this.degreesInput.nativeElement.focus();
|
|
210
|
+
}
|
|
211
|
+
else if (isNilOrBlank(this.parts.value.minutes)) {
|
|
212
|
+
this.minutesInput.nativeElement.focus();
|
|
213
|
+
}
|
|
214
|
+
else if (isNilOrBlank(this.parts.value.seconds)) {
|
|
215
|
+
this.secondsInput.nativeElement.focus();
|
|
216
|
+
}
|
|
217
|
+
else if (isNil(this.parts.value.sign)) {
|
|
218
|
+
this.signInput.nativeElement.focus();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
writeValue(value) {
|
|
222
|
+
this.value = value;
|
|
223
|
+
}
|
|
224
|
+
registerOnChange(fn) {
|
|
225
|
+
this.onChange = fn;
|
|
226
|
+
}
|
|
227
|
+
registerOnTouched(fn) {
|
|
228
|
+
this.onTouched = fn;
|
|
229
|
+
}
|
|
230
|
+
setDisabledState(isDisabled) {
|
|
231
|
+
this.disabled = isDisabled;
|
|
232
|
+
}
|
|
233
|
+
computeLatLongFormGroupValue(rawValue) {
|
|
234
|
+
const isLongitude = this.type === 'longitude';
|
|
235
|
+
const value = typeof rawValue === 'string' ? parseFloat(rawValue.replace(/,/g, '.')) : rawValue;
|
|
236
|
+
const result = {
|
|
237
|
+
degrees: null,
|
|
238
|
+
minutes: null,
|
|
239
|
+
seconds: null,
|
|
240
|
+
sign: isNotNil(value)
|
|
241
|
+
? value < 0
|
|
242
|
+
? -1
|
|
243
|
+
: 1
|
|
244
|
+
: // Use default sign, if any
|
|
245
|
+
this.defaultSign
|
|
246
|
+
? this.defaultSign === '-'
|
|
247
|
+
? -1
|
|
248
|
+
: 1
|
|
249
|
+
: null,
|
|
250
|
+
};
|
|
251
|
+
if (value === 0) {
|
|
252
|
+
result.degrees = 0;
|
|
253
|
+
}
|
|
254
|
+
else if (isNotNil(value)) {
|
|
255
|
+
// Parse options
|
|
256
|
+
const parseOptions = {
|
|
257
|
+
longitude: isLongitude,
|
|
258
|
+
pattern: this.pattern,
|
|
259
|
+
maxDecimals: this.lastInputMaxDecimals,
|
|
260
|
+
fixLatLong: true,
|
|
261
|
+
};
|
|
262
|
+
if (this.pattern === 'DD') {
|
|
263
|
+
const splitValue = splitDegreesToDDArray(value, parseOptions).slice(1); // remove sign;
|
|
264
|
+
result.seconds = 0;
|
|
265
|
+
result.minutes = 0;
|
|
266
|
+
result.degrees = (splitValue[0] + computeDecimalPart(splitValue[1] ?? 0, this.lastInputMaxDecimals)) * (result.sign || 1);
|
|
267
|
+
}
|
|
268
|
+
else if (this.pattern === 'DDMM') {
|
|
269
|
+
const splitValue = splitDegreesToDDMMArray(value, parseOptions);
|
|
270
|
+
result.seconds = 0;
|
|
271
|
+
result.minutes = Math.abs((splitValue[1] ?? 0) + computeDecimalPart(splitValue[2] ?? 0, this.lastInputMaxDecimals));
|
|
272
|
+
result.degrees = Math.abs(!result.minutes && isNilOrBlank(splitValue[0]) ? 0 : (splitValue[0] ?? 0));
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// Default // DDMMSS
|
|
276
|
+
const splitValue = splitDegreesToDDMMSSArray(value, parseOptions);
|
|
277
|
+
result.seconds = Math.abs((splitValue[2] ?? 0) + computeDecimalPart(splitValue[3] ?? 0, this.lastInputMaxDecimals));
|
|
278
|
+
result.minutes = !result.seconds && !splitValue[1] ? 0 : Math.abs(splitValue[1] ?? 0);
|
|
279
|
+
result.degrees = !result.seconds && !result.minutes && isNilOrBlank(splitValue[0]) ? 0 : Math.abs(splitValue[0] ?? 0);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return result;
|
|
283
|
+
}
|
|
284
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongFieldInput, deps: [{ token: i0.ElementRef }, { token: MAT_FORM_FIELD, optional: true }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
285
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatLatLongFieldInput, selector: "mat-latlong-input", inputs: { userAriaDescribedBy: ["aria-describedby", "userAriaDescribedBy"], required: "required", disabled: "disabled", value: "value", type: "type", pattern: ["latLongPattern", "pattern"], degreesSymbolUnit: "degreesSymbolUnit", minutesSymbolUnit: "minutesSymbolUnit", secondsSymbolUnit: "secondsSymbolUnit", defaultSign: "defaultSign", maxDecimals: "maxDecimals", showMinutes: "showMinutes", showSeconds: "showSeconds", showSign: "showSign", degreesMask: "degreesMask", minutesMask: "minutesMask", secondsMask: "secondsMask", degreesPlaceholder: "degreesPlaceholder", minutesPlaceholder: "minutesPlaceholder", secondsPlaceholder: "secondsPlaceholder", lastInputMaxDecimals: "lastInputMaxDecimals" }, host: { properties: { "class.label-floating": "shouldLabelFloat", "id": "id" } }, providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }], viewQueries: [{ propertyName: "degreesInput", first: true, predicate: ["degrees"], descendants: true, read: ElementRef }, { propertyName: "minutesInput", first: true, predicate: ["minutes"], descendants: true, read: ElementRef }, { propertyName: "secondsInput", first: true, predicate: ["seconds"], descendants: true, read: ElementRef }, { propertyName: "signInput", first: true, predicate: ["sign"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n role=\"group\"\n class=\"mat-latlong-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn($event)\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n #degrees\n aria-label=\"Degrees\"\n [class.degrees]=\"pattern !== 'DD'\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n formControlName=\"degrees\"\n [maskito]=\"degreesMask\"\n (input)=\"handleInput('degrees', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n #minutes\n aria-label=\"Minutes\"\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n formControlName=\"minutes\"\n [maskito]=\"minutesMask\"\n (input)=\"handleInput('minutes', 'seconds')\"\n (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n />\n <span class=\"symbol-unit\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n #seconds\n aria-label=\"Seconds\"\n class=\"seconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n formControlName=\"seconds\"\n [maskito]=\"secondsMask\"\n (input)=\"handleInput('seconds', 'sign')\"\n (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSign) {\n <span class=\"sign-spacer\"></span>\n <mat-select\n #sign\n aria-label=\"Sign\"\n class=\"sign\"\n formControlName=\"sign\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n (focusin)=\"sign.open()\"\n (selectionChange)=\"handleInput('sign')\"\n >\n <mat-option [value]=\"1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n</div>\n", styles: [".mat-latlong-input-container{display:inline-flex;opacity:0;transition:opacity .2s;pointer-events:none;--mat-select-arrow-transform: translateY(0)}input{border:none;background:none;padding:0;outline:none;font:inherit;text-align:right;color:var(--mdc-filled-text-field-input-text-color, var(--ion-text-color))}input::placeholder{letter-spacing:-.075em;padding-right:.075em;color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--app-form-field-label-color))}input.degrees{width:2em}input.minutes{width:1.5em}input.minutes-seconds{width:3.5em}input.seconds{width:3em}.symbol-unit{font-weight:700}.sign-spacer{width:.25em}.sign{max-width:2.5em;color:inherit}:host.label-floating .mat-latlong-input-container{opacity:1;pointer-events:revert}\n"], dependencies: [{ 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
286
|
+
}
|
|
287
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongFieldInput, decorators: [{
|
|
288
|
+
type: Component,
|
|
289
|
+
args: [{ selector: 'mat-latlong-input', providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }], host: {
|
|
290
|
+
'[class.label-floating]': 'shouldLabelFloat',
|
|
291
|
+
'[id]': 'id',
|
|
292
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n role=\"group\"\n class=\"mat-latlong-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn($event)\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n #degrees\n aria-label=\"Degrees\"\n [class.degrees]=\"pattern !== 'DD'\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n formControlName=\"degrees\"\n [maskito]=\"degreesMask\"\n (input)=\"handleInput('degrees', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n #minutes\n aria-label=\"Minutes\"\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n formControlName=\"minutes\"\n [maskito]=\"minutesMask\"\n (input)=\"handleInput('minutes', 'seconds')\"\n (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n />\n <span class=\"symbol-unit\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n #seconds\n aria-label=\"Seconds\"\n class=\"seconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n formControlName=\"seconds\"\n [maskito]=\"secondsMask\"\n (input)=\"handleInput('seconds', 'sign')\"\n (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSign) {\n <span class=\"sign-spacer\"></span>\n <mat-select\n #sign\n aria-label=\"Sign\"\n class=\"sign\"\n formControlName=\"sign\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n (focusin)=\"sign.open()\"\n (selectionChange)=\"handleInput('sign')\"\n >\n <mat-option [value]=\"1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n</div>\n", styles: [".mat-latlong-input-container{display:inline-flex;opacity:0;transition:opacity .2s;pointer-events:none;--mat-select-arrow-transform: translateY(0)}input{border:none;background:none;padding:0;outline:none;font:inherit;text-align:right;color:var(--mdc-filled-text-field-input-text-color, var(--ion-text-color))}input::placeholder{letter-spacing:-.075em;padding-right:.075em;color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--app-form-field-label-color))}input.degrees{width:2em}input.minutes{width:1.5em}input.minutes-seconds{width:3.5em}input.seconds{width:3em}.symbol-unit{font-weight:700}.sign-spacer{width:.25em}.sign{max-width:2.5em;color:inherit}:host.label-floating .mat-latlong-input-container{opacity:1;pointer-events:revert}\n"] }]
|
|
293
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i6.MatFormField, decorators: [{
|
|
294
|
+
type: Optional
|
|
295
|
+
}, {
|
|
296
|
+
type: Inject,
|
|
297
|
+
args: [MAT_FORM_FIELD]
|
|
298
|
+
}] }, { type: i1.NgControl, decorators: [{
|
|
299
|
+
type: Optional
|
|
300
|
+
}, {
|
|
301
|
+
type: Self
|
|
302
|
+
}] }], propDecorators: { degreesInput: [{
|
|
303
|
+
type: ViewChild,
|
|
304
|
+
args: ['degrees', { read: ElementRef }]
|
|
305
|
+
}], minutesInput: [{
|
|
306
|
+
type: ViewChild,
|
|
307
|
+
args: ['minutes', { read: ElementRef }]
|
|
308
|
+
}], secondsInput: [{
|
|
309
|
+
type: ViewChild,
|
|
310
|
+
args: ['seconds', { read: ElementRef }]
|
|
311
|
+
}], signInput: [{
|
|
312
|
+
type: ViewChild,
|
|
313
|
+
args: ['sign', { read: ElementRef }]
|
|
314
|
+
}], userAriaDescribedBy: [{
|
|
315
|
+
type: Input,
|
|
316
|
+
args: ['aria-describedby']
|
|
317
|
+
}], required: [{
|
|
318
|
+
type: Input
|
|
319
|
+
}], disabled: [{
|
|
320
|
+
type: Input
|
|
321
|
+
}], value: [{
|
|
322
|
+
type: Input
|
|
323
|
+
}], type: [{
|
|
324
|
+
type: Input
|
|
325
|
+
}], pattern: [{
|
|
326
|
+
type: Input,
|
|
327
|
+
args: ['latLongPattern']
|
|
328
|
+
}], degreesSymbolUnit: [{
|
|
329
|
+
type: Input
|
|
330
|
+
}], minutesSymbolUnit: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], secondsSymbolUnit: [{
|
|
333
|
+
type: Input
|
|
334
|
+
}], defaultSign: [{
|
|
335
|
+
type: Input
|
|
336
|
+
}], maxDecimals: [{
|
|
337
|
+
type: Input
|
|
338
|
+
}], showMinutes: [{
|
|
339
|
+
type: Input
|
|
340
|
+
}], showSeconds: [{
|
|
341
|
+
type: Input
|
|
342
|
+
}], showSign: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}], degreesMask: [{
|
|
345
|
+
type: Input
|
|
346
|
+
}], minutesMask: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], secondsMask: [{
|
|
349
|
+
type: Input
|
|
350
|
+
}], degreesPlaceholder: [{
|
|
351
|
+
type: Input
|
|
352
|
+
}], minutesPlaceholder: [{
|
|
353
|
+
type: Input
|
|
354
|
+
}], secondsPlaceholder: [{
|
|
355
|
+
type: Input
|
|
356
|
+
}], lastInputMaxDecimals: [{
|
|
357
|
+
type: Input
|
|
358
|
+
}] } });
|
|
359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwubGF0bG9uZy1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy1pbnB1dC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy1pbnB1dC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQXdCLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGtCQUFrQixFQU1sQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixHQUMxQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxjQUFjLEVBQWdCLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBYTVFLE1BQU0sT0FBTyxvQkFBb0I7SUF1SHJCO0lBQ21DO0lBQ2hCO0lBeEg3QixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMwQixZQUFZLENBQWE7SUFDekIsWUFBWSxDQUFhO0lBQ3pCLFlBQVksQ0FBYTtJQUM1QixTQUFTLENBQWE7SUFFL0QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNiLElBQUksRUFBRSxDQUFtQixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDdEQsQ0FBQyxDQUFDO0lBQ0gsWUFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztJQUNsQyxFQUFFLEdBQUcscUJBQXFCLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDMUQsUUFBUSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDMUIsU0FBUyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUVyQixJQUFJLEtBQUs7UUFDUCxNQUFNLEVBQ0osS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FDckMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRWYsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRTBCLG1CQUFtQixDQUFTO0lBQ3ZELFdBQVcsQ0FBUyxDQUFDLFdBQVc7SUFFaEMsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUNJLFFBQVEsQ0FBQyxLQUFtQjtRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFMUIsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUNJLFFBQVEsQ0FBQyxLQUFtQjtRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRTFCLElBQUksS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQ3JCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJO29CQUN2QyxDQUFDLENBQUMsT0FBTztvQkFDVCxDQUFDLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzVFLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDWCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFDSSxLQUFLLENBQUMsS0FBb0I7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSTtZQUMzQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJO1lBQzNDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUk7WUFDM0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM1QyxDQUFDO0lBRVEsSUFBSSxDQUFjO0lBQ0YsT0FBTyxDQUFpQjtJQUN4QyxpQkFBaUIsQ0FBUztJQUMxQixpQkFBaUIsQ0FBUztJQUMxQixpQkFBaUIsQ0FBUztJQUMxQixXQUFXLENBQWM7SUFDekIsV0FBVyxDQUFTO0lBRXBCLFdBQVcsQ0FBVTtJQUNyQixXQUFXLENBQVU7SUFDckIsUUFBUSxDQUFVO0lBQ2xCLFdBQVcsQ0FBaUI7SUFDNUIsV0FBVyxDQUFpQjtJQUM1QixXQUFXLENBQWlCO0lBQzVCLGtCQUFrQixDQUFTO0lBQzNCLGtCQUFrQixDQUFTO0lBQzNCLGtCQUFrQixDQUFTO0lBQzNCLG9CQUFvQixDQUFTO0lBRTlCLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQztJQUUxQyxZQUNVLFdBQW9DLEVBQ0QsVUFBd0IsRUFDeEMsU0FBb0I7UUFGdkMsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ0QsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN4QyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBRS9DLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFpQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsS0FBaUI7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBd0IsQ0FBQyxFQUFFLENBQUM7WUFDN0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsV0FBbUIsRUFBRSxlQUF3QjtRQUN2RCwrQkFBK0I7UUFDL0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLFFBQVEsV0FBVyxFQUFFLENBQUM7WUFDcEIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQy9ELFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ3hFLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNqQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO2dCQUNELE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNmLG9CQUFvQjtnQkFDcEIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsYUFBYSxDQUFDLFdBQW1CLEVBQUUsZUFBd0I7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsV0FBbUIsRUFBRSxlQUF1QjtRQUN4RCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVk7UUFDM0IsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQ3pDLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQ3pDLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQ3pDLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBQ3RDO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyw4QkFBOEIsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQWE7UUFDN0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFFLENBQUM7UUFDckcsY0FBYyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsQ0FBQzthQUFNLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsQ0FBQzthQUFNLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsS0FBb0I7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxRQUF5QjtRQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztRQUM5QyxNQUFNLEtBQUssR0FBRyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDaEcsTUFBTSxNQUFNLEdBQWlCO1lBQzNCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNuQixDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7b0JBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsMkJBQTJCO29CQUMzQixJQUFJLENBQUMsV0FBVzt3QkFDaEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRzs0QkFDeEIsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDSixDQUFDLENBQUMsQ0FBQzt3QkFDTCxDQUFDLENBQUMsSUFBSTtTQUNYLENBQUM7UUFFRixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixnQkFBZ0I7WUFDaEIsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLFNBQVMsRUFBRSxXQUFXO2dCQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CO2dCQUN0QyxVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxQixNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBYSxDQUFDLENBQUMsZUFBZTtnQkFDbkcsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUgsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BILE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLG9CQUFvQjtnQkFDcEIsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNsRSxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUNwSCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdEYsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4SCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7d0dBNVNVLG9CQUFvQiw0Q0F3SFQsY0FBYzs0RkF4SHpCLG9CQUFvQiw0ekJBUHBCLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLENBQUMsOEdBU2xELFVBQVUsa0dBQ1YsVUFBVSxrR0FDVixVQUFVLDRGQUNiLFVBQVUsNkJDcEN2QywyK0VBb0ZBOzs0RkRyRGEsb0JBQW9CO2tCQVhoQyxTQUFTOytCQUNFLG1CQUFtQixhQUdsQixDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsc0JBQXNCLEVBQUUsQ0FBQyxRQUMxRTt3QkFDSix3QkFBd0IsRUFBRSxrQkFBa0I7d0JBQzVDLE1BQU0sRUFBRSxJQUFJO3FCQUNiLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzswQkEwSDVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYzs7MEJBQ2pDLFFBQVE7OzBCQUFJLElBQUk7eUNBdkh5QixZQUFZO3NCQUF2RCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ0UsWUFBWTtzQkFBdkQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUNFLFlBQVk7c0JBQXZELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDRCxTQUFTO3NCQUFqRCxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBNEJaLG1CQUFtQjtzQkFBN0MsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBUXJCLFFBQVE7c0JBRFgsS0FBSztnQkFhRixRQUFRO3NCQURYLEtBQUs7Z0JBNkJGLEtBQUs7c0JBRFIsS0FBSztnQkFpQkcsSUFBSTtzQkFBWixLQUFLO2dCQUNtQixPQUFPO3NCQUEvQixLQUFLO3VCQUFDLGdCQUFnQjtnQkFDZCxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIFNlbGYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1CdWlsZGVyLCBOZ0NvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc05pbCwgaXNOaWxPckJsYW5rLCBpc05vdE5pbCB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1xuICBjb21wdXRlRGVjaW1hbERlZ3JlZXMsXG4gIGNvbXB1dGVEZWNpbWFsUGFydCxcbiAgSUxhdExvbmdEYXRhLFxuICBMYXRMb25nUGF0dGVybixcbiAgTGF0TG9uZ1NpZ24sXG4gIExhdExvbmdTaWduVmFsdWUsXG4gIExhdExvbmdUeXBlLFxuICBzcGxpdERlZ3JlZXNUb0REQXJyYXksXG4gIHNwbGl0RGVncmVlc1RvRERNTUFycmF5LFxuICBzcGxpdERlZ3JlZXNUb0RETU1TU0FycmF5LFxufSBmcm9tICcuL2xhdGxvbmcudXRpbHMnO1xuaW1wb3J0IHsgTWFza2l0b09wdGlvbnMgfSBmcm9tICdAbWFza2l0by9jb3JlJztcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxELCBNYXRGb3JtRmllbGQsIE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWxhdGxvbmctaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwubGF0bG9uZy1pbnB1dC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21hdGVyaWFsLmxhdGxvbmctaW5wdXQuc2NzcycsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IE1hdExhdExvbmdGaWVsZElucHV0IH1dLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5sYWJlbC1mbG9hdGluZ10nOiAnc2hvdWxkTGFiZWxGbG9hdCcsXG4gICAgJ1tpZF0nOiAnaWQnLFxuICB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0TGF0TG9uZ0ZpZWxkSW5wdXQgaW1wbGVtZW50cyBNYXRGb3JtRmllbGRDb250cm9sPG51bWJlcj4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xuICBAVmlld0NoaWxkKCdkZWdyZWVzJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRlZ3JlZXNJbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbWludXRlcycsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBtaW51dGVzSW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NlY29uZHMnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc2Vjb25kc0lucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzaWduJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHNpZ25JbnB1dDogRWxlbWVudFJlZjtcblxuICBwYXJ0cyA9IGluamVjdChGb3JtQnVpbGRlcikuZ3JvdXAoe1xuICAgIGRlZ3JlZXM6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICBtaW51dGVzOiBbJyddLFxuICAgIHNlY29uZHM6IFsnJ10sXG4gICAgc2lnbjogWzxMYXRMb25nU2lnblZhbHVlPm51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gIH0pO1xuICBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBmb2N1c2VkID0gZmFsc2U7XG4gIHRvdWNoZWQgPSBmYWxzZTtcbiAgY29udHJvbFR5cGUgPSAnbWF0LWxhdGxvbmctaW5wdXQnO1xuICBpZCA9IGBtYXQtbGF0bG9uZy1pbnB1dC0ke01hdExhdExvbmdGaWVsZElucHV0Lm5leHRJZCsrfWA7XG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGdldCBlbXB0eSgpIHtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZTogeyBkZWdyZWVzLCBtaW51dGVzLCBzZWNvbmRzIH0sXG4gICAgfSA9IHRoaXMucGFydHM7XG5cbiAgICByZXR1cm4gIWRlZ3JlZXMgJiYgIW1pbnV0ZXMgJiYgIXNlY29uZHM7XG4gIH1cblxuICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xuICB9XG5cbiAgQElucHV0KCdhcmlhLWRlc2NyaWJlZGJ5JykgdXNlckFyaWFEZXNjcmliZWRCeTogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nOyAvLyBOb3QgdXNlZFxuXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcmVxdWlyZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucGFydHMuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnRzLmVuYWJsZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGhpcy5wYXJ0cy52YWxpZCkge1xuICAgICAgY29uc3QgZGVncmVlcyA9IHBhcnNlRmxvYXQodGhpcy5wYXJ0cy52YWx1ZS5kZWdyZWVzKTtcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUZsb2F0KHRoaXMucGFydHMudmFsdWUubWludXRlcyk7XG4gICAgICBjb25zdCBzZWNvbmRzID0gcGFyc2VGbG9hdCh0aGlzLnBhcnRzLnZhbHVlLnNlY29uZHMpO1xuICAgICAgY29uc3Qgc2lnbiA9IHRoaXMucGFydHMudmFsdWUuc2lnbjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnRzLnZhbGlkXG4gICAgICAgID8gaXNOaWwoZGVncmVlcykgfHwgdGhpcy5wYXR0ZXJuID09PSAnREQnXG4gICAgICAgICAgPyBkZWdyZWVzXG4gICAgICAgICAgOiBjb21wdXRlRGVjaW1hbERlZ3JlZXMoZGVncmVlcywgbWludXRlcywgc2Vjb25kcywgc2lnbiwgdGhpcy5tYXhEZWNpbWFscylcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29tcHV0ZUxhdExvbmdGb3JtR3JvdXBWYWx1ZSh2YWx1ZSk7XG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gU2V0dGluZyB2YWx1ZWAsIHZhbHVlLCByZXN1bHQpO1xuICAgIHRoaXMucGFydHMuc2V0VmFsdWUoe1xuICAgICAgZGVncmVlczogcmVzdWx0LmRlZ3JlZXM/LnRvU3RyaW5nKCkgfHwgbnVsbCxcbiAgICAgIG1pbnV0ZXM6IHJlc3VsdC5taW51dGVzPy50b1N0cmluZygpIHx8IG51bGwsXG4gICAgICBzZWNvbmRzOiByZXN1bHQuc2Vjb25kcz8udG9TdHJpbmcoKSB8fCBudWxsLFxuICAgICAgc2lnbjogcmVzdWx0LnNpZ24sXG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgZ2V0IGVycm9yU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuaW52YWxpZCAmJiB0aGlzLnRvdWNoZWQ7XG4gIH1cblxuICBASW5wdXQoKSB0eXBlOiBMYXRMb25nVHlwZTtcbiAgQElucHV0KCdsYXRMb25nUGF0dGVybicpIHBhdHRlcm46IExhdExvbmdQYXR0ZXJuO1xuICBASW5wdXQoKSBkZWdyZWVzU3ltYm9sVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBtaW51dGVzU3ltYm9sVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBzZWNvbmRzU3ltYm9sVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U2lnbjogTGF0TG9uZ1NpZ247XG4gIEBJbnB1dCgpIG1heERlY2ltYWxzOiBudW1iZXI7XG5cbiAgQElucHV0KCkgc2hvd01pbnV0ZXM6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dTZWNvbmRzOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93U2lnbjogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVncmVlc01hc2s6IE1hc2tpdG9PcHRpb25zO1xuICBASW5wdXQoKSBtaW51dGVzTWFzazogTWFza2l0b09wdGlvbnM7XG4gIEBJbnB1dCgpIHNlY29uZHNNYXNrOiBNYXNraXRvT3B0aW9ucztcbiAgQElucHV0KCkgZGVncmVlc1BsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1pbnV0ZXNQbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzZWNvbmRzUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgbGFzdElucHV0TWF4RGVjaW1hbHM6IG51bWJlcjtcblxuICBwcml2YXRlIGxvZ1ByZWZpeCA9ICdbbWF0LWxhdGxvbmctaW5wdXRdJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEKSBwdWJsaWMgX2Zvcm1GaWVsZDogTWF0Rm9ybUZpZWxkLFxuICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5zaG93TWludXRlcykge1xuICAgICAgdGhpcy5wYXJ0cy5jb250cm9scy5taW51dGVzLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dTZWNvbmRzKSB7XG4gICAgICB0aGlzLnBhcnRzLmNvbnRyb2xzLnNlY29uZHMuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25Gb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmZvY3VzZWQpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgb25Gb2N1c091dChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlSW5wdXQoY29udHJvbE5hbWU6IHN0cmluZywgbmV4dENvbnRyb2xOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2FuIGF1dG9mb2N1cyBuZXh0IGNvbnRyb2wgP1xuICAgIGxldCBmb2N1c05leHQgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKGNvbnRyb2xOYW1lKSB7XG4gICAgICBjYXNlICdkZWdyZWVzJzoge1xuICAgICAgICBjb25zdCBkZWdyZWVzID0gcGFyc2VGbG9hdCh0aGlzLnBhcnRzLnZhbHVlLmRlZ3JlZXMpO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbGF0aXR1ZGUnICYmIChkZWdyZWVzID09PSAwIHx8IGRlZ3JlZXMgPiA5KSkge1xuICAgICAgICAgIGZvY3VzTmV4dCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnbG9uZ2l0dWRlJyAmJiAoZGVncmVlcyA9PT0gMCB8fCBkZWdyZWVzID4gMTgpKSB7XG4gICAgICAgICAgZm9jdXNOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ21pbnV0ZXMnOiB7XG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUZsb2F0KHRoaXMucGFydHMudmFsdWUubWludXRlcyk7XG4gICAgICAgIGlmIChtaW51dGVzID09PSAwIHx8IG1pbnV0ZXMgPiA2KSB7XG4gICAgICAgICAgZm9jdXNOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NlY29uZHMnOiB7XG4gICAgICAgIC8vIGZvY3VzTmV4dCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb2N1c05leHQpIHtcbiAgICAgIHRoaXMuYXV0b0ZvY3VzTmV4dChjb250cm9sTmFtZSwgbmV4dENvbnRyb2xOYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGF1dG9Gb2N1c05leHQoY29udHJvbE5hbWU6IHN0cmluZywgbmV4dENvbnRyb2xOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhcnRzLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS5lcnJvcnMgJiYgbmV4dENvbnRyb2xOYW1lKSB7XG4gICAgICB0aGlzLmdldEVsZW1lbnRCeU5hbWUobmV4dENvbnRyb2xOYW1lKS5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGF1dG9Gb2N1c1ByZXYoY29udHJvbE5hbWU6IHN0cmluZywgcHJldkNvbnRyb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHRoaXMucGFydHMuY29udHJvbHNbY29udHJvbE5hbWVdLnZhbHVlKSkge1xuICAgICAgdGhpcy5nZXRFbGVtZW50QnlOYW1lKHByZXZDb250cm9sTmFtZSkuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbGVtZW50QnlOYW1lKG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2RlZ3JlZXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kZWdyZWVzSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGNhc2UgJ3NpZ24nOlxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmxvZ1ByZWZpeH0gTm8gSFRNTEVsZW1lbnQgd2l0aCBuYW1lICcke25hbWV9J2ApO1xuICAgIH1cbiAgfVxuXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LWxhdGxvbmctaW5wdXQtY29udGFpbmVyJykhO1xuICAgIGNvbnRyb2xFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGlkcy5qb2luKCcgJykpO1xuICB9XG5cbiAgb25Db250YWluZXJDbGljaygpIHtcbiAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBERUJVRyBvbkNvbnRhaW5lckNsaWNrYCk7XG4gICAgaWYgKHRoaXMuZW1wdHkpIHtcbiAgICAgIHRoaXMuZGVncmVlc0lucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKGlzTmlsT3JCbGFuayh0aGlzLnBhcnRzLnZhbHVlLm1pbnV0ZXMpKSB7XG4gICAgICB0aGlzLm1pbnV0ZXNJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmIChpc05pbE9yQmxhbmsodGhpcy5wYXJ0cy52YWx1ZS5zZWNvbmRzKSkge1xuICAgICAgdGhpcy5zZWNvbmRzSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoaXNOaWwodGhpcy5wYXJ0cy52YWx1ZS5zaWduKSkge1xuICAgICAgdGhpcy5zaWduSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlTGF0TG9uZ0Zvcm1Hcm91cFZhbHVlKHJhd1ZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBJTGF0TG9uZ0RhdGEge1xuICAgIGNvbnN0IGlzTG9uZ2l0dWRlID0gdGhpcy50eXBlID09PSAnbG9uZ2l0dWRlJztcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUZsb2F0KHJhd1ZhbHVlLnJlcGxhY2UoLywvZywgJy4nKSkgOiByYXdWYWx1ZTtcbiAgICBjb25zdCByZXN1bHQ6IElMYXRMb25nRGF0YSA9IHtcbiAgICAgIGRlZ3JlZXM6IG51bGwsXG4gICAgICBtaW51dGVzOiBudWxsLFxuICAgICAgc2Vjb25kczogbnVsbCxcbiAgICAgIHNpZ246IGlzTm90TmlsKHZhbHVlKVxuICAgICAgICA/IHZhbHVlIDwgMFxuICAgICAgICAgID8gLTFcbiAgICAgICAgICA6IDFcbiAgICAgICAgOiAvLyBVc2UgZGVmYXVsdCBzaWduLCBpZiBhbnlcbiAgICAgICAgICB0aGlzLmRlZmF1bHRTaWduXG4gICAgICAgICAgPyB0aGlzLmRlZmF1bHRTaWduID09PSAnLSdcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogMVxuICAgICAgICAgIDogbnVsbCxcbiAgICB9O1xuXG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICByZXN1bHQuZGVncmVlcyA9IDA7XG4gICAgfSBlbHNlIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgIC8vIFBhcnNlIG9wdGlvbnNcbiAgICAgIGNvbnN0IHBhcnNlT3B0aW9ucyA9IHtcbiAgICAgICAgbG9uZ2l0dWRlOiBpc0xvbmdpdHVkZSxcbiAgICAgICAgcGF0dGVybjogdGhpcy5wYXR0ZXJuLFxuICAgICAgICBtYXhEZWNpbWFsczogdGhpcy5sYXN0SW5wdXRNYXhEZWNpbWFscyxcbiAgICAgICAgZml4TGF0TG9uZzogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERCcpIHtcbiAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZSA9IHNwbGl0RGVncmVlc1RvRERBcnJheSh2YWx1ZSwgcGFyc2VPcHRpb25zKS5zbGljZSgxKSBhcyBudW1iZXJbXTsgLy8gcmVtb3ZlIHNpZ247XG4gICAgICAgIHJlc3VsdC5zZWNvbmRzID0gMDtcbiAgICAgICAgcmVzdWx0Lm1pbnV0ZXMgPSAwO1xuICAgICAgICByZXN1bHQuZGVncmVlcyA9IChzcGxpdFZhbHVlWzBdICsgY29tcHV0ZURlY2ltYWxQYXJ0KHNwbGl0VmFsdWVbMV0gPz8gMCwgdGhpcy5sYXN0SW5wdXRNYXhEZWNpbWFscykpICogKHJlc3VsdC5zaWduIHx8IDEpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERE1NJykge1xuICAgICAgICBjb25zdCBzcGxpdFZhbHVlID0gc3BsaXREZWdyZWVzVG9ERE1NQXJyYXkodmFsdWUsIHBhcnNlT3B0aW9ucyk7XG4gICAgICAgIHJlc3VsdC5zZWNvbmRzID0gMDtcbiAgICAgICAgcmVzdWx0Lm1pbnV0ZXMgPSBNYXRoLmFicygoc3BsaXRWYWx1ZVsxXSA/PyAwKSArIGNvbXB1dGVEZWNpbWFsUGFydChzcGxpdFZhbHVlWzJdID8/IDAsIHRoaXMubGFzdElucHV0TWF4RGVjaW1hbHMpKTtcbiAgICAgICAgcmVzdWx0LmRlZ3JlZXMgPSBNYXRoLmFicyghcmVzdWx0Lm1pbnV0ZXMgJiYgaXNOaWxPckJsYW5rKHNwbGl0VmFsdWVbMF0pID8gMCA6IChzcGxpdFZhbHVlWzBdID8/IDApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgLy8gRERNTVNTXG4gICAgICAgIGNvbnN0IHNwbGl0VmFsdWUgPSBzcGxpdERlZ3JlZXNUb0RETU1TU0FycmF5KHZhbHVlLCBwYXJzZU9wdGlvbnMpO1xuICAgICAgICByZXN1bHQuc2Vjb25kcyA9IE1hdGguYWJzKChzcGxpdFZhbHVlWzJdID8/IDApICsgY29tcHV0ZURlY2ltYWxQYXJ0KHNwbGl0VmFsdWVbM10gPz8gMCwgdGhpcy5sYXN0SW5wdXRNYXhEZWNpbWFscykpO1xuICAgICAgICByZXN1bHQubWludXRlcyA9ICFyZXN1bHQuc2Vjb25kcyAmJiAhc3BsaXRWYWx1ZVsxXSA/IDAgOiBNYXRoLmFicyhzcGxpdFZhbHVlWzFdID8/IDApO1xuICAgICAgICByZXN1bHQuZGVncmVlcyA9ICFyZXN1bHQuc2Vjb25kcyAmJiAhcmVzdWx0Lm1pbnV0ZXMgJiYgaXNOaWxPckJsYW5rKHNwbGl0VmFsdWVbMF0pID8gMCA6IE1hdGguYWJzKHNwbGl0VmFsdWVbMF0gPz8gMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiPGRpdlxuICByb2xlPVwiZ3JvdXBcIlxuICBjbGFzcz1cIm1hdC1sYXRsb25nLWlucHV0LWNvbnRhaW5lclwiXG4gIFtmb3JtR3JvdXBdPVwicGFydHNcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiX2Zvcm1GaWVsZD8uZ2V0TGFiZWxJZCgpXCJcbiAgKGZvY3VzaW4pPVwib25Gb2N1c0luKCRldmVudClcIlxuICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCJcbj5cbiAgPGlucHV0XG4gICAgI2RlZ3JlZXNcbiAgICBhcmlhLWxhYmVsPVwiRGVncmVlc1wiXG4gICAgW2NsYXNzLmRlZ3JlZXNdPVwicGF0dGVybiAhPT0gJ0REJ1wiXG4gICAgaW5wdXRtb2RlPVwiZGVjaW1hbFwiXG4gICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiZGVncmVlc1BsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWdyZWVzXCJcbiAgICBbbWFza2l0b109XCJkZWdyZWVzTWFza1wiXG4gICAgKGlucHV0KT1cImhhbmRsZUlucHV0KCdkZWdyZWVzJywgJ21pbnV0ZXMnKVwiXG4gIC8+XG4gIDxzcGFuIGNsYXNzPVwic3ltYm9sLXVuaXRcIj5cbiAgICB7eyBkZWdyZWVzU3ltYm9sVW5pdCB9fVxuICA8L3NwYW4+XG5cbiAgQGlmIChzaG93TWludXRlcykge1xuICAgIDxpbnB1dFxuICAgICAgI21pbnV0ZXNcbiAgICAgIGFyaWEtbGFiZWw9XCJNaW51dGVzXCJcbiAgICAgIFtjbGFzcy5taW51dGVzXT1cInNob3dTZWNvbmRzXCJcbiAgICAgIFtjbGFzcy5taW51dGVzLXNlY29uZHNdPVwiIXNob3dTZWNvbmRzXCJcbiAgICAgIGlucHV0bW9kZT1cImRlY2ltYWxcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJtaW51dGVzUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWludXRlc1wiXG4gICAgICBbbWFza2l0b109XCJtaW51dGVzTWFza1wiXG4gICAgICAoaW5wdXQpPVwiaGFuZGxlSW5wdXQoJ21pbnV0ZXMnLCAnc2Vjb25kcycpXCJcbiAgICAgIChrZXl1cC5iYWNrc3BhY2UpPVwiYXV0b0ZvY3VzUHJldignbWludXRlcycsICdkZWdyZWVzJylcIlxuICAgIC8+XG4gICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtdW5pdFwiPlxuICAgICAge3sgbWludXRlc1N5bWJvbFVuaXQgfX1cbiAgICA8L3NwYW4+XG4gIH1cblxuICBAaWYgKHNob3dTZWNvbmRzKSB7XG4gICAgPGlucHV0XG4gICAgICAjc2Vjb25kc1xuICAgICAgYXJpYS1sYWJlbD1cIlNlY29uZHNcIlxuICAgICAgY2xhc3M9XCJzZWNvbmRzXCJcbiAgICAgIGlucHV0bW9kZT1cImRlY2ltYWxcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWNvbmRzUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2Vjb25kc1wiXG4gICAgICBbbWFza2l0b109XCJzZWNvbmRzTWFza1wiXG4gICAgICAoaW5wdXQpPVwiaGFuZGxlSW5wdXQoJ3NlY29uZHMnLCAnc2lnbicpXCJcbiAgICAgIChrZXl1cC5iYWNrc3BhY2UpPVwiYXV0b0ZvY3VzUHJldignc2Vjb25kcycsICdtaW51dGVzJylcIlxuICAgIC8+XG4gICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtdW5pdFwiPlxuICAgICAge3sgc2Vjb25kc1N5bWJvbFVuaXQgfX1cbiAgICA8L3NwYW4+XG4gIH1cblxuICA8IS0tIHNpZ24gLS0+XG4gIEBpZiAoc2hvd1NpZ24pIHtcbiAgICA8c3BhbiBjbGFzcz1cInNpZ24tc3BhY2VyXCI+PC9zcGFuPlxuICAgIDxtYXQtc2VsZWN0XG4gICAgICAjc2lnblxuICAgICAgYXJpYS1sYWJlbD1cIlNpZ25cIlxuICAgICAgY2xhc3M9XCJzaWduXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInNpZ25cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAodHlwZSA9PT0gJ2xhdGl0dWRlJyA/ICdDT01NT04uTEFUX0xPTkcuTEFUX1NJR05fUExBQ0VIT0xERVInIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fUExBQ0VIT0xERVInKVxuICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICBcIlxuICAgICAgKGZvY3VzaW4pPVwic2lnbi5vcGVuKClcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJoYW5kbGVJbnB1dCgnc2lnbicpXCJcbiAgICA+XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMVwiIChjbGljayk9XCJzaWduLmNsb3NlKClcIj5cbiAgICAgICAge3sgKHR5cGUgPT09ICdsYXRpdHVkZScgPyAnQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX04nIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fRScpIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiLTFcIiAoY2xpY2spPVwic2lnbi5jbG9zZSgpXCI+XG4gICAgICAgIHt7ICh0eXBlID09PSAnbGF0aXR1ZGUnID8gJ0NPTU1PTi5MQVRfTE9ORy5MQVRfU0lHTl9TJyA6ICdDT01NT04uTEFUX0xPTkcuTE9OR19TSUdOX1cnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgfVxuPC9kaXY+XG4iXX0=
|