@metadev/lux 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -0
- package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -0
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +156 -0
- package/esm2022/lib/datetime/datetime.component.mjs +312 -0
- package/esm2022/lib/filter/filter.component.mjs +158 -0
- package/esm2022/lib/geolocation/geolocation.component.mjs +423 -0
- package/esm2022/lib/geolocation/geolocation.service.mjs +123 -0
- package/{esm2020 → esm2022}/lib/geolocation/openlayer-loader.service.mjs +4 -4
- package/esm2022/lib/helperFns.mjs +118 -0
- package/esm2022/lib/input/input.component.mjs +469 -0
- package/{esm2020 → esm2022}/lib/input/regexp.service.mjs +4 -4
- package/esm2022/lib/lux.module.mjs +119 -0
- package/esm2022/lib/map/map.component.mjs +275 -0
- package/esm2022/lib/modal/modal-backdrop.mjs +25 -0
- package/esm2022/lib/modal/modal-config.mjs +12 -0
- package/esm2022/lib/modal/modal-ref.mjs +101 -0
- package/esm2022/lib/modal/modal-stack.mjs +182 -0
- package/esm2022/lib/modal/modal-window.mjs +125 -0
- package/esm2022/lib/modal/modal.service.mjs +28 -0
- package/esm2022/lib/modal/util.mjs +82 -0
- package/esm2022/lib/pagination/pagination.component.mjs +144 -0
- package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -0
- package/esm2022/lib/select/select.component.mjs +148 -0
- package/esm2022/lib/tooltip/tooltip.component.mjs +24 -0
- package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -0
- package/esm2022/lib/tooltip/tooltip.service.mjs +137 -0
- package/esm2022/lib/tooltip/tooltop-content.mjs +9 -0
- package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -0
- package/{fesm2020 → fesm2022}/metadev-lux.mjs +722 -610
- package/fesm2022/metadev-lux.mjs.map +1 -0
- package/lib/autocomplete/autocomplete.component.d.ts +1 -1
- package/lib/autocomplete-list/autocomplete-list.component.d.ts +1 -1
- package/lib/breadcrumb/breadcrumb.component.d.ts +1 -1
- package/lib/checkbox/checkbox.component.d.ts +1 -1
- package/lib/datasource.d.ts +2 -2
- package/lib/datetime/datetime.component.d.ts +1 -1
- package/lib/filter/filter.component.d.ts +1 -1
- package/lib/geolocation/geolocation.component.d.ts +1 -1
- package/lib/input/input.component.d.ts +1 -1
- package/lib/lux.module.d.ts +5 -6
- package/lib/map/map.component.d.ts +2 -2
- package/lib/modal/modal-backdrop.d.ts +1 -1
- package/lib/modal/modal-stack.d.ts +1 -1
- package/lib/modal/modal-window.d.ts +1 -1
- package/lib/modal/util.d.ts +1 -1
- package/lib/pagination/pagination.component.d.ts +1 -1
- package/lib/radiogroup/radiogroup.component.d.ts +1 -1
- package/lib/select/select.component.d.ts +1 -1
- package/lib/tooltip/placement.d.ts +1 -1
- package/lib/tooltip/tooltip.component.d.ts +1 -1
- package/lib/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/voice-recognition/voice-recognition.directive.d.ts +1 -1
- package/package.json +8 -14
- package/esm2020/lib/autocomplete/autocomplete.component.mjs +0 -480
- package/esm2020/lib/autocomplete-list/autocomplete-list.component.mjs +0 -254
- package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -75
- package/esm2020/lib/checkbox/checkbox.component.mjs +0 -154
- package/esm2020/lib/datetime/datetime.component.mjs +0 -306
- package/esm2020/lib/filter/filter.component.mjs +0 -152
- package/esm2020/lib/geolocation/geolocation.component.mjs +0 -407
- package/esm2020/lib/geolocation/geolocation.service.mjs +0 -120
- package/esm2020/lib/helperFns.mjs +0 -117
- package/esm2020/lib/input/input.component.mjs +0 -452
- package/esm2020/lib/lux.module.mjs +0 -128
- package/esm2020/lib/map/map.component.mjs +0 -265
- package/esm2020/lib/modal/modal-backdrop.mjs +0 -26
- package/esm2020/lib/modal/modal-config.mjs +0 -14
- package/esm2020/lib/modal/modal-ref.mjs +0 -91
- package/esm2020/lib/modal/modal-stack.mjs +0 -179
- package/esm2020/lib/modal/modal-window.mjs +0 -119
- package/esm2020/lib/modal/modal.service.mjs +0 -26
- package/esm2020/lib/modal/util.mjs +0 -83
- package/esm2020/lib/pagination/pagination.component.mjs +0 -137
- package/esm2020/lib/radiogroup/radiogroup.component.mjs +0 -130
- package/esm2020/lib/select/select.component.mjs +0 -149
- package/esm2020/lib/tooltip/tooltip.component.mjs +0 -23
- package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -60
- package/esm2020/lib/tooltip/tooltip.service.mjs +0 -134
- package/esm2020/lib/tooltip/tooltop-content.mjs +0 -7
- package/esm2020/lib/voice-recognition/voice-recognition.directive.mjs +0 -73
- package/fesm2015/metadev-lux.mjs +0 -4352
- package/fesm2015/metadev-lux.mjs.map +0 -1
- package/fesm2020/metadev-lux.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/datasource.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/lang.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/map/geopoint.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modal/modal-dismiss-reasons.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/pagination/pagination.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/tooltip/placement.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/tooltip/tooltip-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/window/window.service.mjs +0 -0
- /package/{esm2020 → esm2022}/metadev-lux.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ElementRef, ViewChild, forwardRef } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
|
|
3
|
+
import { hasValue, isInitialAndEmpty, isValidEmail, isValidNumber, isValidRelativeUrl, isValidColor, normalizeDate } from '../helperFns';
|
|
4
|
+
import { languageDetector } from '../lang';
|
|
5
|
+
import { RegexpService } from './regexp.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./regexp.service";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
9
|
+
export class InputComponent {
|
|
10
|
+
regexpService;
|
|
11
|
+
static idCounter = 0;
|
|
12
|
+
input;
|
|
13
|
+
textarea;
|
|
14
|
+
colorpicker;
|
|
15
|
+
touched = false;
|
|
16
|
+
dirty = false;
|
|
17
|
+
lastErrors = null;
|
|
18
|
+
_disabled;
|
|
19
|
+
_value = '';
|
|
20
|
+
_type;
|
|
21
|
+
_placeholder;
|
|
22
|
+
_pattern = undefined;
|
|
23
|
+
_regexp = undefined;
|
|
24
|
+
_currency;
|
|
25
|
+
_required;
|
|
26
|
+
userErrors = {
|
|
27
|
+
en: {
|
|
28
|
+
required: 'Required field.',
|
|
29
|
+
min: 'Minimum value is $min.',
|
|
30
|
+
max: 'Maximum value is $max.',
|
|
31
|
+
email: 'Format should match example@example.com.',
|
|
32
|
+
url: 'Format should match https://example.com.',
|
|
33
|
+
color: 'Format should match #XXXXXX.'
|
|
34
|
+
},
|
|
35
|
+
es: {
|
|
36
|
+
required: 'El campo es obligatorio.',
|
|
37
|
+
min: 'El valor mínimo es $min.',
|
|
38
|
+
max: 'El valor máximo es $max.',
|
|
39
|
+
email: 'El campo debe tener un formato como ejemplo@ejemplo.com.',
|
|
40
|
+
url: 'El campo debe tener un formato como https://ejemplo.com.',
|
|
41
|
+
color: 'El campo debe tener un formato como #XXXXXX.'
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
domain;
|
|
45
|
+
rows;
|
|
46
|
+
cols;
|
|
47
|
+
step;
|
|
48
|
+
min;
|
|
49
|
+
max;
|
|
50
|
+
get className() {
|
|
51
|
+
return this.checkClassName();
|
|
52
|
+
}
|
|
53
|
+
get color() {
|
|
54
|
+
return this.checkColor();
|
|
55
|
+
}
|
|
56
|
+
lang = languageDetector();
|
|
57
|
+
inlineErrors = false;
|
|
58
|
+
inputId;
|
|
59
|
+
ariaLabel;
|
|
60
|
+
readonly = null;
|
|
61
|
+
set disabled(v) {
|
|
62
|
+
v = typeof v === 'string' ? true : v;
|
|
63
|
+
this._disabled = v;
|
|
64
|
+
}
|
|
65
|
+
get disabled() {
|
|
66
|
+
return this._disabled;
|
|
67
|
+
}
|
|
68
|
+
set pattern(p) {
|
|
69
|
+
this._pattern = p;
|
|
70
|
+
if (p === undefined) {
|
|
71
|
+
this._regexp = undefined;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
try {
|
|
75
|
+
this._regexp = new RegExp(p);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
this._pattern = undefined;
|
|
79
|
+
this._regexp = undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
get pattern() {
|
|
84
|
+
return this._pattern;
|
|
85
|
+
}
|
|
86
|
+
set currency(v) {
|
|
87
|
+
this._currency = v.toUpperCase();
|
|
88
|
+
}
|
|
89
|
+
get currency() {
|
|
90
|
+
return this._currency;
|
|
91
|
+
}
|
|
92
|
+
set placeholder(v) {
|
|
93
|
+
this._placeholder = v;
|
|
94
|
+
}
|
|
95
|
+
get placeholder() {
|
|
96
|
+
return this._placeholder ? this._placeholder : '';
|
|
97
|
+
}
|
|
98
|
+
set required(v) {
|
|
99
|
+
this._required = v;
|
|
100
|
+
}
|
|
101
|
+
get required() {
|
|
102
|
+
return this._required;
|
|
103
|
+
}
|
|
104
|
+
set type(v) {
|
|
105
|
+
this._type = v.toLowerCase();
|
|
106
|
+
this.domain = v.toLowerCase();
|
|
107
|
+
this.checkType(v);
|
|
108
|
+
}
|
|
109
|
+
get type() {
|
|
110
|
+
return this._type ? this._type : 'text';
|
|
111
|
+
}
|
|
112
|
+
set value(v) {
|
|
113
|
+
v = v === undefined ? null : v;
|
|
114
|
+
if (v === this._value) {
|
|
115
|
+
return; // prevent events when there is no changes
|
|
116
|
+
}
|
|
117
|
+
const initialAndEmpty = isInitialAndEmpty(this._value, v);
|
|
118
|
+
if (this.type === 'date') {
|
|
119
|
+
v = normalizeDate(v);
|
|
120
|
+
}
|
|
121
|
+
this._value = v;
|
|
122
|
+
this.onChange(v);
|
|
123
|
+
if (!initialAndEmpty) {
|
|
124
|
+
this.valueChange.emit(v);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
get value() {
|
|
128
|
+
if (this.isPercentage() || this.isPermillage() || this.isNumber()) {
|
|
129
|
+
const numVal = parseFloat(this._value);
|
|
130
|
+
if (!Number.isNaN(numVal)) {
|
|
131
|
+
return numVal;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return this._value;
|
|
135
|
+
}
|
|
136
|
+
valueChange = new EventEmitter();
|
|
137
|
+
keyPress = new EventEmitter();
|
|
138
|
+
onChange = (value) => { };
|
|
139
|
+
onTouched = () => { };
|
|
140
|
+
constructor(regexpService) {
|
|
141
|
+
this.regexpService = regexpService;
|
|
142
|
+
}
|
|
143
|
+
// ControlValueAccessor Interface implementation
|
|
144
|
+
writeValue(value) {
|
|
145
|
+
this.value = value;
|
|
146
|
+
this.setValueInControl(value);
|
|
147
|
+
}
|
|
148
|
+
registerOnChange(onChange) {
|
|
149
|
+
this.onChange = onChange;
|
|
150
|
+
}
|
|
151
|
+
registerOnTouched(onTouched) {
|
|
152
|
+
this.onTouched = onTouched;
|
|
153
|
+
}
|
|
154
|
+
markAsTouched() {
|
|
155
|
+
if (!this.touched) {
|
|
156
|
+
this.onTouched();
|
|
157
|
+
this.touched = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
setDisabledState(disabled) {
|
|
161
|
+
this.disabled = disabled;
|
|
162
|
+
}
|
|
163
|
+
// End of ControlValueAccessor Interface implementation
|
|
164
|
+
setValueInControl(v) {
|
|
165
|
+
if (this.domain === 'date') {
|
|
166
|
+
v = normalizeDate(v);
|
|
167
|
+
}
|
|
168
|
+
if (this.input) {
|
|
169
|
+
this.input.nativeElement.value = v;
|
|
170
|
+
}
|
|
171
|
+
if (this.textarea) {
|
|
172
|
+
this.textarea.nativeElement.value = v;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Validator interface
|
|
176
|
+
registerOnValidatorChange() { }
|
|
177
|
+
validate(control) {
|
|
178
|
+
const value = control.value;
|
|
179
|
+
let result = null;
|
|
180
|
+
if (this.required && !hasValue(value)) {
|
|
181
|
+
result = result || {};
|
|
182
|
+
result.required = { value, reason: 'Required field.' };
|
|
183
|
+
}
|
|
184
|
+
if (this._regexp && hasValue(value) && !this._regexp.test(value)) {
|
|
185
|
+
result = result || {};
|
|
186
|
+
result.pattern = {
|
|
187
|
+
value,
|
|
188
|
+
reason: `Value must follow the pattern: ${this._pattern}`
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (this.type === 'email' && hasValue(value) && !isValidEmail(value)) {
|
|
192
|
+
result = result || {};
|
|
193
|
+
result.email = { value, reason: 'Invalid email.' };
|
|
194
|
+
}
|
|
195
|
+
if (this.type === 'url' && hasValue(value) && !isValidRelativeUrl(value)) {
|
|
196
|
+
result = result || {};
|
|
197
|
+
result.url = { value, reason: 'Invalid URL.' };
|
|
198
|
+
}
|
|
199
|
+
if (this.type === 'color' && hasValue(value) && !isValidColor(value)) {
|
|
200
|
+
result = result || {};
|
|
201
|
+
result.color = { value, reason: 'Invalid color.' };
|
|
202
|
+
}
|
|
203
|
+
if (this.type === 'number' && hasValue(value) && !isValidNumber(value)) {
|
|
204
|
+
result = result || {};
|
|
205
|
+
result.numeric = { value, reason: 'Invalid number.' };
|
|
206
|
+
}
|
|
207
|
+
if (this.type === 'date' ||
|
|
208
|
+
this.type === 'time' ||
|
|
209
|
+
this.type === 'timestamp') {
|
|
210
|
+
if (typeof this.min === 'string' &&
|
|
211
|
+
hasValue(value) &&
|
|
212
|
+
String(value).localeCompare(this.min) === -1) {
|
|
213
|
+
result = result || {};
|
|
214
|
+
result.min = {
|
|
215
|
+
value,
|
|
216
|
+
min: this.min,
|
|
217
|
+
reason: `Value is lower than minimum value: ${this.min}.`
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
if (typeof this.max === 'string' &&
|
|
221
|
+
hasValue(value) &&
|
|
222
|
+
String(value).localeCompare(this.max) !== -1) {
|
|
223
|
+
result = result || {};
|
|
224
|
+
result.max = {
|
|
225
|
+
value,
|
|
226
|
+
max: this.max,
|
|
227
|
+
reason: `Value is greater than than maximum value: ${this.max}.`
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (this.type === 'percentage' ||
|
|
232
|
+
this.type === 'permillage' ||
|
|
233
|
+
this.type === 'number' ||
|
|
234
|
+
this.type === 'currency') {
|
|
235
|
+
if (hasValue(this.min) && hasValue(value) && value < +this.min) {
|
|
236
|
+
result = result || {};
|
|
237
|
+
result.min = {
|
|
238
|
+
value,
|
|
239
|
+
min: this.min,
|
|
240
|
+
reason: `Value is lower than minimum value: ${this.min}.`
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
if (hasValue(this.max) && hasValue(value) && value > +this.max) {
|
|
244
|
+
result = result || {};
|
|
245
|
+
result.max = {
|
|
246
|
+
value,
|
|
247
|
+
max: this.max,
|
|
248
|
+
reason: `Value is greater than than maximum value: ${this.max}.`
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
this.lastErrors = result;
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
255
|
+
// End of Validator interface
|
|
256
|
+
ngOnInit() {
|
|
257
|
+
this.inputId = this.inputId
|
|
258
|
+
? this.inputId
|
|
259
|
+
: `${this.type}$${InputComponent.idCounter++}`;
|
|
260
|
+
}
|
|
261
|
+
onLostFocus() {
|
|
262
|
+
this.markAsTouched();
|
|
263
|
+
}
|
|
264
|
+
onKeyUp(newValue) {
|
|
265
|
+
this.value = newValue;
|
|
266
|
+
}
|
|
267
|
+
onChangeValue(newValue) {
|
|
268
|
+
this.value = newValue;
|
|
269
|
+
if (this.isColor()) {
|
|
270
|
+
this.colorpicker.nativeElement.value = undefined;
|
|
271
|
+
}
|
|
272
|
+
this.markAsTouched();
|
|
273
|
+
}
|
|
274
|
+
onKeyPress(event) {
|
|
275
|
+
this.keyPress.emit(event);
|
|
276
|
+
}
|
|
277
|
+
onColorPicked(newValue) {
|
|
278
|
+
this.onChangeValue(newValue);
|
|
279
|
+
this.setValueInControl(newValue);
|
|
280
|
+
}
|
|
281
|
+
isUrl() {
|
|
282
|
+
return this.type === 'url';
|
|
283
|
+
}
|
|
284
|
+
isColor() {
|
|
285
|
+
return this.type === 'color';
|
|
286
|
+
}
|
|
287
|
+
isNumber() {
|
|
288
|
+
return this.type === 'number';
|
|
289
|
+
}
|
|
290
|
+
isPercentage() {
|
|
291
|
+
return this.type === 'percentage';
|
|
292
|
+
}
|
|
293
|
+
isPermillage() {
|
|
294
|
+
return this.type === 'permillage';
|
|
295
|
+
}
|
|
296
|
+
hasPrefix() {
|
|
297
|
+
return this.currency === 'USD';
|
|
298
|
+
}
|
|
299
|
+
hasPostfix() {
|
|
300
|
+
return (this.currency === 'EUR' ||
|
|
301
|
+
this.isPercentage() ||
|
|
302
|
+
this.isPermillage() ||
|
|
303
|
+
(this.isUrl() && !!this.value) ||
|
|
304
|
+
this.isColor());
|
|
305
|
+
}
|
|
306
|
+
checkClassName() {
|
|
307
|
+
return this.disabled
|
|
308
|
+
? this.readonly
|
|
309
|
+
? 'disabled readonly'
|
|
310
|
+
: 'disabled'
|
|
311
|
+
: this.readonly
|
|
312
|
+
? 'readonly'
|
|
313
|
+
: '';
|
|
314
|
+
}
|
|
315
|
+
checkColor() {
|
|
316
|
+
return this.type === 'color' && isValidColor(this.value)
|
|
317
|
+
? this.value
|
|
318
|
+
: 'initial';
|
|
319
|
+
}
|
|
320
|
+
checkType(type) {
|
|
321
|
+
switch (type) {
|
|
322
|
+
case 'email':
|
|
323
|
+
this.setEmailPatterns();
|
|
324
|
+
break;
|
|
325
|
+
case 'url':
|
|
326
|
+
this.setUrlPatterns();
|
|
327
|
+
break;
|
|
328
|
+
case 'color':
|
|
329
|
+
this.setColorPatterns();
|
|
330
|
+
break;
|
|
331
|
+
case 'date':
|
|
332
|
+
this.setDatePatterns();
|
|
333
|
+
break;
|
|
334
|
+
case 'time':
|
|
335
|
+
this.setTimePatterns();
|
|
336
|
+
break;
|
|
337
|
+
case 'password':
|
|
338
|
+
this.setPasswordPatterns();
|
|
339
|
+
break;
|
|
340
|
+
case 'number':
|
|
341
|
+
this.setNumberPatterns();
|
|
342
|
+
break;
|
|
343
|
+
case 'currency':
|
|
344
|
+
this.setCurrencyPatterns();
|
|
345
|
+
break;
|
|
346
|
+
case 'percentage':
|
|
347
|
+
this.setPercentagePatterns();
|
|
348
|
+
break;
|
|
349
|
+
case 'permillage':
|
|
350
|
+
this.setPermillagePatterns();
|
|
351
|
+
break;
|
|
352
|
+
default:
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
setEmailPatterns() { }
|
|
357
|
+
setUrlPatterns() { }
|
|
358
|
+
setColorPatterns() {
|
|
359
|
+
this.domain = 'text';
|
|
360
|
+
}
|
|
361
|
+
setDatePatterns() {
|
|
362
|
+
this.min = this.min || '1900-01-01';
|
|
363
|
+
this.max = this.max || '2100-01-01';
|
|
364
|
+
}
|
|
365
|
+
setTimePatterns() { }
|
|
366
|
+
setPasswordPatterns() { }
|
|
367
|
+
setNumberPatterns() {
|
|
368
|
+
this.domain = 'number';
|
|
369
|
+
this.placeholder = '0';
|
|
370
|
+
}
|
|
371
|
+
setCurrencyPatterns() {
|
|
372
|
+
this.domain = 'number';
|
|
373
|
+
this.step = this.step || 0.1;
|
|
374
|
+
this.min = this.min || 0.0;
|
|
375
|
+
this.max = this.max || 10000.0;
|
|
376
|
+
this.value = 0.0;
|
|
377
|
+
}
|
|
378
|
+
setPercentagePatterns() {
|
|
379
|
+
this.domain = 'number';
|
|
380
|
+
this.step = this.step || 0.01;
|
|
381
|
+
this.min = this.min || 0.0;
|
|
382
|
+
this.max = this.max || 100.0;
|
|
383
|
+
this.placeholder = '0.00';
|
|
384
|
+
}
|
|
385
|
+
setPermillagePatterns() {
|
|
386
|
+
this.domain = 'number';
|
|
387
|
+
this.step = this.step || 0.01;
|
|
388
|
+
this.min = this.min || 0.0;
|
|
389
|
+
this.max = this.max || 1000.0;
|
|
390
|
+
this.placeholder = '0.00';
|
|
391
|
+
}
|
|
392
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: InputComponent, deps: [{ token: i1.RegexpService }], target: i0.ɵɵFactoryTarget.Component });
|
|
393
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: InputComponent, selector: "lux-input", inputs: { rows: "rows", cols: "cols", step: "step", min: "min", max: "max", lang: "lang", inlineErrors: "inlineErrors", inputId: "inputId", ariaLabel: ["aria-label", "ariaLabel"], readonly: "readonly", disabled: "disabled", pattern: "pattern", currency: "currency", placeholder: "placeholder", required: "required", type: "type", value: "value" }, outputs: { valueChange: "valueChange", keyPress: "keyPress" }, providers: [
|
|
394
|
+
{
|
|
395
|
+
provide: NG_VALUE_ACCESSOR,
|
|
396
|
+
multi: true,
|
|
397
|
+
useExisting: forwardRef(() => InputComponent)
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
provide: NG_VALIDATORS,
|
|
401
|
+
multi: true,
|
|
402
|
+
useExisting: forwardRef(() => InputComponent)
|
|
403
|
+
}
|
|
404
|
+
], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "textarea", first: true, predicate: ["textarea"], descendants: true }, { propertyName: "colorpicker", first: true, predicate: ["colorpicker"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"currency && currency === 'USD'\" class=\"prefix rounded-left symbol\" [ngClass]=\"className\">\n <span>$</span>\n</div>\n<input\n #input\n *ngIf=\"type !== 'textarea'\"\n [class]=\"hasPrefix() ? (hasPostfix() ? 'infix' : 'postfix rounded-right') : (hasPostfix() ? 'prefix rounded-left' : 'rounded')\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [type]=\"domain\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"min?.toString() || undefined\"\n [attr.max]=\"max?.toString() || undefined\"\n [attr.step]=\"step?.toString() || undefined\"\n [attr.pattern]=\"pattern || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(input.value)\"\n (change)=\"onChangeValue(input.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<textarea\n #textarea\n *ngIf=\"type === 'textarea'\"\n class=\"rounded\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.cols]=\"cols?.toString() || undefined\"\n [attr.rows]=\"rows?.toString() || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(textarea.value)\"\n (change)=\"onChangeValue(textarea.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n></textarea>\n<div *ngIf=\"currency && currency === 'EUR'\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u20AC</span>\n</div>\n<div *ngIf=\"isPercentage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>%</span>\n</div>\n<div *ngIf=\"isPermillage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u2030</span>\n</div>\n<div *ngIf=\"isUrl() && !!value\" class=\"postfix rounded-right symbol clickable\" [ngClass]=\"className\">\n <a href=\"{{ value }}\" target=\"_blank\">\n <span class=\"icon-external\"></span>\n </a>\n</div>\n<div *ngIf=\"isColor()\" class=\"postfix rounded-right bordered transparency\" [ngClass]=\"className\">\n <div class=\"rounded-right full-space\" [ngStyle]=\"{'background-color': color}\">\n <input\n #colorpicker\n class=\"minimal-space clickable invisible rounded-right full-space\"\n [id]=\"inputId + '$colorpicker'\"\n type=\"color\"\n [attr.value]=\"value\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n (change)=\"onColorPicked(colorpicker.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n />\n </div>\n</div>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[this.lang].required }}\n </div>\n <div *ngIf=\"lastErrors.email\">{{ userErrors[this.lang].email }}</div>\n <div *ngIf=\"lastErrors.url\">{{ userErrors[this.lang].url }}</div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[this.lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[this.lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch;min-height:1.5rem}input[type=color]{min-height:100%;height:0}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.clickable{cursor:pointer}.full-space{width:100%;height:100%;margin:0;border:0;padding:0}.minimal-space,.icon,.icon-external{min-width:1rem;min-height:1rem}.icon,.icon-external{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.icon-external{background:var(--lux-input-icon-external, url(/assets/img/external.svg) no-repeat center);background-size:1rem;background-position-y:.1rem;height:100%}.invisible{opacity:0}.transparency{background-image:conic-gradient(white 0deg 90deg,lightgray 90deg 180deg,white 180deg 270deg,lightgray 270deg 360deg)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
405
|
+
}
|
|
406
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: InputComponent, decorators: [{
|
|
407
|
+
type: Component,
|
|
408
|
+
args: [{ selector: 'lux-input', providers: [
|
|
409
|
+
{
|
|
410
|
+
provide: NG_VALUE_ACCESSOR,
|
|
411
|
+
multi: true,
|
|
412
|
+
useExisting: forwardRef(() => InputComponent)
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
provide: NG_VALIDATORS,
|
|
416
|
+
multi: true,
|
|
417
|
+
useExisting: forwardRef(() => InputComponent)
|
|
418
|
+
}
|
|
419
|
+
], template: "<div *ngIf=\"currency && currency === 'USD'\" class=\"prefix rounded-left symbol\" [ngClass]=\"className\">\n <span>$</span>\n</div>\n<input\n #input\n *ngIf=\"type !== 'textarea'\"\n [class]=\"hasPrefix() ? (hasPostfix() ? 'infix' : 'postfix rounded-right') : (hasPostfix() ? 'prefix rounded-left' : 'rounded')\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [type]=\"domain\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"min?.toString() || undefined\"\n [attr.max]=\"max?.toString() || undefined\"\n [attr.step]=\"step?.toString() || undefined\"\n [attr.pattern]=\"pattern || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(input.value)\"\n (change)=\"onChangeValue(input.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<textarea\n #textarea\n *ngIf=\"type === 'textarea'\"\n class=\"rounded\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.cols]=\"cols?.toString() || undefined\"\n [attr.rows]=\"rows?.toString() || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(textarea.value)\"\n (change)=\"onChangeValue(textarea.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n></textarea>\n<div *ngIf=\"currency && currency === 'EUR'\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u20AC</span>\n</div>\n<div *ngIf=\"isPercentage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>%</span>\n</div>\n<div *ngIf=\"isPermillage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u2030</span>\n</div>\n<div *ngIf=\"isUrl() && !!value\" class=\"postfix rounded-right symbol clickable\" [ngClass]=\"className\">\n <a href=\"{{ value }}\" target=\"_blank\">\n <span class=\"icon-external\"></span>\n </a>\n</div>\n<div *ngIf=\"isColor()\" class=\"postfix rounded-right bordered transparency\" [ngClass]=\"className\">\n <div class=\"rounded-right full-space\" [ngStyle]=\"{'background-color': color}\">\n <input\n #colorpicker\n class=\"minimal-space clickable invisible rounded-right full-space\"\n [id]=\"inputId + '$colorpicker'\"\n type=\"color\"\n [attr.value]=\"value\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n (change)=\"onColorPicked(colorpicker.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n />\n </div>\n</div>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[this.lang].required }}\n </div>\n <div *ngIf=\"lastErrors.email\">{{ userErrors[this.lang].email }}</div>\n <div *ngIf=\"lastErrors.url\">{{ userErrors[this.lang].url }}</div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[this.lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[this.lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch;min-height:1.5rem}input[type=color]{min-height:100%;height:0}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.clickable{cursor:pointer}.full-space{width:100%;height:100%;margin:0;border:0;padding:0}.minimal-space,.icon,.icon-external{min-width:1rem;min-height:1rem}.icon,.icon-external{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.icon-external{background:var(--lux-input-icon-external, url(/assets/img/external.svg) no-repeat center);background-size:1rem;background-position-y:.1rem;height:100%}.invisible{opacity:0}.transparency{background-image:conic-gradient(white 0deg 90deg,lightgray 90deg 180deg,white 180deg 270deg,lightgray 270deg 360deg)}\n"] }]
|
|
420
|
+
}], ctorParameters: function () { return [{ type: i1.RegexpService }]; }, propDecorators: { input: [{
|
|
421
|
+
type: ViewChild,
|
|
422
|
+
args: ['input', { static: false }]
|
|
423
|
+
}], textarea: [{
|
|
424
|
+
type: ViewChild,
|
|
425
|
+
args: ['textarea', { static: false }]
|
|
426
|
+
}], colorpicker: [{
|
|
427
|
+
type: ViewChild,
|
|
428
|
+
args: ['colorpicker', { static: false }]
|
|
429
|
+
}], rows: [{
|
|
430
|
+
type: Input
|
|
431
|
+
}], cols: [{
|
|
432
|
+
type: Input
|
|
433
|
+
}], step: [{
|
|
434
|
+
type: Input
|
|
435
|
+
}], min: [{
|
|
436
|
+
type: Input
|
|
437
|
+
}], max: [{
|
|
438
|
+
type: Input
|
|
439
|
+
}], lang: [{
|
|
440
|
+
type: Input
|
|
441
|
+
}], inlineErrors: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], inputId: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], ariaLabel: [{
|
|
446
|
+
type: Input,
|
|
447
|
+
args: ['aria-label']
|
|
448
|
+
}], readonly: [{
|
|
449
|
+
type: Input
|
|
450
|
+
}], disabled: [{
|
|
451
|
+
type: Input
|
|
452
|
+
}], pattern: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], currency: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], placeholder: [{
|
|
457
|
+
type: Input
|
|
458
|
+
}], required: [{
|
|
459
|
+
type: Input
|
|
460
|
+
}], type: [{
|
|
461
|
+
type: Input
|
|
462
|
+
}], value: [{
|
|
463
|
+
type: Input
|
|
464
|
+
}], valueChange: [{
|
|
465
|
+
type: Output
|
|
466
|
+
}], keyPress: [{
|
|
467
|
+
type: Output
|
|
468
|
+
}] } });
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaW5wdXQvaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaW5wdXQvaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLGFBQWEsRUFDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixhQUFhLEVBQ2QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQWtCakQsTUFBTSxPQUFPLGNBQWM7SUE4Sk47SUE3Sm5CLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWtCLEtBQUssQ0FBYTtJQUNmLFFBQVEsQ0FBYTtJQUNsQixXQUFXLENBQWE7SUFFckUsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFbkMsU0FBUyxDQUFtQjtJQUM1QixNQUFNLEdBQVEsRUFBRSxDQUFDO0lBQ2pCLEtBQUssQ0FBUztJQUNkLFlBQVksQ0FBUztJQUNyQixRQUFRLEdBQVksU0FBUyxDQUFDO0lBQzlCLE9BQU8sR0FBWSxTQUFTLENBQUM7SUFDN0IsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBVTtJQUVwQixVQUFVLEdBQUc7UUFDbEIsRUFBRSxFQUFFO1lBQ0YsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixHQUFHLEVBQUUsd0JBQXdCO1lBQzdCLEdBQUcsRUFBRSx3QkFBd0I7WUFDN0IsS0FBSyxFQUFFLDBDQUEwQztZQUNqRCxHQUFHLEVBQUUsMENBQTBDO1lBQy9DLEtBQUssRUFBRSw4QkFBOEI7U0FDdEM7UUFDRCxFQUFFLEVBQUU7WUFDRixRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLEdBQUcsRUFBRSwwQkFBMEI7WUFDL0IsR0FBRyxFQUFFLDBCQUEwQjtZQUMvQixLQUFLLEVBQUUsMERBQTBEO1lBQ2pFLEdBQUcsRUFBRSwwREFBMEQ7WUFDL0QsS0FBSyxFQUFFLDhDQUE4QztTQUN0RDtLQUNGLENBQUM7SUFFSyxNQUFNLENBQVM7SUFFZixJQUFJLENBQW1CO0lBRXZCLElBQUksQ0FBbUI7SUFFdkIsSUFBSSxDQUFVO0lBRWQsR0FBRyxDQUFtQjtJQUV0QixHQUFHLENBQW1CO0lBRTdCLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVEsSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixPQUFPLENBQVM7SUFDSixTQUFTLENBQVM7SUFDOUIsUUFBUSxHQUFtQixJQUFJLENBQUM7SUFFaEQsSUFDSSxRQUFRLENBQUMsQ0FBbUI7UUFDOUIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFDSSxPQUFPLENBQUMsQ0FBcUI7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1NBQzFCO2FBQU07WUFDTCxJQUFJO2dCQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7YUFDMUI7U0FDRjtJQUNILENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQ0ksUUFBUSxDQUFDLENBQVM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFDSSxXQUFXLENBQUMsQ0FBUztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQ0ksUUFBUSxDQUFDLENBQVU7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFDSSxJQUFJLENBQUMsQ0FBUztRQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFDSSxLQUFLLENBQUMsQ0FBTTtRQUNkLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JCLE9BQU8sQ0FBQywwQ0FBMEM7U0FDbkQ7UUFDRCxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDeEIsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFDRCxJQUFJLEtBQUs7UUFDUCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBQ1MsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdEMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO0lBRXZELFFBQVEsR0FBRyxDQUFDLEtBQUssRUFBUSxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQy9CLFNBQVMsR0FBRyxHQUFTLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFM0IsWUFBbUIsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFBRyxDQUFDO0lBRW5ELGdEQUFnRDtJQUNoRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWE7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUNELHVEQUF1RDtJQUUvQyxpQkFBaUIsQ0FBQyxDQUFNO1FBQzlCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDMUIsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFFRCxzQkFBc0I7SUFDdEIseUJBQXlCLEtBQVUsQ0FBQztJQUVwQyxRQUFRLENBQUMsT0FBd0I7UUFDL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLE1BQU0sR0FBNEIsSUFBSSxDQUFDO1FBRTNDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hFLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxPQUFPLEdBQUc7Z0JBQ2YsS0FBSztnQkFDTCxNQUFNLEVBQUUsa0NBQWtDLElBQUksQ0FBQyxRQUFRLEVBQUU7YUFDMUQsQ0FBQztTQUNIO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztTQUNwRDtRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7U0FDaEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwRSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztTQUN2RDtRQUNELElBQ0UsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUNwQixJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFDekI7WUFDQSxJQUNFLE9BQU8sSUFBSSxDQUFDLEdBQUcsS0FBSyxRQUFRO2dCQUM1QixRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1QztnQkFDQSxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLEdBQUcsR0FBRztvQkFDWCxLQUFLO29CQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztvQkFDYixNQUFNLEVBQUUsc0NBQXNDLElBQUksQ0FBQyxHQUFHLEdBQUc7aUJBQzFELENBQUM7YUFDSDtZQUNELElBQ0UsT0FBTyxJQUFJLENBQUMsR0FBRyxLQUFLLFFBQVE7Z0JBQzVCLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzVDO2dCQUNBLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsR0FBRyxHQUFHO29CQUNYLEtBQUs7b0JBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLE1BQU0sRUFBRSw2Q0FBNkMsSUFBSSxDQUFDLEdBQUcsR0FBRztpQkFDakUsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxJQUNFLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWTtZQUMxQixJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVk7WUFDMUIsSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3RCLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUN4QjtZQUNBLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDOUQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxHQUFHLEdBQUc7b0JBQ1gsS0FBSztvQkFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2IsTUFBTSxFQUFFLHNDQUFzQyxJQUFJLENBQUMsR0FBRyxHQUFHO2lCQUMxRCxDQUFDO2FBQ0g7WUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQzlELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsR0FBRyxHQUFHO29CQUNYLEtBQUs7b0JBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLE1BQU0sRUFBRSw2Q0FBNkMsSUFBSSxDQUFDLEdBQUcsR0FBRztpQkFDakUsQ0FBQzthQUNIO1NBQ0Y7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUN6QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsNkJBQTZCO0lBRTdCLFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPO1lBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNkLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksY0FBYyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sQ0FBQyxRQUFnQjtRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBQ0QsYUFBYSxDQUFDLFFBQWdCO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELFVBQVUsQ0FBQyxLQUFvQjtRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsYUFBYSxDQUFDLFFBQWdCO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUNELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBQ0QsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUM7SUFDcEMsQ0FBQztJQUNELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxVQUFVO1FBQ1IsT0FBTyxDQUNMLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSztZQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFFBQVE7WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNiLENBQUMsQ0FBQyxtQkFBbUI7Z0JBQ3JCLENBQUMsQ0FBQyxVQUFVO1lBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNmLENBQUMsQ0FBQyxVQUFVO2dCQUNaLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ1osQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQVk7UUFDcEIsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLE1BQU07WUFDUixLQUFLLEtBQUs7Z0JBQ1IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixLQUFLLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLE1BQU07WUFDUixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLE1BQU07WUFDUixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLEtBQVUsQ0FBQztJQUUzQixjQUFjLEtBQVUsQ0FBQztJQUV6QixnQkFBZ0I7UUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQsZUFBZSxLQUFVLENBQUM7SUFFMUIsbUJBQW1CLEtBQVUsQ0FBQztJQUU5QixpQkFBaUI7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUN6QixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztJQUM1QixDQUFDO3VHQTFiVSxjQUFjOzJGQUFkLGNBQWMsK2JBYmQ7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUM5QztZQUNEO2dCQUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixLQUFLLEVBQUUsSUFBSTtnQkFDWCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUM5QztTQUNGLDhTQzVDSCxzMkdBd0ZBOzsyRkQxQ2EsY0FBYztrQkFqQjFCLFNBQVM7K0JBQ0UsV0FBVyxhQUdWO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQzt5QkFDOUM7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQzt5QkFDOUM7cUJBQ0Y7b0dBS3NDLEtBQUs7c0JBQTNDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0ssV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQW9DcEMsSUFBSTtzQkFEVixLQUFLO2dCQUdDLElBQUk7c0JBRFYsS0FBSztnQkFHQyxJQUFJO3NCQURWLEtBQUs7Z0JBR0MsR0FBRztzQkFEVCxLQUFLO2dCQUdDLEdBQUc7c0JBRFQsS0FBSztnQkFXRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNzQixTQUFTO3NCQUFwQyxLQUFLO3VCQUFDLFlBQVk7Z0JBQ0gsUUFBUTtzQkFBdkIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7Z0JBVUYsT0FBTztzQkFEVixLQUFLO2dCQW1CRixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsV0FBVztzQkFEZCxLQUFLO2dCQVNGLFFBQVE7c0JBRFgsS0FBSztnQkFTRixJQUFJO3NCQURQLEtBQUs7Z0JBV0YsS0FBSztzQkFEUixLQUFLO2dCQTBCSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEFic3RyYWN0Q29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxuICBOR19WQUxJREFUT1JTXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGhhc1ZhbHVlLFxuICBpc0luaXRpYWxBbmRFbXB0eSxcbiAgaXNWYWxpZEVtYWlsLFxuICBpc1ZhbGlkTnVtYmVyLFxuICBpc1ZhbGlkUmVsYXRpdmVVcmwsXG4gIGlzVmFsaWRDb2xvcixcbiAgbm9ybWFsaXplRGF0ZVxufSBmcm9tICcuLi9oZWxwZXJGbnMnO1xuaW1wb3J0IHsgbGFuZ3VhZ2VEZXRlY3RvciB9IGZyb20gJy4uL2xhbmcnO1xuaW1wb3J0IHsgUmVnZXhwU2VydmljZSB9IGZyb20gJy4vcmVnZXhwLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHV4LWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElucHV0Q29tcG9uZW50KVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSW5wdXRDb21wb25lbnQpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgc3RhdGljIGlkQ291bnRlciA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RleHRhcmVhJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRleHRhcmVhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdjb2xvcnBpY2tlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBjb2xvcnBpY2tlcjogRWxlbWVudFJlZjtcblxuICB0b3VjaGVkID0gZmFsc2U7XG4gIGRpcnR5ID0gZmFsc2U7XG4gIGxhc3RFcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9kaXNhYmxlZDogc3RyaW5nIHwgYm9vbGVhbjtcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9ICcnO1xuICBwcml2YXRlIF90eXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIHByaXZhdGUgX3BhdHRlcm4/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3JlZ2V4cD86IFJlZ0V4cCA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY3VycmVuY3k6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgcHVibGljIHVzZXJFcnJvcnMgPSB7XG4gICAgZW46IHtcbiAgICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQgZmllbGQuJyxcbiAgICAgIG1pbjogJ01pbmltdW0gdmFsdWUgaXMgJG1pbi4nLFxuICAgICAgbWF4OiAnTWF4aW11bSB2YWx1ZSBpcyAkbWF4LicsXG4gICAgICBlbWFpbDogJ0Zvcm1hdCBzaG91bGQgbWF0Y2ggZXhhbXBsZUBleGFtcGxlLmNvbS4nLFxuICAgICAgdXJsOiAnRm9ybWF0IHNob3VsZCBtYXRjaCBodHRwczovL2V4YW1wbGUuY29tLicsXG4gICAgICBjb2xvcjogJ0Zvcm1hdCBzaG91bGQgbWF0Y2ggI1hYWFhYWC4nXG4gICAgfSxcbiAgICBlczoge1xuICAgICAgcmVxdWlyZWQ6ICdFbCBjYW1wbyBlcyBvYmxpZ2F0b3Jpby4nLFxuICAgICAgbWluOiAnRWwgdmFsb3IgbcOtbmltbyBlcyAkbWluLicsXG4gICAgICBtYXg6ICdFbCB2YWxvciBtw6F4aW1vIGVzICRtYXguJyxcbiAgICAgIGVtYWlsOiAnRWwgY2FtcG8gZGViZSB0ZW5lciB1biBmb3JtYXRvIGNvbW8gZWplbXBsb0BlamVtcGxvLmNvbS4nLFxuICAgICAgdXJsOiAnRWwgY2FtcG8gZGViZSB0ZW5lciB1biBmb3JtYXRvIGNvbW8gaHR0cHM6Ly9lamVtcGxvLmNvbS4nLFxuICAgICAgY29sb3I6ICdFbCBjYW1wbyBkZWJlIHRlbmVyIHVuIGZvcm1hdG8gY29tbyAjWFhYWFhYLidcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIGRvbWFpbjogc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgcm93cz86IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIGNvbHM/OiBudW1iZXIgfCBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdGVwPzogbnVtYmVyO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWluPzogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWF4PzogbnVtYmVyIHwgc3RyaW5nO1xuXG4gIGdldCBjbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0NsYXNzTmFtZSgpO1xuICB9XG5cbiAgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tDb2xvcigpO1xuICB9XG5cbiAgQElucHV0KCkgbGFuZyA9IGxhbmd1YWdlRGV0ZWN0b3IoKTtcbiAgQElucHV0KCkgcHVibGljIGlubGluZUVycm9ycyA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgaW5wdXRJZDogc3RyaW5nO1xuICBASW5wdXQoJ2FyaWEtbGFiZWwnKSBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2OiBzdHJpbmcgfCBib29sZWFuKSB7XG4gICAgdiA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHRydWUgOiB2O1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdjtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKTogc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHBhdHRlcm4ocDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGF0dGVybiA9IHA7XG4gICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcmVnZXhwID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9yZWdleHAgPSBuZXcgUmVnRXhwKHApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLl9wYXR0ZXJuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9yZWdleHAgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBwYXR0ZXJuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgY3VycmVuY3kodjogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3VycmVuY3kgPSB2LnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHBsYWNlaG9sZGVyKHY6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdjtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXIgPyB0aGlzLl9wbGFjZWhvbGRlciA6ICcnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHJlcXVpcmVkKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IHY7XG4gIH1cbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB0eXBlKHY6IHN0cmluZykge1xuICAgIHRoaXMuX3R5cGUgPSB2LnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5kb21haW4gPSB2LnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5jaGVja1R5cGUodik7XG4gIH1cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZSA/IHRoaXMuX3R5cGUgOiAndGV4dCc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodjogYW55KSB7XG4gICAgdiA9IHYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2O1xuICAgIGlmICh2ID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuOyAvLyBwcmV2ZW50IGV2ZW50cyB3aGVuIHRoZXJlIGlzIG5vIGNoYW5nZXNcbiAgICB9XG4gICAgY29uc3QgaW5pdGlhbEFuZEVtcHR5ID0gaXNJbml0aWFsQW5kRW1wdHkodGhpcy5fdmFsdWUsIHYpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgdiA9IG5vcm1hbGl6ZURhdGUodik7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgIHRoaXMub25DaGFuZ2Uodik7XG4gICAgaWYgKCFpbml0aWFsQW5kRW1wdHkpIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2KTtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNQZXJjZW50YWdlKCkgfHwgdGhpcy5pc1Blcm1pbGxhZ2UoKSB8fCB0aGlzLmlzTnVtYmVyKCkpIHtcbiAgICAgIGNvbnN0IG51bVZhbCA9IHBhcnNlRmxvYXQodGhpcy5fdmFsdWUpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtVmFsKSkge1xuICAgICAgICByZXR1cm4gbnVtVmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBrZXlQcmVzcyA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcblxuICBvbkNoYW5nZSA9ICh2YWx1ZSk6IHZvaWQgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWdleHBTZXJ2aWNlOiBSZWdleHBTZXJ2aWNlKSB7fVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zZXRWYWx1ZUluQ29udHJvbCh2YWx1ZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuICAvLyBFbmQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IgSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZUluQ29udHJvbCh2OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kb21haW4gPT09ICdkYXRlJykge1xuICAgICAgdiA9IG5vcm1hbGl6ZURhdGUodik7XG4gICAgfVxuICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2O1xuICAgIH1cbiAgICBpZiAodGhpcy50ZXh0YXJlYSkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5uYXRpdmVFbGVtZW50LnZhbHVlID0gdjtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0b3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoKTogdm9pZCB7fVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgbGV0IHJlc3VsdDogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgIWhhc1ZhbHVlKHZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LnJlcXVpcmVkID0geyB2YWx1ZSwgcmVhc29uOiAnUmVxdWlyZWQgZmllbGQuJyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVnZXhwICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiAhdGhpcy5fcmVnZXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQucGF0dGVybiA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJlYXNvbjogYFZhbHVlIG11c3QgZm9sbG93IHRoZSBwYXR0ZXJuOiAke3RoaXMuX3BhdHRlcm59YFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2VtYWlsJyAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgIWlzVmFsaWRFbWFpbCh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5lbWFpbCA9IHsgdmFsdWUsIHJlYXNvbjogJ0ludmFsaWQgZW1haWwuJyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSAndXJsJyAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgIWlzVmFsaWRSZWxhdGl2ZVVybCh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC51cmwgPSB7IHZhbHVlLCByZWFzb246ICdJbnZhbGlkIFVSTC4nIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdjb2xvcicgJiYgaGFzVmFsdWUodmFsdWUpICYmICFpc1ZhbGlkQ29sb3IodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQuY29sb3IgPSB7IHZhbHVlLCByZWFzb246ICdJbnZhbGlkIGNvbG9yLicgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ251bWJlcicgJiYgaGFzVmFsdWUodmFsdWUpICYmICFpc1ZhbGlkTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0Lm51bWVyaWMgPSB7IHZhbHVlLCByZWFzb246ICdJbnZhbGlkIG51bWJlci4nIH07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gJ2RhdGUnIHx8XG4gICAgICB0aGlzLnR5cGUgPT09ICd0aW1lJyB8fFxuICAgICAgdGhpcy50eXBlID09PSAndGltZXN0YW1wJ1xuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdGhpcy5taW4gPT09ICdzdHJpbmcnICYmXG4gICAgICAgIGhhc1ZhbHVlKHZhbHVlKSAmJlxuICAgICAgICBTdHJpbmcodmFsdWUpLmxvY2FsZUNvbXBhcmUodGhpcy5taW4pID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0Lm1pbiA9IHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgIHJlYXNvbjogYFZhbHVlIGlzIGxvd2VyIHRoYW4gbWluaW11bSB2YWx1ZTogJHt0aGlzLm1pbn0uYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdGhpcy5tYXggPT09ICdzdHJpbmcnICYmXG4gICAgICAgIGhhc1ZhbHVlKHZhbHVlKSAmJlxuICAgICAgICBTdHJpbmcodmFsdWUpLmxvY2FsZUNvbXBhcmUodGhpcy5tYXgpICE9PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0Lm1heCA9IHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBtYXg6IHRoaXMubWF4LFxuICAgICAgICAgIHJlYXNvbjogYFZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGFuIG1heGltdW0gdmFsdWU6ICR7dGhpcy5tYXh9LmBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnR5cGUgPT09ICdwZXJjZW50YWdlJyB8fFxuICAgICAgdGhpcy50eXBlID09PSAncGVybWlsbGFnZScgfHxcbiAgICAgIHRoaXMudHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAgIHRoaXMudHlwZSA9PT0gJ2N1cnJlbmN5J1xuICAgICkge1xuICAgICAgaWYgKGhhc1ZhbHVlKHRoaXMubWluKSAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgdmFsdWUgPCArdGhpcy5taW4pIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHQubWluID0ge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG1pbjogdGhpcy5taW4sXG4gICAgICAgICAgcmVhc29uOiBgVmFsdWUgaXMgbG93ZXIgdGhhbiBtaW5pbXVtIHZhbHVlOiAke3RoaXMubWlufS5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaGFzVmFsdWUodGhpcy5tYXgpICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiB2YWx1ZSA+ICt0aGlzLm1heCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICAgIHJlc3VsdC5tYXggPSB7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICByZWFzb246IGBWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhbiBtYXhpbXVtIHZhbHVlOiAke3RoaXMubWF4fS5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGFzdEVycm9ycyA9IHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8vIEVuZCBvZiBWYWxpZGF0b3IgaW50ZXJmYWNlXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dElkID0gdGhpcy5pbnB1dElkXG4gICAgICA/IHRoaXMuaW5wdXRJZFxuICAgICAgOiBgJHt0aGlzLnR5cGV9JCR7SW5wdXRDb21wb25lbnQuaWRDb3VudGVyKyt9YDtcbiAgfVxuICBvbkxvc3RGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBvbktleVVwKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgb25DaGFuZ2VWYWx1ZShuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmlzQ29sb3IoKSkge1xuICAgICAgdGhpcy5jb2xvcnBpY2tlci5uYXRpdmVFbGVtZW50LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlQcmVzcy5lbWl0KGV2ZW50KTtcbiAgfVxuICBvbkNvbG9yUGlja2VkKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlVmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0VmFsdWVJbkNvbnRyb2wobmV3VmFsdWUpO1xuICB9XG5cbiAgaXNVcmwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3VybCc7XG4gIH1cbiAgaXNDb2xvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnY29sb3InO1xuICB9XG4gIGlzTnVtYmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdudW1iZXInO1xuICB9XG4gIGlzUGVyY2VudGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAncGVyY2VudGFnZSc7XG4gIH1cbiAgaXNQZXJtaWxsYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdwZXJtaWxsYWdlJztcbiAgfVxuICBoYXNQcmVmaXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVuY3kgPT09ICdVU0QnO1xuICB9XG4gIGhhc1Bvc3RmaXgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VycmVuY3kgPT09ICdFVVInIHx8XG4gICAgICB0aGlzLmlzUGVyY2VudGFnZSgpIHx8XG4gICAgICB0aGlzLmlzUGVybWlsbGFnZSgpIHx8XG4gICAgICAodGhpcy5pc1VybCgpICYmICEhdGhpcy52YWx1ZSkgfHxcbiAgICAgIHRoaXMuaXNDb2xvcigpXG4gICAgKTtcbiAgfVxuXG4gIGNoZWNrQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRcbiAgICAgID8gdGhpcy5yZWFkb25seVxuICAgICAgICA/ICdkaXNhYmxlZCByZWFkb25seSdcbiAgICAgICAgOiAnZGlzYWJsZWQnXG4gICAgICA6IHRoaXMucmVhZG9ubHlcbiAgICAgID8gJ3JlYWRvbmx5J1xuICAgICAgOiAnJztcbiAgfVxuXG4gIGNoZWNrQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnY29sb3InICYmIGlzVmFsaWRDb2xvcih0aGlzLnZhbHVlKVxuICAgICAgPyB0aGlzLnZhbHVlXG4gICAgICA6ICdpbml0aWFsJztcbiAgfVxuXG4gIGNoZWNrVHlwZSh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgdGhpcy5zZXRFbWFpbFBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgdGhpcy5zZXRVcmxQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgdGhpcy5zZXRDb2xvclBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHRoaXMuc2V0RGF0ZVBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgIHRoaXMuc2V0VGltZVBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGFzc3dvcmQnOlxuICAgICAgICB0aGlzLnNldFBhc3N3b3JkUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICB0aGlzLnNldE51bWJlclBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgICB0aGlzLnNldEN1cnJlbmN5UGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwZXJjZW50YWdlJzpcbiAgICAgICAgdGhpcy5zZXRQZXJjZW50YWdlUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwZXJtaWxsYWdlJzpcbiAgICAgICAgdGhpcy5zZXRQZXJtaWxsYWdlUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzZXRFbWFpbFBhdHRlcm5zKCk6IHZvaWQge31cblxuICBzZXRVcmxQYXR0ZXJucygpOiB2b2lkIHt9XG5cbiAgc2V0Q29sb3JQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLmRvbWFpbiA9ICd0ZXh0JztcbiAgfVxuXG4gIHNldERhdGVQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8ICcxOTAwLTAxLTAxJztcbiAgICB0aGlzLm1heCA9IHRoaXMubWF4IHx8ICcyMTAwLTAxLTAxJztcbiAgfVxuXG4gIHNldFRpbWVQYXR0ZXJucygpOiB2b2lkIHt9XG5cbiAgc2V0UGFzc3dvcmRQYXR0ZXJucygpOiB2b2lkIHt9XG5cbiAgc2V0TnVtYmVyUGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5kb21haW4gPSAnbnVtYmVyJztcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gJzAnO1xuICB9XG5cbiAgc2V0Q3VycmVuY3lQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLmRvbWFpbiA9ICdudW1iZXInO1xuICAgIHRoaXMuc3RlcCA9IHRoaXMuc3RlcCB8fCAwLjE7XG4gICAgdGhpcy5taW4gPSB0aGlzLm1pbiB8fCAwLjA7XG4gICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAxMDAwMC4wO1xuICAgIHRoaXMudmFsdWUgPSAwLjA7XG4gIH1cblxuICBzZXRQZXJjZW50YWdlUGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5kb21haW4gPSAnbnVtYmVyJztcbiAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXAgfHwgMC4wMTtcbiAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8IDAuMDtcbiAgICB0aGlzLm1heCA9IHRoaXMubWF4IHx8IDEwMC4wO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSAnMC4wMCc7XG4gIH1cblxuICBzZXRQZXJtaWxsYWdlUGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5kb21haW4gPSAnbnVtYmVyJztcbiAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXAgfHwgMC4wMTtcbiAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8IDAuMDtcbiAgICB0aGlzLm1heCA9IHRoaXMubWF4IHx8IDEwMDAuMDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gJzAuMDAnO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiY3VycmVuY3kgJiYgY3VycmVuY3kgPT09ICdVU0QnXCIgY2xhc3M9XCJwcmVmaXggcm91bmRlZC1sZWZ0IHN5bWJvbFwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8c3Bhbj4kPC9zcGFuPlxuPC9kaXY+XG48aW5wdXRcbiAgI2lucHV0XG4gICpuZ0lmPVwidHlwZSAhPT0gJ3RleHRhcmVhJ1wiXG4gIFtjbGFzc109XCJoYXNQcmVmaXgoKSA/IChoYXNQb3N0Zml4KCkgPyAnaW5maXgnIDogJ3Bvc3RmaXggcm91bmRlZC1yaWdodCcpIDogKGhhc1Bvc3RmaXgoKSA/ICdwcmVmaXggcm91bmRlZC1sZWZ0JyA6ICdyb3VuZGVkJylcIlxuICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICBbaWRdPVwiaW5wdXRJZFwiXG4gIFt0eXBlXT1cImRvbWFpblwiXG4gIFthdHRyLnZhbHVlXT1cInZhbHVlXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLnJlYWRvbmx5XT1cInJlYWRvbmx5ID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIubWluXT1cIm1pbj8udG9TdHJpbmcoKSB8fCB1bmRlZmluZWRcIlxuICBbYXR0ci5tYXhdPVwibWF4Py50b1N0cmluZygpIHx8IHVuZGVmaW5lZFwiXG4gIFthdHRyLnN0ZXBdPVwic3RlcD8udG9TdHJpbmcoKSB8fCB1bmRlZmluZWRcIlxuICBbYXR0ci5wYXR0ZXJuXT1cInBhdHRlcm4gfHwgdW5kZWZpbmVkXCJcbiAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgKGtleXVwKT1cIm9uS2V5VXAoaW5wdXQudmFsdWUpXCJcbiAgKGNoYW5nZSk9XCJvbkNoYW5nZVZhbHVlKGlucHV0LnZhbHVlKVwiXG4gIChrZXlwcmVzcyk9XCJvbktleVByZXNzKCRldmVudClcIlxuICAoYmx1cik9XCJvbkxvc3RGb2N1cygpXCJcbi8+XG48dGV4dGFyZWFcbiAgI3RleHRhcmVhXG4gICpuZ0lmPVwidHlwZSA9PT0gJ3RleHRhcmVhJ1wiXG4gIGNsYXNzPVwicm91bmRlZFwiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIHBsYWNlbWVudD1cInRvcFwiXG4gIFtpZF09XCJpbnB1dElkXCJcbiAgW2F0dHIudmFsdWVdPVwidmFsdWVcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5jb2xzXT1cImNvbHM/LnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkXCJcbiAgW2F0dHIucm93c109XCJyb3dzPy50b1N0cmluZygpIHx8IHVuZGVmaW5lZFwiXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gIChrZXl1cCk9XCJvbktleVVwKHRleHRhcmVhLnZhbHVlKVwiXG4gIChjaGFuZ2UpPVwib25DaGFuZ2VWYWx1ZSh0ZXh0YXJlYS52YWx1ZSlcIlxuICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4+PC90ZXh0YXJlYT5cbjxkaXYgKm5nSWY9XCJjdXJyZW5jeSAmJiBjdXJyZW5jeSA9PT0gJ0VVUidcIiBjbGFzcz1cInBvc3RmaXggcm91bmRlZC1yaWdodCBzeW1ib2xcIiBbbmdDbGFzc109XCJjbGFzc05hbWVcIj5cbiAgPHNwYW4+4oKsPC9zcGFuPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiaXNQZXJjZW50YWdlKClcIiBjbGFzcz1cInBvc3RmaXggcm91bmRlZC1yaWdodCBzeW1ib2xcIiBbbmdDbGFzc109XCJjbGFzc05hbWVcIj5cbiAgPHNwYW4+JTwvc3Bhbj5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cImlzUGVybWlsbGFnZSgpXCIgY2xhc3M9XCJwb3N0Zml4IHJvdW5kZWQtcmlnaHQgc3ltYm9sXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxzcGFuPuKAsDwvc3Bhbj5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cImlzVXJsKCkgJiYgISF2YWx1ZVwiIGNsYXNzPVwicG9zdGZpeCByb3VuZGVkLXJpZ2h0IHN5bWJvbCBjbGlja2FibGVcIiBbbmdDbGFzc109XCJjbGFzc05hbWVcIj5cbiAgPGEgaHJlZj1cInt7IHZhbHVlIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJpY29uLWV4dGVybmFsXCI+PC9zcGFuPlxuICA8L2E+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJpc0NvbG9yKClcIiBjbGFzcz1cInBvc3RmaXggcm91bmRlZC1yaWdodCBib3JkZXJlZCB0cmFuc3BhcmVuY3lcIiBbbmdDbGFzc109XCJjbGFzc05hbWVcIj5cbiAgPGRpdiBjbGFzcz1cInJvdW5kZWQtcmlnaHQgZnVsbC1zcGFjZVwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IGNvbG9yfVwiPlxuICAgIDxpbnB1dFxuICAgICAgI2NvbG9ycGlja2VyXG4gICAgICBjbGFzcz1cIm1pbmltYWwtc3BhY2UgY2xpY2thYmxlIGludmlzaWJsZSByb3VuZGVkLXJpZ2h0IGZ1bGwtc3BhY2VcIlxuICAgICAgW2lkXT1cImlucHV0SWQgKyAnJGNvbG9ycGlja2VyJ1wiXG4gICAgICB0eXBlPVwiY29sb3JcIlxuICAgICAgW2F0dHIudmFsdWVdPVwidmFsdWVcIlxuICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICAgICAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICAgICAgKGNoYW5nZSk9XCJvbkNvbG9yUGlja2VkKGNvbG9ycGlja2VyLnZhbHVlKVwiXG4gICAgICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgICAgIChibHVyKT1cIm9uTG9zdEZvY3VzKClcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJpbmxpbmVFcnJvcnMgJiYgbGFzdEVycm9ycyAmJiAoZGlydHkgfHwgdG91Y2hlZClcIiBjbGFzcz1cImFsZXJ0XCI+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLnJlcXVpcmVkXCI+XG4gICAge3sgdXNlckVycm9yc1t0aGlzLmxhbmddLnJlcXVpcmVkIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5lbWFpbFwiPnt7IHVzZXJFcnJvcnNbdGhpcy5sYW5nXS5lbWFpbCB9fTwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy51cmxcIj57eyB1c2VyRXJyb3JzW3RoaXMubGFuZ10udXJsIH19PC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLm1pblwiPlxuICAgIHt7IHVzZXJFcnJvcnNbdGhpcy5sYW5nXS5taW4ucmVwbGFjZSgnJG1pbicsIGxhc3RFcnJvcnMubWluLm1pbikgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLm1heFwiPlxuICAgIHt7IHVzZXJFcnJvcnNbdGhpcy5sYW5nXS5tYXgucmVwbGFjZSgnJG1heCcsIGxhc3RFcnJvcnMubWF4Lm1heCkgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|