sf-crud 12.0.5 → 12.1.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 (47) hide show
  1. package/bundles/sf-crud.umd.js +2563 -1306
  2. package/bundles/sf-crud.umd.js.map +1 -1
  3. package/esm2015/lib/components/control/control.component.js +285 -73
  4. package/esm2015/lib/components/file-upload/file-upload.component.js +143 -0
  5. package/esm2015/lib/components/form/form.component.js +267 -0
  6. package/esm2015/lib/components/registro/registro.component.js +507 -407
  7. package/esm2015/lib/components/step/step.component.js +79 -0
  8. package/esm2015/lib/components/tablero/tablero.component.js +87 -27
  9. package/esm2015/lib/sf-crud.module.js +27 -15
  10. package/esm2015/lib/sf-crud.routing.module.js +23 -0
  11. package/esm2015/lib/sf-crud.service.js +486 -12
  12. package/esm2015/lib/shared/models/Conditions.model.js +81 -0
  13. package/esm2015/lib/shared/models/Empresa.model.js +2 -0
  14. package/esm2015/lib/shared/models/Reason.model.js +7 -0
  15. package/esm2015/lib/shared/models/crud-config.model.js +36 -13
  16. package/esm2015/lib/shared/models/shema.model.js +5 -1
  17. package/esm2015/lib/shared/services/general.service.js +41 -17
  18. package/esm2015/lib/shared/services/notification.service.js +83 -0
  19. package/esm2015/lib/shared/services/step.service.js +65 -0
  20. package/esm2015/public-api.js +7 -1
  21. package/fesm2015/sf-crud.js +2194 -1151
  22. package/fesm2015/sf-crud.js.map +1 -1
  23. package/lib/components/control/control.component.d.ts +39 -10
  24. package/lib/components/file-upload/file-upload.component.d.ts +34 -0
  25. package/lib/components/form/form.component.d.ts +58 -0
  26. package/lib/components/registro/registro.component.d.ts +81 -54
  27. package/lib/components/step/step.component.d.ts +27 -0
  28. package/lib/components/tablero/tablero.component.d.ts +15 -5
  29. package/lib/sf-crud.module.d.ts +80 -76
  30. package/lib/sf-crud.routing.module.d.ts +7 -0
  31. package/lib/sf-crud.service.d.ts +115 -5
  32. package/lib/shared/models/Conditions.model.d.ts +32 -0
  33. package/lib/shared/models/Empresa.model.d.ts +11 -0
  34. package/lib/shared/models/Reason.model.d.ts +5 -0
  35. package/lib/shared/models/crud-config.model.d.ts +76 -24
  36. package/lib/shared/models/shema.model.d.ts +27 -0
  37. package/lib/shared/services/general.service.d.ts +8 -1
  38. package/lib/shared/services/notification.service.d.ts +27 -0
  39. package/lib/shared/services/step.service.d.ts +27 -0
  40. package/package.json +9 -2
  41. package/public-api.d.ts +6 -0
  42. package/esm2015/lib/components/registro-child/registro-child.component.js +0 -348
  43. package/esm2015/lib/components/registro-detalle/registro-detalle.component.js +0 -232
  44. package/esm2015/lib/shared/models/data-temp-crud.model.js +0 -6
  45. package/lib/components/registro-child/registro-child.component.d.ts +0 -48
  46. package/lib/components/registro-detalle/registro-detalle.component.d.ts +0 -36
  47. package/lib/shared/models/data-temp-crud.model.d.ts +0 -4
@@ -1,47 +1,175 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewChildren } from '@angular/core';
2
2
  import { Shema } from '../../shared/models/shema.model';
3
+ import { RequestChecking } from '../../shared/models/crud-config.model';
4
+ import { Tooltip } from 'primeng/tooltip';
3
5
  import * as moment from 'moment';
6
+ import * as jsonpath from 'jsonpath';
4
7
  import * as i0 from "@angular/core";
5
8
  import * as i1 from "../../shared/services/general.service";
