@metadev/lux 0.26.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.
Files changed (90) hide show
  1. package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -0
  2. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -0
  3. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -0
  4. package/esm2022/lib/checkbox/checkbox.component.mjs +156 -0
  5. package/esm2022/lib/datetime/datetime.component.mjs +312 -0
  6. package/esm2022/lib/filter/filter.component.mjs +158 -0
  7. package/esm2022/lib/geolocation/geolocation.component.mjs +423 -0
  8. package/esm2022/lib/geolocation/geolocation.service.mjs +123 -0
  9. package/{esm2020 → esm2022}/lib/geolocation/openlayer-loader.service.mjs +4 -4
  10. package/esm2022/lib/helperFns.mjs +118 -0
  11. package/esm2022/lib/input/input.component.mjs +469 -0
  12. package/{esm2020 → esm2022}/lib/input/regexp.service.mjs +4 -4
  13. package/esm2022/lib/lux.module.mjs +119 -0
  14. package/esm2022/lib/map/map.component.mjs +275 -0
  15. package/esm2022/lib/modal/modal-backdrop.mjs +25 -0
  16. package/esm2022/lib/modal/modal-config.mjs +12 -0
  17. package/esm2022/lib/modal/modal-ref.mjs +101 -0
  18. package/esm2022/lib/modal/modal-stack.mjs +182 -0
  19. package/esm2022/lib/modal/modal-window.mjs +125 -0
  20. package/esm2022/lib/modal/modal.service.mjs +28 -0
  21. package/esm2022/lib/modal/util.mjs +82 -0
  22. package/esm2022/lib/pagination/pagination.component.mjs +144 -0
  23. package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -0
  24. package/esm2022/lib/select/select.component.mjs +148 -0
  25. package/esm2022/lib/tooltip/tooltip.component.mjs +24 -0
  26. package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -0
  27. package/esm2022/lib/tooltip/tooltip.service.mjs +137 -0
  28. package/esm2022/lib/tooltip/tooltop-content.mjs +9 -0
  29. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -0
  30. package/{fesm2020 → fesm2022}/metadev-lux.mjs +671 -554
  31. package/fesm2022/metadev-lux.mjs.map +1 -0
  32. package/lib/autocomplete/autocomplete.component.d.ts +1 -1
  33. package/lib/autocomplete-list/autocomplete-list.component.d.ts +1 -1
  34. package/lib/checkbox/checkbox.component.d.ts +1 -1
  35. package/lib/datetime/datetime.component.d.ts +1 -1
  36. package/lib/filter/filter.component.d.ts +1 -1
  37. package/lib/geolocation/geolocation.component.d.ts +1 -1
  38. package/lib/input/input.component.d.ts +1 -1
  39. package/lib/map/map.component.d.ts +2 -2
  40. package/lib/modal/modal-backdrop.d.ts +1 -1
  41. package/lib/modal/modal-stack.d.ts +1 -1
  42. package/lib/modal/modal-window.d.ts +1 -1
  43. package/lib/modal/util.d.ts +1 -1
  44. package/lib/pagination/pagination.component.d.ts +1 -1
  45. package/lib/radiogroup/radiogroup.component.d.ts +1 -1
  46. package/lib/select/select.component.d.ts +1 -1
  47. package/lib/tooltip/tooltip.component.d.ts +1 -1
  48. package/lib/tooltip/tooltip.directive.d.ts +1 -1
  49. package/lib/voice-recognition/voice-recognition.directive.d.ts +1 -1
  50. package/package.json +7 -13
  51. package/esm2020/lib/autocomplete/autocomplete.component.mjs +0 -479
  52. package/esm2020/lib/autocomplete-list/autocomplete-list.component.mjs +0 -254
  53. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -75
  54. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -154
  55. package/esm2020/lib/datetime/datetime.component.mjs +0 -306
  56. package/esm2020/lib/filter/filter.component.mjs +0 -152
  57. package/esm2020/lib/geolocation/geolocation.component.mjs +0 -407
  58. package/esm2020/lib/geolocation/geolocation.service.mjs +0 -120
  59. package/esm2020/lib/helperFns.mjs +0 -117
  60. package/esm2020/lib/input/input.component.mjs +0 -452
  61. package/esm2020/lib/lux.module.mjs +0 -124
  62. package/esm2020/lib/map/map.component.mjs +0 -264
  63. package/esm2020/lib/modal/modal-backdrop.mjs +0 -26
  64. package/esm2020/lib/modal/modal-config.mjs +0 -14
  65. package/esm2020/lib/modal/modal-ref.mjs +0 -91
  66. package/esm2020/lib/modal/modal-stack.mjs +0 -179
  67. package/esm2020/lib/modal/modal-window.mjs +0 -119
  68. package/esm2020/lib/modal/modal.service.mjs +0 -26
  69. package/esm2020/lib/modal/util.mjs +0 -83
  70. package/esm2020/lib/pagination/pagination.component.mjs +0 -137
  71. package/esm2020/lib/radiogroup/radiogroup.component.mjs +0 -130
  72. package/esm2020/lib/select/select.component.mjs +0 -149
  73. package/esm2020/lib/tooltip/tooltip.component.mjs +0 -23
  74. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -60
  75. package/esm2020/lib/tooltip/tooltip.service.mjs +0 -134
  76. package/esm2020/lib/tooltip/tooltop-content.mjs +0 -7
  77. package/esm2020/lib/voice-recognition/voice-recognition.directive.mjs +0 -73
  78. package/fesm2015/metadev-lux.mjs +0 -4347
  79. package/fesm2015/metadev-lux.mjs.map +0 -1
  80. package/fesm2020/metadev-lux.mjs.map +0 -1
  81. /package/{esm2020 → esm2022}/lib/datasource.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/lang.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/map/geopoint.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/modal/modal-dismiss-reasons.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/pagination/pagination.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/tooltip/placement.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/tooltip/tooltip-context.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/window/window.service.mjs +0 -0
  89. /package/{esm2020 → esm2022}/metadev-lux.mjs +0 -0
  90. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -1,452 +0,0 @@
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
- get className() {
11
- return this.checkClassName();
12
- }
13
- get color() {
14
- return this.checkColor();
15
- }
16
- set disabled(v) {
17
- v = typeof v === 'string' ? true : v;
18
- this._disabled = v;
19
- }
20
- get disabled() {
21
- return this._disabled;
22
- }
23
- set pattern(p) {
24
- this._pattern = p;
25
- if (p === undefined) {
26
- this._regexp = undefined;
27
- }
28
- else {
29
- try {
30
- this._regexp = new RegExp(p);
31
- }
32
- catch (e) {
33
- this._pattern = undefined;
34
- this._regexp = undefined;
35
- }
36
- }
37
- }
38
- get pattern() {
39
- return this._pattern;
40
- }
41
- set currency(v) {
42
- this._currency = v.toUpperCase();
43
- }
44
- get currency() {
45
- return this._currency;
46
- }
47
- set placeholder(v) {
48
- this._placeholder = v;
49
- }
50
- get placeholder() {
51
- return this._placeholder ? this._placeholder : '';
52
- }
53
- set required(v) {
54
- this._required = v;
55
- }
56
- get required() {
57
- return this._required;
58
- }
59
- set type(v) {
60
- this._type = v.toLowerCase();
61
- this.domain = v.toLowerCase();
62
- this.checkType(v);
63
- }
64
- get type() {
65
- return this._type ? this._type : 'text';
66
- }
67
- set value(v) {
68
- v = v === undefined ? null : v;
69
- if (v === this._value) {
70
- return; // prevent events when there is no changes
71
- }
72
- const initialAndEmpty = isInitialAndEmpty(this._value, v);
73
- if (this.type === 'date') {
74
- v = normalizeDate(v);
75
- }
76
- this._value = v;
77
- this.onChange(v);
78
- if (!initialAndEmpty) {
79
- this.valueChange.emit(v);
80
- }
81
- }
82
- get value() {
83
- if (this.isPercentage() || this.isPermillage() || this.isNumber()) {
84
- const numVal = parseFloat(this._value);
85
- if (!Number.isNaN(numVal)) {
86
- return numVal;
87
- }
88
- }
89
- return this._value;
90
- }
91
- constructor(regexpService) {
92
- this.regexpService = regexpService;
93
- this.touched = false;
94
- this.dirty = false;
95
- this.lastErrors = null;
96
- this._value = '';
97
- this._pattern = undefined;
98
- this._regexp = undefined;
99
- this.userErrors = {
100
- en: {
101
- required: 'Required field.',
102
- min: 'Minimum value is $min.',
103
- max: 'Maximum value is $max.',
104
- email: 'Format should match example@example.com.',
105
- url: 'Format should match https://example.com.',
106
- color: 'Format should match #XXXXXX.'
107
- },
108
- es: {
109
- required: 'El campo es obligatorio.',
110
- min: 'El valor mínimo es $min.',
111
- max: 'El valor máximo es $max.',
112
- email: 'El campo debe tener un formato como ejemplo@ejemplo.com.',
113
- url: 'El campo debe tener un formato como https://ejemplo.com.',
114
- color: 'El campo debe tener un formato como #XXXXXX.'
115
- }
116
- };
117
- this.lang = languageDetector();
118
- this.inlineErrors = false;
119
- this.readonly = null;
120
- this.valueChange = new EventEmitter();
121
- this.keyPress = new EventEmitter();
122
- this.onChange = (value) => { };
123
- this.onTouched = () => { };
124
- }
125
- // ControlValueAccessor Interface implementation
126
- writeValue(value) {
127
- this.value = value;
128
- this.setValueInControl(value);
129
- }
130
- registerOnChange(onChange) {
131
- this.onChange = onChange;
132
- }
133
- registerOnTouched(onTouched) {
134
- this.onTouched = onTouched;
135
- }
136
- markAsTouched() {
137
- if (!this.touched) {
138
- this.onTouched();
139
- this.touched = true;
140
- }
141
- }
142
- setDisabledState(disabled) {
143
- this.disabled = disabled;
144
- }
145
- // End of ControlValueAccessor Interface implementation
146
- setValueInControl(v) {
147
- if (this.domain === 'date') {
148
- v = normalizeDate(v);
149
- }
150
- if (this.input) {
151
- this.input.nativeElement.value = v;
152
- }
153
- if (this.textarea) {
154
- this.textarea.nativeElement.value = v;
155
- }
156
- }
157
- // Validator interface
158
- registerOnValidatorChange() { }
159
- validate(control) {
160
- const value = control.value;
161
- let result = null;
162
- if (this.required && !hasValue(value)) {
163
- result = result || {};
164
- result.required = { value, reason: 'Required field.' };
165
- }
166
- if (this._regexp && hasValue(value) && !this._regexp.test(value)) {
167
- result = result || {};
168
- result.pattern = {
169
- value,
170
- reason: `Value must follow the pattern: ${this._pattern}`
171
- };
172
- }
173
- if (this.type === 'email' && hasValue(value) && !isValidEmail(value)) {
174
- result = result || {};
175
- result.email = { value, reason: 'Invalid email.' };
176
- }
177
- if (this.type === 'url' && hasValue(value) && !isValidRelativeUrl(value)) {
178
- result = result || {};
179
- result.url = { value, reason: 'Invalid URL.' };
180
- }
181
- if (this.type === 'color' && hasValue(value) && !isValidColor(value)) {
182
- result = result || {};
183
- result.color = { value, reason: 'Invalid color.' };
184
- }
185
- if (this.type === 'number' && hasValue(value) && !isValidNumber(value)) {
186
- result = result || {};
187
- result.numeric = { value, reason: 'Invalid number.' };
188
- }
189
- if (this.type === 'date' ||
190
- this.type === 'time' ||
191
- this.type === 'timestamp') {
192
- if (typeof this.min === 'string' &&
193
- hasValue(value) &&
194
- String(value).localeCompare(this.min) === -1) {
195
- result = result || {};
196
- result.min = {
197
- value,
198
- min: this.min,
199
- reason: `Value is lower than minimum value: ${this.min}.`
200
- };
201
- }
202
- if (typeof this.max === 'string' &&
203
- hasValue(value) &&
204
- String(value).localeCompare(this.max) !== -1) {
205
- result = result || {};
206
- result.max = {
207
- value,
208
- max: this.max,
209
- reason: `Value is greater than than maximum value: ${this.max}.`
210
- };
211
- }
212
- }
213
- if (this.type === 'percentage' ||
214
- this.type === 'permillage' ||
215
- this.type === 'number' ||
216
- this.type === 'currency') {
217
- if (hasValue(this.min) && hasValue(value) && value < +this.min) {
218
- result = result || {};
219
- result.min = {
220
- value,
221
- min: this.min,
222
- reason: `Value is lower than minimum value: ${this.min}.`
223
- };
224
- }
225
- if (hasValue(this.max) && hasValue(value) && value > +this.max) {
226
- result = result || {};
227
- result.max = {
228
- value,
229
- max: this.max,
230
- reason: `Value is greater than than maximum value: ${this.max}.`
231
- };
232
- }
233
- }
234
- this.lastErrors = result;
235
- return result;
236
- }
237
- // End of Validator interface
238
- ngOnInit() {
239
- this.inputId = this.inputId
240
- ? this.inputId
241
- : `${this.type}$${InputComponent.idCounter++}`;
242
- }
243
- onLostFocus() {
244
- this.markAsTouched();
245
- }
246
- onKeyUp(newValue) {
247
- this.value = newValue;
248
- }
249
- onChangeValue(newValue) {
250
- this.value = newValue;
251
- if (this.isColor()) {
252
- this.colorpicker.nativeElement.value = undefined;
253
- }
254
- this.markAsTouched();
255
- }
256
- onKeyPress(event) {
257
- this.keyPress.emit(event);
258
- }
259
- onColorPicked(newValue) {
260
- this.onChangeValue(newValue);
261
- this.setValueInControl(newValue);
262
- }
263
- isUrl() {
264
- return this.type === 'url';
265
- }
266
- isColor() {
267
- return this.type === 'color';
268
- }
269
- isNumber() {
270
- return this.type === 'number';
271
- }
272
- isPercentage() {
273
- return this.type === 'percentage';
274
- }
275
- isPermillage() {
276
- return this.type === 'permillage';
277
- }
278
- hasPrefix() {
279
- return this.currency === 'USD';
280
- }
281
- hasPostfix() {
282
- return (this.currency === 'EUR' ||
283
- this.isPercentage() ||
284
- this.isPermillage() ||
285
- (this.isUrl() && !!this.value) ||
286
- this.isColor());
287
- }
288
- checkClassName() {
289
- return this.disabled
290
- ? this.readonly
291
- ? 'disabled readonly'
292
- : 'disabled'
293
- : this.readonly
294
- ? 'readonly'
295
- : '';
296
- }
297
- checkColor() {
298
- return this.type === 'color' && isValidColor(this.value)
299
- ? this.value
300
- : 'initial';
301
- }
302
- checkType(type) {
303
- switch (type) {
304
- case 'email':
305
- this.setEmailPatterns();
306
- break;
307
- case 'url':
308
- this.setUrlPatterns();
309
- break;
310
- case 'color':
311
- this.setColorPatterns();
312
- break;
313
- case 'date':
314
- this.setDatePatterns();
315
- break;
316
- case 'time':
317
- this.setTimePatterns();
318
- break;
319
- case 'password':
320
- this.setPasswordPatterns();
321
- break;
322
- case 'number':
323
- this.setNumberPatterns();
324
- break;
325
- case 'currency':
326
- this.setCurrencyPatterns();
327
- break;
328
- case 'percentage':
329
- this.setPercentagePatterns();
330
- break;
331
- case 'permillage':
332
- this.setPermillagePatterns();
333
- break;
334
- default:
335
- break;
336
- }
337
- }
338
- setEmailPatterns() { }
339
- setUrlPatterns() { }
340
- setColorPatterns() {
341
- this.domain = 'text';
342
- }
343
- setDatePatterns() {
344
- this.min = this.min || '1900-01-01';
345
- this.max = this.max || '2100-01-01';
346
- }
347
- setTimePatterns() { }
348
- setPasswordPatterns() { }
349
- setNumberPatterns() {
350
- this.domain = 'number';
351
- this.placeholder = '0';
352
- }
353
- setCurrencyPatterns() {
354
- this.domain = 'number';
355
- this.step = this.step || 0.1;
356
- this.min = this.min || 0.0;
357
- this.max = this.max || 10000.0;
358
- this.value = 0.0;
359
- }
360
- setPercentagePatterns() {
361
- this.domain = 'number';
362
- this.step = this.step || 0.01;
363
- this.min = this.min || 0.0;
364
- this.max = this.max || 100.0;
365
- this.placeholder = '0.00';
366
- }
367
- setPermillagePatterns() {
368
- this.domain = 'number';
369
- this.step = this.step || 0.01;
370
- this.min = this.min || 0.0;
371
- this.max = this.max || 1000.0;
372
- this.placeholder = '0.00';
373
- }
374
- }
375
- InputComponent.idCounter = 0;
376
- InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: InputComponent, deps: [{ token: i1.RegexpService }], target: i0.ɵɵFactoryTarget.Component });
377
- InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.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: [
378
- {
379
- provide: NG_VALUE_ACCESSOR,
380
- multi: true,
381
- useExisting: forwardRef(() => InputComponent)
382
- },
383
- {
384
- provide: NG_VALIDATORS,
385
- multi: true,
386
- useExisting: forwardRef(() => InputComponent)
387
- }
388
- ], 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"] }] });
389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: InputComponent, decorators: [{
390
- type: Component,
391
- args: [{ selector: 'lux-input', providers: [
392
- {
393
- provide: NG_VALUE_ACCESSOR,
394
- multi: true,
395
- useExisting: forwardRef(() => InputComponent)
396
- },
397
- {
398
- provide: NG_VALIDATORS,
399
- multi: true,
400
- useExisting: forwardRef(() => InputComponent)
401
- }
402
- ], 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"] }]
403
- }], ctorParameters: function () { return [{ type: i1.RegexpService }]; }, propDecorators: { input: [{
404
- type: ViewChild,
405
- args: ['input', { static: false }]
406
- }], textarea: [{
407
- type: ViewChild,
408
- args: ['textarea', { static: false }]
409
- }], colorpicker: [{
410
- type: ViewChild,
411
- args: ['colorpicker', { static: false }]
412
- }], rows: [{
413
- type: Input
414
- }], cols: [{
415
- type: Input
416
- }], step: [{
417
- type: Input
418
- }], min: [{
419
- type: Input
420
- }], max: [{
421
- type: Input
422
- }], lang: [{
423
- type: Input
424
- }], inlineErrors: [{
425
- type: Input
426
- }], inputId: [{
427
- type: Input
428
- }], ariaLabel: [{
429
- type: Input,
430
- args: ['aria-label']
431
- }], readonly: [{
432
- type: Input
433
- }], disabled: [{
434
- type: Input
435
- }], pattern: [{
436
- type: Input
437
- }], currency: [{
438
- type: Input
439
- }], placeholder: [{
440
- type: Input
441
- }], required: [{
442
- type: Input
443
- }], type: [{
444
- type: Input
445
- }], value: [{
446
- type: Input
447
- }], valueChange: [{
448
- type: Output
449
- }], keyPress: [{
450
- type: Output
451
- }] } });
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaW5wdXQvaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaW5wdXQvaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLGFBQWEsRUFDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixhQUFhLEVBQ2QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQWtCakQsTUFBTSxPQUFPLGNBQWM7SUFtRHpCLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBUUQsSUFDSSxRQUFRLENBQUMsQ0FBbUI7UUFDOUIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFB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RFYsS0FBSztnQkFtQkYsUUFBUTtzQkFEWCxLQUFLO2dCQVNGLFdBQVc7c0JBRGQsS0FBSztnQkFTRixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsSUFBSTtzQkFEUCxLQUFLO2dCQVdGLEtBQUs7c0JBRFIsS0FBSztnQkEwQkksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBBYnN0cmFjdENvbnRyb2wsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcixcbiAgTkdfVkFMSURBVE9SU1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBoYXNWYWx1ZSxcbiAgaXNJbml0aWFsQW5kRW1wdHksXG4gIGlzVmFsaWRFbWFpbCxcbiAgaXNWYWxpZE51bWJlcixcbiAgaXNWYWxpZFJlbGF0aXZlVXJsLFxuICBpc1ZhbGlkQ29sb3IsXG4gIG5vcm1hbGl6ZURhdGVcbn0gZnJvbSAnLi4vaGVscGVyRm5zJztcbmltcG9ydCB7IGxhbmd1YWdlRGV0ZWN0b3IgfSBmcm9tICcuLi9sYW5nJztcbmltcG9ydCB7IFJlZ2V4cFNlcnZpY2UgfSBmcm9tICcuL3JlZ2V4cC5zZXJ2aWNlJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x1eC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dENvbXBvbmVudClcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElucHV0Q29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG4gIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0ZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KSB0ZXh0YXJlYTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnY29sb3JwaWNrZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgY29sb3JwaWNrZXI6IEVsZW1lbnRSZWY7XG5cbiAgdG91Y2hlZCA9IGZhbHNlO1xuICBkaXJ0eSA9IGZhbHNlO1xuICBsYXN0RXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IHN0cmluZyB8IGJvb2xlYW47XG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSAnJztcbiAgcHJpdmF0ZSBfdHlwZTogc3RyaW5nO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuICBwcml2YXRlIF9wYXR0ZXJuPzogc3RyaW5nID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZWdleHA/OiBSZWdFeHAgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2N1cnJlbmN5OiBzdHJpbmc7XG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuO1xuXG4gIHB1YmxpYyB1c2VyRXJyb3JzID0ge1xuICAgIGVuOiB7XG4gICAgICByZXF1aXJlZDogJ1JlcXVpcmVkIGZpZWxkLicsXG4gICAgICBtaW46ICdNaW5pbXVtIHZhbHVlIGlzICRtaW4uJyxcbiAgICAgIG1heDogJ01heGltdW0gdmFsdWUgaXMgJG1heC4nLFxuICAgICAgZW1haWw6ICdGb3JtYXQgc2hvdWxkIG1hdGNoIGV4YW1wbGVAZXhhbXBsZS5jb20uJyxcbiAgICAgIHVybDogJ0Zvcm1hdCBzaG91bGQgbWF0Y2ggaHR0cHM6Ly9leGFtcGxlLmNvbS4nLFxuICAgICAgY29sb3I6ICdGb3JtYXQgc2hvdWxkIG1hdGNoICNYWFhYWFguJ1xuICAgIH0sXG4gICAgZXM6IHtcbiAgICAgIHJlcXVpcmVkOiAnRWwgY2FtcG8gZXMgb2JsaWdhdG9yaW8uJyxcbiAgICAgIG1pbjogJ0VsIHZhbG9yIG3DrW5pbW8gZXMgJG1pbi4nLFxuICAgICAgbWF4OiAnRWwgdmFsb3IgbcOheGltbyBlcyAkbWF4LicsXG4gICAgICBlbWFpbDogJ0VsIGNhbXBvIGRlYmUgdGVuZXIgdW4gZm9ybWF0byBjb21vIGVqZW1wbG9AZWplbXBsby5jb20uJyxcbiAgICAgIHVybDogJ0VsIGNhbXBvIGRlYmUgdGVuZXIgdW4gZm9ybWF0byBjb21vIGh0dHBzOi8vZWplbXBsby5jb20uJyxcbiAgICAgIGNvbG9yOiAnRWwgY2FtcG8gZGViZSB0ZW5lciB1biBmb3JtYXRvIGNvbW8gI1hYWFhYWC4nXG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBkb21haW46IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIHJvd3M/OiBudW1iZXIgfCBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb2xzPzogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3RlcD86IG51bWJlcjtcbiAgQElucHV0KClcbiAgcHVibGljIG1pbj86IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIG1heD86IG51bWJlciB8IHN0cmluZztcblxuICBnZXQgY2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tDbGFzc05hbWUoKTtcbiAgfVxuXG4gIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoZWNrQ29sb3IoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGxhbmcgPSBsYW5ndWFnZURldGVjdG9yKCk7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbmxpbmVFcnJvcnMgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGlucHV0SWQ6IHN0cmluZztcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodjogc3RyaW5nIHwgYm9vbGVhbikge1xuICAgIHYgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB0cnVlIDogdjtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHY7XG4gIH1cbiAgZ2V0IGRpc2FibGVkKCk6IHN0cmluZyB8IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBwYXR0ZXJuKHA6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhdHRlcm4gPSBwO1xuICAgIGlmIChwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JlZ2V4cCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fcmVnZXhwID0gbmV3IFJlZ0V4cChwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5fcGF0dGVybiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcmVnZXhwID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgcGF0dGVybigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXR0ZXJuO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGN1cnJlbmN5KHY6IHN0cmluZykge1xuICAgIHRoaXMuX2N1cnJlbmN5ID0gdi50b1VwcGVyQ2FzZSgpO1xuICB9XG4gIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW5jeTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBwbGFjZWhvbGRlcih2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHY7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyID8gdGhpcy5fcGxhY2Vob2xkZXIgOiAnJztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCByZXF1aXJlZCh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2O1xuICB9XG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdHlwZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl90eXBlID0gdi50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuZG9tYWluID0gdi50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuY2hlY2tUeXBlKHYpO1xuICB9XG4gIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGUgPyB0aGlzLl90eXBlIDogJ3RleHQnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHY6IGFueSkge1xuICAgIHYgPSB2ID09PSB1bmRlZmluZWQgPyBudWxsIDogdjtcbiAgICBpZiAodiA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybjsgLy8gcHJldmVudCBldmVudHMgd2hlbiB0aGVyZSBpcyBubyBjaGFuZ2VzXG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxBbmRFbXB0eSA9IGlzSW5pdGlhbEFuZEVtcHR5KHRoaXMuX3ZhbHVlLCB2KTtcbiAgICBpZiAodGhpcy50eXBlID09PSAnZGF0ZScpIHtcbiAgICAgIHYgPSBub3JtYWxpemVEYXRlKHYpO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICB0aGlzLm9uQ2hhbmdlKHYpO1xuICAgIGlmICghaW5pdGlhbEFuZEVtcHR5KSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodik7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzUGVyY2VudGFnZSgpIHx8IHRoaXMuaXNQZXJtaWxsYWdlKCkgfHwgdGhpcy5pc051bWJlcigpKSB7XG4gICAgICBjb25zdCBudW1WYWwgPSBwYXJzZUZsb2F0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bVZhbCkpIHtcbiAgICAgICAgcmV0dXJuIG51bVZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkga2V5UHJlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgb25DaGFuZ2UgPSAodmFsdWUpOiB2b2lkID0+IHt9O1xuICBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVnZXhwU2VydmljZTogUmVnZXhwU2VydmljZSkge31cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0VmFsdWVJbkNvbnRyb2wodmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIG1hcmtBc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIH1cbiAgLy8gRW5kIG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuXG4gIHByaXZhdGUgc2V0VmFsdWVJbkNvbnRyb2wodjogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9tYWluID09PSAnZGF0ZScpIHtcbiAgICAgIHYgPSBub3JtYWxpemVEYXRlKHYpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdjtcbiAgICB9XG4gICAgaWYgKHRoaXMudGV4dGFyZWEpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEubmF0aXZlRWxlbWVudC52YWx1ZSA9IHY7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdG9yIGludGVyZmFjZVxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKCk6IHZvaWQge31cblxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICFoYXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5yZXF1aXJlZCA9IHsgdmFsdWUsIHJlYXNvbjogJ1JlcXVpcmVkIGZpZWxkLicgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlZ2V4cCAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgIXRoaXMuX3JlZ2V4cC50ZXN0KHZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LnBhdHRlcm4gPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICByZWFzb246IGBWYWx1ZSBtdXN0IGZvbGxvdyB0aGUgcGF0dGVybjogJHt0aGlzLl9wYXR0ZXJufWBcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdlbWFpbCcgJiYgaGFzVmFsdWUodmFsdWUpICYmICFpc1ZhbGlkRW1haWwodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQuZW1haWwgPSB7IHZhbHVlLCByZWFzb246ICdJbnZhbGlkIGVtYWlsLicgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VybCcgJiYgaGFzVmFsdWUodmFsdWUpICYmICFpc1ZhbGlkUmVsYXRpdmVVcmwodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQudXJsID0geyB2YWx1ZSwgcmVhc29uOiAnSW52YWxpZCBVUkwuJyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSAnY29sb3InICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiAhaXNWYWxpZENvbG9yKHZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LmNvbG9yID0geyB2YWx1ZSwgcmVhc29uOiAnSW52YWxpZCBjb2xvci4nIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdudW1iZXInICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiAhaXNWYWxpZE51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5udW1lcmljID0geyB2YWx1ZSwgcmVhc29uOiAnSW52YWxpZCBudW1iZXIuJyB9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLnR5cGUgPT09ICdkYXRlJyB8fFxuICAgICAgdGhpcy50eXBlID09PSAndGltZScgfHxcbiAgICAgIHRoaXMudHlwZSA9PT0gJ3RpbWVzdGFtcCdcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHRoaXMubWluID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBoYXNWYWx1ZSh2YWx1ZSkgJiZcbiAgICAgICAgU3RyaW5nKHZhbHVlKS5sb2NhbGVDb21wYXJlKHRoaXMubWluKSA9PT0gLTFcbiAgICAgICkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICAgIHJlc3VsdC5taW4gPSB7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICByZWFzb246IGBWYWx1ZSBpcyBsb3dlciB0aGFuIG1pbmltdW0gdmFsdWU6ICR7dGhpcy5taW59LmBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHRoaXMubWF4ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBoYXNWYWx1ZSh2YWx1ZSkgJiZcbiAgICAgICAgU3RyaW5nKHZhbHVlKS5sb2NhbGVDb21wYXJlKHRoaXMubWF4KSAhPT0gLTFcbiAgICAgICkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICAgIHJlc3VsdC5tYXggPSB7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICByZWFzb246IGBWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhhbiBtYXhpbXVtIHZhbHVlOiAke3RoaXMubWF4fS5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy50eXBlID09PSAncGVyY2VudGFnZScgfHxcbiAgICAgIHRoaXMudHlwZSA9PT0gJ3Blcm1pbGxhZ2UnIHx8XG4gICAgICB0aGlzLnR5cGUgPT09ICdudW1iZXInIHx8XG4gICAgICB0aGlzLnR5cGUgPT09ICdjdXJyZW5jeSdcbiAgICApIHtcbiAgICAgIGlmIChoYXNWYWx1ZSh0aGlzLm1pbikgJiYgaGFzVmFsdWUodmFsdWUpICYmIHZhbHVlIDwgK3RoaXMubWluKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0Lm1pbiA9IHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgIHJlYXNvbjogYFZhbHVlIGlzIGxvd2VyIHRoYW4gbWluaW11bSB2YWx1ZTogJHt0aGlzLm1pbn0uYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGhhc1ZhbHVlKHRoaXMubWF4KSAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgdmFsdWUgPiArdGhpcy5tYXgpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHQubWF4ID0ge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgcmVhc29uOiBgVmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoYW4gbWF4aW11bSB2YWx1ZTogJHt0aGlzLm1heH0uYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxhc3RFcnJvcnMgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBFbmQgb2YgVmFsaWRhdG9yIGludGVyZmFjZVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJZCA9IHRoaXMuaW5wdXRJZFxuICAgICAgPyB0aGlzLmlucHV0SWRcbiAgICAgIDogYCR7dGhpcy50eXBlfSQke0lucHV0Q29tcG9uZW50LmlkQ291bnRlcisrfWA7XG4gIH1cbiAgb25Mb3N0Rm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbiAgb25LZXlVcChuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIG9uQ2hhbmdlVmFsdWUobmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5pc0NvbG9yKCkpIHtcbiAgICAgIHRoaXMuY29sb3JwaWNrZXIubmF0aXZlRWxlbWVudC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5UHJlc3MuZW1pdChldmVudCk7XG4gIH1cbiAgb25Db2xvclBpY2tlZChuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZVZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnNldFZhbHVlSW5Db250cm9sKG5ld1ZhbHVlKTtcbiAgfVxuXG4gIGlzVXJsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICd1cmwnO1xuICB9XG4gIGlzQ29sb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2NvbG9yJztcbiAgfVxuICBpc051bWJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnbnVtYmVyJztcbiAgfVxuICBpc1BlcmNlbnRhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3BlcmNlbnRhZ2UnO1xuICB9XG4gIGlzUGVybWlsbGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAncGVybWlsbGFnZSc7XG4gIH1cbiAgaGFzUHJlZml4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbmN5ID09PSAnVVNEJztcbiAgfVxuICBoYXNQb3N0Zml4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1cnJlbmN5ID09PSAnRVVSJyB8fFxuICAgICAgdGhpcy5pc1BlcmNlbnRhZ2UoKSB8fFxuICAgICAgdGhpcy5pc1Blcm1pbGxhZ2UoKSB8fFxuICAgICAgKHRoaXMuaXNVcmwoKSAmJiAhIXRoaXMudmFsdWUpIHx8XG4gICAgICB0aGlzLmlzQ29sb3IoKVxuICAgICk7XG4gIH1cblxuICBjaGVja0NsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkXG4gICAgICA/IHRoaXMucmVhZG9ubHlcbiAgICAgICAgPyAnZGlzYWJsZWQgcmVhZG9ubHknXG4gICAgICAgIDogJ2Rpc2FibGVkJ1xuICAgICAgOiB0aGlzLnJlYWRvbmx5XG4gICAgICA/ICdyZWFkb25seSdcbiAgICAgIDogJyc7XG4gIH1cblxuICBjaGVja0NvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2NvbG9yJyAmJiBpc1ZhbGlkQ29sb3IodGhpcy52YWx1ZSlcbiAgICAgID8gdGhpcy52YWx1ZVxuICAgICAgOiAnaW5pdGlhbCc7XG4gIH1cblxuICBjaGVja1R5cGUodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgIHRoaXMuc2V0RW1haWxQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VybCc6XG4gICAgICAgIHRoaXMuc2V0VXJsUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2xvcic6XG4gICAgICAgIHRoaXMuc2V0Q29sb3JQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICB0aGlzLnNldERhdGVQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICB0aGlzLnNldFRpbWVQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Bhc3N3b3JkJzpcbiAgICAgICAgdGhpcy5zZXRQYXNzd29yZFBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgdGhpcy5zZXROdW1iZXJQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgdGhpcy5zZXRDdXJyZW5jeVBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGVyY2VudGFnZSc6XG4gICAgICAgIHRoaXMuc2V0UGVyY2VudGFnZVBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGVybWlsbGFnZSc6XG4gICAgICAgIHRoaXMuc2V0UGVybWlsbGFnZVBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc2V0RW1haWxQYXR0ZXJucygpOiB2b2lkIHt9XG5cbiAgc2V0VXJsUGF0dGVybnMoKTogdm9pZCB7fVxuXG4gIHNldENvbG9yUGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5kb21haW4gPSAndGV4dCc7XG4gIH1cblxuICBzZXREYXRlUGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5taW4gPSB0aGlzLm1pbiB8fCAnMTkwMC0wMS0wMSc7XG4gICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAnMjEwMC0wMS0wMSc7XG4gIH1cblxuICBzZXRUaW1lUGF0dGVybnMoKTogdm9pZCB7fVxuXG4gIHNldFBhc3N3b3JkUGF0dGVybnMoKTogdm9pZCB7fVxuXG4gIHNldE51bWJlclBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMuZG9tYWluID0gJ251bWJlcic7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9ICcwJztcbiAgfVxuXG4gIHNldEN1cnJlbmN5UGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5kb21haW4gPSAnbnVtYmVyJztcbiAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXAgfHwgMC4xO1xuICAgIHRoaXMubWluID0gdGhpcy5taW4gfHwgMC4wO1xuICAgIHRoaXMubWF4ID0gdGhpcy5tYXggfHwgMTAwMDAuMDtcbiAgICB0aGlzLnZhbHVlID0gMC4wO1xuICB9XG5cbiAgc2V0UGVyY2VudGFnZVBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMuZG9tYWluID0gJ251bWJlcic7XG4gICAgdGhpcy5zdGVwID0gdGhpcy5zdGVwIHx8IDAuMDE7XG4gICAgdGhpcy5taW4gPSB0aGlzLm1pbiB8fCAwLjA7XG4gICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAxMDAuMDtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gJzAuMDAnO1xuICB9XG5cbiAgc2V0UGVybWlsbGFnZVBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMuZG9tYWluID0gJ251bWJlcic7XG4gICAgdGhpcy5zdGVwID0gdGhpcy5zdGVwIHx8IDAuMDE7XG4gICAgdGhpcy5taW4gPSB0aGlzLm1pbiB8fCAwLjA7XG4gICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAxMDAwLjA7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9ICcwLjAwJztcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImN1cnJlbmN5ICYmIGN1cnJlbmN5ID09PSAnVVNEJ1wiIGNsYXNzPVwicHJlZml4IHJvdW5kZWQtbGVmdCBzeW1ib2xcIiBbbmdDbGFzc109XCJjbGFzc05hbWVcIj5cbiAgPHNwYW4+JDwvc3Bhbj5cbjwvZGl2PlxuPGlucHV0XG4gICNpbnB1dFxuICAqbmdJZj1cInR5cGUgIT09ICd0ZXh0YXJlYSdcIlxuICBbY2xhc3NdPVwiaGFzUHJlZml4KCkgPyAoaGFzUG9zdGZpeCgpID8gJ2luZml4JyA6ICdwb3N0Zml4IHJvdW5kZWQtcmlnaHQnKSA6IChoYXNQb3N0Zml4KCkgPyAncHJlZml4IHJvdW5kZWQtbGVmdCcgOiAncm91bmRlZCcpXCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgcGxhY2VtZW50PVwidG9wXCJcbiAgW2lkXT1cImlucHV0SWRcIlxuICBbdHlwZV09XCJkb21haW5cIlxuICBbYXR0ci52YWx1ZV09XCJ2YWx1ZVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5yZWFkb25seV09XCJyZWFkb25seSA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLm1pbl09XCJtaW4/LnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkXCJcbiAgW2F0dHIubWF4XT1cIm1heD8udG9TdHJpbmcoKSB8fCB1bmRlZmluZWRcIlxuICBbYXR0ci5zdGVwXT1cInN0ZXA/LnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkXCJcbiAgW2F0dHIucGF0dGVybl09XCJwYXR0ZXJuIHx8IHVuZGVmaW5lZFwiXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gIChrZXl1cCk9XCJvbktleVVwKGlucHV0LnZhbHVlKVwiXG4gIChjaGFuZ2UpPVwib25DaGFuZ2VWYWx1ZShpbnB1dC52YWx1ZSlcIlxuICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4vPlxuPHRleHRhcmVhXG4gICN0ZXh0YXJlYVxuICAqbmdJZj1cInR5cGUgPT09ICd0ZXh0YXJlYSdcIlxuICBjbGFzcz1cInJvdW5kZWRcIlxuICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICBbaWRdPVwiaW5wdXRJZFwiXG4gIFthdHRyLnZhbHVlXT1cInZhbHVlXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLnJlYWRvbmx5XT1cInJlYWRvbmx5ID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIuY29sc109XCJjb2xzPy50b1N0cmluZygpIHx8IHVuZGVmaW5lZFwiXG4gIFthdHRyLnJvd3NdPVwicm93cz8udG9TdHJpbmcoKSB8fCB1bmRlZmluZWRcIlxuICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAoa2V5dXApPVwib25LZXlVcCh0ZXh0YXJlYS52YWx1ZSlcIlxuICAoY2hhbmdlKT1cIm9uQ2hhbmdlVmFsdWUodGV4dGFyZWEudmFsdWUpXCJcbiAgKGtleXByZXNzKT1cIm9uS2V5UHJlc3MoJGV2ZW50KVwiXG4gIChibHVyKT1cIm9uTG9zdEZvY3VzKClcIlxuPjwvdGV4dGFyZWE+XG48ZGl2ICpuZ0lmPVwiY3VycmVuY3kgJiYgY3VycmVuY3kgPT09ICdFVVInXCIgY2xhc3M9XCJwb3N0Zml4IHJvdW5kZWQtcmlnaHQgc3ltYm9sXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxzcGFuPuKCrDwvc3Bhbj5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cImlzUGVyY2VudGFnZSgpXCIgY2xhc3M9XCJwb3N0Zml4IHJvdW5kZWQtcmlnaHQgc3ltYm9sXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxzcGFuPiU8L3NwYW4+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJpc1Blcm1pbGxhZ2UoKVwiIGNsYXNzPVwicG9zdGZpeCByb3VuZGVkLXJpZ2h0IHN5bWJvbFwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8c3Bhbj7igLA8L3NwYW4+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJpc1VybCgpICYmICEhdmFsdWVcIiBjbGFzcz1cInBvc3RmaXggcm91bmRlZC1yaWdodCBzeW1ib2wgY2xpY2thYmxlXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxhIGhyZWY9XCJ7eyB2YWx1ZSB9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1leHRlcm5hbFwiPjwvc3Bhbj5cbiAgPC9hPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiaXNDb2xvcigpXCIgY2xhc3M9XCJwb3N0Zml4IHJvdW5kZWQtcmlnaHQgYm9yZGVyZWQgdHJhbnNwYXJlbmN5XCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxkaXYgY2xhc3M9XCJyb3VuZGVkLXJpZ2h0IGZ1bGwtc3BhY2VcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiBjb2xvcn1cIj5cbiAgICA8aW5wdXRcbiAgICAgICNjb2xvcnBpY2tlclxuICAgICAgY2xhc3M9XCJtaW5pbWFsLXNwYWNlIGNsaWNrYWJsZSBpbnZpc2libGUgcm91bmRlZC1yaWdodCBmdWxsLXNwYWNlXCJcbiAgICAgIFtpZF09XCJpbnB1dElkICsgJyRjb2xvcnBpY2tlcidcIlxuICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgIFthdHRyLnZhbHVlXT1cInZhbHVlXCJcbiAgICAgIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgICAgIFthdHRyLnJlYWRvbmx5XT1cInJlYWRvbmx5ID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgICAgIChjaGFuZ2UpPVwib25Db2xvclBpY2tlZChjb2xvcnBpY2tlci52YWx1ZSlcIlxuICAgICAgKGtleXByZXNzKT1cIm9uS2V5UHJlc3MoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJvbkxvc3RGb2N1cygpXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiaW5saW5lRXJyb3JzICYmIGxhc3RFcnJvcnMgJiYgKGRpcnR5IHx8IHRvdWNoZWQpXCIgY2xhc3M9XCJhbGVydFwiPlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5yZXF1aXJlZFwiPlxuICAgIHt7IHVzZXJFcnJvcnNbdGhpcy5sYW5nXS5yZXF1aXJlZCB9fVxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMuZW1haWxcIj57eyB1c2VyRXJyb3JzW3RoaXMubGFuZ10uZW1haWwgfX08L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMudXJsXCI+e3sgdXNlckVycm9yc1t0aGlzLmxhbmddLnVybCB9fTwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5taW5cIj5cbiAgICB7eyB1c2VyRXJyb3JzW3RoaXMubGFuZ10ubWluLnJlcGxhY2UoJyRtaW4nLCBsYXN0RXJyb3JzLm1pbi5taW4pIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5tYXhcIj5cbiAgICB7eyB1c2VyRXJyb3JzW3RoaXMubGFuZ10ubWF4LnJlcGxhY2UoJyRtYXgnLCBsYXN0RXJyb3JzLm1heC5tYXgpIH19XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=