form-aurora-stefanini 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/karma.conf.js +32 -0
- package/ng-package.json +7 -0
- package/package.json +17 -28
- package/src/lib/Components/from-aurora/form-aurora.component.css +117 -0
- package/src/lib/Components/from-aurora/form-aurora.component.html +343 -0
- package/src/lib/Components/from-aurora/form-aurora.component.spec.ts +25 -0
- package/src/lib/Components/from-aurora/form-aurora.component.ts +725 -0
- package/src/lib/Models/company-parameters.ts +16 -0
- package/src/lib/Models/company.ts +25 -0
- package/src/lib/Models/fill.ts +6 -0
- package/src/lib/Models/state.ts +5 -0
- package/src/lib/Models/step.ts +15 -0
- package/src/lib/Models/stepMethod.ts +9 -0
- package/src/lib/form-aurora.module.ts +18 -0
- package/src/lib/services/TemplateService.ts +84 -0
- package/src/lib/services/data.service.ts +83 -0
- package/src/lib/utils/regex.ts +51 -0
- package/src/public-api.ts +9 -0
- package/src/test.ts +21 -0
- package/tsconfig.lib.json +26 -0
- package/tsconfig.spec.json +17 -0
- package/tslint.json +17 -0
- package/bundles/form-aurora-stefanini.umd.js +0 -975
- package/bundles/form-aurora-stefanini.umd.js.map +0 -1
- package/bundles/form-aurora-stefanini.umd.min.js +0 -16
- package/bundles/form-aurora-stefanini.umd.min.js.map +0 -1
- package/esm2015/form-aurora-stefanini.js +0 -5
- package/esm2015/lib/fill.js +0 -3
- package/esm2015/lib/form-aurora.component.js +0 -681
- package/esm2015/lib/form-aurora.module.js +0 -22
- package/esm2015/public-api.js +0 -6
- package/esm5/form-aurora-stefanini.js +0 -5
- package/esm5/lib/fill.js +0 -7
- package/esm5/lib/form-aurora.component.js +0 -733
- package/esm5/lib/form-aurora.module.js +0 -25
- package/esm5/public-api.js +0 -6
- package/fesm2015/form-aurora-stefanini.js +0 -703
- package/fesm2015/form-aurora-stefanini.js.map +0 -1
- package/fesm5/form-aurora-stefanini.js +0 -758
- package/fesm5/form-aurora-stefanini.js.map +0 -1
- package/form-aurora-stefanini.d.ts +0 -4
- package/form-aurora-stefanini.metadata.json +0 -1
- package/lib/fill.d.ts +0 -6
- package/lib/form-aurora.component.d.ts +0 -106
- package/lib/form-aurora.module.d.ts +0 -2
- package/public-api.d.ts +0 -2
@@ -1,681 +0,0 @@
|
|
1
|
-
import * as tslib_1 from "tslib";
|
2
|
-
import { Component, Injectable, Input, ViewChild, Output, EventEmitter } from '@angular/core';
|
3
|
-
import { FormGroup, FormControl } from '@angular/forms';
|
4
|
-
import { HttpClient } from '@angular/common/http';
|
5
|
-
// import moment from 'moment';
|
6
|
-
import { NgbDateAdapter, NgbDateParserFormatter, NgbDatepickerI18n } from '@ng-bootstrap/ng-bootstrap';
|
7
|
-
import * as moment_ from 'moment';
|
8
|
-
const moment = moment_;
|
9
|
-
// import { regexType } from "@app/_shared/_util/regex";
|
10
|
-
// import { ExternalService } from '@app/_shared/_services/external.service';
|
11
|
-
// import { AuroraService } from '@app/_shared/_services/aurora.service';
|
12
|
-
/**
|
13
|
-
* This Service handles how the date is represented in scripts i.e. ngModel.
|
14
|
-
*/
|
15
|
-
let CustomAdapter = class CustomAdapter extends NgbDateAdapter {
|
16
|
-
// import { regexType } from "@app/_shared/_util/regex";
|
17
|
-
// import { ExternalService } from '@app/_shared/_services/external.service';
|
18
|
-
// import { AuroraService } from '@app/_shared/_services/aurora.service';
|
19
|
-
/**
|
20
|
-
* This Service handles how the date is represented in scripts i.e. ngModel.
|
21
|
-
*/
|
22
|
-
constructor() {
|
23
|
-
super(...arguments);
|
24
|
-
this.DELIMITER = '/';
|
25
|
-
}
|
26
|
-
fromModel(value) {
|
27
|
-
if (value) {
|
28
|
-
const date = value.split(this.DELIMITER);
|
29
|
-
return {
|
30
|
-
day: parseInt(date[0], 10),
|
31
|
-
month: parseInt(date[1], 10),
|
32
|
-
year: parseInt(date[2], 10)
|
33
|
-
};
|
34
|
-
}
|
35
|
-
return null;
|
36
|
-
}
|
37
|
-
toModel(date) {
|
38
|
-
//return date ? date.day + this.DELIMITER + date.month + this.DELIMITER + date.year : null;
|
39
|
-
return date ? (date.day < 10 ? 0 + date.day : date.day) + this.DELIMITER + (date.month < 10 ? 0 + date.month : date.month) + this.DELIMITER + date.year : '';
|
40
|
-
}
|
41
|
-
};
|
42
|
-
CustomAdapter = tslib_1.__decorate([
|
43
|
-
Injectable()
|
44
|
-
], CustomAdapter);
|
45
|
-
export { CustomAdapter };
|
46
|
-
/**
|
47
|
-
* This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
|
48
|
-
*/
|
49
|
-
let CustomDateParserFormatter = class CustomDateParserFormatter extends NgbDateParserFormatter {
|
50
|
-
/**
|
51
|
-
* This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
|
52
|
-
*/
|
53
|
-
constructor() {
|
54
|
-
super(...arguments);
|
55
|
-
this.DELIMITER = '/';
|
56
|
-
}
|
57
|
-
parse(value) {
|
58
|
-
if (value) {
|
59
|
-
const date = value.split(this.DELIMITER);
|
60
|
-
return {
|
61
|
-
day: parseInt(date[0], 10),
|
62
|
-
month: parseInt(date[1], 10),
|
63
|
-
year: parseInt(date[2], 10)
|
64
|
-
};
|
65
|
-
}
|
66
|
-
return null;
|
67
|
-
}
|
68
|
-
format(date) {
|
69
|
-
return date ? (date.day < 10 ? '0' + date.day : date.day) + this.DELIMITER + (date.month < 10 ? '0' + date.month : date.month) + this.DELIMITER + date.year : '';
|
70
|
-
}
|
71
|
-
};
|
72
|
-
CustomDateParserFormatter = tslib_1.__decorate([
|
73
|
-
Injectable()
|
74
|
-
], CustomDateParserFormatter);
|
75
|
-
export { CustomDateParserFormatter };
|
76
|
-
const I18N_VALUES = {
|
77
|
-
'es': {
|
78
|
-
weekdays: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],
|
79
|
-
months: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
|
80
|
-
weekLabel: 'sem'
|
81
|
-
}
|
82
|
-
// other languages you would support
|
83
|
-
};
|
84
|
-
let I18n = class I18n {
|
85
|
-
constructor() {
|
86
|
-
this.language = 'es';
|
87
|
-
}
|
88
|
-
};
|
89
|
-
I18n = tslib_1.__decorate([
|
90
|
-
Injectable()
|
91
|
-
], I18n);
|
92
|
-
export { I18n };
|
93
|
-
// Define custom service providing the months and weekdays translations
|
94
|
-
let CustomDatepickerI18n = class CustomDatepickerI18n extends NgbDatepickerI18n {
|
95
|
-
constructor(_i18n) {
|
96
|
-
super();
|
97
|
-
this._i18n = _i18n;
|
98
|
-
}
|
99
|
-
getWeekdayLabel(weekday) {
|
100
|
-
return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
|
101
|
-
}
|
102
|
-
getWeekLabel() {
|
103
|
-
return I18N_VALUES[this._i18n.language].weekLabel;
|
104
|
-
}
|
105
|
-
getMonthShortName(month) {
|
106
|
-
return I18N_VALUES[this._i18n.language].months[month - 1];
|
107
|
-
}
|
108
|
-
getMonthFullName(month) {
|
109
|
-
return this.getMonthShortName(month);
|
110
|
-
}
|
111
|
-
getDayAriaLabel(date) {
|
112
|
-
return `${date.day}-${date.month}-${date.year}`;
|
113
|
-
}
|
114
|
-
getWeekdayShortName(weekday) {
|
115
|
-
return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
|
116
|
-
}
|
117
|
-
;
|
118
|
-
};
|
119
|
-
CustomDatepickerI18n.ctorParameters = () => [
|
120
|
-
{ type: I18n }
|
121
|
-
];
|
122
|
-
CustomDatepickerI18n = tslib_1.__decorate([
|
123
|
-
Injectable()
|
124
|
-
], CustomDatepickerI18n);
|
125
|
-
export { CustomDatepickerI18n };
|
126
|
-
let FormAuroraComponent = class FormAuroraComponent {
|
127
|
-
constructor(http) {
|
128
|
-
this.http = http;
|
129
|
-
this.response = new EventEmitter();
|
130
|
-
this.summit = new EventEmitter();
|
131
|
-
this.setAcceptanceDocument = new EventEmitter();
|
132
|
-
this.tipodocNumDoc = false;
|
133
|
-
this.onSubmitEvent = false;
|
134
|
-
this.countSubmit = 0;
|
135
|
-
this.watchValid = false;
|
136
|
-
this.watchRequired = false;
|
137
|
-
this.captchaValid = false;
|
138
|
-
this.displayMonths = 2;
|
139
|
-
this.navigation = 'select';
|
140
|
-
this.showWeekNumbers = false;
|
141
|
-
this.outsideDays = 'visible';
|
142
|
-
this.respServiceSegmentation = null;
|
143
|
-
//emailPattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
|
144
|
-
this.today = moment(new Date());
|
145
|
-
this.maxYear = this.today.year();
|
146
|
-
this.minYear = this.today.year() - 82;
|
147
|
-
this.minDate = this.minYear.toString() + '-' + this.today.month().toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.minYear, month: this.today.month(), day: this.today.date()};
|
148
|
-
this.maxDate = this.maxYear.toString() + '-' + (this.today.month() + 1).toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.maxYear, month: this.today.month() + 1, day: this.today.date()};
|
149
|
-
//Revisar variables
|
150
|
-
this.recharge = false;
|
151
|
-
this.indicativo = '57';
|
152
|
-
this.defaultDocType = 'Cédula de ciudadanía';
|
153
|
-
this.range = new FormGroup({
|
154
|
-
start: new FormControl(),
|
155
|
-
end: new FormControl(),
|
156
|
-
});
|
157
|
-
}
|
158
|
-
ngOnInit() {
|
159
|
-
console.log('nueva version 0.1.0');
|
160
|
-
this.minDate = new Date(this.minDate).toISOString().split('T')[0];
|
161
|
-
setTimeout(() => {
|
162
|
-
this.startComponent();
|
163
|
-
}, 2000);
|
164
|
-
}
|
165
|
-
startComponent() {
|
166
|
-
//ordena los campos
|
167
|
-
if (this.dataForm != null && this.dataForm.formQuestions != undefined) {
|
168
|
-
//Same row fields
|
169
|
-
this.tipodocNumDoc = (this.dataForm.formQuestions.some(question => question.question.value === 'tipoDoc') && this.dataForm.formQuestions.some(question => question.question.value === 'numeroDoc')) ? true : false;
|
170
|
-
this.dataForm.formQuestions = this.dataForm.formQuestions.sort(function (a, b) {
|
171
|
-
return a.order - b.order;
|
172
|
-
});
|
173
|
-
let existcaptcha = this.dataForm.formQuestions.filter((item) => item.question.questionType.id == 6);
|
174
|
-
if (existcaptcha.length == 0) {
|
175
|
-
this.captchaValid = true;
|
176
|
-
}
|
177
|
-
for (const item of this.dataForm.formQuestions) {
|
178
|
-
if (item.question.maxlength == null || item.question.maxlength == undefined || item.question.maxlength == 0) {
|
179
|
-
item.question.maxlength = 524288; //defaultvalue
|
180
|
-
}
|
181
|
-
if (item.question.minLength == null || item.question.minLength == undefined) {
|
182
|
-
item.question.minLength = 0;
|
183
|
-
}
|
184
|
-
this.dataReloadForm.forEach(element => {
|
185
|
-
this.filldata = element;
|
186
|
-
if ((item.question.questionType.id === 2 || item.question.questionType.id === 1 ||
|
187
|
-
item.question.questionType.id === 3) && (this.filldata.data !== null &&
|
188
|
-
this.filldata.data !== undefined) && item.question.id === this.filldata.id) {
|
189
|
-
item.question.registred = this.filldata.data;
|
190
|
-
}
|
191
|
-
});
|
192
|
-
if (item.question.registred == null || item.question.minLength == undefined) {
|
193
|
-
item.question.registred = '';
|
194
|
-
}
|
195
|
-
}
|
196
|
-
}
|
197
|
-
}
|
198
|
-
resolvedCaptcha(captchaResponse) {
|
199
|
-
this.captchaValid = true;
|
200
|
-
if (!this.formDynamic.form.value.captcha) {
|
201
|
-
this.formDynamic.controls.captcha.setValue(captchaResponse);
|
202
|
-
this.formDynamic.form.value.captcha = captchaResponse;
|
203
|
-
document.getElementById('btnIng').style.opacity = !this.formDynamic.valid ? '0.65' : '1';
|
204
|
-
}
|
205
|
-
}
|
206
|
-
//Forms
|
207
|
-
//Metodo para evitar el render de los items del for
|
208
|
-
trackByIndex(index, obj) {
|
209
|
-
return index;
|
210
|
-
}
|
211
|
-
onChangeValidPatter(event, question) {
|
212
|
-
if (question.pattern != undefined) {
|
213
|
-
let valid = true;
|
214
|
-
let keyvalid = [8, 32, 37, 38, 39, 40, 46, 9];
|
215
|
-
//diferente de Backpsace
|
216
|
-
//se deja catch por error no controlable en otro tiempo de ejecucion
|
217
|
-
try {
|
218
|
-
if (!keyvalid.includes(event.keyCode)) {
|
219
|
-
const regex = new RegExp(question.pattern);
|
220
|
-
valid = regex.test(event.key);
|
221
|
-
}
|
222
|
-
}
|
223
|
-
catch (error) {
|
224
|
-
}
|
225
|
-
return valid;
|
226
|
-
}
|
227
|
-
document.getElementById('char' + question.value).setAttribute('hidden', 'true');
|
228
|
-
//if temporal mientras se migran todos los tipos de campos al foreach
|
229
|
-
if (question.questionType.id != 11 && question.questionType.id != 7) {
|
230
|
-
if (this.validMinLength(this.formDynamic, question)) {
|
231
|
-
document.getElementById(question.value).style.borderColor = '#FF0000';
|
232
|
-
document.getElementById('ml' + question.value).removeAttribute('hidden');
|
233
|
-
}
|
234
|
-
else {
|
235
|
-
document.getElementById(question.value).style.borderColor = '#E4E4E4';
|
236
|
-
document.getElementById('ml' + question.value).setAttribute('hidden', 'true');
|
237
|
-
}
|
238
|
-
if (this.validMaxLength(this.formDynamic, question)) {
|
239
|
-
document.getElementById(question.value).style.borderColor = '#FF0000';
|
240
|
-
document.getElementById('mxl' + question.value).removeAttribute('hidden');
|
241
|
-
}
|
242
|
-
else {
|
243
|
-
document.getElementById(question.value).style.borderColor = '#E4E4E4';
|
244
|
-
document.getElementById('mxl' + question.value).setAttribute('hidden', 'true');
|
245
|
-
}
|
246
|
-
}
|
247
|
-
this.dataForm.formQuestions.forEach(formQuestion => {
|
248
|
-
switch (formQuestion.question.questionType.id) {
|
249
|
-
//se valida campo de tipo calendario
|
250
|
-
case 7:
|
251
|
-
if (question.questionType.id == 7)
|
252
|
-
this.calendarRulesValidate(formQuestion);
|
253
|
-
break;
|
254
|
-
//se valida campo de tipo email
|
255
|
-
case 11:
|
256
|
-
if (question.questionType.id == 11)
|
257
|
-
this.emailRulesValidate(formQuestion);
|
258
|
-
break;
|
259
|
-
}
|
260
|
-
});
|
261
|
-
document.getElementById('btnIng').style.opacity = !this.formDynamic.valid ? '0.65' : '1';
|
262
|
-
}
|
263
|
-
validOnlyText(event) {
|
264
|
-
let regex = /^[a-zA-Z\u00C0-\u017F]+$/g;
|
265
|
-
if (event.charCode == 32) {
|
266
|
-
return true;
|
267
|
-
}
|
268
|
-
let valid = regex.test(event.key);
|
269
|
-
return valid;
|
270
|
-
}
|
271
|
-
validDate(event) {
|
272
|
-
/*let pattern = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20)[0-9]{2}/;
|
273
|
-
const regex = new RegExp(pattern);
|
274
|
-
valid = regex.test(event.key);
|
275
|
-
*/
|
276
|
-
const matches = String(event.key).match(this.regexType.date.exp);
|
277
|
-
let valid = true;
|
278
|
-
if (matches === null)
|
279
|
-
valid = false;
|
280
|
-
// alert(valid);
|
281
|
-
return valid;
|
282
|
-
}
|
283
|
-
onChangeValidDate(event) {
|
284
|
-
//let pattern = /(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12][0-9]|3[01])\/(?:19|20)[0-9]{2}/;
|
285
|
-
let dateN = /[0-9]|\//;
|
286
|
-
let valid = true;
|
287
|
-
const regex = new RegExp(dateN);
|
288
|
-
valid = regex.test(event.key);
|
289
|
-
return valid;
|
290
|
-
}
|
291
|
-
rediretoutside(event, question) {
|
292
|
-
//se deja catch por error no controlable en otro tiempo de ejecucion
|
293
|
-
try {
|
294
|
-
event.preventDefault();
|
295
|
-
window.open(question.value, '_blank');
|
296
|
-
}
|
297
|
-
catch (error) {
|
298
|
-
}
|
299
|
-
}
|
300
|
-
/**
|
301
|
-
* Dispatch submit event for validations exists
|
302
|
-
* @param change
|
303
|
-
*/
|
304
|
-
ngOnChanges(change) {
|
305
|
-
this.countSubmit++;
|
306
|
-
}
|
307
|
-
//onSubmit(form: NgForm) {
|
308
|
-
onSubmit() {
|
309
|
-
let form = this.formDynamic;
|
310
|
-
this.watchValid = true;
|
311
|
-
this.watchRequired = true;
|
312
|
-
if (form.valid) {
|
313
|
-
if (!this.validRulesFields(form.controls['numeroDoc'].value.toString(), form.controls['celular'].value.toString(), form.controls['email'].value))
|
314
|
-
return false;
|
315
|
-
}
|
316
|
-
if (this.validMinlenghtAllQuestions(form.value) && this.validMaxLengthAllQuestions(form.value) && form.valid) {
|
317
|
-
if (this.dataForm.urlSend != '' && this.captchaValid) {
|
318
|
-
this.http.post(this.dataForm.urlSend, form.value).subscribe((resp) => this.response.emit(resp));
|
319
|
-
}
|
320
|
-
else if (form.valid && this.captchaValid) {
|
321
|
-
this.summit.emit(form.value);
|
322
|
-
}
|
323
|
-
}
|
324
|
-
}
|
325
|
-
validRulesFields(numeroDoc, numeroCel, email) {
|
326
|
-
// Validaciones para celular en caso de indicativo en Colombia
|
327
|
-
let cel = document.getElementById('charcelular');
|
328
|
-
let doc = document.getElementById('charnumeroDoc');
|
329
|
-
let valOk = true;
|
330
|
-
if (this.indicativo == '+57' || this.indicativo == '57') {
|
331
|
-
let stringOrdenado = this.orderString(numeroDoc);
|
332
|
-
if (this.nameCompany.toUpperCase() !== 'CLARO') { //claro acepta nro consecutivos
|
333
|
-
if (numeroDoc == stringOrdenado) {
|
334
|
-
doc.style.borderColor = '#FF0000';
|
335
|
-
doc.removeAttribute('hidden');
|
336
|
-
doc.textContent = 'El numero documento No debe contener caracteres consecutivos';
|
337
|
-
valOk = false;
|
338
|
-
//this.msgErrorCampo = "El numero documento No debe contener caracteres consecutivos";
|
339
|
-
//return false;
|
340
|
-
}
|
341
|
-
}
|
342
|
-
if (numeroCel.substring(0, 1) != '3') {
|
343
|
-
cel.style.borderColor = '#FF0000';
|
344
|
-
cel.removeAttribute('hidden');
|
345
|
-
cel.textContent = 'El primer carácter del celular debe ser 3';
|
346
|
-
valOk = false;
|
347
|
-
//this.msgErrorCampo = "El primer carácter del celular debe ser 3";
|
348
|
-
//return false;
|
349
|
-
}
|
350
|
-
/*
|
351
|
-
if (parseInt(numeroCel.substring(0, 3)) > 350) {
|
352
|
-
cel.style.borderColor = "#FF0000";
|
353
|
-
cel.removeAttribute("hidden");
|
354
|
-
cel.textContent = "El prefijo del celular no debe ser mayor a 350";
|
355
|
-
valOk = false;
|
356
|
-
//this.msgErrorCampo = "El prefijo del celular no debe ser mayor a 350";
|
357
|
-
//return false;
|
358
|
-
}
|
359
|
-
*/
|
360
|
-
//En caso de que el número se repita, ejemplo 33333333
|
361
|
-
let listnumber = numeroDoc.substring(0, 1);
|
362
|
-
for (let index = 1; index < numeroDoc.length; index++) {
|
363
|
-
listnumber = listnumber + numeroDoc.substring(0, 1);
|
364
|
-
}
|
365
|
-
if (numeroDoc == listnumber) {
|
366
|
-
doc.style.borderColor = '#FF0000';
|
367
|
-
doc.removeAttribute('hidden');
|
368
|
-
doc.textContent = 'Caracteres numéricos no se pueden repetirse de manera continua ';
|
369
|
-
valOk = false;
|
370
|
-
//this.msgErrorCampo = "Caracteres numéricos no se pueden repetirse de manera continua ";
|
371
|
-
//return false;
|
372
|
-
}
|
373
|
-
// En caso de que el número se repita, ejemplo 33333333
|
374
|
-
let arrayPhoneRepeat = Array.from(String(numeroCel), Number);
|
375
|
-
let arrayPhoneOutRepeat = [...new Set(arrayPhoneRepeat)];
|
376
|
-
if (arrayPhoneOutRepeat.length == 1) {
|
377
|
-
cel.style.borderColor = '#FF0000';
|
378
|
-
cel.removeAttribute('hidden');
|
379
|
-
cel.textContent = 'El número que ingresa no es valido';
|
380
|
-
valOk = false;
|
381
|
-
//this.msgErrorCampo = "El número que ingresa no es valido";
|
382
|
-
//return false;
|
383
|
-
}
|
384
|
-
}
|
385
|
-
else if (this.indicativo == '+593' || this.indicativo == '593') {
|
386
|
-
if (numeroCel.substring(0, 1) != '9') {
|
387
|
-
cel.style.borderColor = '#FF0000';
|
388
|
-
cel.removeAttribute('hidden');
|
389
|
-
cel.textContent = 'El primer carácter del celular debe ser 9';
|
390
|
-
valOk = false;
|
391
|
-
//this.msgErrorCampo = "El primer carácter del celular debe ser 9";
|
392
|
-
//return false;
|
393
|
-
}
|
394
|
-
}
|
395
|
-
//se validan los campos por tipo de campo y no por value
|
396
|
-
this.dataForm.formQuestions.forEach(formQuestion => {
|
397
|
-
switch (formQuestion.question.questionType.id) {
|
398
|
-
//se valida campo de tipo email
|
399
|
-
case 11:
|
400
|
-
valOk = this.emailRulesValidate(formQuestion);
|
401
|
-
break;
|
402
|
-
}
|
403
|
-
});
|
404
|
-
return valOk;
|
405
|
-
}
|
406
|
-
orderString(value) {
|
407
|
-
let arrayNumber = [];
|
408
|
-
for (let index = 0; index < value.length; index++) {
|
409
|
-
arrayNumber.push(parseInt(value.substring(index, index + 1)));
|
410
|
-
}
|
411
|
-
//ordena el array
|
412
|
-
arrayNumber.sort(function (a, b) {
|
413
|
-
return a - b;
|
414
|
-
});
|
415
|
-
let numberOrder = '';
|
416
|
-
numberOrder = arrayNumber[0];
|
417
|
-
for (let index = 1; index < arrayNumber.length; index++) {
|
418
|
-
numberOrder = numberOrder + (arrayNumber[0] + index).toString();
|
419
|
-
}
|
420
|
-
return numberOrder;
|
421
|
-
}
|
422
|
-
validMinlenghtAllQuestions(form) {
|
423
|
-
for (const item of this.dataForm.formQuestions) {
|
424
|
-
if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
|
425
|
-
let minLength = parseInt(item.question.minLength);
|
426
|
-
let formValueLength = parseInt(form[item.question.value].toString().length);
|
427
|
-
if (minLength > 0 && formValueLength != minLength && formValueLength < minLength)
|
428
|
-
return false;
|
429
|
-
}
|
430
|
-
}
|
431
|
-
return true;
|
432
|
-
}
|
433
|
-
validMaxLengthAllQuestions(form) {
|
434
|
-
for (const item of this.dataForm.formQuestions) {
|
435
|
-
if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
|
436
|
-
let maxLength = parseInt(item.question.maxLength);
|
437
|
-
let formValueLength = parseInt(form[item.question.value].toString().length);
|
438
|
-
if (maxLength > 0 && formValueLength != maxLength && formValueLength > maxLength)
|
439
|
-
return false;
|
440
|
-
}
|
441
|
-
}
|
442
|
-
return true;
|
443
|
-
}
|
444
|
-
validRequired(form, question) {
|
445
|
-
//se deja catch por error no controlable en otro tiempo de ejecucion
|
446
|
-
try {
|
447
|
-
if (question != undefined && question.value != undefined) {
|
448
|
-
if (form.controls[question.value] != undefined &&
|
449
|
-
form.controls[question.value].errors != null &&
|
450
|
-
form.controls[question.value].errors.required) {
|
451
|
-
return true;
|
452
|
-
}
|
453
|
-
}
|
454
|
-
}
|
455
|
-
catch (error) {
|
456
|
-
}
|
457
|
-
return false;
|
458
|
-
}
|
459
|
-
validMinLength(form, question) {
|
460
|
-
//se deja catch por error no controlable en otro tiempo de ejecucion
|
461
|
-
try {
|
462
|
-
if (question != undefined && question.value != undefined) {
|
463
|
-
if (question.minLength > form.controls[question.value].value.toLocaleString().length && question.minLength > 0) {
|
464
|
-
return true;
|
465
|
-
}
|
466
|
-
}
|
467
|
-
}
|
468
|
-
catch (error) {
|
469
|
-
}
|
470
|
-
return false;
|
471
|
-
}
|
472
|
-
validMaxLength(form, question) {
|
473
|
-
//se deja catch por error no controlable en otro tiempo de ejecucion
|
474
|
-
try {
|
475
|
-
if (question != undefined && question.value != undefined) {
|
476
|
-
if (question.maxLength > 0) {
|
477
|
-
if (question.maxLength + 1 <= form.controls[question.value].value.toString().replace(/\./g, '').length) {
|
478
|
-
if (!this.formDynamic.controls[question.value].hasError('errorMaxLength')) {
|
479
|
-
this.formDynamic.controls[question.value].setErrors({ 'errorMaxLength': true });
|
480
|
-
}
|
481
|
-
return true;
|
482
|
-
}
|
483
|
-
}
|
484
|
-
}
|
485
|
-
}
|
486
|
-
catch (error) {
|
487
|
-
}
|
488
|
-
return false;
|
489
|
-
}
|
490
|
-
tycSelection(event) {
|
491
|
-
event.preventDefault();
|
492
|
-
let tyc = document.getElementById('txtPoliticas');
|
493
|
-
tyc.style.color = '#A3AD32';
|
494
|
-
// this.externalService.getTermsAndConditions().subscribe(resp => {
|
495
|
-
let b64 = null;
|
496
|
-
if (this.getTermsAndConditions && this.getTermsAndConditions.listaDocumentos) {
|
497
|
-
b64 = this.getTermsAndConditions.listaDocumentos[0].contenidoDocumento;
|
498
|
-
this.respServiceSegmentation = this.getTermsAndConditions.listaDocumentos[0];
|
499
|
-
let pdfWindow = window.open('');
|
500
|
-
pdfWindow.document.write('<iframe width=\'100%\' height=\'100%\' src=\'data:application/pdf;base64, ' +
|
501
|
-
encodeURI(b64) + '\'></iframe>');
|
502
|
-
}
|
503
|
-
// })
|
504
|
-
}
|
505
|
-
openLabelUrl(event, question) {
|
506
|
-
event.preventDefault();
|
507
|
-
let tyc = document.getElementById('check' + question.id);
|
508
|
-
tyc.style.color = '#A3AD32';
|
509
|
-
window.open(question.urllabel, '_blank');
|
510
|
-
}
|
511
|
-
checkTermsAndConditions(value) {
|
512
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
513
|
-
if (value) {
|
514
|
-
// let ipAddress = await this.auroraService.getIpAddress().toPromise();
|
515
|
-
let ipAddress = yield this.getIpAddress;
|
516
|
-
let objToSend = {
|
517
|
-
'idDocumento': this.respServiceSegmentation.idDocumento || '',
|
518
|
-
// "idDocumento": this.respServiceSegmentation?.idDocumento || "",
|
519
|
-
'nombrePortafolio': '0',
|
520
|
-
'aplicacion': 'ZP_OF',
|
521
|
-
'ip': ipAddress.ip,
|
522
|
-
'tipoIdAfil': 'CC',
|
523
|
-
'numeroIdAfil': this.formDynamic.controls['numeroDoc'].value.toString(),
|
524
|
-
'numeroCuentaPI': '0',
|
525
|
-
'transaccion': 'INICIO DE SESION_OF',
|
526
|
-
'conceptoAceptacion': 'HABEAS_DATA_USO_APP',
|
527
|
-
'respuesta': 'SI',
|
528
|
-
'usuarioCreacion': this.formDynamic.controls['numeroDoc'].value.toString()
|
529
|
-
};
|
530
|
-
let aceptaciones = { aceptaciones: [objToSend] };
|
531
|
-
// this.externalService.setAcceptanceDocument(aceptaciones).subscribe(() => { })
|
532
|
-
this.setAcceptanceDocument.emit(aceptaciones);
|
533
|
-
}
|
534
|
-
});
|
535
|
-
}
|
536
|
-
cancellKeypress() {
|
537
|
-
return false;
|
538
|
-
}
|
539
|
-
emailRulesValidate(formQuestion) {
|
540
|
-
let valOk = true;
|
541
|
-
try {
|
542
|
-
let hasError = false;
|
543
|
-
document.getElementById(formQuestion.question.id).setAttribute('hidden', 'true');
|
544
|
-
let eml = document.getElementById(formQuestion.question.id);
|
545
|
-
let email = formQuestion.question.registred;
|
546
|
-
if (!hasError) {
|
547
|
-
if (formQuestion.question.required && (email == '' || email == undefined || email == null)) {
|
548
|
-
eml.style.borderColor = '#FF0000';
|
549
|
-
eml.textContent = 'El correco eléctronico es requerido';
|
550
|
-
eml.removeAttribute('hidden');
|
551
|
-
valOk = false;
|
552
|
-
hasError = true;
|
553
|
-
}
|
554
|
-
}
|
555
|
-
if (!hasError) {
|
556
|
-
if (this.validMinLength(undefined, formQuestion.question)) {
|
557
|
-
eml.style.borderColor = '#FF0000';
|
558
|
-
eml.textContent = 'Debe ser mínimo de ' + formQuestion.question.minLength + ' caracteres';
|
559
|
-
document.getElementById(formQuestion.question.id).removeAttribute('hidden');
|
560
|
-
valOk = false;
|
561
|
-
hasError = true;
|
562
|
-
}
|
563
|
-
}
|
564
|
-
if (!hasError) {
|
565
|
-
if (this.validMaxLength(undefined, formQuestion.question)) {
|
566
|
-
eml.style.borderColor = '#FF0000';
|
567
|
-
eml.textContent = 'Debe ser maximo de ' + formQuestion.question.maxLength + ' caracteres';
|
568
|
-
document.getElementById(formQuestion.question.id).removeAttribute('hidden');
|
569
|
-
valOk = false;
|
570
|
-
hasError = true;
|
571
|
-
}
|
572
|
-
}
|
573
|
-
if (!hasError) {
|
574
|
-
const matches = String(email).match(this.regexType.email.exp);
|
575
|
-
if (matches == null) {
|
576
|
-
eml.style.borderColor = '#FF0000';
|
577
|
-
eml.textContent = 'Tu email es invalido';
|
578
|
-
eml.removeAttribute('hidden');
|
579
|
-
valOk = false;
|
580
|
-
hasError = true;
|
581
|
-
}
|
582
|
-
}
|
583
|
-
}
|
584
|
-
catch (error) {
|
585
|
-
}
|
586
|
-
return valOk;
|
587
|
-
}
|
588
|
-
calendarRulesValidate(formQuestion) {
|
589
|
-
let hasError = false;
|
590
|
-
try {
|
591
|
-
document.getElementById(formQuestion.question.id).setAttribute('hidden', 'true');
|
592
|
-
let ecalendar = document.getElementById(formQuestion.question.id);
|
593
|
-
//se valida que no sea null si es requerido
|
594
|
-
let date = formQuestion.question.registred;
|
595
|
-
if (formQuestion.question.required && (date == '' || date == undefined || date == null)) {
|
596
|
-
ecalendar.style.borderColor = '#FF0000';
|
597
|
-
ecalendar.textContent = 'La fecha es requerida';
|
598
|
-
ecalendar.removeAttribute('hidden');
|
599
|
-
}
|
600
|
-
}
|
601
|
-
catch (error) {
|
602
|
-
}
|
603
|
-
}
|
604
|
-
validateNotSpace(event) {
|
605
|
-
if (event.charCode == 32) {
|
606
|
-
return false;
|
607
|
-
}
|
608
|
-
else {
|
609
|
-
return true;
|
610
|
-
}
|
611
|
-
}
|
612
|
-
};
|
613
|
-
FormAuroraComponent.ctorParameters = () => [
|
614
|
-
{ type: HttpClient }
|
615
|
-
];
|
616
|
-
tslib_1.__decorate([
|
617
|
-
Input()
|
618
|
-
], FormAuroraComponent.prototype, "dataClassCss", void 0);
|
619
|
-
tslib_1.__decorate([
|
620
|
-
Input()
|
621
|
-
], FormAuroraComponent.prototype, "dataForm", void 0);
|
622
|
-
tslib_1.__decorate([
|
623
|
-
Input()
|
624
|
-
], FormAuroraComponent.prototype, "clickSubmit", void 0);
|
625
|
-
tslib_1.__decorate([
|
626
|
-
Input()
|
627
|
-
], FormAuroraComponent.prototype, "dataReloadForm", void 0);
|
628
|
-
tslib_1.__decorate([
|
629
|
-
Input()
|
630
|
-
], FormAuroraComponent.prototype, "welcomeTitle", void 0);
|
631
|
-
tslib_1.__decorate([
|
632
|
-
Input()
|
633
|
-
], FormAuroraComponent.prototype, "welcomeDescription", void 0);
|
634
|
-
tslib_1.__decorate([
|
635
|
-
Input()
|
636
|
-
], FormAuroraComponent.prototype, "urlPdf", void 0);
|
637
|
-
tslib_1.__decorate([
|
638
|
-
Input()
|
639
|
-
], FormAuroraComponent.prototype, "nameCompany", void 0);
|
640
|
-
tslib_1.__decorate([
|
641
|
-
Input()
|
642
|
-
], FormAuroraComponent.prototype, "schedule", void 0);
|
643
|
-
tslib_1.__decorate([
|
644
|
-
Input()
|
645
|
-
], FormAuroraComponent.prototype, "getTermsAndConditions", void 0);
|
646
|
-
tslib_1.__decorate([
|
647
|
-
Input()
|
648
|
-
], FormAuroraComponent.prototype, "regexType", void 0);
|
649
|
-
tslib_1.__decorate([
|
650
|
-
Input()
|
651
|
-
], FormAuroraComponent.prototype, "getIpAddress", void 0);
|
652
|
-
tslib_1.__decorate([
|
653
|
-
ViewChild('formDynamic', { static: true })
|
654
|
-
], FormAuroraComponent.prototype, "formDynamic", void 0);
|
655
|
-
tslib_1.__decorate([
|
656
|
-
Output()
|
657
|
-
], FormAuroraComponent.prototype, "response", void 0);
|
658
|
-
tslib_1.__decorate([
|
659
|
-
Output()
|
660
|
-
], FormAuroraComponent.prototype, "summit", void 0);
|
661
|
-
tslib_1.__decorate([
|
662
|
-
Output()
|
663
|
-
], FormAuroraComponent.prototype, "setAcceptanceDocument", void 0);
|
664
|
-
tslib_1.__decorate([
|
665
|
-
ViewChild('modalTurns', { static: false })
|
666
|
-
], FormAuroraComponent.prototype, "myModal", void 0);
|
667
|
-
FormAuroraComponent = tslib_1.__decorate([
|
668
|
-
Component({
|
669
|
-
selector: 'lib-FormAurora',
|
670
|
-
template: "<script src=\"https://www.google.com/recaptcha/api.js\" async defer></script>\n<div class=\"card\">\n <span class=\"text-center mt-2 d-none d-sm-block\">\n <img style=\"width: 115px; height:96px;\" [class]=\"dataClassCss.logo\" id=\"logo\">\n </span>\n <div class=\"card-body pt-0\">\n <ng-container *ngIf=\"schedule\">\n <h4 class=\"card-title text-center mb-0\" [class]=\"dataClassCss.bienvenida2\" style=\"color: #EE7E0E;\">\n Horarios de atenci\u00F3n\n </h4>\n <small class=\"text-center d-block\">{{schedule}}</small>\n </ng-container>\n <form #formDynamic=\"ngForm\">\n <div *ngFor=\"let control of dataForm?.formQuestions; let index = index; trackBy: trackByIndex\">\n <div\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2)) || (index < dataForm.formQuestions.length && dataForm.formQuestions[index].question.questionType.id == 3 && dataForm.formQuestions[index + 1].question.questionType.id == 2); else switchTemp\">\n <div class=\"row\"\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2))\">\n <div class=\"col-lg-6 col-xs-12\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index - 1].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index -\n 1].question.label}}</span>\n </label>\n <div class=\"selectContainer\">\n <select [name]=\"dataForm.formQuestions[index - 1].question.value\"\n [required]=\"dataForm.formQuestions[index - 1].question.required\"\n [class]=\"dataClassCss.formcontrol\"\n id=\"{{dataForm.formQuestions[index - 1].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index - 1].question.registred\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container\n *ngFor=\"let item of dataForm.formQuestions[index - 1].question.questionAnswers\">\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index-1].question.value\"\n hidden></span>\n </div>\n </div>\n <div class=\"col-lg-6 col-xs-12\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\"\n class=\"col-sm-12 p-sm-0 px-sm-1\" style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" digitOnly id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keyup)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n onkeypress=\"return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57\"\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\"/>\n\n </div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\n Este campo es obligatorio</span>\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser m\u00EDnimo de\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser maximo de\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\n hidden></span>\n </div>\n </div>\n </div>\n </div>\n\n <ng-template #switchTemp>\n <div [ngSwitch]=\"dataForm.formQuestions[index].question.questionType.id\">\n <div *ngSwitchCase=\"1\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\"/>\n </div>\n </div>\n <div *ngSwitchCase=\"2\">\n\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" digitOnly id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n onkeypress=\"return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57\"\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\"/>\n </div>\n\n </div>\n <div *ngSwitchCase=\"3\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <select [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [class]=\"dataClassCss.formcontrol\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index].question.registred\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\">\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n <div *ngSwitchCase=\"4\">\n <select class=\"{{ dataClassCss.formcontrol }} select-checkbox\"\n style=\"overflow: hidden; border-style: hidden;\"\n [style.height.px]=\"dataForm.formQuestions[index].question.questionAnswers.length * 24\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\" ngModel multiple>\n <!-- todo: delete (mousedown)=\"onMouseDown($event, dataForm.formQuestions[index].question.value, formDynamic)\"-->\n <option\n (mousemove)=\"$event.preventDefault()\"\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\"\n [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </select>\n </div>\n <div *ngSwitchCase=\"5\">\n <a (click)=\"rediretoutside($event,dataForm.formQuestions[index].question)\" href=\"\">\n <span>{{ dataForm.formQuestions[index].question.label }}</span>\n </a>\n </div>\n <div *ngSwitchCase=\"6\">\n <div [class]=\"dataClassCss.cl12\" [id]=\"'reCaptcha'\">\n <div class=\"cnt-captcha\">\n <re-captcha (resolved)=\"resolvedCaptcha($event)\"\n siteKey=\"6LfQisEZAAAAAARuuKFEAgS-x4qJse5uBA_QCA7v\"></re-captcha>\n <input hidden type=\"text\" [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\n </div>\n <span class=\"error\" *ngIf=\"watchValid && !captchaValid\" style=\"margin-top: 0;\">\n Debe resolver la captcha para continuar\n </span>\n </div>\n </div>\n <div *ngSwitchCase=\"7\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; margin-bottom: 0 ;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input placeholder=\"dd/mm/aaaa\" style=\"margin-top: -0.4rem !important;\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [name]=\"dataForm.formQuestions[index].question.value\" type=\"date\" min=\"{{minDate}}\"\n max=\"{{maxDate}}\" [maxlength]=\"10\" (paste)=\"false\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.txtCalendar\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n (keydown)=\"cancellKeypress()\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\">\n\n <!-- for replace by id todo-->\n <button class=\"btn\" id=\"{{dataForm.formQuestions[index].question.value}}\" type=\"button\"\n style=\"width: 46px;\n top: 12px;\n color: white;\n right: 15px;\n position: absolute;\n background: #D25D42;\n pointer-events: none;\">\n <i class=\"fa fa-calendar\"></i>\n </button>\n\n </div>\n </div>\n <div *ngSwitchCase=\"8\">\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\n <input [style]=\"'width: 4%; height: auto; display: inline;'\" type=\"checkbox\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\"\n (change)=\"checkTermsAndConditions(dataForm.formQuestions[index].question.registred)\">\n <!-- <a href=\"{{urlPdf}}\" target=\"_blank\" style=\"text-decoration: underline;\"\n id=\"txtPoliticas\" (click)=\"tycSelection()\">\n {{dataForm.formQuestions[index].question.label}}\n </a> -->\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\n id=\"txtPoliticas\" (click)=\"tycSelection($event)\">\n {{dataForm.formQuestions[index].question.label}}\n </a>\n </div>\n </div>\n <div *ngSwitchCase=\"9\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keypress)=\"validOnlyText($event)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\"/>\n </div>\n </div>\n <div *ngSwitchCase=\"10\">\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\n <input [style]=\"'width: 4%; height: auto; display: inline;'\" type=\"checkbox\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\">\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\n id=\"check{{dataForm.formQuestions[index].question.id}}\"\n (click)=\"openLabelUrl($event,dataForm.formQuestions[index].question)\">\n {{dataForm.formQuestions[index].question.label}}\n </a>\n </div>\n </div>\n <div *ngSwitchCase=\"11\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keypress)=\"validateNotSpace($event)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\"/>\n </div>\n </div>\n <div *ngSwitchDefault>Tipo de control no detectado</div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\n Este campo es obligatorio</span>\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser m\u00EDnimo de\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser maximo de\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\n hidden></span>\n <span class=\"error\" [id]=\"dataForm.formQuestions[index].question.id\" hidden></span>\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"mt-3 text-center\">\n <button type=\"button\" [class]=\"dataClassCss.btn\" (click)=\"onSubmit()\" [disabled]=\"!formDynamic.valid\"\n id=\"btnIng\">Ingresar\n </button>\n </div>\n </form>\n </div>\n</div>\n",
|
671
|
-
providers: [
|
672
|
-
{ provide: NgbDateAdapter, useClass: CustomAdapter },
|
673
|
-
{ provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter },
|
674
|
-
{ provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
|
675
|
-
I18n
|
676
|
-
],
|
677
|
-
styles: [".select-checkbox option::before{content:\"\\2610\";width:1.3em;text-align:center;display:inline-block}.select-checkbox option:checked::before{content:\"\\2611\"}"]
|
678
|
-
})
|
679
|
-
], FormAuroraComponent);
|
680
|
-
export { FormAuroraComponent };
|
681
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hdXJvcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZm9ybS1hdXJvcmEtc3RlZmFuaW5pLyIsInNvdXJjZXMiOlsibGliL2Zvcm0tYXVyb3JhLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUlMLFNBQVMsRUFHVCxNQUFNLEVBQ04sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELCtCQUErQjtBQUMvQixPQUFPLEVBQUMsY0FBYyxFQUFFLHNCQUFzQixFQUFpQixpQkFBaUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BILE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUN2Qix3REFBd0Q7QUFDeEQsNkVBQTZFO0FBQzdFLHlFQUF5RTtBQUV6RTs7R0FFRztBQUVILElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWMsU0FBUSxjQUFzQjtJQVJ6RCx3REFBd0Q7SUFDeEQsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUV6RTs7T0FFRztJQUNIOztRQUdXLGNBQVMsR0FBRyxHQUFHLENBQUM7SUFrQjNCLENBQUM7SUFoQkMsU0FBUyxDQUFDLEtBQW9CO1FBQzVCLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsT0FBTztnQkFDTCxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMs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REFBcUI7QUFDcEQ7SUFBVCxNQUFNLEVBQUU7cURBQW9DO0FBQ25DO0lBQVQsTUFBTSxFQUFFO21EQUFrQztBQUNqQztJQUFULE1BQU0sRUFBRTtrRUFBaUQ7QUEyQmhCO0lBQXpDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUM7b0RBQXFCO0FBNUNuRCxtQkFBbUI7SUFYL0IsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGdCQUFnQjtRQUMxQixpaXJCQUEyQztRQUUzQyxTQUFTLEVBQUU7WUFDVCxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQztZQUNsRCxFQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUM7WUFDdEUsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFDO1lBQzVELElBQUk7U0FDTDs7S0FDRixDQUFDO0dBQ1csbUJBQW1CLENBK2lCL0I7U0EvaUJZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEluamVjdGFibGUsXHJcbiAgSW5wdXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBPbkluaXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgTmdGb3JtLCBGb3JtfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge0ZpbGx9IGZyb20gJy4vZmlsbCc7XHJcbi8vIGltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHtOZ2JEYXRlQWRhcHRlciwgTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgTmdiRGF0ZVN0cnVjdCwgTmdiRGF0ZXBpY2tlckkxOG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuLy8gaW1wb3J0IHsgcmVnZXhUeXBlIH0gZnJvbSBcIkBhcHAvX3NoYXJlZC9fdXRpbC9yZWdleFwiO1xyXG4vLyBpbXBvcnQgeyBFeHRlcm5hbFNlcnZpY2UgfSBmcm9tICdAYXBwL19zaGFyZWQvX3NlcnZpY2VzL2V4dGVybmFsLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBBdXJvcmFTZXJ2aWNlIH0gZnJvbSAnQGFwcC9fc2hhcmVkL19zZXJ2aWNlcy9hdXJvcmEuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogVGhpcyBTZXJ2aWNlIGhhbmRsZXMgaG93IHRoZSBkYXRlIGlzIHJlcHJlc2VudGVkIGluIHNjcmlwdHMgaS5lLiBuZ01vZGVsLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tQWRhcHRlciBleHRlbmRzIE5nYkRhdGVBZGFwdGVyPHN0cmluZz4ge1xyXG5cclxuICByZWFkb25seSBERUxJTUlURVIgPSAnLyc7XHJcblxyXG4gIGZyb21Nb2RlbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQodGhpcy5ERUxJTUlURVIpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRheTogcGFyc2VJbnQoZGF0ZVswXSwgMTApLFxyXG4gICAgICAgIG1vbnRoOiBwYXJzZUludChkYXRlWzFdLCAxMCksXHJcbiAgICAgICAgeWVhcjogcGFyc2VJbnQoZGF0ZVsyXSwgMTApXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHRvTW9kZWwoZGF0ZTogTmdiRGF0ZVN0cnVjdCB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIC8vcmV0dXJuIGRhdGUgPyBkYXRlLmRheSArIHRoaXMuREVMSU1JVEVSICsgZGF0ZS5tb250aCArIHRoaXMuREVMSU1JVEVSICsgZGF0ZS55ZWFyIDogbnVsbDtcclxuICAgIHJldHVybiBkYXRlID8gKGRhdGUuZGF5IDwgMTAgPyAwICsgZGF0ZS5kYXkgOiBkYXRlLmRheSkgKyB0aGlzLkRFTElNSVRFUiArIChkYXRlLm1vbnRoIDwgMTAgPyAwICsgZGF0ZS5tb250aCA6IGRhdGUubW9udGgpICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiAnJztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIFNlcnZpY2UgaGFuZGxlcyBob3cgdGhlIGRhdGUgaXMgcmVuZGVyZWQgYW5kIHBhcnNlZCBmcm9tIGtleWJvYXJkIGkuZS4gaW4gdGhlIGJvdW5kIGlucHV0IGZpZWxkLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRGF0ZVBhcnNlckZvcm1hdHRlciBleHRlbmRzIE5nYkRhdGVQYXJzZXJGb3JtYXR0ZXIge1xyXG5cclxuICByZWFkb25seSBERUxJTUlURVIgPSAnLyc7XHJcblxyXG4gIHBhcnNlKHZhbHVlOiBzdHJpbmcpOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IHZhbHVlLnNwbGl0KHRoaXMuREVMSU1JVEVSKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkYXk6IHBhcnNlSW50KGRhdGVbMF0sIDEwKSxcclxuICAgICAgICBtb250aDogcGFyc2VJbnQoZGF0ZVsxXSwgMTApLFxyXG4gICAgICAgIHllYXI6IHBhcnNlSW50KGRhdGVbMl0sIDEwKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBmb3JtYXQoZGF0ZTogTmdiRGF0ZVN0cnVjdCB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRhdGUgPyAoZGF0ZS5kYXkgPCAxMCA/ICcwJyArIGRhdGUuZGF5IDogZGF0ZS5kYXkpICsgdGhpcy5ERUxJTUlURVIgKyAoZGF0ZS5tb250aCA8IDEwID8gJzAnICsgZGF0ZS5tb250aCA6IGRhdGUubW9udGgpICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiAnJztcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IEkxOE5fVkFMVUVTID0ge1xyXG4gICdlcyc6IHtcclxuICAgIHdlZWtkYXlzOiBbJ0x1JywgJ01hJywgJ01pJywgJ0p1JywgJ1ZpJywgJ1NhJywgJ0RvJ10sXHJcbiAgICBtb250aHM6IFsnRW5lJywgJ0ZlYicsICdNYXInLCAnQWJyJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0FnbycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEaWMnXSxcclxuICAgIHdlZWtMYWJlbDogJ3NlbSdcclxuICB9XHJcbiAgLy8gb3RoZXIgbGFuZ3VhZ2VzIHlvdSB3b3VsZCBzdXBwb3J0XHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBJMThuIHtcclxuICBsYW5ndWFnZSA9ICdlcyc7XHJcbn1cclxuXHJcbi8vIERlZmluZSBjdXN0b20gc2VydmljZSBwcm92aWRpbmcgdGhlIG1vbnRocyBhbmQgd2Vla2RheXMgdHJhbnNsYXRpb25zXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEN1c3RvbURhdGVwaWNrZXJJMThuIGV4dGVuZHMgTmdiRGF0ZXBpY2tlckkxOG4ge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2kxOG46IEkxOG4pIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXRXZWVrZGF5TGFiZWwod2Vla2RheTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrZGF5c1t3ZWVrZGF5IC0gMV07XHJcbiAgfVxyXG5cclxuICBnZXRXZWVrTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrTGFiZWw7XHJcbiAgfVxyXG5cclxuICBnZXRNb250aFNob3J0TmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS5tb250aHNbbW9udGggLSAxXTtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoRnVsbE5hbWUobW9udGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRNb250aFNob3J0TmFtZShtb250aCk7XHJcbiAgfVxyXG5cclxuICBnZXREYXlBcmlhTGFiZWwoZGF0ZTogTmdiRGF0ZVN0cnVjdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7ZGF0ZS5kYXl9LSR7ZGF0ZS5tb250aH0tJHtkYXRlLnllYXJ9YDtcclxuICB9XHJcblxyXG4gIGdldFdlZWtkYXlTaG9ydE5hbWUod2Vla2RheTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrZGF5c1t3ZWVrZGF5IC0gMV07XHJcbiAgfTtcclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLUZvcm1BdXJvcmEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWF1cm9yYS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1hdXJvcmEuY29tcG9uZW50LmNzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge3Byb3ZpZGU6IE5nYkRhdGVBZGFwdGVyLCB1c2VDbGFzczogQ3VzdG9tQWRhcHRlcn0sXHJcbiAgICB7cHJvdmlkZTogTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgdXNlQ2xhc3M6IEN1c3RvbURhdGVQYXJzZXJGb3JtYXR0ZXJ9LFxyXG4gICAge3Byb3ZpZGU6IE5nYkRhdGVwaWNrZXJJMThuLCB1c2VDbGFzczogQ3VzdG9tRGF0ZXBpY2tlckkxOG59LFxyXG4gICAgSTE4blxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1BdXJvcmFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFDbGFzc0NzczogYW55O1xyXG4gIEBJbnB1dCgpIGRhdGFGb3JtOiBhbnk7XHJcbiAgQElucHV0KCkgY2xpY2tTdWJtaXQ6IGFueTtcclxuICBASW5wdXQoKSBkYXRhUmVsb2FkRm9ybTogYW55O1xyXG4gIEBJbnB1dCgpIHdlbGNvbWVUaXRsZTogYW55O1xyXG4gIEBJbnB1dCgpIHdlbGNvbWVEZXNjcmlwdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIHVybFBkZjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5hbWVDb21wYW55OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2NoZWR1bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBnZXRUZXJtc0FuZENvbmRpdGlvbnM6IGFueTtcclxuICBASW5wdXQoKSByZWdleFR5cGU6IGFueTtcclxuICBASW5wdXQoKSBnZXRJcEFkZHJlc3M6IGFueTtcclxuICBAVmlld0NoaWxkKCdmb3JtRHluYW1pYycsIHtzdGF0aWM6IHRydWV9KSBmb3JtRHluYW1pYzogTmdGb3JtO1xyXG4gIEBPdXRwdXQoKSByZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzdW1taXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2V0QWNjZXB0YW5jZURvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHRpcG9kb2NOdW1Eb2M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBvblN1Ym1pdEV2ZW50OiBhbnkgPSBmYWxzZTtcclxuICBjb3VudFN1Ym1pdCA9IDA7XHJcbiAgd2F0Y2hWYWxpZCA9IGZhbHNlO1xyXG4gIHdhdGNoUmVxdWlyZWQgPSBmYWxzZTtcclxuICBjYXB0Y2hhVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNwbGF5TW9udGhzID0gMjtcclxuICBuYXZpZ2F0aW9uID0gJ3NlbGVjdCc7XHJcbiAgc2hvd1dlZWtOdW1iZXJzID0gZmFsc2U7XHJcbiAgb3V0c2lkZURheXMgPSAndmlzaWJsZSc7XHJcbiAgcmVzcFNlcnZpY2VTZWdtZW50YXRpb246IGFueSA9IG51bGw7XHJcblxyXG5cclxuICAvL2VtYWlsUGF0dGVybiA9IFwiXlthLXowLTkuXyUrLV0rQFthLXowLTkuLV0rXFwuW2Etel17Miw0fSRcIjtcclxuXHJcbiAgdG9kYXkgPSBtb21lbnQobmV3IERhdGUoKSk7XHJcbiAgbWF4WWVhciA9IHRoaXMudG9kYXkueWVhcigpO1xyXG4gIG1pblllYXIgPSB0aGlzLnRvZGF5LnllYXIoKSAtIDgyO1xyXG4gIG1pbkRhdGUgPSB0aGlzLm1pblllYXIudG9TdHJpbmcoKSArICctJyArIHRoaXMudG9kYXkubW9udGgoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyB0aGlzLnRvZGF5LmRhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7Ly8ge3llYXI6IHRoaXMubWluWWVhciwgbW9udGg6IHRoaXMudG9kYXkubW9udGgoKSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcbiAgbWF4RGF0ZSA9IHRoaXMubWF4WWVhci50b1N0cmluZygpICsgJy0nICsgKHRoaXMudG9kYXkubW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICctJyArIHRoaXMudG9kYXkuZGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsvLyB7eWVhcjogdGhpcy5tYXhZZWFyLCBtb250aDogdGhpcy50b2RheS5tb250aCgpICsgMSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcblxyXG4gIC8vUmV2aXNhciB2YXJpYWJsZXNcclxuICByZWNoYXJnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluZGljYXRpdm86IHN0cmluZyA9ICc1Nyc7XHJcbiAgLy8gQFZpZXdDaGlsZChcIm1vZGFsVHVybnNcIikgbXlNb2RhbDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtb2RhbFR1cm5zJywge3N0YXRpYzogZmFsc2V9KSBteU1vZGFsOiBFbGVtZW50UmVmO1xyXG4gIGZpbGxkYXRhOiBGaWxsO1xyXG4gIGRlZmF1bHREb2NUeXBlOiBzdHJpbmcgPSAnQ8OpZHVsYSBkZSBjaXVkYWRhbsOtYSc7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ251ZXZhIHZlcnNpb24gMC4xLjAnKTtcclxuICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhcnRDb21wb25lbnQoKTtcclxuICAgIH0sIDIwMDApO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0Q29tcG9uZW50KCkge1xyXG4gICAgLy9vcmRlbmEgbG9zIGNhbXBvc1xyXG4gICAgaWYgKHRoaXMuZGF0YUZvcm0gIT0gbnVsbCAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vU2FtZSByb3cgZmllbGRzXHJcbiAgICAgIHRoaXMudGlwb2RvY051bURvYyA9ICh0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gJ3RpcG9Eb2MnKSAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gJ251bWVyb0RvYycpKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucyA9IHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgZXhpc3RjYXB0Y2hhID0gdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gNik7XHJcblxyXG4gICAgICBpZiAoZXhpc3RjYXB0Y2hhLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jYXB0Y2hhVmFsaWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gdW5kZWZpbmVkIHx8IGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID0gNTI0Mjg4OyAvL2RlZmF1bHR2YWx1ZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5taW5MZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFSZWxvYWRGb3JtLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbGxkYXRhID0gZWxlbWVudDtcclxuXHJcbiAgICAgICAgICBpZiAoKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAyIHx8IGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAxIHx8XHJcbiAgICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAzKSAmJiAodGhpcy5maWxsZGF0YS5kYXRhICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgIHRoaXMuZmlsbGRhdGEuZGF0YSAhPT0gdW5kZWZpbmVkKSAmJiBpdGVtLnF1ZXN0aW9uLmlkID09PSB0aGlzLmZpbGxkYXRhLmlkKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID0gdGhpcy5maWxsZGF0YS5kYXRhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5xdWVzdGlvbi5yZWdpc3RyZWQgPT0gbnVsbCB8fCBpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByYW5nZSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbCgpLFxyXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woKSxcclxuICB9KTtcclxuXHJcbiAgcmVzb2x2ZWRDYXB0Y2hhKGNhcHRjaGFSZXNwb25zZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNhcHRjaGFWYWxpZCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhKSB7XHJcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHMuY2FwdGNoYS5zZXRWYWx1ZShjYXB0Y2hhUmVzcG9uc2UpO1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmZvcm0udmFsdWUuY2FwdGNoYSA9IGNhcHRjaGFSZXNwb25zZTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkluZycpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/ICcwLjY1JyA6ICcxJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRm9ybXNcclxuICAvL01ldG9kbyBwYXJhIGV2aXRhciBlbCByZW5kZXIgZGUgbG9zIGl0ZW1zIGRlbCBmb3JcclxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIG9iajogYW55KTogYW55IHtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlVmFsaWRQYXR0ZXIoZXZlbnQsIHF1ZXN0aW9uKSB7XHJcbiAgICBpZiAocXVlc3Rpb24ucGF0dGVybiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuICAgICAgbGV0IGtleXZhbGlkID0gWzgsIDMyLCAzNywgMzgsIDM5LCA0MCwgNDYsIDldO1xyXG4gICAgICAvL2RpZmVyZW50ZSBkZSBCYWNrcHNhY2VcclxuICAgICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoIWtleXZhbGlkLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpKSB7XHJcbiAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocXVlc3Rpb24ucGF0dGVybik7XHJcbiAgICAgICAgICB2YWxpZCA9IHJlZ2V4LnRlc3QoZXZlbnQua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHZhbGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyJyArIHF1ZXN0aW9uLnZhbHVlKS5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICd0cnVlJyk7XHJcblxyXG4gICAgLy9pZiB0ZW1wb3JhbCBtaWVudHJhcyBzZSBtaWdyYW4gdG9kb3MgbG9zIHRpcG9zIGRlIGNhbXBvcyBhbCBmb3JlYWNoXHJcbiAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkICE9IDExICYmIHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCAhPSA3KSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbGlkTWluTGVuZ3RoKHRoaXMuZm9ybUR5bmFtaWMsIHF1ZXN0aW9uKSkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWwnICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24udmFsdWUpLnN0eWxlLmJvcmRlckNvbG9yID0gJyNFNEU0RTQnO1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtbCcgKyBxdWVzdGlvbi52YWx1ZSkuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnZhbGlkTWF4TGVuZ3RoKHRoaXMuZm9ybUR5bmFtaWMsIHF1ZXN0aW9uKSkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXhsJyArIHF1ZXN0aW9uLnZhbHVlKS5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRTRFNEU0JztcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXhsJyArIHF1ZXN0aW9uLnZhbHVlKS5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICd0cnVlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZvckVhY2goZm9ybVF1ZXN0aW9uID0+IHtcclxuICAgICAgc3dpdGNoIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkKSB7XHJcbiAgICAgICAgLy9zZSB2YWxpZGEgIGNhbXBvIGRlIHRpcG8gY2FsZW5kYXJpb1xyXG4gICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gNylcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vc2UgdmFsaWRhICBjYW1wbyBkZSB0aXBvIGVtYWlsXHJcbiAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMTEpXHJcbiAgICAgICAgICAgIHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkluZycpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/ICcwLjY1JyA6ICcxJztcclxuICB9XHJcblxyXG4gIHZhbGlkT25seVRleHQoZXZlbnQpIHtcclxuICAgIGxldCByZWdleCA9IC9eW2EtekEtWlxcdTAwQzAtXFx1MDE3Rl0rJC9nO1xyXG4gICAgaWYgKGV2ZW50LmNoYXJDb2RlID09IDMyKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xyXG5cclxuICAgIHJldHVybiB2YWxpZDtcclxuICB9XHJcblxyXG4gIHZhbGlkRGF0ZShldmVudCkge1xyXG4gICAgLypsZXQgcGF0dGVybiA9IC8oPzowWzEtOV18WzEyXVswLTldfDNbMDFdKVxcLyg/OjBbMS05XXwxWzAtMl0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xyXG4gICAgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XHJcbiAgICAqL1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhldmVudC5rZXkpLm1hdGNoKHRoaXMucmVnZXhUeXBlLmRhdGUuZXhwKTtcclxuICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbClcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBhbGVydCh2YWxpZCk7XHJcblxyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG5cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlVmFsaWREYXRlKGV2ZW50KSB7XHJcblxyXG4gICAgLy9sZXQgcGF0dGVybiA9IC8oPzowWzEtOV18MVswLTJdKVxcLyg/OjBbMS05XXxbMTJdWzAtOV18M1swMV0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgbGV0IGRhdGVOID0gL1swLTldfFxcLy87XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGRhdGVOKTtcclxuICAgIHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG5cclxuICB9XHJcblxyXG4gIHJlZGlyZXRvdXRzaWRlKGV2ZW50LCBxdWVzdGlvbikge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHdpbmRvdy5vcGVuKHF1ZXN0aW9uLnZhbHVlLCAnX2JsYW5rJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGF0Y2ggc3VibWl0IGV2ZW50IGZvciB2YWxpZGF0aW9ucyBleGlzdHNcclxuICAgKiBAcGFyYW0gY2hhbmdlXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICB0aGlzLmNvdW50U3VibWl0Kys7XHJcbiAgfVxyXG5cclxuICAvL29uU3VibWl0KGZvcm06IE5nRm9ybSkge1xyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgbGV0IGZvcm0gPSB0aGlzLmZvcm1EeW5hbWljO1xyXG4gICAgdGhpcy53YXRjaFZhbGlkID0gdHJ1ZTtcclxuICAgIHRoaXMud2F0Y2hSZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKGZvcm0udmFsaWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnZhbGlkUnVsZXNGaWVsZHMoZm9ybS5jb250cm9sc1snbnVtZXJvRG9jJ10udmFsdWUudG9TdHJpbmcoKSwgZm9ybS5jb250cm9sc1snY2VsdWxhciddLnZhbHVlLnRvU3RyaW5nKCksIGZvcm0uY29udHJvbHNbJ2VtYWlsJ10udmFsdWUpKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy52YWxpZE1pbmxlbmdodEFsbFF1ZXN0aW9ucyhmb3JtLnZhbHVlKSAmJiB0aGlzLnZhbGlkTWF4TGVuZ3RoQWxsUXVlc3Rpb25zKGZvcm0udmFsdWUpICYmIGZvcm0udmFsaWQpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YUZvcm0udXJsU2VuZCAhPSAnJyAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PGFueT4odGhpcy5kYXRhRm9ybS51cmxTZW5kLCBmb3JtLnZhbHVlKS5zdWJzY3JpYmUoKHJlc3ApID0+IHRoaXMucmVzcG9uc2UuZW1pdChyZXNwKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZm9ybS52YWxpZCAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3VtbWl0LmVtaXQoZm9ybS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkUnVsZXNGaWVsZHMobnVtZXJvRG9jOiBTdHJpbmcsIG51bWVyb0NlbDogU3RyaW5nLCBlbWFpbDogU3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBWYWxpZGFjaW9uZXMgcGFyYSBjZWx1bGFyIGVuIGNhc28gZGUgaW5kaWNhdGl2byBlbiBDb2xvbWJpYVxyXG4gICAgbGV0IGNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyY2VsdWxhcicpO1xyXG4gICAgbGV0IGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFybnVtZXJvRG9jJyk7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaW5kaWNhdGl2byA9PSAnKzU3JyB8fCB0aGlzLmluZGljYXRpdm8gPT0gJzU3Jykge1xyXG4gICAgICBsZXQgc3RyaW5nT3JkZW5hZG8gPSB0aGlzLm9yZGVyU3RyaW5nKG51bWVyb0RvYyk7XHJcbiAgICAgIGlmICh0aGlzLm5hbWVDb21wYW55LnRvVXBwZXJDYXNlKCkgIT09ICdDTEFSTycpIHsvL2NsYXJvIGFjZXB0YSBucm8gY29uc2VjdXRpdm9zXHJcbiAgICAgICAgaWYgKG51bWVyb0RvYyA9PSBzdHJpbmdPcmRlbmFkbykge1xyXG4gICAgICAgICAgZG9jLnN0eWxlLmJvcmRlckNvbG9yID0gJyNGRjAwMDAnO1xyXG4gICAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgICBkb2MudGV4dENvbnRlbnQgPSAnRWwgbnVtZXJvIGRvY3VtZW50byBObyBkZWJlIGNvbnRlbmVyIGNhcmFjdGVyZXMgY29uc2VjdXRpdm9zJztcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy90aGlzLm1zZ0Vycm9yQ2FtcG8gPSBcIkVsIG51bWVybyBkb2N1bWVudG8gTm8gZGViZSBjb250ZW5lciBjYXJhY3RlcmVzIGNvbnNlY3V0aXZvc1wiO1xyXG4gICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChudW1lcm9DZWwuc3Vic3RyaW5nKDAsIDEpICE9ICczJykge1xyXG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSAnRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciAzJztcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciAzXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLypcclxuICAgICAgaWYgKHBhcnNlSW50KG51bWVyb0NlbC5zdWJzdHJpbmcoMCwgMykpID4gMzUwKSB7XHJcbiAgICAgICAgY2VsLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByZWZpam8gZGVsIGNlbHVsYXIgbm8gZGViZSBzZXIgbWF5b3IgYSAzNTBcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmVmaWpvIGRlbCBjZWx1bGFyIG5vIGRlYmUgc2VyIG1heW9yIGEgMzUwXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgKi9cclxuICAgICAgLy9FbiBjYXNvIGRlIHF1ZSBlbCBuw7ptZXJvIHNlIHJlcGl0YSwgZWplbXBsbyAzMzMzMzMzM1xyXG4gICAgICBsZXQgbGlzdG51bWJlciA9IG51bWVyb0RvYy5zdWJzdHJpbmcoMCwgMSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBudW1lcm9Eb2MubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgbGlzdG51bWJlciA9IGxpc3RudW1iZXIgKyBudW1lcm9Eb2Muc3Vic3RyaW5nKDAsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobnVtZXJvRG9jID09IGxpc3RudW1iZXIpIHtcclxuICAgICAgICBkb2Muc3R5bGUuYm9yZGVyQ29sb3IgPSAnI0ZGMDAwMCc7XHJcbiAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgZG9jLnRleHRDb250ZW50ID0gJ0NhcmFjdGVyZXMgbnVtw6lyaWNvcyBubyBzZSBwdWVkZW4gcmVwZXRpcnNlIGRlIG1hbmVyYSBjb250aW51YSAnO1xyXG4gICAgICAgIHZhbE9rID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJDYXJhY3RlcmVzIG51bcOpcmljb3Mgbm8gc2UgcHVlZGVuIHJlcGV0aXJzZSBkZSBtYW5lcmEgY29udGludWEgXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEVuIGNhc28gZGUgcXVlIGVsIG7Dum1lcm8gc2UgcmVwaXRhLCBlamVtcGxvIDMzMzMzMzMzXHJcbiAgICAgIGxldCBhcnJheVBob25lUmVwZWF0ID0gQXJyYXkuZnJvbShTdHJpbmcobnVtZXJvQ2VsKSwgTnVtYmVyKTtcclxuICAgICAgbGV0IGFycmF5UGhvbmVPdXRSZXBlYXQgPSBbLi4ubmV3IFNldChhcnJheVBob25lUmVwZWF0KV07XHJcbiAgICAgIGlmIChhcnJheVBob25lT3V0UmVwZWF0Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgY2VsLnN0eWxlLmJvcmRlckNvbG9yID0gJyNGRjAwMDAnO1xyXG4gICAgICAgIGNlbC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICAgIGNlbC50ZXh0Q29udGVudCA9ICdFbCBuw7ptZXJvIHF1ZSBpbmdyZXNhIG5vIGVzIHZhbGlkbyc7XHJcbiAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgbsO6bWVybyBxdWUgaW5ncmVzYSBubyBlcyB2YWxpZG9cIjtcclxuICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmluZGljYXRpdm8gPT0gJys1OTMnIHx8IHRoaXMuaW5kaWNhdGl2byA9PSAnNTkzJykge1xyXG4gICAgICBpZiAobnVtZXJvQ2VsLnN1YnN0cmluZygwLCAxKSAhPSAnOScpIHtcclxuICAgICAgICBjZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI0ZGMDAwMCc7XHJcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gJ0VsIHByaW1lciBjYXLDoWN0ZXIgZGVsIGNlbHVsYXIgZGViZSBzZXIgOSc7XHJcbiAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciA5XCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vc2UgdmFsaWRhbiBsb3MgY2FtcG9zIHBvciB0aXBvIGRlIGNhbXBvIHkgbm8gcG9yIHZhbHVlXHJcbiAgICB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuZm9yRWFjaChmb3JtUXVlc3Rpb24gPT4ge1xyXG4gICAgICBzd2l0Y2ggKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQpIHtcclxuICAgICAgICAvL3NlIHZhbGlkYSAgY2FtcG8gZGUgdGlwbyBlbWFpbFxyXG4gICAgICAgIGNhc2UgMTE6XHJcbiAgICAgICAgICB2YWxPayA9IHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHZhbE9rO1xyXG4gIH1cclxuXHJcbiAgb3JkZXJTdHJpbmcodmFsdWU6IFN0cmluZykge1xyXG4gICAgbGV0IGFycmF5TnVtYmVyID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGFycmF5TnVtYmVyLnB1c2gocGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpKSk7XHJcbiAgICB9XHJcbiAgICAvL29yZGVuYSBlbCBhcnJheVxyXG4gICAgYXJyYXlOdW1iZXIuc29ydChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgIHJldHVybiBhIC0gYjtcclxuICAgIH0pO1xyXG4gICAgbGV0IG51bWJlck9yZGVyID0gJyc7XHJcbiAgICBudW1iZXJPcmRlciA9IGFycmF5TnVtYmVyWzBdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGFycmF5TnVtYmVyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBudW1iZXJPcmRlciA9IG51bWJlck9yZGVyICsgKGFycmF5TnVtYmVyWzBdICsgaW5kZXgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVtYmVyT3JkZXI7XHJcbiAgfVxyXG5cclxuICB2YWxpZE1pbmxlbmdodEFsbFF1ZXN0aW9ucyhmb3JtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcclxuICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDEgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMikge1xyXG4gICAgICAgIGxldCBtaW5MZW5ndGggPSBwYXJzZUludChpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGZvcm1WYWx1ZUxlbmd0aCA9IHBhcnNlSW50KGZvcm1baXRlbS5xdWVzdGlvbi52YWx1ZV0udG9TdHJpbmcoKS5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChtaW5MZW5ndGggPiAwICYmIGZvcm1WYWx1ZUxlbmd0aCAhPSBtaW5MZW5ndGggJiYgZm9ybVZhbHVlTGVuZ3RoIDwgbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNYXhMZW5ndGhBbGxRdWVzdGlvbnMoZm9ybTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zKSB7XHJcbiAgICAgIGlmIChpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSAxIHx8IGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDIpIHtcclxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gcGFyc2VJbnQoaXRlbS5xdWVzdGlvbi5tYXhMZW5ndGgpO1xyXG4gICAgICAgIGxldCBmb3JtVmFsdWVMZW5ndGggPSBwYXJzZUludChmb3JtW2l0ZW0ucXVlc3Rpb24udmFsdWVdLnRvU3RyaW5nKCkubGVuZ3RoKTtcclxuICAgICAgICBpZiAobWF4TGVuZ3RoID4gMCAmJiBmb3JtVmFsdWVMZW5ndGggIT0gbWF4TGVuZ3RoICYmIGZvcm1WYWx1ZUxlbmd0aCA+IG1heExlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkUmVxdWlyZWQoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0gIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5lcnJvcnMgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0uZXJyb3JzLnJlcXVpcmVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB2YWxpZE1pbkxlbmd0aChmb3JtOiBOZ0Zvcm0sIHF1ZXN0aW9uKTogQm9vbGVhbiB7XHJcbiAgICAvL3NlIGRlamEgY2F0Y2ggcG9yIGVycm9yIG5vIGNvbnRyb2xhYmxlIGVuIG90cm8gdGllbXBvIGRlIGVqZWN1Y2lvblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHF1ZXN0aW9uICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAocXVlc3Rpb24ubWluTGVuZ3RoID4gZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0udmFsdWUudG9Mb2NhbGVTdHJpbmcoKS5sZW5ndGggJiYgcXVlc3Rpb24ubWluTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNYXhMZW5ndGgoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm1heExlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5tYXhMZW5ndGggKyAxIDw9IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwuL2csICcnKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5oYXNFcnJvcignZXJyb3JNYXhMZW5ndGgnKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnNldEVycm9ycyh7J2Vycm9yTWF4TGVuZ3RoJzogdHJ1ZX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHR5Y1NlbGVjdGlvbihldmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGxldCB0eWMgPSA8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R4dFBvbGl0aWNhcycpO1xyXG4gICAgdHljLnN0eWxlLmNvbG9yID0gJyNBM0FEMzInO1xyXG5cclxuXHJcbiAgICAvLyB0aGlzLmV4dGVybmFsU2VydmljZS5nZXRUZXJtc0FuZENvbmRpdGlvbnMoKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICBsZXQgYjY0ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRUZXJtc0FuZENvbmRpdGlvbnMgJiYgdGhpcy5nZXRUZXJtc0FuZENvbmRpdGlvbnMubGlzdGFEb2N1bWVudG9zKSB7XHJcbiAgICAgIGI2NCA9IHRoaXMuZ2V0VGVybXNBbmRDb25kaXRpb25zLmxpc3RhRG9jdW1lbnRvc1swXS5jb250ZW5pZG9Eb2N1bWVudG87XHJcbiAgICAgIHRoaXMucmVzcFNlcnZpY2VTZWdtZW50YXRpb24gPSB0aGlzLmdldFRlcm1zQW5kQ29uZGl0aW9ucy5saXN0YURvY3VtZW50b3NbMF07XHJcblxyXG4gICAgICBsZXQgcGRmV2luZG93ID0gd2luZG93Lm9wZW4oJycpO1xyXG4gICAgICBwZGZXaW5kb3cuZG9jdW1lbnQud3JpdGUoXHJcbiAgICAgICAgJzxpZnJhbWUgd2lkdGg9XFwnMTAwJVxcJyBoZWlnaHQ9XFwnMTAwJVxcJyBzcmM9XFwnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCAnICtcclxuICAgICAgICBlbmNvZGVVUkkoYjY0KSArICdcXCc+PC9pZnJhbWU+J1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gfSlcclxuICB9XHJcblxyXG4gIG9wZW5MYWJlbFVybChldmVudCwgcXVlc3Rpb24pIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBsZXQgdHljID0gPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVjaycgKyBxdWVzdGlvbi5pZCk7XHJcbiAgICB0eWMuc3R5bGUuY29sb3IgPSAnI0EzQUQzMic7XHJcbiAgICB3aW5kb3cub3BlbihxdWVzdGlvbi51cmxsYWJlbCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2hlY2tUZXJtc0FuZENvbmRpdGlvbnModmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvLyBsZXQgaXBBZGRyZXNzID0gYXdhaXQgdGhpcy5hdXJvcmFTZXJ2aWNlLmdldElwQWRkcmVzcygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgaXBBZGRyZXNzID0gYXdhaXQgdGhpcy5nZXRJcEFkZHJlc3M7XHJcblxyXG4gICAgICBsZXQgb2JqVG9TZW5kID0ge1xyXG4gICAgICAgICdpZERvY3VtZW50byc6IHRoaXMucmVzcFNlcnZpY2VTZWdtZW50YXRpb24uaWREb2N1bWVudG8gfHwgJycsXHJcbiAgICAgICAgLy8gXCJpZERvY3VtZW50b1wiOiB0aGlzLnJlc3BTZXJ2aWNlU2VnbWVudGF0aW9uPy5pZERvY3VtZW50byB8fCBcIlwiLFxyXG4gICAgICAgICdub21icmVQb3J0YWZvbGlvJzogJzAnLFxyXG4gICAgICAgICdhcGxpY2FjaW9uJzogJ1pQX09GJyxcclxuICAgICAgICAnaXAnOiBpcEFkZHJlc3MuaXAsXHJcbiAgICAgICAgJ3RpcG9JZEFmaWwnOiAnQ0MnLFxyXG4gICAgICAgICdudW1lcm9JZEFmaWwnOiB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzWydudW1lcm9Eb2MnXS52YWx1ZS50b1N0cmluZygpLFxyXG4gICAgICAgICdudW1lcm9DdWVudGFQSSc6ICcwJyxcclxuICAgICAgICAndHJhbnNhY2Npb24nOiAnSU5JQ0lPIERFIFNFU0lPTl9PRicsXHJcbiAgICAgICAgJ2NvbmNlcHRvQWNlcHRhY2lvbic6ICdIQUJFQVNfREFUQV9VU09fQVBQJyxcclxuICAgICAgICAncmVzcHVlc3RhJzogJ1NJJyxcclxuICAgICAgICAndXN1YXJpb0NyZWFjaW9uJzogdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1snbnVtZXJvRG9jJ10udmFsdWUudG9TdHJpbmcoKVxyXG4gICAgICB9O1xyXG4gICAgICBsZXQgYWNlcHRhY2lvbmVzID0ge2FjZXB0YWNpb25lczogW29ialRvU2VuZF19O1xyXG4gICAgICAvLyB0aGlzLmV4dGVybmFsU2VydmljZS5zZXRBY2NlcHRhbmNlRG9jdW1lbnQoYWNlcHRhY2lvbmVzKS5zdWJzY3JpYmUoKCkgPT4geyB9KVxyXG4gICAgICB0aGlzLnNldEFjY2VwdGFuY2VEb2N1bWVudC5lbWl0KGFjZXB0YWNpb25lcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxsS2V5cHJlc3MoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbWFpbFJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKSB7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICBsZXQgZW1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcclxuICAgICAgbGV0IGVtYWlsID0gZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnJlZ2lzdHJlZDtcclxuICAgICAgaWYgKCFoYXNFcnJvcikge1xyXG4gICAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGVtYWlsID09ICcnIHx8IGVtYWlsID09IHVuZGVmaW5lZCB8fCBlbWFpbCA9PSBudWxsKSkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gJyNGRjAwMDAnO1xyXG4gICAgICAgICAgZW1sLnRleHRDb250ZW50ID0gJ0VsIGNvcnJlY28gZWzDqWN0cm9uaWNvIGVzIHJlcXVlcmlkbyc7XHJcbiAgICAgICAgICBlbWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZE1pbkxlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9ICdEZWJlIHNlciBtw61uaW1vIGRlICcgKyBmb3JtUXVlc3Rpb24ucXVlc3Rpb24ubWluTGVuZ3RoICsgJyBjYXJhY3RlcmVzJztcclxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZE1heExlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9ICdEZWJlIHNlciBtYXhpbW8gZGUgJyArIGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5tYXhMZW5ndGggKyAnIGNhcmFjdGVyZXMnO1xyXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKS5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFoYXNFcnJvcikge1xyXG5cclxuICAgICAgICBjb25zdCBtYXRjaGVzID0gU3RyaW5nKGVtYWlsKS5tYXRjaCh0aGlzLnJlZ2V4VHlwZS5lbWFpbC5leHApO1xyXG4gICAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9ICdUdSBlbWFpbCBlcyBpbnZhbGlkbyc7XHJcbiAgICAgICAgICBlbWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsT2s7XHJcbiAgfVxyXG5cclxuICBjYWxlbmRhclJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKSB7XHJcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICBsZXQgZWNhbGVuZGFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcclxuICAgICAgLy9zZSB2YWxpZGEgcXVlIG5vIHNlYSBudWxsIHNpIGVzIHJlcXVlcmlkb1xyXG4gICAgICBsZXQgZGF0ZSA9IGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5yZWdpc3RyZWQ7XHJcbiAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGRhdGUgPT0gJycgfHwgZGF0ZSA9PSB1bmRlZmluZWQgfHwgZGF0ZSA9PSBudWxsKSkge1xyXG4gICAgICAgIGVjYWxlbmRhci5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBlY2FsZW5kYXIudGV4dENvbnRlbnQgPSAnTGEgZmVjaGEgZXMgcmVxdWVyaWRhJztcclxuICAgICAgICBlY2FsZW5kYXIucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZU5vdFNwYWNlKGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuY2hhckNvZGUgPT0gMzIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|