6
- import * as i2 from "primeng/inputmask";
7
- import * as i3 from "primeng/dropdown";
8
- import * as i4 from "primeng/autocomplete";
9
- import * as i5 from "primeng/calendar";
10
- import * as i6 from "primeng/inputnumber";
11
- import * as i7 from "primeng/fileupload";
12
- import * as i8 from "primeng/inputswitch";
13
- import * as i9 from "@angular/common";
14
- import * as i10 from "@angular/forms";
15
- import * as i11 from "primeng/inputtext";
16
- import * as i12 from "primeng/inputtextarea";
17
- import * as i13 from "primeng/button";
18
- import * as i14 from "primeng/api";
9
+ import * as i2 from "../../sf-crud.service";
10
+ import * as i3 from "../../shared/services/notification.service";
11
+ import * as i4 from "primeng/inputmask";
12
+ import * as i5 from "primeng/dropdown";
13
+ import * as i6 from "primeng/autocomplete";
14
+ import * as i7 from "../file-upload/file-upload.component";
15
+ import * as i8 from "primeng/calendar";
16
+ import * as i9 from "primeng/inputnumber";
17
+ import * as i10 from "primeng/multiselect";
18
+ import * as i11 from "primeng/inputswitch";
19
+ import * as i12 from "@angular/common";
20
+ import * as i13 from "primeng/tooltip";
21
+ import * as i14 from "@angular/forms";
22
+ import * as i15 from "primeng/inputtext";
23
+ import * as i16 from "primeng/inputtextarea";
24
+ import * as i17 from "primeng/button";
19
25
  export class ControlComponent {
20
- constructor(generalService) {
26
+ constructor(generalService, crudService, cdr, notificationService) {
21
27
  this.generalService = generalService;
28
+ this.crudService = crudService;
29
+ this.cdr = cdr;
30
+ this.notificationService = notificationService;
31
+ this.showTempValue = false;
22
32
  this.control = new Shema();
23
33
  this.label = '';
24
34
  this.setValue = new EventEmitter();
25
- this.sendNotification = new EventEmitter();
26
35
  this.sendObject = new EventEmitter();
27
36
  this.isLoading = false;
28
37
  this.dataFromService = [];
29
38
  this.uploadedFiles = [];
30
39
  this.displayAdd = false;
31
- this.tempValue = {};
40
+ this.uploadingFiles = false;
41
+ }
42
+ ngOnChanges(changes) {
32
43
  }
33
44
  ngOnInit() {
34
- var _a;
35
- if (((_a = this.control) === null || _a === void 0 ? void 0 : _a.config) && this.control.subtype == 'dropdown')
45
+ var _a, _b;
46
+ this.loadDefaultValues();
47
+ if ((_b = (_a = this.control) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.depends) {
48
+ this.crudService.changeData$.subscribe(res => {
49
+ var _a, _b;
50
+ if (res) {
51
+ let registro = this.crudService.getRegistro(this.crudService.index);
52
+ let keyFound = (_a = registro.keys) === null || _a === void 0 ? void 0 : _a.find(k => k.scope === res.scope
53
+ && this.control.config.depends.includes(k.key) &&
54
+ (res.index === k.indexData || res.index === k.indexAnswer));
55
+ if (keyFound === null || keyFound === void 0 ? void 0 : keyFound.overrideControl) {
56
+ let override = keyFound.overrideControl;
57
+ let completed = this.crudService.isConditionsCompleted((_b = override.conditions) !== null && _b !== void 0 ? _b : [], registro.conditions || [], this.crudService.getData(this.crudService.index));
58
+ jsonpath.value(this.control, override.property, completed ? override.value : override.elseValue);
59
+ this.value = this.getNewValue(override, completed);
60
+ this.tempValue = null;
61
+ this.sendValue();
62
+ if (this.control.subtype == 'dropdown' || this.control.subtype == 'multiselect')
63
+ this.loadDataFromService();
64
+ //this.cdr.detectChanges()
65
+ }
66
+ else if (keyFound) {
67
+ this.value = null;
68
+ this.sendValue();
69
+ this.loadDefaultValues();
70
+ //this.cdr.detectChanges()
71
+ }
72
+ }
73
+ });
74
+ }
75
+ }
76
+ getNewValue(override, completed) {
77
+ const newValue = completed ? override.newPropertyValue : override.elseNewPropertyValue;
78
+ if (newValue && typeof (newValue) == "string") {
79
+ if (!newValue.startsWith('$') && !newValue.startsWith('@')) {
80
+ return newValue;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ loadDefaultValues() {
86
+ var _a, _b, _c, _d, _e;
87
+ if (((_a = this.control) === null || _a === void 0 ? void 0 : _a.config) && this.control.subtype == 'dropdown' || this.control.subtype == 'multiselect')
36
88
  this.loadDataFromService();
37
- if (this.value && this.control.subtype == 'autocomplete')
38
- this.setDefaultValue();
89
+ if (((_b = this.control) === null || _b === void 0 ? void 0 : _b.subtype) == 'autocomplete')
90
+ this.extracValueFromControlBusqueda();
39
91
  if (this.value && this.control.type == 'date')
40
- this.setDate();
92
+ this.instanceDate();
93
+ if (((_c = this.control) === null || _c === void 0 ? void 0 : _c.subtype) == "file") {
94
+ this.loadFiles();
95
+ }
96
+ if (((_d = this.control) === null || _d === void 0 ? void 0 : _d.type) == 'string')
97
+ this.lenghtWord = this.value ? this.value.length : 0;
98
+ if (((_e = this.control) === null || _e === void 0 ? void 0 : _e.subtype) == 'switch')
99
+ this.instanceBoolField();
100
+ }
101
+ instanceBoolField() {
102
+ this.tempValue = this.value;
103
+ if (this.value == true && this.control.trueValue !== undefined) {
104
+ this.value = this.control.trueValue;
105
+ this.sendValue();
106
+ }
107
+ else if (this.value == false && this.control.falseValue !== undefined) {
108
+ this.value = this.control.falseValue;
109
+ this.sendValue();
110
+ }
111
+ }
112
+ onChangeSwitch() {
113
+ this.value = this.tempValue;
114
+ this.sendValue();
115
+ }
116
+ loadFiles() {
117
+ this.isLoading = true;
118
+ this.uploadedFiles = [];
119
+ if (!this.value) {
120
+ this.isLoading = false;
121
+ this.cdr.detectChanges();
122
+ }
123
+ else if (this.control.config.namePattern && this.control.type == "string") {
124
+ let urls = this.control.config.separator ? this.value.split(",") : [this.value];
125
+ urls.forEach(url => this.uploadedFiles.push({ url: url, name: this.getNameFile(this.control.config.namePattern, url) }));
126
+ this.isLoading = false;
127
+ this.cdr.detectChanges();
128
+ }
129
+ else if (this.control.config.namePattern && this.control.type == "array") {
130
+ this.value.forEach((url) => this.uploadedFiles.push({ url: url, name: this.getNameFile(this.control.config.namePattern, url) }));
131
+ this.isLoading = false;
132
+ this.cdr.detectChanges();
133
+ }
134
+ }
135
+ onDeleteFile(index) {
136
+ var _a, _b;
137
+ if ((!((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.limit) || ((_b = this.control.config) === null || _b === void 0 ? void 0 : _b.limit) == 1) && this.control.type == "string")
138
+ this.value = null;
139
+ else if (this.control.type == "array")
140
+ this.value.splice(index, 1);
141
+ }
142
+ getNameFile(namePattern, url) {
143
+ const regexObj = new RegExp(namePattern);
144
+ const match = regexObj.exec(url);
145
+ if (!match)
146
+ throw new Error("El pattern no coincide con la url. " + url);
147
+ return match[0];
41
148
  }
42
149
  sendValue() {
150
+ var _a;
151
+ if (this.control.type == "string" && this.value == "" && ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.allowEmpty) == false)
152
+ this.value = null;
43
153
  this.setValue.emit(this.value);
44
154
  }
155
+ sendNumberValue($event) {
156
+ this.value = $event.value;
157
+ this.sendValue();
158
+ }
159
+ onInputEmail(force) {
160
+ const aux = Math.abs(this.lenghtWord - this.value.length);
161
+ this.lenghtWord = this.value.length;
162
+ if (aux > 1 || force) {
163
+ const regex = new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/igm);
164
+ if (regex.test(this.value))
165
+ this.sendValue();
166
+ else {
167
+ this.value = null;
168
+ this.sendValue();
169
+ this.notificationService.addNotification({ severity: 'warn', detail: 'El correo no es válido' }, this.primeChecking());
170
+ }
171
+ }
172
+ }
45
173
  sendValueFromObject(event) {
46
174
  switch (typeof (this.control.config.optionValue)) {
47
175
  case 'object':
@@ -53,59 +181,86 @@ export class ControlComponent {
53
181
  break;
54
182
  }
55
183
  }
56
- validateValue(type) {
57
- switch (type) {
58
- case 'email':
59
- let regex = new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/igm);
60
- if (regex.test(this.value))
61
- this.sendValue();
62
- else {
63
- this.value = null;
64
- this.sendValue();
65
- this.sendNotification.emit({ severity: 'warn', detail: 'El correo no es válido' });
66
- }
67
- break;
68
- default:
69
- break;
70
- }
71
- }
72
184
  loadDataFromService() {
73
185
  this.isLoading = true;
74
186
  this.dataFromService = [];
75
- this.generalService.genericRequest(this.control.config.method, this.control.config.server, this.control.config.endpoint)
187
+ const op = this.control.config;
188
+ const url = this.crudService.getURL(op, undefined, undefined);
189
+ this.generalService.genericRequest(this.control.config.method, url)
76
190
  .then((res) => {
77
191
  this.dataFromService = res.data;
192
+ }).finally(() => {
78
193
  this.isLoading = false;
194
+ this.cdr.detectChanges();
79
195
  });
80
196
  }
81
197
  loadDataFromControlBusquedaService(event) {
82
198
  this.isLoading = true;
83
- this.generalService.genericRequest(this.control.config.method, this.control.config.server, this.control.config.endpoint.replace('@query', (event === null || event === void 0 ? void 0 : event.query) || ''))
199
+ const op = this.control.config;
200
+ let url = this.crudService.getURL(op);
201
+ url = url.replace('@query', (event === null || event === void 0 ? void 0 : event.query) || '');
202
+ this.generalService.genericRequest(this.control.config.method, url)
84
203
  .then((res) => {
204
+ var _a;
85
205
  this.dataFromService = res.data;
206
+ if (((_a = this.dataFromService) === null || _a === void 0 ? void 0 : _a.length) == 0 && this.control.allowCustomOption) {
207
+ //agregar un campo que el usuario haya digitado
208
+ let newItem = {};
209
+ newItem[this.control.field] = this.tempValue;
210
+ newItem[this.control.config.optionValue] = this.tempValue;
211
+ this.dataFromService.push(newItem);
212
+ }
213
+ }).finally(() => {
86
214
  this.isLoading = false;
215
+ this.cdr.detectChanges();
216
+ });
217
+ }
218
+ extracValueFromControlBusqueda() {
219
+ const op = this.control.config;
220
+ let url = this.crudService.getURL(op);
221
+ url = url.replace('@query', this.value);
222
+ this.generalService.genericRequest(this.control.config.method, url)
223
+ .then((res) => {
224
+ var _a;
225
+ if (((_a = res.data) === null || _a === void 0 ? void 0 : _a.length) == 1 && res.data[0][this.control.field]) {
226
+ this.tempValue = res.data[0];
227
+ this.value = res.data[0][this.control.field];
228
+ }
229
+ else
230
+ this.setDefaultValue();
231
+ }).finally(() => {
232
+ this.cdr.detectChanges();
233
+ }).catch(() => {
234
+ this.setDefaultValue();
87
235
  });
88
236
  }
89
237
  onUpload(event) {
90
- let file = event.files[0];
91
- let formData = new FormData();
92
- let path = 'Imagenes/CRUD/temp';
93
- formData.append('uploadFile', file);
238
+ this.uploadingFiles = true;
239
+ const formData = new FormData();
240
+ const path = this.control.config.path || 'Imagenes/CRUD/temp';
94
241
  formData.append('Ruta', `/${path}`);
95
- this.isLoading = true;
96
- this.generalService.genericRequest(this.control.config.method, this.control.config.server, this.control.config.endpoint, formData)
242
+ for (let i = 0; i < event.length; i++)
243
+ formData.append(`uploadFile_${i}`, event[i]);
244
+ const op = this.control.config;
245
+ const url = this.crudService.getURL(op);
246
+ this.generalService.genericRequest(this.control.config.method, url, formData)
97
247
  .then(() => {
98
- this.sendNotification.emit({ severity: 'info', detail: `Archivo cargado correctamente!` });
99
- this.uploadedFiles.push(file);
100
- this.isLoading = false;
101
- this.value = `${this.generalService.jsonConfig.Server}${path}/${file.name}`;
248
+ var _a;
249
+ let separator = ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.separator) || ",";
250
+ //se asume que viene namePattern
251
+ if (this.control.type == "string")
252
+ this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`).join(separator);
253
+ else if (this.control.type == "array")
254
+ this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`);
255
+ // SI NO TRAE namePattern, debe retornar un objeto con el nombre y href
256
+ //else if (this.control.config.namePattern && this.control.type == "array") this.value = event.map(x => x.name)
257
+ //else if (!this.control.config.namePattern && this.control.type == "array") this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`)
102
258
  this.sendValue();
259
+ let msg = !this.control.config.limit || this.control.config.limit == 1 ? "Archivo cargado correctamente!" : "Archivos cargados correctamente!";
260
+ this.notificationService.addNotification({ severity: 'info', detail: msg }, this.primeChecking());
103
261
  })
104
- .catch(err => {
105
- console.log(err);
106
- this.isLoading = false;
107
- this.sendNotification.emit({ severity: 'error', detail: `Error al cargar el archivo!` });
108
- });
262
+ .catch(() => this.notificationService.addNotification({ severity: 'error', detail: `Error al cargar el archivo!` }, this.primeChecking()))
263
+ .finally(() => this.uploadingFiles = false);
109
264
  }
110
265
  refresData() {
111
266
  var _a, _b;
@@ -113,44 +268,100 @@ export class ControlComponent {
113
268
  this.loadDataFromService();
114
269
  }
115
270
  setDefaultValue() {
116
- var _a;
117
- Object.defineProperty(this.tempValue, (_a = this.control.config) === null || _a === void 0 ? void 0 : _a.optionLabel, { value: this.value, writable: true, enumerable: true, configurable: true });
271
+ this.tempValue = {};
272
+ if (!this.control.config.optionLabel)
273
+ console.error("No esta bien configurado el control ", this.control);
274
+ else
275
+ this.tempValue[this.control.config.optionLabel] = this.value ? this.value : "";
118
276
  }
119
277
  searchValue(value) {
120
- let endpoint = this.control.config.endpoint.replace('@id', value);
121
- this.generalService.genericRequest(this.control.config.method, this.control.config.server, endpoint)
278
+ const op = this.control.config;
279
+ let url = this.crudService.getURL(op, undefined, undefined);
280
+ url = url.replace('@id', value);
281
+ this.generalService.genericRequest(this.control.config.method, url)
122
282
  .then((res) => {
123
283
  var _a;
124
284
  if (((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.length) > 0) {
125
285
  this.sendObject.emit({ data: res.data[0], optionValue: this.control.config.optionValue });
126
286
  }
127
287
  else {
128
- this.sendNotification.emit({ severity: 'warn', detail: `Valor no encontrado.` });
288
+ this.notificationService.addNotification({ severity: 'warn', detail: `Valor no encontrado.` }, this.primeChecking());
129
289
  this.sendObject.emit({ data: null, optionValue: this.control.config.optionValue });
130
290
  }
131
291
  })
132
292
  .catch(err => {
133
- console.log(err);
134
- this.sendNotification.emit({ severity: 'error', detail: `Error al consumir el servicio.` });
293
+ this.notificationService.addNotification({ severity: 'error', detail: `Error al consumir el servicio.` }, this.primeChecking());
135
294
  });
136
295
  }
137
- setDate() {
138
- let format = this.control.formatMoment;
139
- if (format && this.value && !(this.value instanceof Date)) {
140
- this.value = moment(this.value, format).toDate();
296
+ primeChecking() {
297
+ return new RequestChecking(undefined, undefined, false, undefined, undefined, false, undefined);
298
+ }
299
+ instanceDate() {
300
+ const format = this.control.formatMoment;
301
+ if (this.value) {
302
+ if (typeof (this.value) == "string" && this.value.includes("T"))
303
+ this.value = new Date(this.value);
304
+ else if (typeof (this.value) == "string")
305
+ this.value = moment(this.value, format).toDate();
306
+ this.tempValue = moment(this.value).format("DD/MM/YYYY");
307
+ }
308
+ else {
309
+ this.tempValue = null;
310
+ this.value = null;
311
+ }
312
+ }
313
+ /**
314
+ * Cast tempValue to date
315
+ */
316
+ onChangeSDate() {
317
+ const aux = moment(this.tempValue, "DD/MM/YYYY");
318
+ if (aux.isValid()) {
319
+ this.value = aux.toDate();
141
320
  this.sendValue();
142
321
  }
322
+ else {
323
+ this.tempValue = null;
324
+ this.notificationService.addNotification({ severity: 'warn', detail: 'La fecha no es válida' }, this.primeChecking());
325
+ }
326
+ }
327
+ onChangeDate() {
328
+ this.tempValue = moment(this.value).format("DD/MM/YYYY");
329
+ this.sendValue();
330
+ }
331
+ onTouchDescription() {
332
+ var _a;
333
+ try {
334
+ (_a = this.tooltips.get(0)) === null || _a === void 0 ? void 0 : _a.activate();
335
+ }
336
+ catch (ex) { }
337
+ }
338
+ onUnTouchDescription() {
339
+ var _a;
340
+ try {
341
+ (_a = this.tooltips.get(0)) === null || _a === void 0 ? void 0 : _a.deactivate();
342
+ }
343
+ catch (ex) { }
344
+ }
345
+ doFocusOut() {
346
+ if (document.activeElement) {
347
+ document.activeElement.blur();
348
+ }
349
+ this.cdr.detectChanges();
143
350
  }
144
351
  }
145
- ControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, deps: [{ token: i1.GeneralService }], target: i0.ɵɵFactoryTarget.Component });
146
- ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { control: "control", label: "label", value: "value", appendTo: "appendTo" }, outputs: { setValue: "setValue", sendNotification: "sendNotification", sendObject: "sendObject" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"control.type\" #cc>\r\n <label [for]=\"label\" style=\"width: -webkit-fill-available;\">{{label}}</label>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n [disabled]=\"control?.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [rows]=\"control?.rows ? control.rows : 4\" \r\n [(ngModel)]=\"value\" (focusout)=\"sendValue()\" pInputTextarea \r\n [disabled]=\"control?.disabled || false\" [autoResize]=\"control?.autoresize || false\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n [disabled]=\"control?.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" placeholder=\"email@example.com\"\r\n (focusout)=\"validateValue('email')\" [disabled]=\"control?.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <p-inputMask mask=\"(999) 999-9999\" [(ngModel)]=\"value\" placeholder=\"(999) 999-9999\"\r\n (focusout)=\"sendValue()\" [disabled]=\"control?.disabled || false\" [unmask]=\"control.unmask || false\"></p-inputMask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control?.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\"\r\n [optionValue]=\"control?.field || control.config.optionValue\" (onClick)=\"refresData()\"\r\n appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control?.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown:replace'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\"\r\n (onChange)=\"sendValueFromObject($event)\" [optionLabel]=\"control.config.optionLabel\"\r\n (onClick)=\"refresData()\" appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control?.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <p-autoComplete [showEmptyMessage]=\"true\" [suggestions]=\"dataFromService\" appendTo=\"body\"\r\n (completeMethod)=\"loadDataFromControlBusquedaService($event)\" [field]=\"control.field\"\r\n [minLength]=\"1\" (onSelect)=\"sendValueFromObject($event)\" [(ngModel)]=\"tempValue\"\r\n [disabled]=\"control?.disabled || false\"></p-autoComplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'input:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"text\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <p-calendar [(ngModel)]=\"value\" (onSelect)=\"sendValue()\" (onBlur)=\"sendValue()\" [monthNavigator]=\"true\"\r\n [yearNavigator]=\"true\" yearRange=\"1900:2035\" [dateFormat]=\"control?.format || 'yy-mm-dd'\"\r\n appendTo=\"body\" [disabled]=\"control?.disabled || false\" [showOnFocus]=\"!control?.hide\"\r\n [placeholder]=\"control?.placeholder || 'aaaa-mm-dd'\" [touchUI]=\"control?.touchUI || false\"\r\n [showIcon]=\"control?.showIcon || false\"></p-calendar>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numeric'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <p-inputNumber [(ngModel)]=\"value\" mode=\"currency\" [minFractionDigits]=\"control?.minFractionDigits || 0\"\r\n [min]=\"control?.min || null\" [max]=\"control?.max || null\" (focusout)=\"sendValue()\" [locale]=\"control?.locale || undefined\"\r\n [currency]=\"control?.currency || 'USD'\" [disabled]=\"control?.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <p-inputNumber [(ngModel)]=\"value\" mode=\"decimal\" (focusout)=\"sendValue()\" [min]=\"control?.min || null\"\r\n [max]=\"control?.max || null\" [minFractionDigits]=\"control?.minFractionDigits || 0\" [locale]=\"control?.locale || undefined\"\r\n [disabled]=\"control?.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percentage'\">\r\n <p-inputNumber [(ngModel)]=\"value\" suffix=\" %\" (focusout)=\"sendValue()\" [min]=\"control?.min || null\"\r\n [max]=\"control?.max || null\" [minFractionDigits]=\"control?.minFractionDigits || 2\" [locale]=\"control?.locale || undefined\"\r\n [disabled]=\"control?.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"number\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'filetmp'\">\r\n <p-fileUpload [accept]=\"control.config.accept\" [customUpload]=\"true\" (uploadHandler)=\"onUpload($event)\"\r\n [maxFileSize]=\"control.config?.maxFileSize || null\" fileLimit=\"1\">\r\n <ng-template pTemplate=\"content\">\r\n <ul *ngIf=\"uploadedFiles.length\">\r\n <li *ngFor=\"let file of uploadedFiles\">{{file.name}} - {{file.size}} bytes</li>\r\n </ul>\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"value\" (onChange)=\"sendValue()\" [id]=\"label\"></p-inputSwitch>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>", components: [{ type: i2.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown"] }, { type: i3.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }, { type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "virtualScroll", "itemSize", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "field", "scrollHeight", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide"] }, { type: i5.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i6.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "step", "inputStyle", "inputStyleClass", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i7.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler"] }, { type: i8.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "ariaLabelledBy"], outputs: ["onChange"] }], directives: [{ type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11.InputText, selector: "[pInputText]" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { type: i13.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i14.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
352
+ ControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, deps: [{ token: i1.GeneralService }, { token: i2.SfCrudService }, { token: i0.ChangeDetectorRef }, { token: i3.NotificationService }], target: i0.ɵɵFactoryTarget.Component });
353
+ ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { showTempValue: "showTempValue", control: "control", label: "label", value: "value", appendTo: "appendTo" }, outputs: { setValue: "setValue", sendObject: "sendObject" }, viewQueries: [{ propertyName: "tooltips", predicate: Tooltip, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<p *ngIf=\"showTempValue && tempValue\">{{tempValue[control.field]}}</p>\r\n\r\n<div *ngIf=\"!showTempValue\" [ngSwitch]=\"control.type\" #cc class=\"control-container\">\r\n <div class=\"label-container\">\r\n <label [for]=\"label\">{{label}}</label>\r\n <i #tooltip *ngIf=\"control.tooltip\" class=\"pi pi-question-circle\"\r\n [tooltipPosition]=\"control.tooltipPosition || 'top'\" [pTooltip]=\"control.tooltip\"\r\n (touchstart)=\"onTouchDescription()\" (touchend)=\"onUnTouchDescription()\"></i>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"'string'\" >\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText [name]=\"label\" type=\"text\" [(ngModel)]=\"value\" (input)=\"sendValue()\"\r\n [disabled]=\"control.disabled || false\" [autocomplete]=\"control.autocomplete || 'off'\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [rows]=\"control.config?.rows ? control.config.rows : 4\" [(ngModel)]=\"value\"\r\n (input)=\"sendValue()\" pInputTextarea [disabled]=\"control.config?.disabled || false\"\r\n [autoResize]=\"control.config?.autoresize || false\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (input)=\"sendValue()\"\r\n [disabled]=\"control.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" placeholder=\"email@example.com\"\r\n [disabled]=\"control.disabled || false\" autocomplete=\"email\" (input)=\"onInputEmail(false)\"\r\n (focusout)=\"onInputEmail(true)\" (keyup.enter)=\"doFocusOut()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <p-inputMask mask=\"(999) 999-9999\" [(ngModel)]=\"value\" placeholder=\"(999) 999-9999\"\r\n [disabled]=\"control.disabled || false\" autocomplete=\"tel-national\"\r\n [unmask]=\"control.unmask || false\" (onComplete)=\"sendValue()\"></p-inputMask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\"\r\n [optionValue]=\"control.field || control.config.optionValue\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown:replace'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\"\r\n (onChange)=\"sendValueFromObject($event)\" [optionLabel]=\"control.config.optionLabel\"\r\n appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <p-autoComplete [showEmptyMessage]=\"true\" [suggestions]=\"dataFromService\" appendTo=\"body\"\r\n (completeMethod)=\"loadDataFromControlBusquedaService($event)\" [field]=\"control.field\"\r\n [minLength]=\"1\" (onSelect)=\"sendValueFromObject($event)\" [(ngModel)]=\"tempValue\"\r\n [disabled]=\"control.disabled || false\"></p-autoComplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'input:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"text\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n (keyup.enter)=\"doFocusOut()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <sf-file-upload *ngIf=\"!isLoading\" [accept]=\"control.config?.accept || 'image/*,application/pdf'\"\r\n [loading]=\"uploadingFiles\" [files]=\"uploadedFiles\" [configName]=\"control.config?.configName\"\r\n [limit]=\"control.config?.limit || 1\" (onUpload)=\"onUpload($event)\"\r\n (onDeleteFile)=\"onDeleteFile($event)\"></sf-file-upload>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-inputgroup\">\r\n <p-inputMask [(ngModel)]=\"tempValue\" mask=\"99/99/9999\" [placeholder]=\"control.placeholder\"\r\n (onComplete)=\"onChangeSDate()\" [disabled]=\"control.disabled || false\"></p-inputMask>\r\n <p-calendar [(ngModel)]=\"value\" class=\"only-icon\" [monthNavigator]=\"true\" [yearNavigator]=\"true\" yearRange=\"1900:2035\"\r\n [dateFormat]=\"control.format || 'yy-mm-dd'\" appendTo=\"body\" [disabled]=\"control.disabled || false\"\r\n [showOnFocus]=\"!control.hide\" [placeholder]=\"control.placeholder || 'aaaa-mm-dd'\"\r\n [touchUI]=\"control.touchUI || false\" [showIcon]=\"control.showIcon || false\" (onSelect)=\"onChangeDate()\"\r\n (onBlur)=\"onChangeDate()\"></p-calendar>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numeric'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <p-inputNumber [ngModel]=\"value\" (ngModelChange)=\"value = $event; sendValue()\" mode=\"decimal\" [minFractionDigits]=\"control.minFractionDigits || 0\"\r\n [min]=\"control.min || null\" [max]=\"control.max || null\" (onInput)=\"sendNumberValue($event)\"\r\n [prefix]=\"control.currency || '$ '\" [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <p-inputNumber [ngModel]=\"value\" mode=\"decimal\" (ngModelChange)=\"value = $event; sendValue()\" [min]=\"control.min || null\"\r\n [max]=\"control.max || null\" [minFractionDigits]=\"control.minFractionDigits || 0\"\r\n [locale]=\"control.locale || undefined\" [useGrouping]=\"control.useGrouping || false\"\r\n [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percentage'\">\r\n <p-inputNumber [ngModel]=\"value\" suffix=\" %\" (ngModelChange)=\"value = $event; sendValue()\" (onInput)=\"sendValue()\" [min]=\"control.min || null\"\r\n [max]=\"control.max || null\" [minFractionDigits]=\"control.minFractionDigits || 2\"\r\n [locale]=\"control.locale || undefined\" [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"number\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n (keyup.enter)=\"doFocusOut()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'array'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <sf-file-upload *ngIf=\"!isLoading\" [loading]=\"uploadingFiles\" [files]=\"uploadedFiles\"\r\n [configName]=\"control.config?.configName\" [limit]=\"control.config?.limit || 1\"\r\n [accept]=\"control.config?.accept || 'image/*,application/pdf'\" (onUpload)=\"onUpload($event)\"\r\n (onDeleteFile)=\"onDeleteFile($event)\"></sf-file-upload>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'multiselect'\">\r\n <p-multiSelect [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config?.optionLabel\" [optionValue]=\"control.config?.optionValue\"\r\n [placeholder]=\"control.config?.placeholder\"\r\n [display]=\"control.config?.display || 'chip'\"></p-multiSelect>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"tempValue\" (onChange)=\"onChangeSwitch()\" [id]=\"label\"\r\n [trueValue]=\"control?.trueValue !== undefined ? control?.trueValue: null\"\r\n [falseValue]=\"control?.falseValue !== undefined ? control?.falseValue: null\"></p-inputSwitch>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n", styles: ["::ng-deep .label-container{& label{margin-right:10px;color:#55585b;font-size:17px}& i{font-size:1.1rem}}::ng-deep .p-tooltip{max-width:15rem;font-size:.85rem;text-align:center}.control-container ::ng-deep .p-button:hover{background:var(--secondary-color)!important;border-color:var(--secondary-color)!important;filter:brightness(85%)}.control-container ::ng-deep .p-component,.control-container ::ng-deep .p-component *{border-radius:6px}.control-container ::ng-deep .p-inputtext{font-size:17px;border:1px solid #d1d5db;border-radius:6px}.control-container ::ng-deep .p-inputtext:focus,.control-container ::ng-deep .p-inputtext:active,.control-container ::ng-deep .p-inputwrapper:focus,.control-container ::ng-deep .p-inputwrapper:active{border-color:var(--button-color)}.control-container ::ng-deep .p-inputtext:enabled:focus{border-color:var(--secondary-color)!important;box-shadow:inset 0 0 0 1px #fff}.control-container ::ng-deep input.p-inputtext::placeholder{color:#6b7280;font-family:sans-serif;font-size:18px}.control-container ::ng-deep .p-dropdown{background:#ffffff;border:1px solid #d1d5db;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:6px}.control-container ::ng-deep .p-dropdown:not(.p-disabled):hover{border-color:var(--secondary-color)!important}.control-container ::ng-deep .p-dropdown:not(.p-disabled).p-focus{border-color:var(--secondary-color)!important;box-shadow:inset 0 0 0 1px #fff}.control-container ::ng-deep .p-dropdown .p-inputtext{border:none}.control-container ::ng-deep .p-dropdown .p-dropdown-label.p-placeholder{font-family:sans-serif;color:#6b7280}.control-container ::ng-deep .p-button.p-button-danger,.control-container ::ng-deep .p-buttonset.p-button-danger>.p-button,.control-container ::ng-deep .p-splitbutton.p-button-danger>.p-button{border-color:var(--secondary-color)!important;background:var(--secondary-color)!important}.control-container ::ng-deep .p-inputgroup button:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px}.control-container ::ng-deep .p-inputgroup input:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.control-container ::ng-deep .p-inputgroup input:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.control-container ::ng-deep .p-datepicker-touch-ui .p-datepicker-title{padding:3px}.control-container ::ng-deep .p-datepicker-month,.control-container ::ng-deep .p-datepicker-month:focus,.control-container ::ng-deep .p-datepicker-year:focus,.control-container ::ng-deep .p-datepicker-year{border:none}.p-inputgroup{& p-calendar{display:contents;& input{display:none}& .p-button-icon-only{border-top-left-radius:0;border-bottom-left-radius:0}}& p-inputMask{display:contents;& ::ng-deep input{border-top-right-radius:0;border-bottom-right-radius:0}}}@media (max-width <=768px){:host{font-size:14px}}\n"], components: [{ type: i4.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown"] }, { type: i5.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }, { type: i6.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "virtualScroll", "itemSize", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "field", "scrollHeight", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide"] }, { type: i7.FileUploadComponent, selector: "sf-file-upload", inputs: ["limit", "files", "loading", "configName", "accept"], outputs: ["onUpload", "onDeleteFile"] }, { type: i8.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "step", "inputStyle", "inputStyleClass", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i11.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "ariaLabelledBy"], outputs: ["onChange"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i12.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i15.InputText, selector: "[pInputText]" }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { type: i17.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i14.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
147
354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, decorators: [{
148
355
  type: Component,
149
356
  args: [{
150
357
  selector: 'sf-control',
151
- templateUrl: './control.component.html'
358
+ templateUrl: './control.component.html',
359
+ styleUrls: ['./control.component.css'],
360
+ changeDetection: ChangeDetectionStrategy.OnPush
152
361
  }]
153
- }], ctorParameters: function () { return [{ type: i1.GeneralService }]; }, propDecorators: { control: [{
362
+ }], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.SfCrudService }, { type: i0.ChangeDetectorRef }, { type: i3.NotificationService }]; }, propDecorators: { showTempValue: [{
363
+ type: Input
364
+ }], control: [{
154
365
  type: Input
155
366
  }], label: [{
156
367
  type: Input
@@ -160,9 +371,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
160
371
  type: Input
161
372
  }], setValue: [{
162
373
  type: Output
163
- }], sendNotification: [{
164
- type: Output
165
374
  }], sendObject: [{
166
375
  type: Output
376
+ }], tooltips: [{
377
+ type: ViewChildren,
378
+ args: [Tooltip]
167
379
  }] } });
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBTWpDLE1BQU0sT0FBTyxnQkFBZ0I7SUFnQjNCLFlBQ1UsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBZi9CLFlBQU8sR0FBVSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzdCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFHbEIsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3RELHFCQUFnQixHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3RFLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUzRCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBQzVCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFRLEVBQUUsQ0FBQTtJQUl0QixDQUFDO0lBRUwsUUFBUTs7UUFDTixJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxNQUFNLEtBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxP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QUksQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLEVBQUM7WUFDdkQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7U0FFakI7SUFDSCxDQUFDOzs4R0FwSVUsZ0JBQWdCO2tHQUFoQixnQkFBZ0IsMk9DVjdCLG8zUEFpSGU7NEZEdkdGLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsV0FBVyxFQUFFLDBCQUEwQjtpQkFDeEM7cUdBR1UsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9nZW5lcmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2YtY29udHJvbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRyb2wuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgY29udHJvbDogU2hlbWEgPSBuZXcgU2hlbWEoKTtcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcclxuICBASW5wdXQoKSBhcHBlbmRUbzogYW55O1xyXG4gIEBPdXRwdXQoKSBzZXRWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VuZE5vdGlmaWNhdGlvbjogRXZlbnRFbWl0dGVyPE1lc3NhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxNZXNzYWdlPigpO1xyXG4gIEBPdXRwdXQoKSBzZW5kT2JqZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRhdGFGcm9tU2VydmljZTogYW55W10gPSBbXTtcclxuICBwdWJsaWMgdXBsb2FkZWRGaWxlczogYW55W10gPSBbXTtcclxuICBwdWJsaWMgZGlzcGxheUFkZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0ZW1wVmFsdWU6IGFueSA9IHt9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZyAmJiB0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnZHJvcGRvd24nKSB0aGlzLmxvYWREYXRhRnJvbVNlcnZpY2UoKTtcclxuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdhdXRvY29tcGxldGUnKSB0aGlzLnNldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy5jb250cm9sLnR5cGUgPT0gJ2RhdGUnKSB0aGlzLnNldERhdGUoKTtcclxuICB9XHJcblxyXG4gIHNlbmRWYWx1ZSgpIHtcclxuICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNlbmRWYWx1ZUZyb21PYmplY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgc3dpdGNoICh0eXBlb2YgKHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUpKSB7XHJcbiAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZS5mb3JFYWNoKChvcDogYW55KSA9PiBvcFsndmFsdWUnXSA9IGV2ZW50W29wLmtleV0pXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZS5lbWl0KHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUuZW1pdChldmVudFt0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVZhbHVlKHR5cGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICBsZXQgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoLyhbXFx3XFwuXFwtX10rKT9cXHcrQFtcXHctX10rKFxcLlxcdyspezEsfS9pZ20pO1xyXG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMudmFsdWUpKSB0aGlzLnNlbmRWYWx1ZSgpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0VsIGNvcnJlbyBubyBlcyB2w6FsaWRvJyB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWREYXRhRnJvbVNlcnZpY2UoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IFtdO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdGhpcy5jb250cm9sLmNvbmZpZy5zZXJ2ZXIsIHRoaXMuY29udHJvbC5jb25maWcuZW5kcG9pbnQpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUZyb21TZXJ2aWNlID0gcmVzLmRhdGE7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGxvYWREYXRhRnJvbUNvbnRyb2xCdXNxdWVkYVNlcnZpY2UoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdGhpcy5jb250cm9sLmNvbmZpZy5zZXJ2ZXIsIHRoaXMuY29udHJvbC5jb25maWcuZW5kcG9pbnQucmVwbGFjZSgnQHF1ZXJ5JywgZXZlbnQ/LnF1ZXJ5IHx8ICcnKSlcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UgPSByZXMuZGF0YTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25VcGxvYWQoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IGZpbGUgPSBldmVudC5maWxlc1swXTtcclxuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgbGV0IHBhdGggPSAnSW1hZ2VuZXMvQ1JVRC90ZW1wJztcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkRmlsZScsIGZpbGUpO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKCdSdXRhJywgYC8ke3BhdGh9YCk7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcnZlciwgdGhpcy5jb250cm9sLmNvbmZpZy5lbmRwb2ludCwgZm9ybURhdGEpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnaW5mbycsIGRldGFpbDogYEFyY2hpdm8gY2FyZ2FkbyBjb3JyZWN0YW1lbnRlIWAgfSlcclxuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaChmaWxlKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBgJHt0aGlzLmdlbmVyYWxTZXJ2aWNlLmpzb25Db25maWcuU2VydmVyfSR7cGF0aH0vJHtmaWxlLm5hbWV9YFxyXG4gICAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnZXJyb3InLCBkZXRhaWw6IGBFcnJvciBhbCBjYXJnYXIgZWwgYXJjaGl2byFgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICByZWZyZXNEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuY29udHJvbD8uY29uZmlnPy5lbmRwb2ludHRlbXApIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVmYXVsdFZhbHVlKCl7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy50ZW1wVmFsdWUsIHRoaXMuY29udHJvbC5jb25maWc/Lm9wdGlvbkxhYmVsLCB7IHZhbHVlOiB0aGlzLnZhbHVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pXHJcbiAgfVxyXG5cclxuICBzZWFyY2hWYWx1ZSh2YWx1ZTogc3RyaW5nKXtcclxuICAgIGxldCBlbmRwb2ludCA9IHRoaXMuY29udHJvbC5jb25maWcuZW5kcG9pbnQucmVwbGFjZSgnQGlkJywgdmFsdWUpXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcnZlciwgZW5kcG9pbnQpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGhpcy5zZW5kT2JqZWN0LmVtaXQoeyBkYXRhOiByZXMuZGF0YVswXSwgb3B0aW9uVmFsdWU6IHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUgfSApXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7c2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOmBWYWxvciBubyBlbmNvbnRyYWRvLmB9KVxyXG4gICAgICAgICAgdGhpcy5zZW5kT2JqZWN0LmVtaXQoeyBkYXRhOiBudWxsLCBvcHRpb25WYWx1ZTogdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZSB9IClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnI9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbi5lbWl0KHtzZXZlcml0eTogJ2Vycm9yJywgZGV0YWlsOmBFcnJvciBhbCBjb25zdW1pciBlbCBzZXJ2aWNpby5gfSlcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIHNldERhdGUoKXtcclxuICAgIGxldCBmb3JtYXQgPSAodGhpcy5jb250cm9sIGFzIGFueSkuZm9ybWF0TW9tZW50XHJcbiAgICBcclxuICAgIGlmKGZvcm1hdCAmJiB0aGlzLnZhbHVlICYmICEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpKXtcclxuICAgICAgdGhpcy52YWx1ZSA9IG1vbWVudCh0aGlzLnZhbHVlLCBmb3JtYXQpLnRvRGF0ZSgpO1xyXG4gICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcblxyXG4gICAgfSBcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC50eXBlXCIgI2NjPlxyXG4gICAgPGxhYmVsIFtmb3JdPVwibGFiZWxcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlO1wiPnt7bGFiZWx9fTwvbGFiZWw+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RyaW5nJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIFtyb3dzXT1cImNvbnRyb2w/LnJvd3MgPyBjb250cm9sLnJvd3MgOiA0XCIgIFxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIHBJbnB1dFRleHRhcmVhIFxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCIgW2F1dG9SZXNpemVdPVwiY29udHJvbD8uYXV0b3Jlc2l6ZSB8fCBmYWxzZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGFzc3dvcmQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlbWFpbCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiZW1haWxAZXhhbXBsZS5jb21cIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ2YWxpZGF0ZVZhbHVlKCdlbWFpbCcpXCIgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE1hc2sgbWFzaz1cIig5OTkpIDk5OS05OTk5XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiKDk5OSkgOTk5LTk5OTlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiIFt1bm1hc2tdPVwiY29udHJvbC51bm1hc2sgfHwgZmFsc2VcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VudW0nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJjb250cm9sLmVudW1cIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIiBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbbGF6eV09XCJpc0xvYWRpbmdcIiBbb3B0aW9uc109XCJkYXRhRnJvbVNlcnZpY2VcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29udHJvbC5jb25maWcub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb250cm9sPy5maWVsZCB8fCBjb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZVwiIChvbkNsaWNrKT1cInJlZnJlc0RhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCIgcGxhY2Vob2xkZXI9XCJTZWxlY2Npb25lIHVuYSBvcGNpw7NuXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd246cmVwbGFjZSdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtsYXp5XT1cImlzTG9hZGluZ1wiIFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZUZyb21PYmplY3QoJGV2ZW50KVwiIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZy5vcHRpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwicmVmcmVzRGF0YSgpXCIgYXBwZW5kVG89XCJib2R5XCIgcGxhY2Vob2xkZXI9XCJTZWxlY2Npb25lIHVuYSBvcGNpw7NuXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXV0b2NvbXBsZXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFtzaG93RW1wdHlNZXNzYWdlXT1cInRydWVcIiBbc3VnZ2VzdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwibG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZSgkZXZlbnQpXCIgW2ZpZWxkXT1cImNvbnRyb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5MZW5ndGhdPVwiMVwiIChvblNlbGVjdCk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIiBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWF1dG9Db21wbGV0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dDpzZWFyY2gnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1zZWFyY2hcIiAoY2xpY2spPVwic2VhcmNoVmFsdWUodmFsdWUpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FsZW5kYXInXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uU2VsZWN0KT1cInNlbmRWYWx1ZSgpXCIgKG9uQmx1cik9XCJzZW5kVmFsdWUoKVwiIFttb250aE5hdmlnYXRvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbeWVhck5hdmlnYXRvcl09XCJ0cnVlXCIgeWVhclJhbmdlPVwiMTkwMDoyMDM1XCIgW2RhdGVGb3JtYXRdPVwiY29udHJvbD8uZm9ybWF0IHx8ICd5eS1tbS1kZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiIFtzaG93T25Gb2N1c109XCIhY29udHJvbD8uaGlkZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2w/LnBsYWNlaG9sZGVyIHx8ICdhYWFhLW1tLWRkJ1wiIFt0b3VjaFVJXT1cImNvbnRyb2w/LnRvdWNoVUkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SWNvbl09XCJjb250cm9sPy5zaG93SWNvbiB8fCBmYWxzZVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1lcmljJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgbW9kZT1cImN1cnJlbmN5XCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbnRyb2w/Lm1pbkZyYWN0aW9uRGlnaXRzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5dPVwiY29udHJvbD8ubWluIHx8IG51bGxcIiBbbWF4XT1cImNvbnRyb2w/Lm1heCB8fCBudWxsXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCIgW2xvY2FsZV09XCJjb250cm9sPy5sb2NhbGUgfHwgdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiY29udHJvbD8uY3VycmVuY3kgfHwgJ1VTRCdcIiBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwidmFsdWVcIiBtb2RlPVwiZGVjaW1hbFwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIFttaW5dPVwiY29udHJvbD8ubWluIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXhdPVwiY29udHJvbD8ubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbD8ubWluRnJhY3Rpb25EaWdpdHMgfHwgMFwiIFtsb2NhbGVdPVwiY29udHJvbD8ubG9jYWxlIHx8IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3BlcmNlbnRhZ2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgc3VmZml4PVwiICVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIiBbbWluXT1cImNvbnRyb2w/Lm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2w/Lm1heCB8fCBudWxsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbnRyb2w/Lm1pbkZyYWN0aW9uRGlnaXRzIHx8IDJcIiBbbG9jYWxlXT1cImNvbnRyb2w/LmxvY2FsZSB8fCB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsOnNlYXJjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaFZhbHVlKHZhbHVlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGV0bXAnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1maWxlVXBsb2FkIFthY2NlcHRdPVwiY29udHJvbC5jb25maWcuYWNjZXB0XCIgW2N1c3RvbVVwbG9hZF09XCJ0cnVlXCIgKHVwbG9hZEhhbmRsZXIpPVwib25VcGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heEZpbGVTaXplXT1cImNvbnRyb2wuY29uZmlnPy5tYXhGaWxlU2l6ZSB8fCBudWxsXCIgZmlsZUxpbWl0PVwiMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInVwbG9hZGVkRmlsZXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGZpbGUgb2YgdXBsb2FkZWRGaWxlc1wiPnt7ZmlsZS5uYW1lfX0gLSB7e2ZpbGUuc2l6ZX19IGJ5dGVzPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLWZpbGVVcGxvYWQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIiBbaWRdPVwibGFiZWxcIj48L3AtaW5wdXRTd2l0Y2g+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQXFCLFlBQVksRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFFOUssT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBNkIsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFbkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBR2pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXJDLE1BQU0sT0FBTyxnQkFBZ0I7SUFxQjNCLFlBQ1UsY0FBOEIsRUFDOUIsV0FBMEIsRUFDMUIsR0FBc0IsRUFDdEIsbUJBQXdDO1FBSHhDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUMxQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdkJ6QyxrQkFBYSxHQUFXLEtBQUssQ0FBQztRQUM5QixZQUFPLEdBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR2xCLGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztR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OEdBaFZVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLGtRQVNiLE9BQU8scUVDMUJ2Qixvb1VBOElBOzRGRDdIYSxnQkFBZ0I7a0JBTjVCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFdBQVcsRUFBRSwwQkFBMEI7b0JBQ3ZDLFNBQVMsRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN0QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7bU1BR1UsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDZ0IsUUFBUTtzQkFBOUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFNoZW1hIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9zaGVtYS5tb2RlbCc7XHJcbmltcG9ydCB7IE9wZXJhdGlvbiwgT3ZlcnJpZGVDb25maWcsIFJlcXVlc3RDaGVja2luZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvY3J1ZC1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZkNydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2YtY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBBcmNoaXZvIH0gZnJvbSAnLi4vZmlsZS11cGxvYWQvZmlsZS11cGxvYWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIGpzb25wYXRoIGZyb20gJ2pzb25wYXRoJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2YtY29udHJvbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRyb2wuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvbnRyb2wuY29tcG9uZW50LmNzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBzaG93VGVtcFZhbHVlOkJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjb250cm9sOiBTaGVtYSA9IG5ldyBTaGVtYSgpO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB2YWx1ZTogYW55O1xyXG4gIEBJbnB1dCgpIGFwcGVuZFRvOiBhbnk7XHJcbiAgQE91dHB1dCgpIHNldFZhbHVlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZW5kT2JqZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBWaWV3Q2hpbGRyZW4oVG9vbHRpcCkgdG9vbHRpcHMhOiBRdWVyeUxpc3QgPFRvb2x0aXA+O1xyXG5cclxuICBwcml2YXRlIGxlbmdodFdvcmQhOiBudW1iZXI7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkYXRhRnJvbVNlcnZpY2U6IGFueVtdID0gW107XHJcbiAgcHVibGljIHVwbG9hZGVkRmlsZXM6IEFyY2hpdm9bXSA9IFtdO1xyXG4gIHB1YmxpYyBkaXNwbGF5QWRkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRlbXBWYWx1ZTogYW55O1xyXG5cclxuICBwdWJsaWMgdXBsb2FkaW5nRmlsZXMgPSBmYWxzZTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNydWRTZXJ2aWNlOiBTZkNydWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5sb2FkRGVmYXVsdFZhbHVlcygpXHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5jb25maWc/LmRlcGVuZHMpe1xyXG4gICAgICB0aGlzLmNydWRTZXJ2aWNlLmNoYW5nZURhdGEkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpe1xyXG4gICAgICAgICAgbGV0IHJlZ2lzdHJvID0gdGhpcy5jcnVkU2VydmljZS5nZXRSZWdpc3Rybyh0aGlzLmNydWRTZXJ2aWNlLmluZGV4KVxyXG4gICAgICAgICAgbGV0IGtleUZvdW5kID0gcmVnaXN0cm8ua2V5cz8uZmluZChrID0+IGsuc2NvcGUgPT09IHJlcy5zY29wZVxyXG4gICAgICAgICAgJiYgICh0aGlzLmNvbnRyb2wuY29uZmlnLmRlcGVuZHMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGsua2V5KSAmJlxyXG4gICAgICAgICAgKHJlcy5pbmRleCA9PT0gay5pbmRleERhdGEgfHwgcmVzLmluZGV4ID09PSBrLmluZGV4QW5zd2VyKSlcclxuICAgICAgICAgIGlmIChrZXlGb3VuZD8ub3ZlcnJpZGVDb250cm9sKXtcclxuICAgICAgICAgICAgbGV0IG92ZXJyaWRlID0ga2V5Rm91bmQub3ZlcnJpZGVDb250cm9sXHJcbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWQgPSB0aGlzLmNydWRTZXJ2aWNlLmlzQ29uZGl0aW9uc0NvbXBsZXRlZChvdmVycmlkZS5jb25kaXRpb25zID8/IFtdLCByZWdpc3Ryby5jb25kaXRpb25zIHx8IFtdLCB0aGlzLmNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5jcnVkU2VydmljZS5pbmRleCkpXHJcbiAgICAgICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuY29udHJvbCwgb3ZlcnJpZGUucHJvcGVydHksIGNvbXBsZXRlZCA/IG92ZXJyaWRlLnZhbHVlIDogb3ZlcnJpZGUuZWxzZVZhbHVlKVxyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShvdmVycmlkZSwgY29tcGxldGVkKTtcclxuICAgICAgICAgICAgdGhpcy50ZW1wVmFsdWUgPSBudWxsXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdkcm9wZG93bicgfHwgdGhpcy5jb250cm9sLnN1YnR5cGUgPT0gJ211bHRpc2VsZWN0JykgdGhpcy5sb2FkRGF0YUZyb21TZXJ2aWNlKClcclxuICAgICAgICAgICAgLy90aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGtleUZvdW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgICAgICAgdGhpcy5sb2FkRGVmYXVsdFZhbHVlcygpXHJcbiAgICAgICAgICAgIC8vdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmV3VmFsdWUob3ZlcnJpZGU6IE92ZXJyaWRlQ29uZmlnLCBjb21wbGV0ZWQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSBjb21wbGV0ZWQgPyBvdmVycmlkZS5uZXdQcm9wZXJ0eVZhbHVlOiBvdmVycmlkZS5lbHNlTmV3UHJvcGVydHlWYWx1ZTtcclxuICAgIGlmIChuZXdWYWx1ZSAmJiB0eXBlb2YobmV3VmFsdWUpID09IFwic3RyaW5nXCIpe1xyXG4gICAgICBpZiAoIW5ld1ZhbHVlLnN0YXJ0c1dpdGgoJyQnKSAmJiAhbmV3VmFsdWUuc3RhcnRzV2l0aCgnQCcpKXtcclxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbG9hZERlZmF1bHRWYWx1ZXMoKXtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZyAmJiB0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnZHJvcGRvd24nIHx8IHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdtdWx0aXNlbGVjdCcpIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbD8uc3VidHlwZSA9PSAnYXV0b2NvbXBsZXRlJykgdGhpcy5leHRyYWNWYWx1ZUZyb21Db250cm9sQnVzcXVlZGEoKTtcclxuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuY29udHJvbC50eXBlID09ICdkYXRlJykgdGhpcy5pbnN0YW5jZURhdGUoKTtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnN1YnR5cGUgPT0gXCJmaWxlXCIpIHtcclxuICAgICAgdGhpcy5sb2FkRmlsZXMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnR5cGUgPT0gJ3N0cmluZycpIHRoaXMubGVuZ2h0V29yZCA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLmxlbmd0aCA6IDBcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnN1YnR5cGUgPT0gJ3N3aXRjaCcpIHRoaXMuaW5zdGFuY2VCb29sRmllbGQoKVxyXG4gIH1cclxuICBpbnN0YW5jZUJvb2xGaWVsZCgpIHtcclxuICAgIHRoaXMudGVtcFZhbHVlID0gdGhpcy52YWx1ZVxyXG4gICAgaWYgKHRoaXMudmFsdWUgPT0gdHJ1ZSAmJiB0aGlzLmNvbnRyb2wudHJ1ZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udHJvbC50cnVlVmFsdWVcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy52YWx1ZSA9PSBmYWxzZSAmJiB0aGlzLmNvbnRyb2wuZmFsc2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRyb2wuZmFsc2VWYWx1ZVxyXG4gICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVN3aXRjaCgpe1xyXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudGVtcFZhbHVlXHJcbiAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgfVxyXG5cclxuICBsb2FkRmlsZXMoKXtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZVxyXG4gICAgdGhpcy51cGxvYWRlZEZpbGVzID0gW11cclxuICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGxldCB1cmxzOiBzdHJpbmdbXSA9IHRoaXMuY29udHJvbC5jb25maWcuc2VwYXJhdG9yID8gdGhpcy52YWx1ZS5zcGxpdChcIixcIikgOiBbdGhpcy52YWx1ZV1cclxuICAgICAgdXJscy5mb3JFYWNoKHVybCA9PiB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaCh7dXJsOnVybCwgIG5hbWU6dGhpcy5nZXROYW1lRmlsZSh0aGlzLmNvbnRyb2wuY29uZmlnLm5hbWVQYXR0ZXJuLCB1cmwpfSkpXHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wuY29uZmlnLm5hbWVQYXR0ZXJuICYmIHRoaXMuY29udHJvbC50eXBlID09IFwiYXJyYXlcIikge1xyXG4gICAgICB0aGlzLnZhbHVlLmZvckVhY2goKHVybDpzdHJpbmcpID0+IHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKHt1cmw6dXJsLCAgbmFtZTp0aGlzLmdldE5hbWVGaWxlKHRoaXMuY29udHJvbC5jb25maWcubmFtZVBhdHRlcm4sIHVybCl9KSlcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRGVsZXRlRmlsZShpbmRleDogbnVtYmVyKXtcclxuICAgIGlmICgoIXRoaXMuY29udHJvbC5jb25maWc/LmxpbWl0IHx8IHRoaXMuY29udHJvbC5jb25maWc/LmxpbWl0ID09IDEpICYmIHRoaXMuY29udHJvbC50eXBlID09IFwic3RyaW5nXCIpIHRoaXMudmFsdWUgPSBudWxsXHJcbiAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZUZpbGUobmFtZVBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVnZXhPYmogPSBuZXcgUmVnRXhwKG5hbWVQYXR0ZXJuKTtcclxuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhPYmouZXhlYyh1cmwpO1xyXG4gICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiRWwgcGF0dGVybiBubyBjb2luY2lkZSBjb24gbGEgdXJsLiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbWF0Y2hbMF07XHJcbiAgfVxyXG5cclxuICBzZW5kVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJzdHJpbmdcIiAmJiB0aGlzLnZhbHVlID09IFwiXCIgJiYgdGhpcy5jb250cm9sLmNvbmZpZz8uYWxsb3dFbXB0eSA9PSBmYWxzZSkgdGhpcy52YWx1ZSA9IG51bGxcclxuICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNlbmROdW1iZXJWYWx1ZSgkZXZlbnQ6IGFueSl7XHJcbiAgICB0aGlzLnZhbHVlID0gJGV2ZW50LnZhbHVlXHJcbiAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgfVxyXG5cclxuICBvbklucHV0RW1haWwoZm9yY2U6Ym9vbGVhbil7XHJcbiAgICBjb25zdCBhdXggPSBNYXRoLmFicyh0aGlzLmxlbmdodFdvcmQgLSB0aGlzLnZhbHVlLmxlbmd0aClcclxuICAgIHRoaXMubGVuZ2h0V29yZCA9IHRoaXMudmFsdWUubGVuZ3RoXHJcbiAgICBpZiAoYXV4ID4gMSB8fCBmb3JjZSl7XHJcbiAgICAgICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoLyhbXFx3XFwuXFwtX10rKT9cXHcrQFtcXHctX10rKFxcLlxcdyspezEsfS9pZ20pO1xyXG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMudmFsdWUpKSB0aGlzLnNlbmRWYWx1ZSgpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiAnRWwgY29ycmVvIG5vIGVzIHbDoWxpZG8nIH0sIHRoaXMucHJpbWVDaGVja2luZygpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZW5kVmFsdWVGcm9tT2JqZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHN3aXRjaCAodHlwZW9mICh0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlKSkge1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUuZm9yRWFjaCgob3A6IGFueSkgPT4gb3BbJ3ZhbHVlJ10gPSBldmVudFtvcC5rZXldKVxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNldFZhbHVlLmVtaXQoZXZlbnRbdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZV0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGFGcm9tU2VydmljZSgpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZGF0YUZyb21TZXJ2aWNlID0gW107XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5jcnVkU2VydmljZS5nZXRVUkwob3AsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IHJlcy5kYXRhO1xyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgbGV0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wKVxyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoJ0BxdWVyeScsIGV2ZW50Py5xdWVyeSB8fCAnJylcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QodGhpcy5jb250cm9sLmNvbmZpZy5tZXRob2QsIHVybClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UgPSByZXMuZGF0YTtcclxuICAgICAgICBpZiAodGhpcy5kYXRhRnJvbVNlcnZpY2U/Lmxlbmd0aCA9PSAwICYmIHRoaXMuY29udHJvbC5hbGxvd0N1c3RvbU9wdGlvbikge1xyXG4gICAgICAgICAgLy9hZ3JlZ2FyIHVuIGNhbXBvIHF1ZSBlbCB1c3VhcmlvIGhheWEgZGlnaXRhZG9cclxuICAgICAgICAgIGxldCBuZXdJdGVtOiBhbnkgPSB7fVxyXG4gICAgICAgICAgbmV3SXRlbVt0aGlzLmNvbnRyb2wuZmllbGRdID0gdGhpcy50ZW1wVmFsdWVcclxuICAgICAgICAgIG5ld0l0ZW1bdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZV0gPSB0aGlzLnRlbXBWYWx1ZVxyXG4gICAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UucHVzaChuZXdJdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGV4dHJhY1ZhbHVlRnJvbUNvbnRyb2xCdXNxdWVkYSgpe1xyXG4gICAgY29uc3Qgb3A6IE9wZXJhdGlvbiA9IHRoaXMuY29udHJvbC5jb25maWdcclxuICAgIGxldCB1cmwgPSB0aGlzLmNydWRTZXJ2aWNlLmdldFVSTChvcClcclxuICAgIHVybCA9IHVybC5yZXBsYWNlKCdAcXVlcnknLCB0aGlzLnZhbHVlKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLmRhdGE/Lmxlbmd0aCA9PSAxICYmIHJlcy5kYXRhWzBdW3RoaXMuY29udHJvbC5maWVsZF0pe1xyXG4gICAgICAgICAgdGhpcy50ZW1wVmFsdWUgPSByZXMuZGF0YVswXVxyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHJlcy5kYXRhWzBdW3RoaXMuY29udHJvbC5maWVsZF1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aGlzLnNldERlZmF1bHRWYWx1ZSgpXHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIG9uVXBsb2FkKGV2ZW50OiBGaWxlW10pIHtcclxuICAgIHRoaXMudXBsb2FkaW5nRmlsZXMgPSB0cnVlXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuY29udHJvbC5jb25maWcucGF0aCB8fCAnSW1hZ2VuZXMvQ1JVRC90ZW1wJztcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnUnV0YScsIGAvJHtwYXRofWApO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnQubGVuZ3RoOyBpKyspIGZvcm1EYXRhLmFwcGVuZChgdXBsb2FkRmlsZV8ke2l9YCwgZXZlbnRbaV0pO1xyXG4gICAgY29uc3Qgb3A6IE9wZXJhdGlvbiA9IHRoaXMuY29udHJvbC5jb25maWdcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsLCBmb3JtRGF0YSlcclxuICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgbGV0IHNlcGFyYXRvciA9IHRoaXMuY29udHJvbC5jb25maWc/LnNlcGFyYXRvciB8fCBcIixcIlxyXG4gICAgICAvL3NlIGFzdW1lIHF1ZSB2aWVuZSBuYW1lUGF0dGVyblxyXG4gICAgICBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJzdHJpbmdcIikgdGhpcy52YWx1ZSA9IGV2ZW50Lm1hcChmID0+IGAke3RoaXMuZ2VuZXJhbFNlcnZpY2UuanNvbkNvbmZpZy5TZXJ2ZXJ9JHtwYXRofS8ke2YubmFtZX1gKS5qb2luKHNlcGFyYXRvcilcclxuICAgICAgZWxzZSBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJhcnJheVwiKSB0aGlzLnZhbHVlID0gZXZlbnQubWFwKGYgPT4gYCR7dGhpcy5nZW5lcmFsU2VydmljZS5qc29uQ29uZmlnLlNlcnZlcn0ke3BhdGh9LyR7Zi5uYW1lfWApXHJcbiAgICAgIC8vIFNJIE5PIFRSQUUgbmFtZVBhdHRlcm4sIGRlYmUgcmV0b3JuYXIgdW4gb2JqZXRvIGNvbiBlbCBub21icmUgeSBocmVmXHJcbiAgICAgIC8vZWxzZSBpZiAodGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHRoaXMudmFsdWUgPSBldmVudC5tYXAoeCA9PiB4Lm5hbWUpXHJcbiAgICAgIC8vZWxzZSBpZiAoIXRoaXMuY29udHJvbC5jb25maWcubmFtZVBhdHRlcm4gJiYgdGhpcy5jb250cm9sLnR5cGUgPT0gXCJhcnJheVwiKSB0aGlzLnZhbHVlID0gZXZlbnQubWFwKGYgPT4gYCR7dGhpcy5nZW5lcmFsU2VydmljZS5qc29uQ29uZmlnLlNlcnZlcn0ke3BhdGh9LyR7Zi5uYW1lfWApXHJcbiAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgbGV0IG1zZyA9ICF0aGlzLmNvbnRyb2wuY29uZmlnLmxpbWl0IHx8IHRoaXMuY29udHJvbC5jb25maWcubGltaXQgPT0gMSA/IFwiQXJjaGl2byBjYXJnYWRvIGNvcnJlY3RhbWVudGUhXCI6IFwiQXJjaGl2b3MgY2FyZ2Fkb3MgY29ycmVjdGFtZW50ZSFcIlxyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHsgc2V2ZXJpdHk6ICdpbmZvJywgZGV0YWlsOiBtc2cgfSwgdGhpcy5wcmltZUNoZWNraW5nKCkpXHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKCgpID0+IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24oeyBzZXZlcml0eTogJ2Vycm9yJywgZGV0YWlsOiBgRXJyb3IgYWwgY2FyZ2FyIGVsIGFyY2hpdm8hYCB9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSkpXHJcbiAgICAuZmluYWxseSgoKSA9PiB0aGlzLnVwbG9hZGluZ0ZpbGVzID0gZmFsc2UpXHJcblxyXG4gIH1cclxuXHJcbiAgcmVmcmVzRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZz8uZW5kcG9pbnR0ZW1wKSB0aGlzLmxvYWREYXRhRnJvbVNlcnZpY2UoKTtcclxuICB9XHJcbiAgc2V0RGVmYXVsdFZhbHVlKCl7XHJcbiAgICB0aGlzLnRlbXBWYWx1ZSA9IHt9XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbC5jb25maWcub3B0aW9uTGFiZWwpIGNvbnNvbGUuZXJyb3IoXCJObyBlc3RhIGJpZW4gY29uZmlndXJhZG8gZWwgY29udHJvbCBcIiwgdGhpcy5jb250cm9sKVxyXG4gICAgZWxzZSB0aGlzLnRlbXBWYWx1ZVt0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvbkxhYmVsXSA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlOiBcIlwiXHJcblxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVmFsdWUodmFsdWU6IHN0cmluZyl7XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgbGV0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wLCB1bmRlZmluZWQsIHVuZGVmaW5lZClcclxuICAgIHVybCA9IHVybC5yZXBsYWNlKCdAaWQnLCB2YWx1ZSlcclxuXHJcblxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIHRoaXMuc2VuZE9iamVjdC5lbWl0KHsgZGF0YTogcmVzLmRhdGFbMF0sIG9wdGlvblZhbHVlOiB0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlIH0gKVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7c2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOmBWYWxvciBubyBlbmNvbnRyYWRvLmB9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSlcclxuICAgICAgICAgIHRoaXMuc2VuZE9iamVjdC5lbWl0KHsgZGF0YTogbnVsbCwgb3B0aW9uVmFsdWU6IHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUgfSApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24oe3NldmVyaXR5OiAnZXJyb3InLCBkZXRhaWw6YEVycm9yIGFsIGNvbnN1bWlyIGVsIHNlcnZpY2lvLmB9LHRoaXMucHJpbWVDaGVja2luZygpKVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpbWVDaGVja2luZygpe1xyXG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q2hlY2tpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZClcclxuICB9XHJcblxyXG4gIGluc3RhbmNlRGF0ZSgpe1xyXG4gICAgY29uc3QgZm9ybWF0ID0gKHRoaXMuY29udHJvbCBhcyBhbnkpLmZvcm1hdE1vbWVudFxyXG5cclxuICAgIGlmICh0aGlzLnZhbHVlKXtcclxuICAgICAgaWYgKHR5cGVvZih0aGlzLnZhbHVlKSA9PSBcInN0cmluZ1wiICYmICh0aGlzLnZhbHVlIGFzIHN0cmluZykuaW5jbHVkZXMoXCJUXCIpKSB0aGlzLnZhbHVlID0gbmV3IERhdGUodGhpcy52YWx1ZSlcclxuICAgICAgZWxzZSBpZiAodHlwZW9mKHRoaXMudmFsdWUpID09IFwic3RyaW5nXCIpIHRoaXMudmFsdWUgPSBtb21lbnQodGhpcy52YWx1ZSwgZm9ybWF0KS50b0RhdGUoKTtcclxuICAgICAgdGhpcy50ZW1wVmFsdWUgPSBtb21lbnQodGhpcy52YWx1ZSkuZm9ybWF0KFwiREQvTU0vWVlZWVwiKVxyXG4gICAgfWVsc2Uge1xyXG4gICAgICB0aGlzLnRlbXBWYWx1ZSA9IG51bGxcclxuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBDYXN0IHRlbXBWYWx1ZSB0byBkYXRlXHJcbiAgICovXHJcbiAgb25DaGFuZ2VTRGF0ZSgpe1xyXG4gICAgY29uc3QgYXV4ID0gbW9tZW50KHRoaXMudGVtcFZhbHVlLCBcIkREL01NL1lZWVlcIilcclxuICAgIGlmIChhdXguaXNWYWxpZCgpKXtcclxuICAgICAgdGhpcy52YWx1ZSA9IGF1eC50b0RhdGUoKTtcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudGVtcFZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0xhIGZlY2hhIG5vIGVzIHbDoWxpZGEnIH0sIHRoaXMucHJpbWVDaGVja2luZygpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG9uQ2hhbmdlRGF0ZSgpe1xyXG4gICAgdGhpcy50ZW1wVmFsdWUgPSBtb21lbnQodGhpcy52YWx1ZSkuZm9ybWF0KFwiREQvTU0vWVlZWVwiKVxyXG4gICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gIH1cclxuXHJcbiAgICBvblRvdWNoRGVzY3JpcHRpb24oKSB7XHJcbiAgICAgIHRyeXtcclxuICAgICAgICB0aGlzLnRvb2x0aXBzLmdldCgwKT8uYWN0aXZhdGUoKVxyXG4gICAgICB9Y2F0Y2goZXgpe31cclxuXHJcbiAgfVxyXG5cclxuICBvblVuVG91Y2hEZXNjcmlwdGlvbigpIHtcclxuICAgICAgdHJ5e1xyXG4gICAgICAgIHRoaXMudG9vbHRpcHMuZ2V0KDApPy5kZWFjdGl2YXRlKClcclxuICAgICAgfWNhdGNoKGV4KXt9XHJcbn1cclxuXHJcbiAgZG9Gb2N1c091dCgpe1xyXG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuYmx1cigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8cCAqbmdJZj1cInNob3dUZW1wVmFsdWUgJiYgdGVtcFZhbHVlXCI+e3t0ZW1wVmFsdWVbY29udHJvbC5maWVsZF19fTwvcD5cclxuXHJcbjxkaXYgKm5nSWY9XCIhc2hvd1RlbXBWYWx1ZVwiIFtuZ1N3aXRjaF09XCJjb250cm9sLnR5cGVcIiAjY2MgY2xhc3M9XCJjb250cm9sLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxsYWJlbCBbZm9yXT1cImxhYmVsXCI+e3tsYWJlbH19PC9sYWJlbD5cclxuICAgICAgICA8aSAjdG9vbHRpcCAqbmdJZj1cImNvbnRyb2wudG9vbHRpcFwiIGNsYXNzPVwicGkgcGktcXVlc3Rpb24tY2lyY2xlXCJcclxuICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJjb250cm9sLnRvb2x0aXBQb3NpdGlvbiB8fCAndG9wJ1wiIFtwVG9vbHRpcF09XCJjb250cm9sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAodG91Y2hzdGFydCk9XCJvblRvdWNoRGVzY3JpcHRpb24oKVwiICh0b3VjaGVuZCk9XCJvblVuVG91Y2hEZXNjcmlwdGlvbigpXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0cmluZydcIiA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFtuYW1lXT1cImxhYmVsXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGlucHV0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiIFthdXRvY29tcGxldGVdPVwiY29udHJvbC5hdXRvY29tcGxldGUgfHwgJ29mZidcIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0YXJlYSdcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBbcm93c109XCJjb250cm9sLmNvbmZpZz8ucm93cyA/IGNvbnRyb2wuY29uZmlnLnJvd3MgOiA0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNlbmRWYWx1ZSgpXCIgcElucHV0VGV4dGFyZWEgW2Rpc2FibGVkXT1cImNvbnRyb2wuY29uZmlnPy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiY29udHJvbC5jb25maWc/LmF1dG9yZXNpemUgfHwgZmFsc2VcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwYXNzd29yZCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJwYXNzd29yZFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAoaW5wdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZW1haWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBwbGFjZWhvbGRlcj1cImVtYWlsQGV4YW1wbGUuY29tXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiIGF1dG9jb21wbGV0ZT1cImVtYWlsXCIgKGlucHV0KT1cIm9uSW5wdXRFbWFpbChmYWxzZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJvbklucHV0RW1haWwodHJ1ZSlcIiAoa2V5dXAuZW50ZXIpPVwiZG9Gb2N1c091dCgpXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE1hc2sgbWFzaz1cIig5OTkpIDk5OS05OTk5XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiKDk5OSkgOTk5LTk5OTlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCIgYXV0b2NvbXBsZXRlPVwidGVsLW5hdGlvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICBbdW5tYXNrXT1cImNvbnRyb2wudW5tYXNrIHx8IGZhbHNlXCIgKG9uQ29tcGxldGUpPVwic2VuZFZhbHVlKClcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VudW0nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJjb250cm9sLmVudW1cIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIiBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkcm9wZG93bidcIj5cclxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtsYXp5XT1cImlzTG9hZGluZ1wiIFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZy5vcHRpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImNvbnRyb2wuZmllbGQgfHwgY29udHJvbC5jb25maWcub3B0aW9uVmFsdWVcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNjaW9uZSB1bmEgb3BjacOzblwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duOnJlcGxhY2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbbGF6eV09XCJpc0xvYWRpbmdcIiBbb3B0aW9uc109XCJkYXRhRnJvbVNlcnZpY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIiBbb3B0aW9uTGFiZWxdPVwiY29udHJvbC5jb25maWcub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIHBsYWNlaG9sZGVyPVwiU2VsZWNjaW9uZSB1bmEgb3BjacOzblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXV0b2NvbXBsZXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFtzaG93RW1wdHlNZXNzYWdlXT1cInRydWVcIiBbc3VnZ2VzdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwibG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZSgkZXZlbnQpXCIgW2ZpZWxkXT1cImNvbnRyb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5MZW5ndGhdPVwiMVwiIChvblNlbGVjdCk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIiBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtYXV0b0NvbXBsZXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0OnNlYXJjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwidmFsdWVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZG9Gb2N1c091dCgpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1zZWFyY2hcIiAoY2xpY2spPVwic2VhcmNoVmFsdWUodmFsdWUpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNmLWZpbGUtdXBsb2FkICpuZ0lmPVwiIWlzTG9hZGluZ1wiIFthY2NlcHRdPVwiY29udHJvbC5jb25maWc/LmFjY2VwdCB8fCAnaW1hZ2UvKixhcHBsaWNhdGlvbi9wZGYnXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJ1cGxvYWRpbmdGaWxlc1wiIFtmaWxlc109XCJ1cGxvYWRlZEZpbGVzXCIgW2NvbmZpZ05hbWVdPVwiY29udHJvbC5jb25maWc/LmNvbmZpZ05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtsaW1pdF09XCJjb250cm9sLmNvbmZpZz8ubGltaXQgfHwgMVwiIChvblVwbG9hZCk9XCJvblVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25EZWxldGVGaWxlKT1cIm9uRGVsZXRlRmlsZSgkZXZlbnQpXCI+PC9zZi1maWxlLXVwbG9hZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FsZW5kYXInXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TWFzayBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiIG1hc2s9XCI5OS85OS85OTk5XCIgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25DaGFuZ2VTRGF0ZSgpXCIgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgY2xhc3M9XCJvbmx5LWljb25cIiBbbW9udGhOYXZpZ2F0b3JdPVwidHJ1ZVwiIFt5ZWFyTmF2aWdhdG9yXT1cInRydWVcIiB5ZWFyUmFuZ2U9XCIxOTAwOjIwMzVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY29udHJvbC5mb3JtYXQgfHwgJ3l5LW1tLWRkJ1wiIGFwcGVuZFRvPVwiYm9keVwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93T25Gb2N1c109XCIhY29udHJvbC5oaWRlXCIgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wucGxhY2Vob2xkZXIgfHwgJ2FhYWEtbW0tZGQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3VjaFVJXT1cImNvbnRyb2wudG91Y2hVSSB8fCBmYWxzZVwiIFtzaG93SWNvbl09XCJjb250cm9sLnNob3dJY29uIHx8IGZhbHNlXCIgKG9uU2VsZWN0KT1cIm9uQ2hhbmdlRGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25DaGFuZ2VEYXRlKClcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1lcmljJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbbmdNb2RlbF09XCJ2YWx1ZVwiICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZSA9ICRldmVudDsgc2VuZFZhbHVlKClcIiBtb2RlPVwiZGVjaW1hbFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb250cm9sLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5dPVwiY29udHJvbC5taW4gfHwgbnVsbFwiIFttYXhdPVwiY29udHJvbC5tYXggfHwgbnVsbFwiIChvbklucHV0KT1cInNlbmROdW1iZXJWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbcHJlZml4XT1cImNvbnRyb2wuY3VycmVuY3kgfHwgJyQgJ1wiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbbmdNb2RlbF09XCJ2YWx1ZVwiIG1vZGU9XCJkZWNpbWFsXCIgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWUgPSAkZXZlbnQ7IHNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sLm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2wubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbnRyb2wubG9jYWxlIHx8IHVuZGVmaW5lZFwiIFt1c2VHcm91cGluZ109XCJjb250cm9sLnVzZUdyb3VwaW5nIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwZXJjZW50YWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgW25nTW9kZWxdPVwidmFsdWVcIiBzdWZmaXg9XCIgJVwiIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlID0gJGV2ZW50OyBzZW5kVmFsdWUoKVwiIChvbklucHV0KT1cInNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sLm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2wubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbnRyb2wubG9jYWxlIHx8IHVuZGVmaW5lZFwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWw6c2VhcmNoJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImRvRm9jdXNPdXQoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaFZhbHVlKHZhbHVlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXJyYXknXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNmLWZpbGUtdXBsb2FkICpuZ0lmPVwiIWlzTG9hZGluZ1wiIFtsb2FkaW5nXT1cInVwbG9hZGluZ0ZpbGVzXCIgW2ZpbGVzXT1cInVwbG9hZGVkRmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdOYW1lXT1cImNvbnRyb2wuY29uZmlnPy5jb25maWdOYW1lXCIgW2xpbWl0XT1cImNvbnRyb2wuY29uZmlnPy5saW1pdCB8fCAxXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImNvbnRyb2wuY29uZmlnPy5hY2NlcHQgfHwgJ2ltYWdlLyosYXBwbGljYXRpb24vcGRmJ1wiIChvblVwbG9hZCk9XCJvblVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25EZWxldGVGaWxlKT1cIm9uRGVsZXRlRmlsZSgkZXZlbnQpXCI+PC9zZi1maWxlLXVwbG9hZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXNlbGVjdCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZz8ub3B0aW9uTGFiZWxcIiBbb3B0aW9uVmFsdWVdPVwiY29udHJvbC5jb25maWc/Lm9wdGlvblZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29udHJvbC5jb25maWc/LnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJjb250cm9sLmNvbmZpZz8uZGlzcGxheSB8fCAnY2hpcCdcIj48L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoICBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZVN3aXRjaCgpXCIgW2lkXT1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFt0cnVlVmFsdWVdPVwiY29udHJvbD8udHJ1ZVZhbHVlICE9PSB1bmRlZmluZWQgPyBjb250cm9sPy50cnVlVmFsdWU6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgW2ZhbHNlVmFsdWVdPVwiY29udHJvbD8uZmFsc2VWYWx1ZSAhPT0gdW5kZWZpbmVkID8gY29udHJvbD8uZmFsc2VWYWx1ZTogbnVsbFwiPjwvcC1pbnB1dFN3aXRjaD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbiJdfQ==