iptdevs-design-system 3.1.933 → 3.1.935
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/esm2020/lib/cod/steps/cod-form-step-two/cod-form-step-two.component.mjs +3 -3
- package/esm2020/lib/components/components.module.mjs +10 -5
- package/esm2020/lib/components/forms/update-user-form/update-user-form.component.mjs +625 -0
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/iptdevs-design-system.mjs +624 -7
- package/fesm2015/iptdevs-design-system.mjs.map +1 -1
- package/fesm2020/iptdevs-design-system.mjs +627 -7
- package/fesm2020/iptdevs-design-system.mjs.map +1 -1
- package/lib/components/components.module.d.ts +9 -8
- package/lib/components/forms/update-user-form/update-user-form.component.d.ts +63 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import Swal from 'sweetalert2';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
import * as i2 from "design-system";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
import * as i4 from "../../atoms/button/button.component";
|
|
9
|
+
import * as i5 from "../../atoms/input/input.component";
|
|
10
|
+
import * as i6 from "../../atoms/select/select.component";
|
|
11
|
+
export class updateUserFormComponent {
|
|
12
|
+
constructor(fb, cdr, parameterService, baseService, userService) {
|
|
13
|
+
this.fb = fb;
|
|
14
|
+
this.cdr = cdr;
|
|
15
|
+
this.parameterService = parameterService;
|
|
16
|
+
this.baseService = baseService;
|
|
17
|
+
this.userService = userService;
|
|
18
|
+
this.visibleModal = false;
|
|
19
|
+
this.closeModalIS = new EventEmitter();
|
|
20
|
+
this.userUpdatedEvent = new EventEmitter();
|
|
21
|
+
this.photo = '';
|
|
22
|
+
this.phoneNumberIndicatives = [];
|
|
23
|
+
this.idTypes = [];
|
|
24
|
+
this.loader = false;
|
|
25
|
+
this.states = [];
|
|
26
|
+
this.cities = [];
|
|
27
|
+
this.countries = [];
|
|
28
|
+
this.showParentSection = false;
|
|
29
|
+
this.showEmailIpt = false;
|
|
30
|
+
this.indicatives = [];
|
|
31
|
+
this.civilStatus = [];
|
|
32
|
+
this.genders = [];
|
|
33
|
+
this.stratums = [];
|
|
34
|
+
this.parametersLoaded = false;
|
|
35
|
+
// userUpdated = false;
|
|
36
|
+
this.initialFormValue = [];
|
|
37
|
+
this.justifyOptions = [
|
|
38
|
+
// { name: 'Inactivos', code: 1 },
|
|
39
|
+
{ name: 'Activo', code: 1 },
|
|
40
|
+
{ name: 'Removido', code: 4 }
|
|
41
|
+
];
|
|
42
|
+
this.initForm();
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
console.log("entro a getParameters por ngoninit");
|
|
46
|
+
this.getParameters();
|
|
47
|
+
}
|
|
48
|
+
ngOnChanges(changes) {
|
|
49
|
+
if (changes['visibleModal'] && changes['visibleModal'].currentValue) {
|
|
50
|
+
console.log("entro a getParameters por visible modal, donde el change es:", changes['visibleModal']);
|
|
51
|
+
this.initializeForm();
|
|
52
|
+
this.cdr.detectChanges();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
getParameters() {
|
|
56
|
+
if (this.parametersLoaded) {
|
|
57
|
+
this.setParameters();
|
|
58
|
+
this.initializeForm();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.parameterService.getAllParametersCodForm().subscribe({
|
|
62
|
+
next: (response) => {
|
|
63
|
+
this.parametersAll = response.data;
|
|
64
|
+
this.parametersLoaded = true;
|
|
65
|
+
this.setParameters();
|
|
66
|
+
this.initializeForm();
|
|
67
|
+
this.cdr.detectChanges();
|
|
68
|
+
},
|
|
69
|
+
error: (err) => {
|
|
70
|
+
console.error('Error fetching parameters:', err);
|
|
71
|
+
this.parametersLoaded = false;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
setParameters() {
|
|
76
|
+
this.idTypes = this.parametersAll?.TypeIdCardByCountryCol;
|
|
77
|
+
this.indicatives = this.parametersAll?.indicatives;
|
|
78
|
+
this.countries = this.parametersAll?.country;
|
|
79
|
+
this.civilStatus = this.parametersAll?.civilStatus;
|
|
80
|
+
this.states = this.parametersAll?.State;
|
|
81
|
+
this.cities = this.parametersAll?.city;
|
|
82
|
+
// this.genders = [
|
|
83
|
+
// { code: 1, name: 'Masculino' },
|
|
84
|
+
// { code: 2, name: 'Femenino' }
|
|
85
|
+
// ];
|
|
86
|
+
if (this.parametersAll && this.parametersAll.gender) {
|
|
87
|
+
// Transformar gender en un arreglo de { code, name }
|
|
88
|
+
this.genders = this.parametersAll.gender.map((gender) => ({
|
|
89
|
+
code: gender.code,
|
|
90
|
+
name: gender.name_spanish
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.genders = [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
initializeForm() {
|
|
98
|
+
this.showParentSection = !!this.DataStudent?.cods?.parent?.code;
|
|
99
|
+
this.showEmailIpt = !!this.DataStudent?.email_ipt && this.DataStudent.email_ipt !== false;
|
|
100
|
+
this.initForm();
|
|
101
|
+
this.populateForm();
|
|
102
|
+
}
|
|
103
|
+
initForm() {
|
|
104
|
+
const baseForm = {
|
|
105
|
+
name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(32)]],
|
|
106
|
+
last_name: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(32)]],
|
|
107
|
+
email: ['', [Validators.required, Validators.email, Validators.maxLength(300)]],
|
|
108
|
+
gender: ['', [Validators.required]],
|
|
109
|
+
id_card_type: ['', [Validators.required]],
|
|
110
|
+
id_card: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(20)]],
|
|
111
|
+
phone_indicative: ['', [Validators.required]],
|
|
112
|
+
phone_number: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(15)]],
|
|
113
|
+
country: ['', [Validators.required]],
|
|
114
|
+
state: ['', [Validators.required]],
|
|
115
|
+
city: ['', [Validators.required]],
|
|
116
|
+
role: [{ value: '', disabled: true }],
|
|
117
|
+
service_hour: ['', Validators.required],
|
|
118
|
+
password: ['', []],
|
|
119
|
+
re_password: ['', []],
|
|
120
|
+
changePassword: [false],
|
|
121
|
+
status: ['', Validators.required]
|
|
122
|
+
};
|
|
123
|
+
if (this.showEmailIpt) {
|
|
124
|
+
Object.assign(baseForm, {
|
|
125
|
+
email_ipt: ['', [Validators.required, Validators.email, Validators.maxLength(255)]]
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (this.showParentSection) {
|
|
129
|
+
Object.assign(baseForm, {
|
|
130
|
+
parent_name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(150)]],
|
|
131
|
+
parent_last_name: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(150)]],
|
|
132
|
+
parent_id_card_type: ['', [Validators.required]],
|
|
133
|
+
parent_id_card: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(30)]],
|
|
134
|
+
parent_phone_indicative: ['', [Validators.required]],
|
|
135
|
+
parent_phone_number: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(20)]],
|
|
136
|
+
parent_occupation: ['', [Validators.required, Validators.maxLength(50)]],
|
|
137
|
+
parent_office_adrress: ['', [Validators.required, Validators.maxLength(150)]],
|
|
138
|
+
parent_email: ['', [Validators.email, Validators.maxLength(255)]]
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
this.updateUserForm = this.fb.group(baseForm, { validators: this.passwordMatchValidator });
|
|
142
|
+
this.updateUserForm.get('changePassword')?.valueChanges.subscribe((checked) => {
|
|
143
|
+
const passwordControl = this.updateUserForm.get('password');
|
|
144
|
+
const rePasswordControl = this.updateUserForm.get('re_password');
|
|
145
|
+
if (checked) {
|
|
146
|
+
passwordControl?.setValidators([Validators.required, Validators.minLength(5), Validators.maxLength(32)]);
|
|
147
|
+
rePasswordControl?.setValidators([Validators.required, Validators.minLength(5), Validators.maxLength(32)]);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
passwordControl?.clearValidators();
|
|
151
|
+
rePasswordControl?.clearValidators();
|
|
152
|
+
passwordControl?.setValue('');
|
|
153
|
+
rePasswordControl?.setValue('');
|
|
154
|
+
}
|
|
155
|
+
passwordControl?.updateValueAndValidity();
|
|
156
|
+
rePasswordControl?.updateValueAndValidity();
|
|
157
|
+
});
|
|
158
|
+
this.updateUserForm.get('password')?.valueChanges.subscribe(() => {
|
|
159
|
+
this.updateUserForm.updateValueAndValidity();
|
|
160
|
+
});
|
|
161
|
+
this.updateUserForm.get('re_password')?.valueChanges.subscribe(() => {
|
|
162
|
+
this.updateUserForm.updateValueAndValidity();
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
passwordMatchValidator(form) {
|
|
166
|
+
const changePassword = form.get('changePassword')?.value;
|
|
167
|
+
const password = form.get('password')?.value;
|
|
168
|
+
const rePassword = form.get('re_password')?.value;
|
|
169
|
+
if (!changePassword) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const mismatch = password && rePassword && password !== rePassword;
|
|
173
|
+
return mismatch ? { mismatch: true } : null;
|
|
174
|
+
}
|
|
175
|
+
noWhitespaceValidator(control) {
|
|
176
|
+
if (control.value && typeof control.value === 'string') {
|
|
177
|
+
const trimmedValue = control.value.trim();
|
|
178
|
+
if (trimmedValue.length === 0) {
|
|
179
|
+
return { onlyWhitespace: true };
|
|
180
|
+
}
|
|
181
|
+
if (control.value !== trimmedValue) {
|
|
182
|
+
return { hasWhitespace: true };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
transformRole(role) {
|
|
188
|
+
const roleMap = {
|
|
189
|
+
1: 'Super Admin',
|
|
190
|
+
10: 'Jefe Academico',
|
|
191
|
+
11: 'Coordinador Academico',
|
|
192
|
+
12: 'Teacher Academico',
|
|
193
|
+
13: 'Estudiante',
|
|
194
|
+
15: 'Posible Estudiante',
|
|
195
|
+
20: 'Jefe Marketing',
|
|
196
|
+
21: 'Coordinador Marketing',
|
|
197
|
+
22: 'Auxiliar Marketing',
|
|
198
|
+
30: 'Jefe Administrativo',
|
|
199
|
+
31: 'Coordinador Administrativo',
|
|
200
|
+
32: 'Cajero Administrativo',
|
|
201
|
+
40: 'Jefe Comercial',
|
|
202
|
+
41: 'Coordinador Comercial',
|
|
203
|
+
42: 'Asesor Comercial',
|
|
204
|
+
50: 'Jefe Cartera',
|
|
205
|
+
51: 'Coordinador Cartera',
|
|
206
|
+
52: 'Asesor Cartera',
|
|
207
|
+
60: 'Proveedor'
|
|
208
|
+
};
|
|
209
|
+
return roleMap[Number(role)] || '';
|
|
210
|
+
}
|
|
211
|
+
populateForm() {
|
|
212
|
+
if (this.DataStudent) {
|
|
213
|
+
const formValue = {
|
|
214
|
+
name: this.DataStudent.name || '',
|
|
215
|
+
last_name: this.DataStudent.last_name || '',
|
|
216
|
+
email: this.DataStudent.email || '',
|
|
217
|
+
gender: this.DataStudent.gender || null,
|
|
218
|
+
id_card_type: this.DataStudent.id_card_type || '',
|
|
219
|
+
id_card: this.DataStudent.id_card || '',
|
|
220
|
+
phone_indicative: this.DataStudent.phone_indicative || '',
|
|
221
|
+
phone_number: this.DataStudent.phone_number || '',
|
|
222
|
+
country: this.DataStudent.city?.country,
|
|
223
|
+
state: this.DataStudent.city?.state,
|
|
224
|
+
city: this.DataStudent.city?.code,
|
|
225
|
+
role: this.transformRole(this.DataStudent.role) || '',
|
|
226
|
+
service_hour: this.DataStudent.service_hour || 0,
|
|
227
|
+
changePassword: false,
|
|
228
|
+
password: '',
|
|
229
|
+
re_password: '',
|
|
230
|
+
status: this.DataStudent.user_status || ''
|
|
231
|
+
};
|
|
232
|
+
if (this.showEmailIpt) {
|
|
233
|
+
formValue.email_ipt = this.DataStudent.email_ipt || '';
|
|
234
|
+
}
|
|
235
|
+
if (this.showParentSection) {
|
|
236
|
+
Object.assign(formValue, {
|
|
237
|
+
parent_name: this.DataStudent.cods?.parent?.name || '',
|
|
238
|
+
parent_last_name: this.DataStudent.cods?.parent?.last_name || '',
|
|
239
|
+
parent_id_card_type: this.DataStudent.cods?.parent?.id_card_type || '',
|
|
240
|
+
parent_id_card: this.DataStudent.cods?.parent?.id_card || '',
|
|
241
|
+
parent_phone_indicative: this.DataStudent.cods?.parent?.phone_indicative || '',
|
|
242
|
+
parent_phone_number: this.DataStudent.cods?.parent?.phone_number || '',
|
|
243
|
+
parent_occupation: this.DataStudent.cods?.parent?.occupation || '',
|
|
244
|
+
parent_office_adrress: this.DataStudent.cods?.parent?.office_adrress || '',
|
|
245
|
+
parent_email: this.DataStudent.cods?.parent?.email || ''
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
this.updateUserForm.reset();
|
|
249
|
+
this.updateUserForm.patchValue(formValue);
|
|
250
|
+
this.initialFormValue = { ...this.updateUserForm.value };
|
|
251
|
+
if (formValue.country) {
|
|
252
|
+
console.log("en populateForm se envio dato para setearse country");
|
|
253
|
+
this.countries = this.parametersAll?.country;
|
|
254
|
+
this.selectCountry(this.DataStudent.city?.country);
|
|
255
|
+
}
|
|
256
|
+
if (formValue.state) {
|
|
257
|
+
this.selectState(this.DataStudent.city?.state);
|
|
258
|
+
}
|
|
259
|
+
if (formValue.city) {
|
|
260
|
+
this.selectCity(this.DataStudent.city?.code);
|
|
261
|
+
}
|
|
262
|
+
if (formValue.id_card_type) {
|
|
263
|
+
this.idTypes = this.parametersAll?.TypeIdCardByCountryCol;
|
|
264
|
+
this.selectGender(this.DataStudent.id_card_type);
|
|
265
|
+
}
|
|
266
|
+
if (formValue.phone_indicative) {
|
|
267
|
+
this.indicatives = this.parametersAll?.indicatives;
|
|
268
|
+
this.selectIndicative('phone_indicative', this.DataStudent.phone_indicative);
|
|
269
|
+
}
|
|
270
|
+
if (formValue.parent_phone_indicative) {
|
|
271
|
+
this.indicatives = this.parametersAll?.indicatives;
|
|
272
|
+
this.selectIndicative('parent_phone_indicative', this.DataStudent.cods?.parent?.phone_indicative);
|
|
273
|
+
}
|
|
274
|
+
if (formValue.gender) {
|
|
275
|
+
if (this.parametersAll && this.parametersAll.gender) {
|
|
276
|
+
// Transformar gender en un arreglo de { code, name }
|
|
277
|
+
this.genders = this.parametersAll.gender.map((gender) => ({
|
|
278
|
+
code: gender.code,
|
|
279
|
+
name: gender.name_spanish
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
this.genders = [];
|
|
284
|
+
}
|
|
285
|
+
this.selectGender(this.DataStudent.gender);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
closeTable() {
|
|
290
|
+
this.visibleModal = false;
|
|
291
|
+
this.updateUserForm.reset();
|
|
292
|
+
this.idTypes = [];
|
|
293
|
+
this.countries = [];
|
|
294
|
+
this.genders = [];
|
|
295
|
+
this.closeModalIS.emit(false);
|
|
296
|
+
}
|
|
297
|
+
selectRol(role) {
|
|
298
|
+
if (role !== null) {
|
|
299
|
+
this.updateUserForm.get('role')?.setValue(this.transformRole(role));
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
this.updateUserForm.get('role')?.setValue('');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
selectIndicative(field, indicative) {
|
|
306
|
+
if (indicative !== null) {
|
|
307
|
+
this.updateUserForm.get(field)?.setValue(indicative);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
this.updateUserForm.get(field)?.setValue(null);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
selectIdType(field, idType) {
|
|
314
|
+
if (idType !== null) {
|
|
315
|
+
this.updateUserForm.get(field)?.setValue(idType);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
this.updateUserForm.get(field)?.setValue(null);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
selectGender(gender) {
|
|
322
|
+
if (gender !== null) {
|
|
323
|
+
this.updateUserForm.get('gender')?.setValue(gender);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
this.updateUserForm.get('gender')?.setValue(null);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
selectCountry(country) {
|
|
330
|
+
const countryNumber = typeof country === 'string' ? parseInt(country, 10) : country;
|
|
331
|
+
if (country != null) {
|
|
332
|
+
this.updateUserForm.controls['country'].setValue(countryNumber);
|
|
333
|
+
console.log("se seteo country con el valor que entro en selectCountry");
|
|
334
|
+
if (this.parametersAll && this.parametersAll?.State) {
|
|
335
|
+
this.states = this.parametersAll.State.filter((course) => {
|
|
336
|
+
const state = typeof course.country === 'string'
|
|
337
|
+
? parseInt(course.country, 10)
|
|
338
|
+
: course.country;
|
|
339
|
+
return state === countryNumber;
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
this.states = [];
|
|
344
|
+
}
|
|
345
|
+
this.updateUserForm.controls['state'].setValue(null);
|
|
346
|
+
this.updateUserForm.controls['city'].setValue(null);
|
|
347
|
+
this.cities = [];
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
this.updateUserForm.controls['country'].setValue(null);
|
|
351
|
+
this.states = [];
|
|
352
|
+
this.cities = [];
|
|
353
|
+
this.cdr.detectChanges();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
selectState(state) {
|
|
357
|
+
const stateNumber = typeof state === 'string' ? parseInt(state, 10) : state;
|
|
358
|
+
if (state !== null) {
|
|
359
|
+
this.updateUserForm.controls['state'].setValue(stateNumber);
|
|
360
|
+
this.updateUserForm.controls['city'].setValue(null);
|
|
361
|
+
this.cities = [];
|
|
362
|
+
this.getState(stateNumber);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
this.updateUserForm.controls['state'].setValue(null);
|
|
366
|
+
this.updateUserForm.controls['city'].setValue(null);
|
|
367
|
+
this.cities = [];
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
getState(state) {
|
|
371
|
+
this.getCity(state);
|
|
372
|
+
}
|
|
373
|
+
getCity(state) {
|
|
374
|
+
const stateNumber = typeof state === 'string' ? parseInt(state, 10) : state;
|
|
375
|
+
if (this.parametersAll?.city) {
|
|
376
|
+
this.cities = this.parametersAll.city.filter((course) => {
|
|
377
|
+
const cityState = typeof course.state === 'string' ? parseInt(course.state, 10) : course.state;
|
|
378
|
+
return cityState === stateNumber;
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
this.cities = [];
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
selectCity(city) {
|
|
386
|
+
const cityNumber = typeof city === 'string' ? parseInt(city, 10) : city;
|
|
387
|
+
if (city !== null) {
|
|
388
|
+
this.updateUserForm.controls['city'].setValue(cityNumber);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
this.updateUserForm.controls['city'].setValue(null);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
setPhoto(type) {
|
|
395
|
+
if (type === 'student')
|
|
396
|
+
this.photo = '/platform/academic/assets/student.jpg';
|
|
397
|
+
if (type === 'academic')
|
|
398
|
+
this.photo = '/platform/academic/assets/academico.png';
|
|
399
|
+
if (type === 'administrative')
|
|
400
|
+
this.photo = '/platform/administrative/assets/administrativo.jpg';
|
|
401
|
+
if (type === 'marketing')
|
|
402
|
+
this.photo = '/platform/marketing/assets/marketing.jpg';
|
|
403
|
+
if (type === 'commercial')
|
|
404
|
+
this.photo = '/platform/commercial/assets/user-form-assets/comercial.jpg';
|
|
405
|
+
if (type === 'treasure')
|
|
406
|
+
this.photo = '/platform/treasure/assets/administrativo.jpg';
|
|
407
|
+
}
|
|
408
|
+
updateUser() {
|
|
409
|
+
if (this.updateUserForm.invalid ||
|
|
410
|
+
this.updateUserForm.hasError('mismatch') ||
|
|
411
|
+
!this.hasFormChanged()) {
|
|
412
|
+
this.updateUserForm.markAllAsTouched();
|
|
413
|
+
console.log('createUser - Validation failed:', {
|
|
414
|
+
invalid: this.updateUserForm.invalid,
|
|
415
|
+
mismatch: this.updateUserForm.hasError('mismatch'),
|
|
416
|
+
hasChanges: this.hasFormChanged()
|
|
417
|
+
});
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
this.loader = true;
|
|
421
|
+
const formValue = this.updateUserForm.getRawValue();
|
|
422
|
+
const request = {
|
|
423
|
+
token: this.baseService.getUserToken(),
|
|
424
|
+
user: {
|
|
425
|
+
code: this.DataStudent.code,
|
|
426
|
+
name: formValue.name,
|
|
427
|
+
last_name: formValue.last_name,
|
|
428
|
+
id_card_type: formValue.id_card_type,
|
|
429
|
+
id_card: formValue.id_card,
|
|
430
|
+
phone_indicative: formValue.phone_indicative,
|
|
431
|
+
phone_number: formValue.phone_number,
|
|
432
|
+
email: formValue.email,
|
|
433
|
+
gender: formValue.gender,
|
|
434
|
+
city: formValue.city,
|
|
435
|
+
service_hour: formValue.service_hour,
|
|
436
|
+
role: this.DataStudent.role,
|
|
437
|
+
status: formValue.status,
|
|
438
|
+
...(this.showEmailIpt ? { email_ipt: formValue.email_ipt } : {}),
|
|
439
|
+
...(formValue.changePassword && formValue.password ? { password: formValue.password } : {})
|
|
440
|
+
},
|
|
441
|
+
parent: this.showParentSection
|
|
442
|
+
? {
|
|
443
|
+
code: this.DataStudent.cods?.parent?.code || null,
|
|
444
|
+
name: formValue.parent_name || null,
|
|
445
|
+
last_name: formValue.parent_last_name || null,
|
|
446
|
+
id_card_type: formValue.parent_id_card_type || null,
|
|
447
|
+
id_card: formValue.parent_id_card || null,
|
|
448
|
+
phone_indicative: formValue.parent_phone_indicative || null,
|
|
449
|
+
phone_number: formValue.parent_phone_number || null,
|
|
450
|
+
occupation: formValue.parent_occupation || null,
|
|
451
|
+
office_adrress: formValue.parent_office_adrress || null,
|
|
452
|
+
email: formValue.parent_email || null
|
|
453
|
+
}
|
|
454
|
+
: null
|
|
455
|
+
};
|
|
456
|
+
console.log(request);
|
|
457
|
+
this.userService.updateUserAndParentByCode(request).subscribe((response) => {
|
|
458
|
+
// this.courseType = response.data;
|
|
459
|
+
if (response.message.code === 1) {
|
|
460
|
+
Swal.fire({
|
|
461
|
+
position: 'center',
|
|
462
|
+
icon: 'success',
|
|
463
|
+
title: 'usuario actualizado satisfactoriamente',
|
|
464
|
+
showConfirmButton: false,
|
|
465
|
+
timer: 2500,
|
|
466
|
+
});
|
|
467
|
+
// this.userUpdated = true
|
|
468
|
+
this.userUpdatedEvent.emit();
|
|
469
|
+
this.closeTable();
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
Swal.fire({
|
|
473
|
+
position: 'center',
|
|
474
|
+
icon: 'error',
|
|
475
|
+
title: 'Ha ocurrido un error inesperado',
|
|
476
|
+
showConfirmButton: false,
|
|
477
|
+
timer: 2500,
|
|
478
|
+
});
|
|
479
|
+
// this.userUpdated = false
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
this.loader = false;
|
|
483
|
+
}
|
|
484
|
+
hasFormChanged() {
|
|
485
|
+
if (!this.initialFormValue || !this.DataStudent) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
const currentValue = this.updateUserForm.getRawValue();
|
|
489
|
+
if (currentValue.changePassword) {
|
|
490
|
+
const password = currentValue.password;
|
|
491
|
+
const rePassword = currentValue.re_password;
|
|
492
|
+
const passwordControl = this.updateUserForm.get('password');
|
|
493
|
+
const rePasswordControl = this.updateUserForm.get('re_password');
|
|
494
|
+
if (passwordControl?.valid &&
|
|
495
|
+
rePasswordControl?.valid &&
|
|
496
|
+
password === rePassword &&
|
|
497
|
+
password?.trim() !== '') {
|
|
498
|
+
return true;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
const fieldsToCompare = [
|
|
502
|
+
'name',
|
|
503
|
+
'last_name',
|
|
504
|
+
'email',
|
|
505
|
+
'gender',
|
|
506
|
+
'id_card_type',
|
|
507
|
+
'id_card',
|
|
508
|
+
'phone_indicative',
|
|
509
|
+
'phone_number',
|
|
510
|
+
'country',
|
|
511
|
+
'state',
|
|
512
|
+
'city',
|
|
513
|
+
'role',
|
|
514
|
+
'service_hour',
|
|
515
|
+
'status'
|
|
516
|
+
];
|
|
517
|
+
if (this.showEmailIpt) {
|
|
518
|
+
fieldsToCompare.push('email_ipt');
|
|
519
|
+
}
|
|
520
|
+
if (this.showParentSection) {
|
|
521
|
+
fieldsToCompare.push('parent_name', 'parent_last_name', 'parent_id_card_type', 'parent_id_card', 'parent_phone_indicative', 'parent_phone_number', 'parent_occupation', 'parent_office_adrress', 'parent_email');
|
|
522
|
+
}
|
|
523
|
+
for (const field of fieldsToCompare) {
|
|
524
|
+
let originalValue;
|
|
525
|
+
let currentFieldValue = currentValue[field];
|
|
526
|
+
switch (field) {
|
|
527
|
+
case 'name':
|
|
528
|
+
originalValue = this.DataStudent.name || '';
|
|
529
|
+
break;
|
|
530
|
+
case 'last_name':
|
|
531
|
+
originalValue = this.DataStudent.last_name || '';
|
|
532
|
+
break;
|
|
533
|
+
case 'email':
|
|
534
|
+
originalValue = this.DataStudent.email || '';
|
|
535
|
+
break;
|
|
536
|
+
case 'email_ipt':
|
|
537
|
+
originalValue = this.DataStudent.email_ipt || '';
|
|
538
|
+
break;
|
|
539
|
+
case 'gender':
|
|
540
|
+
originalValue = this.DataStudent.gender || null;
|
|
541
|
+
break;
|
|
542
|
+
case 'id_card_type':
|
|
543
|
+
originalValue = this.DataStudent.id_card_type || '';
|
|
544
|
+
break;
|
|
545
|
+
case 'id_card':
|
|
546
|
+
originalValue = this.DataStudent.id_card || '';
|
|
547
|
+
break;
|
|
548
|
+
case 'phone_indicative':
|
|
549
|
+
originalValue = this.DataStudent.phone_indicative || '';
|
|
550
|
+
break;
|
|
551
|
+
case 'phone_number':
|
|
552
|
+
originalValue = this.DataStudent.phone_number || '';
|
|
553
|
+
break;
|
|
554
|
+
case 'country':
|
|
555
|
+
originalValue = this.DataStudent.city?.country || '';
|
|
556
|
+
break;
|
|
557
|
+
case 'state':
|
|
558
|
+
originalValue = this.DataStudent.city?.state || '';
|
|
559
|
+
break;
|
|
560
|
+
case 'city':
|
|
561
|
+
originalValue = this.DataStudent.city?.code || '';
|
|
562
|
+
break;
|
|
563
|
+
case 'role':
|
|
564
|
+
originalValue = this.transformRole(this.DataStudent.role) || '';
|
|
565
|
+
break;
|
|
566
|
+
case 'service_hour':
|
|
567
|
+
originalValue = this.DataStudent.service_hour;
|
|
568
|
+
break;
|
|
569
|
+
case 'status':
|
|
570
|
+
originalValue = this.DataStudent.user_status || '';
|
|
571
|
+
break;
|
|
572
|
+
case 'parent_name':
|
|
573
|
+
originalValue = this.DataStudent.cods?.parent?.name || '';
|
|
574
|
+
break;
|
|
575
|
+
case 'parent_last_name':
|
|
576
|
+
originalValue = this.DataStudent.cods?.parent?.last_name || '';
|
|
577
|
+
break;
|
|
578
|
+
case 'parent_id_card_type':
|
|
579
|
+
originalValue = this.DataStudent.cods?.parent?.id_card_type;
|
|
580
|
+
break;
|
|
581
|
+
case 'parent_id_card':
|
|
582
|
+
originalValue = this.DataStudent.cods?.parent?.id_card || '';
|
|
583
|
+
break;
|
|
584
|
+
case 'parent_phone_indicative':
|
|
585
|
+
originalValue = this.DataStudent.cods?.parent?.phone_indicative || '';
|
|
586
|
+
break;
|
|
587
|
+
case 'parent_phone_number':
|
|
588
|
+
originalValue = this.DataStudent.cods?.parent?.phone_number || '';
|
|
589
|
+
break;
|
|
590
|
+
case 'parent_occupation':
|
|
591
|
+
originalValue = this.DataStudent.cods?.parent?.occupation || '';
|
|
592
|
+
break;
|
|
593
|
+
case 'parent_office_adrress':
|
|
594
|
+
originalValue = this.DataStudent.cods?.parent?.office_adrress || '';
|
|
595
|
+
break;
|
|
596
|
+
case 'parent_email':
|
|
597
|
+
originalValue = this.DataStudent.cods?.parent?.email || '';
|
|
598
|
+
break;
|
|
599
|
+
default:
|
|
600
|
+
originalValue = '';
|
|
601
|
+
}
|
|
602
|
+
const normalizedCurrent = currentFieldValue != null ? String(currentFieldValue).trim() : '';
|
|
603
|
+
const normalizedOriginal = originalValue != null ? String(originalValue).trim() : '';
|
|
604
|
+
if (normalizedCurrent !== normalizedOriginal) {
|
|
605
|
+
return true;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
updateUserFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: updateUserFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.ParameterService }, { token: i2.BaseService }, { token: i2.UserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
612
|
+
updateUserFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.7", type: updateUserFormComponent, selector: "ipt-update-user-form", inputs: { DataStudent: "DataStudent", visibleModal: "visibleModal" }, outputs: { closeModalIS: "closeModalIS", userUpdatedEvent: "userUpdatedEvent" }, usesOnChanges: true, ngImport: i0, template: "<!-- <p-dialog\n [(visible)]=\"visibleModal\"\n [style]=\"{width: '80%'}\"\n header=\"Actualizar usuario\"\n [modal]=\"true\"\n styleClass=\"p-fluid\"\n (onHide)=\"closeTable()\"\n [dismissableMask]=\"true\"\n [breakpoints]=\"{'1920px': '75vw', '1440px': '75vw', '1024px': '75vw', '576px': '100vw'}\"\n> -->\n<!-- <div>\n <pre>{{ updateUserForm.value | json }}</pre>\n <div>\n <pre>{{ updateUserForm.valid | json }}</pre>\n </div>\n</div> -->\n <div class=\"grid_container\">\n <div>\n <form *ngIf=\"updateUserForm\" autocomplete=\"off\" [formGroup]=\"updateUserForm\">\n <!-- User Information Section -->\n <div class=\"section-header\">\n <h2>Informaci\u00F3n del usuario</h2>\n </div>\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['name']\"\n [validateText]=\"updateUserForm.controls['name'].hasError('required') ? 'Debe ingresar el nombre' :\n updateUserForm.controls['name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['last_name']\"\n [validateText]=\"updateUserForm.controls['last_name'].hasError('required') ? 'Debe ingresar los apellidos' :\n updateUserForm.controls['last_name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['last_name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['last_name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['last_name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['last_name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['email']\"\n [validateText]=\"updateUserForm.controls['email'].hasError('required') ? 'Debe ingresar un correo v\u00E1lido' :\n updateUserForm.controls['email'].hasError('maxlength') ? 'M\u00E1ximo 300 caracteres' :\n updateUserForm.controls['email'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'text'\"\n [placeHolder]=\"'Email IPT'\"\n [control]=\"updateUserForm.controls['email_ipt']\"\n [validateText]=\"updateUserForm.controls['email_ipt'].hasError('required') ? 'Debe ingresar un correo IPT v\u00E1lido' :\n updateUserForm.controls['email_ipt'].hasError('maxlength') ? 'M\u00E1ximo 255 caracteres' :\n updateUserForm.controls['email_ipt'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email_ipt'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email_ipt'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo IPT v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'number'\"\n [placeHolder]=\"'Horas de servicio'\"\n [control]=\"updateUserForm.controls['service_hour']\"\n [validateText]=\"'Debe ingresar las horas de servicio'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Rol'\"\n [control]=\"updateUserForm.controls['role']\"\n [validateText]=\"'Rol requerido'\"\n ></ipt-input>\n <!-- <ipt-select\n [initialValue]=\"updateUserForm.controls['gender'].value\"\n [control]=\"updateUserForm.controls['gender']\"\n [selectCode]=\"updateUserForm.controls['gender'].value === null ? 'Seleccione g\u00E9nero' : (updateUserForm.controls['gender'].value | genderDisplay)\"\n [data]=\"genders\"\n (eventSelect)=\"selectGender($event)\"\n [defaultText]=\"'Seleccione g\u00E9nero'\"\n ></ipt-select> -->\n <ipt-select\n [initialValue]=\"updateUserForm.controls['phone_indicative'].value\"\n [control]=\"updateUserForm.controls['phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['id_card_type'].value\"\n [control]=\"updateUserForm.controls['id_card_type']\"\n [selectCode]=\"updateUserForm.controls['id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['country'].value\"\n [control]=\"updateUserForm.controls['country']\"\n [selectCode]=\"updateUserForm.controls['country'].value === null ? 'Pa\u00EDs de residencia' : updateUserForm.controls['country'].value\"\n (eventSelect)=\"selectCountry($event)\"\n [data]=\"countries\"\n [defaultText]=\"'Pa\u00EDs de residencia'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['state'].value\"\n [control]=\"updateUserForm.controls['state']\"\n [selectCode]=\"updateUserForm.controls['state'].value === null ? 'Departamento o estado' : updateUserForm.controls['state'].value\"\n [isRequired]=\"true\"\n (eventSelect)=\"selectState($event)\"\n [data]=\"states\"\n [defaultText]=\"'Departamento o estado'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['city'].value\"\n [control]=\"updateUserForm.controls['city']\"\n [selectCode]=\"updateUserForm.controls['city'].value === null ? 'Ciudad de residencia' : updateUserForm.controls['city'].value\"\n (eventSelect)=\"selectCity($event)\"\n [data]=\"cities\"\n [defaultText]=\"'Ciudad de residencia'\"\n ></ipt-select>\n <!-- <div *ngIf=\"this.DataStudent.role !== 13\" class=\"card flex justify-content-center align-content-center align-items-end text-cen ter \">\n <p-selectButton [options]=\"justifyOptions\" formControlName=\"status\" optionLabel=\"name\" optionValue=\"code\"></p-selectButton>\n </div>\n <div class=\"field\">\n <p-checkbox\n formControlName=\"changePassword\"\n label=\"Cambio de contrase\u00F1a\"\n [binary]=\"true\"\n ></p-checkbox>\n </div> -->\n </div>\n <div class=\"form-grid\" *ngIf=\"updateUserForm.controls['changePassword'].value\">\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['password']\"\n [validateText]=\"updateUserForm.controls['password'].hasError('required') ? 'La contrase\u00F1a es requerida' :\n updateUserForm.controls['password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n 'Ingrese una contrase\u00F1a v\u00E1lida'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Repetir contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['re_password']\"\n [validateText]=\"updateUserForm.controls['re_password'].hasError('required') ? 'Debe repetir la contrase\u00F1a' :\n updateUserForm.controls['re_password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['re_password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.hasError('mismatch') ? 'Las contrase\u00F1as no coinciden' :\n 'Repita la contrase\u00F1a'\"\n ></ipt-input>\n </div>\n\n <!-- Mensaje adicional para el error de mismatch (opcional, si quieres mostrarlo por separado) -->\n\n <div *ngIf=\"updateUserForm.hasError('mismatch') && updateUserForm.controls['changePassword'].value\" class=\"error-message\">\n <small >Las contrase\u00F1as no coinciden</small>\n </div>\n <!-- Parent Information Section -->\n <div class=\"section-header\" *ngIf=\"DataStudent?.cods\">\n <h2>Informaci\u00F3n del acudiente</h2>\n </div>\n <div *ngIf=\"DataStudent?.cods\">\n <div *ngIf=\"showParentSection; else noParentMessage\">\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['parent_name']\"\n [validateText]=\"'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['parent_last_name']\"\n [validateText]=\"'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Ocupaci\u00F3n'\"\n [control]=\"updateUserForm.controls['parent_occupation']\"\n [validateText]=\"'Debe ingresar la ocupaci\u00F3n'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['parent_email']\"\n [validateText]=\"'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_id_card_type'].value\"\n [control]=\"updateUserForm.controls['parent_id_card_type']\"\n [selectCode]=\"updateUserForm.controls['parent_id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['parent_id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('parent_id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['parent_id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_phone_indicative'].value\"\n [control]=\"updateUserForm.controls['parent_phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('parent_phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['parent_phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Direcci\u00F3n de oficina'\"\n [control]=\"updateUserForm.controls['parent_office_adrress']\"\n [validateText]=\"'Debe ingresar la direcci\u00F3n'\"\n ></ipt-input>\n </div>\n </div>\n <ng-template #noParentMessage>\n <div class=\"no-parent-message\">\n <p>Sin acudiente</p>\n </div>\n </ng-template>\n </div>\n\n <div class=\"buttons-container\">\n <ipt-button\n [label]=\"'Actualizar'\"\n [isEnabled]=\"!loader && updateUserForm.valid && !updateUserForm.hasError('mismatch') && hasFormChanged()\"\n (onClick)=\"updateUser()\"\n [primary]=\"true\"\n ></ipt-button>\n </div>\n </form>\n </div>\n </div>\n<!-- </p-dialog> -->", styles: ["@media screen and (min-width: 320px){main{background:rgba(0,0,0,.472);color:#fff;position:fixed;top:0;left:0;height:100vh;width:100vw;transition:all .5s}main .modal_container{width:60%;height:-moz-fit-content;height:fit-content;position:absolute;inset:0;margin:auto;background-color:#fff;border-radius:3px}.header_modal{display:flex;padding:15px 15px 0;gap:1rem;align-items:center}.header_modal h1{padding:.5rem;background-color:#1c77f7;color:#fff;width:100%;border-radius:10px;font-size:1.25rem;font-weight:700}.header_modal button{margin-left:auto;font-size:26px;padding:1.2rem;font-weight:200;color:#6c7f7d;display:flex;width:25px;height:25px;align-items:center;justify-content:center;transition:50ms;background-color:transparent;border:none}.header_modal button:hover{cursor:pointer;border-radius:50%;background-color:#d4d4d4}.grid_container{display:grid;grid-template-columns:1fr;padding:0 15px}form{display:grid;grid-template-columns:1fr;gap:.25rem;justify-content:center;padding:0 1rem}.section-header{margin:1.5rem 0 .5rem;border-bottom:2px solid #1c77f7}.section-header h2{font-size:1.2rem;color:#1c77f7;font-weight:600;margin-bottom:.5rem}.form-grid{display:grid;grid-template-columns:1fr;gap:.25rem}.buttons-container{margin-top:2rem;margin-bottom:2rem;display:flex;justify-content:center;align-items:center}.user-type-image{display:none}.no-parent-message{padding:1rem;text-align:center;color:#666;font-size:1rem;font-weight:500;background-color:#f8f9fa;border-radius:.5rem;margin-top:.5rem}}@media screen and (min-width: 768px){.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem}}@media screen and (min-width: 1366px){form{padding:0}}.field{height:1px;max-width:67%}.error-message{color:red;font-size:12px;margin-top:5px}.p-selectbutton{display:flex;flex-wrap:wrap;justify-content:center;width:100%;min-width:10rem}:host ::ng-deep .p-selectbutton .p-button{padding:.5rem;font-size:.875rem;height:30px}:host ::ng-deep .p-buttonset .p-button:first-of-type{height:30px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.ButtonComponent, selector: "ipt-button", inputs: ["primary", "size", "label", "buttonType", "isEnabled"], outputs: ["onClick"] }, { kind: "component", type: i5.InputComponent, selector: "ipt-input", inputs: ["inputType", "placeHolder", "validateText", "withPipe", "list", "iconUrl", "control", "prefix", "thousands", "decimal", "disabledSel"], outputs: ["dateSelected"] }, { kind: "component", type: i6.SelectComponent, selector: "ipt-select", inputs: ["isRequired", "data", "defaultText", "selectCode", "disabledSel", "initialValue", "label", "control"], outputs: ["eventSelect"] }] });
|
|
613
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: updateUserFormComponent, decorators: [{
|
|
614
|
+
type: Component,
|
|
615
|
+
args: [{ selector: 'ipt-update-user-form', template: "<!-- <p-dialog\n [(visible)]=\"visibleModal\"\n [style]=\"{width: '80%'}\"\n header=\"Actualizar usuario\"\n [modal]=\"true\"\n styleClass=\"p-fluid\"\n (onHide)=\"closeTable()\"\n [dismissableMask]=\"true\"\n [breakpoints]=\"{'1920px': '75vw', '1440px': '75vw', '1024px': '75vw', '576px': '100vw'}\"\n> -->\n<!-- <div>\n <pre>{{ updateUserForm.value | json }}</pre>\n <div>\n <pre>{{ updateUserForm.valid | json }}</pre>\n </div>\n</div> -->\n <div class=\"grid_container\">\n <div>\n <form *ngIf=\"updateUserForm\" autocomplete=\"off\" [formGroup]=\"updateUserForm\">\n <!-- User Information Section -->\n <div class=\"section-header\">\n <h2>Informaci\u00F3n del usuario</h2>\n </div>\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['name']\"\n [validateText]=\"updateUserForm.controls['name'].hasError('required') ? 'Debe ingresar el nombre' :\n updateUserForm.controls['name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['last_name']\"\n [validateText]=\"updateUserForm.controls['last_name'].hasError('required') ? 'Debe ingresar los apellidos' :\n updateUserForm.controls['last_name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['last_name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['last_name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['last_name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['last_name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['email']\"\n [validateText]=\"updateUserForm.controls['email'].hasError('required') ? 'Debe ingresar un correo v\u00E1lido' :\n updateUserForm.controls['email'].hasError('maxlength') ? 'M\u00E1ximo 300 caracteres' :\n updateUserForm.controls['email'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'text'\"\n [placeHolder]=\"'Email IPT'\"\n [control]=\"updateUserForm.controls['email_ipt']\"\n [validateText]=\"updateUserForm.controls['email_ipt'].hasError('required') ? 'Debe ingresar un correo IPT v\u00E1lido' :\n updateUserForm.controls['email_ipt'].hasError('maxlength') ? 'M\u00E1ximo 255 caracteres' :\n updateUserForm.controls['email_ipt'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email_ipt'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email_ipt'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo IPT v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'number'\"\n [placeHolder]=\"'Horas de servicio'\"\n [control]=\"updateUserForm.controls['service_hour']\"\n [validateText]=\"'Debe ingresar las horas de servicio'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Rol'\"\n [control]=\"updateUserForm.controls['role']\"\n [validateText]=\"'Rol requerido'\"\n ></ipt-input>\n <!-- <ipt-select\n [initialValue]=\"updateUserForm.controls['gender'].value\"\n [control]=\"updateUserForm.controls['gender']\"\n [selectCode]=\"updateUserForm.controls['gender'].value === null ? 'Seleccione g\u00E9nero' : (updateUserForm.controls['gender'].value | genderDisplay)\"\n [data]=\"genders\"\n (eventSelect)=\"selectGender($event)\"\n [defaultText]=\"'Seleccione g\u00E9nero'\"\n ></ipt-select> -->\n <ipt-select\n [initialValue]=\"updateUserForm.controls['phone_indicative'].value\"\n [control]=\"updateUserForm.controls['phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['id_card_type'].value\"\n [control]=\"updateUserForm.controls['id_card_type']\"\n [selectCode]=\"updateUserForm.controls['id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['country'].value\"\n [control]=\"updateUserForm.controls['country']\"\n [selectCode]=\"updateUserForm.controls['country'].value === null ? 'Pa\u00EDs de residencia' : updateUserForm.controls['country'].value\"\n (eventSelect)=\"selectCountry($event)\"\n [data]=\"countries\"\n [defaultText]=\"'Pa\u00EDs de residencia'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['state'].value\"\n [control]=\"updateUserForm.controls['state']\"\n [selectCode]=\"updateUserForm.controls['state'].value === null ? 'Departamento o estado' : updateUserForm.controls['state'].value\"\n [isRequired]=\"true\"\n (eventSelect)=\"selectState($event)\"\n [data]=\"states\"\n [defaultText]=\"'Departamento o estado'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['city'].value\"\n [control]=\"updateUserForm.controls['city']\"\n [selectCode]=\"updateUserForm.controls['city'].value === null ? 'Ciudad de residencia' : updateUserForm.controls['city'].value\"\n (eventSelect)=\"selectCity($event)\"\n [data]=\"cities\"\n [defaultText]=\"'Ciudad de residencia'\"\n ></ipt-select>\n <!-- <div *ngIf=\"this.DataStudent.role !== 13\" class=\"card flex justify-content-center align-content-center align-items-end text-cen ter \">\n <p-selectButton [options]=\"justifyOptions\" formControlName=\"status\" optionLabel=\"name\" optionValue=\"code\"></p-selectButton>\n </div>\n <div class=\"field\">\n <p-checkbox\n formControlName=\"changePassword\"\n label=\"Cambio de contrase\u00F1a\"\n [binary]=\"true\"\n ></p-checkbox>\n </div> -->\n </div>\n <div class=\"form-grid\" *ngIf=\"updateUserForm.controls['changePassword'].value\">\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['password']\"\n [validateText]=\"updateUserForm.controls['password'].hasError('required') ? 'La contrase\u00F1a es requerida' :\n updateUserForm.controls['password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n 'Ingrese una contrase\u00F1a v\u00E1lida'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Repetir contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['re_password']\"\n [validateText]=\"updateUserForm.controls['re_password'].hasError('required') ? 'Debe repetir la contrase\u00F1a' :\n updateUserForm.controls['re_password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['re_password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.hasError('mismatch') ? 'Las contrase\u00F1as no coinciden' :\n 'Repita la contrase\u00F1a'\"\n ></ipt-input>\n </div>\n\n <!-- Mensaje adicional para el error de mismatch (opcional, si quieres mostrarlo por separado) -->\n\n <div *ngIf=\"updateUserForm.hasError('mismatch') && updateUserForm.controls['changePassword'].value\" class=\"error-message\">\n <small >Las contrase\u00F1as no coinciden</small>\n </div>\n <!-- Parent Information Section -->\n <div class=\"section-header\" *ngIf=\"DataStudent?.cods\">\n <h2>Informaci\u00F3n del acudiente</h2>\n </div>\n <div *ngIf=\"DataStudent?.cods\">\n <div *ngIf=\"showParentSection; else noParentMessage\">\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['parent_name']\"\n [validateText]=\"'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['parent_last_name']\"\n [validateText]=\"'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Ocupaci\u00F3n'\"\n [control]=\"updateUserForm.controls['parent_occupation']\"\n [validateText]=\"'Debe ingresar la ocupaci\u00F3n'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['parent_email']\"\n [validateText]=\"'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_id_card_type'].value\"\n [control]=\"updateUserForm.controls['parent_id_card_type']\"\n [selectCode]=\"updateUserForm.controls['parent_id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['parent_id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('parent_id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['parent_id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_phone_indicative'].value\"\n [control]=\"updateUserForm.controls['parent_phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('parent_phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['parent_phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Direcci\u00F3n de oficina'\"\n [control]=\"updateUserForm.controls['parent_office_adrress']\"\n [validateText]=\"'Debe ingresar la direcci\u00F3n'\"\n ></ipt-input>\n </div>\n </div>\n <ng-template #noParentMessage>\n <div class=\"no-parent-message\">\n <p>Sin acudiente</p>\n </div>\n </ng-template>\n </div>\n\n <div class=\"buttons-container\">\n <ipt-button\n [label]=\"'Actualizar'\"\n [isEnabled]=\"!loader && updateUserForm.valid && !updateUserForm.hasError('mismatch') && hasFormChanged()\"\n (onClick)=\"updateUser()\"\n [primary]=\"true\"\n ></ipt-button>\n </div>\n </form>\n </div>\n </div>\n<!-- </p-dialog> -->", styles: ["@media screen and (min-width: 320px){main{background:rgba(0,0,0,.472);color:#fff;position:fixed;top:0;left:0;height:100vh;width:100vw;transition:all .5s}main .modal_container{width:60%;height:-moz-fit-content;height:fit-content;position:absolute;inset:0;margin:auto;background-color:#fff;border-radius:3px}.header_modal{display:flex;padding:15px 15px 0;gap:1rem;align-items:center}.header_modal h1{padding:.5rem;background-color:#1c77f7;color:#fff;width:100%;border-radius:10px;font-size:1.25rem;font-weight:700}.header_modal button{margin-left:auto;font-size:26px;padding:1.2rem;font-weight:200;color:#6c7f7d;display:flex;width:25px;height:25px;align-items:center;justify-content:center;transition:50ms;background-color:transparent;border:none}.header_modal button:hover{cursor:pointer;border-radius:50%;background-color:#d4d4d4}.grid_container{display:grid;grid-template-columns:1fr;padding:0 15px}form{display:grid;grid-template-columns:1fr;gap:.25rem;justify-content:center;padding:0 1rem}.section-header{margin:1.5rem 0 .5rem;border-bottom:2px solid #1c77f7}.section-header h2{font-size:1.2rem;color:#1c77f7;font-weight:600;margin-bottom:.5rem}.form-grid{display:grid;grid-template-columns:1fr;gap:.25rem}.buttons-container{margin-top:2rem;margin-bottom:2rem;display:flex;justify-content:center;align-items:center}.user-type-image{display:none}.no-parent-message{padding:1rem;text-align:center;color:#666;font-size:1rem;font-weight:500;background-color:#f8f9fa;border-radius:.5rem;margin-top:.5rem}}@media screen and (min-width: 768px){.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem}}@media screen and (min-width: 1366px){form{padding:0}}.field{height:1px;max-width:67%}.error-message{color:red;font-size:12px;margin-top:5px}.p-selectbutton{display:flex;flex-wrap:wrap;justify-content:center;width:100%;min-width:10rem}:host ::ng-deep .p-selectbutton .p-button{padding:.5rem;font-size:.875rem;height:30px}:host ::ng-deep .p-buttonset .p-button:first-of-type{height:30px}\n"] }]
|
|
616
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.ParameterService }, { type: i2.BaseService }, { type: i2.UserService }]; }, propDecorators: { DataStudent: [{
|
|
617
|
+
type: Input
|
|
618
|
+
}], visibleModal: [{
|
|
619
|
+
type: Input
|
|
620
|
+
}], closeModalIS: [{
|
|
621
|
+
type: Output
|
|
622
|
+
}], userUpdatedEvent: [{
|
|
623
|
+
type: Output
|
|
624
|
+
}] } });
|
|
625
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXVzZXItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy91cGRhdGUtdXNlci1mb3JtL3VwZGF0ZS11c2VyLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvdXBkYXRlLXVzZXItZm9ybS91cGRhdGUtdXNlci1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBb0MsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM1SCxPQUFPLEVBQTJDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JGLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7QUFPL0IsTUFBTSxPQUFPLHVCQUF1QjtJQThCbEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0IsRUFDdEIsZ0JBQWtDLEVBQ2xDLFdBQXdCLEVBQ3hCLFdBQXdCO1FBSnhCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBakN6QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM3QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDM0MscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV0RCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztRQUNuQyxZQUFPLEdBQVUsRUFBRSxDQUFDO1FBQ3BCLFdBQU0sR0FB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QyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO29CQUNwRSxNQUFNO2dCQUNSLEtBQUssY0FBYztvQkFDakIsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUMzRCxNQUFNO2dCQUNSO29CQUNFLGFBQWEsR0FBRyxFQUFFLENBQUM7YUFDdEI7WUFFRCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RixNQUFNLGtCQUFrQixHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXJGLElBQUksaUJBQWlCLEtBQUssa0JBQWtCLEVBQUU7Z0JBQzVDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7b0hBdm9CVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qix3T0NYcEMsNHBjQThRb0I7MkZEblFQLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7cU5BS3ZCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE91dHB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIGltcG9ydCB7IEJhc2VTZXJ2aWNlLCBQYXJhbWV0ZXJTZXJ2aWNlLCBVc2VyU2VydmljZSB9IGZyb20gJ2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2UsIElGb3JtRGF0YVJxLCBQYXJhbWV0ZXJTZXJ2aWNlLCBVc2VyU2VydmljZSB9IGZyb20gJ2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpcHQtdXBkYXRlLXVzZXItZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGRhdGUtdXNlci1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBkYXRlLXVzZXItZm9ybS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgdXBkYXRlVXNlckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIERhdGFTdHVkZW50OiBhbnk7XG4gIEBJbnB1dCgpIHZpc2libGVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbElTID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgdXNlclVwZGF0ZWRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgdXBkYXRlVXNlckZvcm0hOiBGb3JtR3JvdXA7XG4gIHBob3RvOiBzdHJpbmcgPSAnJztcbiAgcGhvbmVOdW1iZXJJbmRpY2F0aXZlczogYW55W10gPSBbXTtcbiAgaWRUeXBlczogYW55W10gPSBbXTtcbiAgbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXRlczogYW55ID0gW107XG4gIGNpdGllczogYW55ID0gW107XG4gIGNvdW50cmllczogYW55ID0gW107XG4gIHNob3dQYXJlbnRTZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dFbWFpbElwdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwYXJhbWV0ZXJzQWxsPzogYW55O1xuICBpbmRpY2F0aXZlczogYW55W10gPSBbXTtcbiAgY2l2aWxTdGF0dXM6IGFueVtdID0gW107XG4gIGdlbmRlcnM6IGFueVtdID0gW107XG4gIHN0cmF0dW1zOiBhbnlbXSA9IFtdO1xuICBwYXJhbWV0ZXJzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIHVzZXJVcGRhdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbEZvcm1WYWx1ZTogYW55ID0gW107XG4gICAganVzdGlmeU9wdGlvbnM6IGFueVtdID0gW1xuICAgIC8vIHsgbmFtZTogJ0luYWN0aXZvcycsIGNvZGU6IDEgfSxcbiAgICB7IG5hbWU6ICdBY3Rpdm8nLCBjb2RlOiAxIH0sXG4gICAgeyBuYW1lOiAnUmVtb3ZpZG8nLCBjb2RlOiA0IH1cbiAgXTtcbiAgXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcGFyYW1ldGVyU2VydmljZTogUGFyYW1ldGVyU2VydmljZSxcbiAgICBwcml2YXRlIGJhc2VTZXJ2aWNlOiBCYXNlU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSAgXG4gICkge1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiZW50cm8gYSBnZXRQYXJhbWV0ZXJzIHBvciBuZ29uaW5pdFwiKTtcbiAgICB0aGlzLmdldFBhcmFtZXRlcnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlzaWJsZU1vZGFsJ10gJiYgY2hhbmdlc1sndmlzaWJsZU1vZGFsJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImVudHJvIGEgZ2V0UGFyYW1ldGVycyBwb3IgdmlzaWJsZSBtb2RhbCwgZG9uZGUgZWwgY2hhbmdlIGVzOlwiLCBjaGFuZ2VzWyd2aXNpYmxlTW9kYWwnXSk7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyYW1ldGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJzTG9hZGVkKSB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlcnMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJhbWV0ZXJTZXJ2aWNlLmdldEFsbFBhcmFtZXRlcnNDb2RGb3JtKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnNBbGwgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnNMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGFyYW1ldGVyczonLCBlcnIpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhcmFtZXRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5pZFR5cGVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5UeXBlSWRDYXJkQnlDb3VudHJ5Q29sO1xuICAgIHRoaXMuaW5kaWNhdGl2ZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGw/LmluZGljYXRpdmVzO1xuICAgIHRoaXMuY291bnRyaWVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5jb3VudHJ5O1xuICAgIHRoaXMuY2l2aWxTdGF0dXMgPSB0aGlzLnBhcmFtZXRlcnNBbGw/LmNpdmlsU3RhdHVzO1xuICAgIHRoaXMuc3RhdGVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5TdGF0ZTtcbiAgICB0aGlzLmNpdGllcyA9IHRoaXMucGFyYW1ldGVyc0FsbD8uY2l0eTtcbiAgICAvLyB0aGlzLmdlbmRlcnMgPSBbXG4gICAgLy8gICB7IGNvZGU6IDEsIG5hbWU6ICdNYXNjdWxpbm8nIH0sXG4gICAgLy8gICB7IGNvZGU6IDIsIG5hbWU6ICdGZW1lbmlubycgfVxuICAgIC8vIF07XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyc0FsbCAmJiB0aGlzLnBhcmFtZXRlcnNBbGwuZ2VuZGVyKSB7XG4gICAgICAvLyBUcmFuc2Zvcm1hciBnZW5kZXIgZW4gdW4gYXJyZWdsbyBkZSB7IGNvZGUsIG5hbWUgfVxuICAgICAgdGhpcy5nZW5kZXJzID0gdGhpcy5wYXJhbWV0ZXJzQWxsLmdlbmRlci5tYXAoKGdlbmRlcjogYW55KSA9PiAoe1xuICAgICAgICBjb2RlOiBnZW5kZXIuY29kZSxcbiAgICAgICAgbmFtZTogZ2VuZGVyLm5hbWVfc3BhbmlzaFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdlbmRlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dQYXJlbnRTZWN0aW9uID0gISF0aGlzLkRhdGFTdHVkZW50Py5jb2RzPy5wYXJlbnQ/LmNvZGU7XG4gICAgdGhpcy5zaG93RW1haWxJcHQgPSAhIXRoaXMuRGF0YVN0dWRlbnQ/LmVtYWlsX2lwdCAmJiB0aGlzLkRhdGFTdHVkZW50LmVtYWlsX2lwdCAhPT0gZmFsc2U7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMucG9wdWxhdGVGb3JtKCk7XG4gIH1cblxuICBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlRm9ybSA9IHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgzMildXSxcbiAgICAgIGxhc3RfbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV1dLFxuICAgICAgZW1haWw6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldXSxcbiAgICAgIGdlbmRlcjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgaWRfY2FyZF90eXBlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBpZF9jYXJkOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg1KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjApXV0sXG4gICAgICBwaG9uZV9pbmRpY2F0aXZlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBwaG9uZV9udW1iZXI6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTUpXV0sXG4gICAgICBjb3VudHJ5OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzdGF0ZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY2l0eTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcm9sZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHNlcnZpY2VfaG91cjogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHBhc3N3b3JkOiBbJycsIFtdXSxcbiAgICAgIHJlX3Bhc3N3b3JkOiBbJycsIFtdXSxcbiAgICAgIGNoYW5nZVBhc3N3b3JkOiBbZmFsc2VdLFxuICAgICAgc3RhdHVzOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNob3dFbWFpbElwdCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihiYXNlRm9ybSwge1xuICAgICAgICBlbWFpbF9pcHQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSldXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd1BhcmVudFNlY3Rpb24pIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZvcm0sIHtcbiAgICAgICAgcGFyZW50X25hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxNTApXV0sXG4gICAgICAgIHBhcmVudF9sYXN0X25hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDUpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxNTApXV0sXG4gICAgICAgIHBhcmVudF9pZF9jYXJkX3R5cGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgcGFyZW50X2lkX2NhcmQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDUpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgzMCldXSxcbiAgICAgICAgcGFyZW50X3Bob25lX2luZGljYXRpdmU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgcGFyZW50X3Bob25lX251bWJlcjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyMCldXSxcbiAgICAgICAgcGFyZW50X29jY3VwYXRpb246IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV1dLFxuICAgICAgICBwYXJlbnRfb2ZmaWNlX2FkcnJlc3M6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDE1MCldXSxcbiAgICAgICAgcGFyZW50X2VtYWlsOiBbJycsIFtWYWxpZGF0b3JzLmVtYWlsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpXV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKGJhc2VGb3JtLCB7IHZhbGlkYXRvcnM6IHRoaXMucGFzc3dvcmRNYXRjaFZhbGlkYXRvciB9KTtcblxuICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KCdjaGFuZ2VQYXNzd29yZCcpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZENvbnRyb2wgPSB0aGlzLnVwZGF0ZVVzZXJGb3JtLmdldCgncGFzc3dvcmQnKTtcbiAgICAgIGNvbnN0IHJlUGFzc3dvcmRDb250cm9sID0gdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JlX3Bhc3N3b3JkJyk7XG5cbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHBhc3N3b3JkQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV0pO1xuICAgICAgICByZVBhc3N3b3JkQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFzc3dvcmRDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgcmVQYXNzd29yZENvbnRyb2w/LmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICBwYXNzd29yZENvbnRyb2w/LnNldFZhbHVlKCcnKTtcbiAgICAgICAgcmVQYXNzd29yZENvbnRyb2w/LnNldFZhbHVlKCcnKTtcbiAgICAgIH1cblxuICAgICAgcGFzc3dvcmRDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICByZVBhc3N3b3JkQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3Bhc3N3b3JkJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JlX3Bhc3N3b3JkJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwYXNzd29yZE1hdGNoVmFsaWRhdG9yKGZvcm06IEZvcm1Hcm91cCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHwgbnVsbCB7XG4gICAgY29uc3QgY2hhbmdlUGFzc3dvcmQgPSBmb3JtLmdldCgnY2hhbmdlUGFzc3dvcmQnKT8udmFsdWU7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBmb3JtLmdldCgncGFzc3dvcmQnKT8udmFsdWU7XG4gICAgY29uc3QgcmVQYXNzd29yZCA9IGZvcm0uZ2V0KCdyZV9wYXNzd29yZCcpPy52YWx1ZTtcbiAgICBpZiAoIWNoYW5nZVBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWlzbWF0Y2ggPSBwYXNzd29yZCAmJiByZVBhc3N3b3JkICYmIHBhc3N3b3JkICE9PSByZVBhc3N3b3JkO1xuICAgIHJldHVybiBtaXNtYXRjaCA/IHsgbWlzbWF0Y2g6IHRydWUgfSA6IG51bGw7XG4gIH1cblxuICBub1doaXRlc3BhY2VWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfCBudWxsIHtcbiAgICBpZiAoY29udHJvbC52YWx1ZSAmJiB0eXBlb2YgY29udHJvbC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IGNvbnRyb2wudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHsgb25seVdoaXRlc3BhY2U6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250cm9sLnZhbHVlICE9PSB0cmltbWVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgaGFzV2hpdGVzcGFjZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyYW5zZm9ybVJvbGUocm9sZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCByb2xlTWFwOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge1xuICAgICAgMTogJ1N1cGVyIEFkbWluJyxcbiAgICAgIDEwOiAnSmVmZSBBY2FkZW1pY28nLFxuICAgICAgMTE6ICdDb29yZGluYWRvciBBY2FkZW1pY28nLFxuICAgICAgMTI6ICdUZWFjaGVyIEFjYWRlbWljbycsXG4gICAgICAxMzogJ0VzdHVkaWFudGUnLFxuICAgICAgMTU6ICdQb3NpYmxlIEVzdHVkaWFudGUnLFxuICAgICAgMjA6ICdKZWZlIE1hcmtldGluZycsXG4gICAgICAyMTogJ0Nvb3JkaW5hZG9yIE1hcmtldGluZycsXG4gICAgICAyMjogJ0F1eGlsaWFyIE1hcmtldGluZycsXG4gICAgICAzMDogJ0plZmUgQWRtaW5pc3RyYXRpdm8nLFxuICAgICAgMzE6ICdDb29yZGluYWRvciBBZG1pbmlzdHJhdGl2bycsXG4gICAgICAzMjogJ0NhamVybyBBZG1pbmlzdHJhdGl2bycsXG4gICAgICA0MDogJ0plZmUgQ29tZXJjaWFsJyxcbiAgICAgIDQxOiAnQ29vcmRpbmFkb3IgQ29tZXJjaWFsJyxcbiAgICAgIDQyOiAnQXNlc29yIENvbWVyY2lhbCcsXG4gICAgICA1MDogJ0plZmUgQ2FydGVyYScsXG4gICAgICA1MTogJ0Nvb3JkaW5hZG9yIENhcnRlcmEnLFxuICAgICAgNTI6ICdBc2Vzb3IgQ2FydGVyYScsXG4gICAgICA2MDogJ1Byb3ZlZWRvcidcbiAgICB9O1xuICAgIHJldHVybiByb2xlTWFwW051bWJlcihyb2xlKV0gfHwgJyc7XG4gIH1cblxuICBwb3B1bGF0ZUZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuRGF0YVN0dWRlbnQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZTogYW55ID0ge1xuICAgICAgICBuYW1lOiB0aGlzLkRhdGFTdHVkZW50Lm5hbWUgfHwgJycsXG4gICAgICAgIGxhc3RfbmFtZTogdGhpcy5EYXRhU3R1ZGVudC5sYXN0X25hbWUgfHwgJycsXG4gICAgICAgIGVtYWlsOiB0aGlzLkRhdGFTdHVkZW50LmVtYWlsIHx8ICcnLFxuICAgICAgICBnZW5kZXI6IHRoaXMuRGF0YVN0dWRlbnQuZ2VuZGVyIHx8IG51bGwsXG4gICAgICAgIGlkX2NhcmRfdHlwZTogdGhpcy5EYXRhU3R1ZGVudC5pZF9jYXJkX3R5cGUgfHwgJycsXG4gICAgICAgIGlkX2NhcmQ6IHRoaXMuRGF0YVN0dWRlbnQuaWRfY2FyZCB8fCAnJyxcbiAgICAgICAgcGhvbmVfaW5kaWNhdGl2ZTogdGhpcy5EYXRhU3R1ZGVudC5waG9uZV9pbmRpY2F0aXZlIHx8ICcnLFxuICAgICAgICBwaG9uZV9udW1iZXI6IHRoaXMuRGF0YVN0dWRlbnQucGhvbmVfbnVtYmVyIHx8ICcnLFxuICAgICAgICBjb3VudHJ5OiB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LmNvdW50cnksXG4gICAgICAgIHN0YXRlOiB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LnN0YXRlLFxuICAgICAgICBjaXR5OiB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LmNvZGUsXG4gICAgICAgIHJvbGU6IHRoaXMudHJhbnNmb3JtUm9sZSh0aGlzLkRhdGFTdHVkZW50LnJvbGUpIHx8ICcnLFxuICAgICAgICBzZXJ2aWNlX2hvdXI6IHRoaXMuRGF0YVN0dWRlbnQuc2VydmljZV9ob3VyIHx8IDAsXG4gICAgICAgIGNoYW5nZVBhc3N3b3JkOiBmYWxzZSxcbiAgICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgICByZV9wYXNzd29yZDogJycsXG4gICAgICAgIHN0YXR1czogdGhpcy5EYXRhU3R1ZGVudC51c2VyX3N0YXR1cyB8fCAnJ1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc2hvd0VtYWlsSXB0KSB7XG4gICAgICAgIGZvcm1WYWx1ZS5lbWFpbF9pcHQgPSB0aGlzLkRhdGFTdHVkZW50LmVtYWlsX2lwdCB8fCAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvd1BhcmVudFNlY3Rpb24pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihmb3JtVmFsdWUsIHtcbiAgICAgICAgICBwYXJlbnRfbmFtZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgcGFyZW50X2xhc3RfbmFtZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lmxhc3RfbmFtZSB8fCAnJyxcbiAgICAgICAgICBwYXJlbnRfaWRfY2FyZF90eXBlOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8uaWRfY2FyZF90eXBlIHx8ICcnLFxuICAgICAgICAgIHBhcmVudF9pZF9jYXJkOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8uaWRfY2FyZCB8fCAnJyxcbiAgICAgICAgICBwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LnBob25lX2luZGljYXRpdmUgfHwgJycsXG4gICAgICAgICAgcGFyZW50X3Bob25lX251bWJlcjogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LnBob25lX251bWJlciB8fCAnJyxcbiAgICAgICAgICBwYXJlbnRfb2NjdXBhdGlvbjogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lm9jY3VwYXRpb24gfHwgJycsXG4gICAgICAgICAgcGFyZW50X29mZmljZV9hZHJyZXNzOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8ub2ZmaWNlX2FkcnJlc3MgfHwgJycsXG4gICAgICAgICAgcGFyZW50X2VtYWlsOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8uZW1haWwgfHwgJydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0ucmVzZXQoKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0ucGF0Y2hWYWx1ZShmb3JtVmFsdWUpO1xuICAgICAgdGhpcy5pbml0aWFsRm9ybVZhbHVlID0geyAuLi50aGlzLnVwZGF0ZVVzZXJGb3JtLnZhbHVlIH07XG4gICAgICBpZiAoZm9ybVZhbHVlLmNvdW50cnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlbiBwb3B1bGF0ZUZvcm0gc2UgZW52aW8gZGF0byBwYXJhIHNldGVhcnNlIGNvdW50cnlcIik7XG4gICAgICAgIHRoaXMuY291bnRyaWVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5jb3VudHJ5O1xuICAgICAgICB0aGlzLnNlbGVjdENvdW50cnkodGhpcy5EYXRhU3R1ZGVudC5jaXR5Py5jb3VudHJ5KTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RTdGF0ZSh0aGlzLkRhdGFTdHVkZW50LmNpdHk/LnN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuY2l0eSkge1xuICAgICAgICB0aGlzLnNlbGVjdENpdHkodGhpcy5EYXRhU3R1ZGVudC5jaXR5Py5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuaWRfY2FyZF90eXBlKSB7XG4gICAgICAgIHRoaXMuaWRUeXBlcyA9IHRoaXMucGFyYW1ldGVyc0FsbD8uVHlwZUlkQ2FyZEJ5Q291bnRyeUNvbDtcbiAgICAgICAgdGhpcy5zZWxlY3RHZW5kZXIodGhpcy5EYXRhU3R1ZGVudC5pZF9jYXJkX3R5cGUpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1WYWx1ZS5waG9uZV9pbmRpY2F0aXZlKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdGl2ZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGw/LmluZGljYXRpdmVzO1xuICAgICAgICB0aGlzLnNlbGVjdEluZGljYXRpdmUoJ3Bob25lX2luZGljYXRpdmUnLCB0aGlzLkRhdGFTdHVkZW50LnBob25lX2luZGljYXRpdmUpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1WYWx1ZS5wYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZSkge1xuICAgICAgICB0aGlzLmluZGljYXRpdmVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5pbmRpY2F0aXZlcztcbiAgICAgICAgdGhpcy5zZWxlY3RJbmRpY2F0aXZlKCdwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZScsIHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5waG9uZV9pbmRpY2F0aXZlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuZ2VuZGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmFtZXRlcnNBbGwgJiYgdGhpcy5wYXJhbWV0ZXJzQWxsLmdlbmRlcikge1xuICAgICAgICAgIC8vIFRyYW5zZm9ybWFyIGdlbmRlciBlbiB1biBhcnJlZ2xvIGRlIHsgY29kZSwgbmFtZSB9XG4gICAgICAgICAgdGhpcy5nZW5kZXJzID0gdGhpcy5wYXJhbWV0ZXJzQWxsLmdlbmRlci5tYXAoKGdlbmRlcjogYW55KSA9PiAoe1xuICAgICAgICAgICAgY29kZTogZ2VuZGVyLmNvZGUsXG4gICAgICAgICAgICBuYW1lOiBnZW5kZXIubmFtZV9zcGFuaXNoXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2VuZGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0R2VuZGVyKHRoaXMuRGF0YVN0dWRlbnQuZ2VuZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9zZVRhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZU1vZGFsID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVVc2VyRm9ybS5yZXNldCgpO1xuICAgIHRoaXMuaWRUeXBlcyA9IFtdO1xuICAgIHRoaXMuY291bnRyaWVzID0gW107XG4gICAgdGhpcy5nZW5kZXJzID0gW107XG5cbiAgICB0aGlzLmNsb3NlTW9kYWxJUy5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHNlbGVjdFJvbChyb2xlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAocm9sZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JvbGUnKT8uc2V0VmFsdWUodGhpcy50cmFuc2Zvcm1Sb2xlKHJvbGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JvbGUnKT8uc2V0VmFsdWUoJycpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEluZGljYXRpdmUoZmllbGQ6IHN0cmluZywgaW5kaWNhdGl2ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGluZGljYXRpdmUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KGZpZWxkKT8uc2V0VmFsdWUoaW5kaWNhdGl2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KGZpZWxkKT8uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SWRUeXBlKGZpZWxkOiBzdHJpbmcsIGlkVHlwZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGlkVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoZmllbGQpPy5zZXRWYWx1ZShpZFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJGb3JtLmdldChmaWVsZCk/LnNldFZhbHVlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEdlbmRlcihnZW5kZXI6IGFueSk6IHZvaWQge1xuICAgIGlmIChnZW5kZXIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KCdnZW5kZXInKT8uc2V0VmFsdWUoZ2VuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ2dlbmRlcicpPy5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDb3VudHJ5KGNvdW50cnk6IGFueSkge1xuICAgIGNvbnN0IGNvdW50cnlOdW1iZXIgPSB0eXBlb2YgY291bnRyeSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChjb3VudHJ5LCAxMCkgOiBjb3VudHJ5O1xuICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NvdW50cnknXS5zZXRWYWx1ZShjb3VudHJ5TnVtYmVyKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2Ugc2V0ZW8gY291bnRyeSBjb24gZWwgdmFsb3IgcXVlIGVudHJvIGVuIHNlbGVjdENvdW50cnlcIik7XG4gICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzQWxsICYmIHRoaXMucGFyYW1ldGVyc0FsbD8uU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGwuU3RhdGUuZmlsdGVyKChjb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdHlwZW9mIGNvdXJzZS5jb3VudHJ5ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBwYXJzZUludChjb3Vyc2UuY291bnRyeSwgMTApXG4gICAgICAgICAgICA6IGNvdXJzZS5jb3VudHJ5O1xuICAgICAgICAgIHJldHVybiBzdGF0ZSA9PT0gY291bnRyeU51bWJlcjtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlcyA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NvdW50cnknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuc3RhdGVzID0gW107XG4gICAgICB0aGlzLmNpdGllcyA9IFtdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdFN0YXRlKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZU51bWJlciA9IHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGF0ZSwgMTApIDogc3RhdGU7XG4gICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddLnNldFZhbHVlKHN0YXRlTnVtYmVyKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgICB0aGlzLmdldFN0YXRlKHN0YXRlTnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZ2V0Q2l0eShzdGF0ZSk7XG4gIH1cblxuICBnZXRDaXR5KHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZU51bWJlciA9IHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGF0ZSwgMTApIDogc3RhdGU7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyc0FsbD8uY2l0eSkge1xuICAgICAgdGhpcy5jaXRpZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGwuY2l0eS5maWx0ZXIoKGNvdXJzZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpdHlTdGF0ZSA9IHR5cGVvZiBjb3Vyc2Uuc3RhdGUgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY291cnNlLnN0YXRlLCAxMCkgOiBjb3Vyc2Uuc3RhdGU7XG4gICAgICAgIHJldHVybiBjaXR5U3RhdGUgPT09IHN0YXRlTnVtYmVyO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q2l0eShjaXR5OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBjaXR5TnVtYmVyID0gdHlwZW9mIGNpdHkgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY2l0eSwgMTApIDogY2l0eTtcbiAgICBpZiAoY2l0eSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY2l0eSddLnNldFZhbHVlKGNpdHlOdW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaXR5J10uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGhvdG8odHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdzdHVkZW50JykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vYWNhZGVtaWMvYXNzZXRzL3N0dWRlbnQuanBnJztcbiAgICBpZiAodHlwZSA9PT0gJ2FjYWRlbWljJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vYWNhZGVtaWMvYXNzZXRzL2FjYWRlbWljby5wbmcnO1xuICAgIGlmICh0eXBlID09PSAnYWRtaW5pc3RyYXRpdmUnKSB0aGlzLnBob3RvID0gJy9wbGF0Zm9ybS9hZG1pbmlzdHJhdGl2ZS9hc3NldHMvYWRtaW5pc3RyYXRpdm8uanBnJztcbiAgICBpZiAodHlwZSA9PT0gJ21hcmtldGluZycpIHRoaXMucGhvdG8gPSAnL3BsYXRmb3JtL21hcmtldGluZy9hc3NldHMvbWFya2V0aW5nLmpwZyc7XG4gICAgaWYgKHR5cGUgPT09ICdjb21tZXJjaWFsJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vY29tbWVyY2lhbC9hc3NldHMvdXNlci1mb3JtLWFzc2V0cy9jb21lcmNpYWwuanBnJztcbiAgICBpZiAodHlwZSA9PT0gJ3RyZWFzdXJlJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vdHJlYXN1cmUvYXNzZXRzL2FkbWluaXN0cmF0aXZvLmpwZyc7XG4gIH1cblxuICB1cGRhdGVVc2VyKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uaW52YWxpZCB8fFxuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5oYXNFcnJvcignbWlzbWF0Y2gnKSB8fFxuICAgICAgIXRoaXMuaGFzRm9ybUNoYW5nZWQoKVxuICAgICkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICBjb25zb2xlLmxvZygnY3JlYXRlVXNlciAtIFZhbGlkYXRpb24gZmFpbGVkOicsIHtcbiAgICAgICAgaW52YWxpZDogdGhpcy51cGRhdGVVc2VyRm9ybS5pbnZhbGlkLFxuICAgICAgICBtaXNtYXRjaDogdGhpcy51cGRhdGVVc2VyRm9ybS5oYXNFcnJvcignbWlzbWF0Y2gnKSxcbiAgICAgICAgaGFzQ2hhbmdlczogdGhpcy5oYXNGb3JtQ2hhbmdlZCgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRlciA9IHRydWU7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy51cGRhdGVVc2VyRm9ybS5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdDphbnkgPSB7XG4gICAgICB0b2tlbjogdGhpcy5iYXNlU2VydmljZS5nZXRVc2VyVG9rZW4oKSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgY29kZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RlLFxuICAgICAgICBuYW1lOiBmb3JtVmFsdWUubmFtZSxcbiAgICAgICAgbGFzdF9uYW1lOiBmb3JtVmFsdWUubGFzdF9uYW1lLFxuICAgICAgICBpZF9jYXJkX3R5cGU6IGZvcm1WYWx1ZS5pZF9jYXJkX3R5cGUsXG4gICAgICAgIGlkX2NhcmQ6IGZvcm1WYWx1ZS5pZF9jYXJkLFxuICAgICAgICBwaG9uZV9pbmRpY2F0aXZlOiBmb3JtVmFsdWUucGhvbmVfaW5kaWNhdGl2ZSxcbiAgICAgICAgcGhvbmVfbnVtYmVyOiBmb3JtVmFsdWUucGhvbmVfbnVtYmVyLFxuICAgICAgICBlbWFpbDogZm9ybVZhbHVlLmVtYWlsLFxuICAgICAgICBnZW5kZXI6IGZvcm1WYWx1ZS5nZW5kZXIsXG4gICAgICAgIGNpdHk6IGZvcm1WYWx1ZS5jaXR5LFxuICAgICAgICBzZXJ2aWNlX2hvdXI6IGZvcm1WYWx1ZS5zZXJ2aWNlX2hvdXIsXG4gICAgICAgIHJvbGU6IHRoaXMuRGF0YVN0dWRlbnQucm9sZSxcbiAgICAgICAgc3RhdHVzOiBmb3JtVmFsdWUuc3RhdHVzLFxuICAgICAgICAuLi4odGhpcy5zaG93RW1haWxJcHQgPyB7IGVtYWlsX2lwdDogZm9ybVZhbHVlLmVtYWlsX2lwdCB9IDoge30pLFxuICAgICAgICAuLi4oZm9ybVZhbHVlLmNoYW5nZVBhc3N3b3JkICYmIGZvcm1WYWx1ZS5wYXNzd29yZCA/IHsgcGFzc3dvcmQ6IGZvcm1WYWx1ZS5wYXNzd29yZCB9IDoge30pXG4gICAgICB9LFxuICAgICAgcGFyZW50OiB0aGlzLnNob3dQYXJlbnRTZWN0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LmNvZGUgfHwgbnVsbCxcbiAgICAgICAgICAgIG5hbWU6IGZvcm1WYWx1ZS5wYXJlbnRfbmFtZSB8fCBudWxsLFxuICAgICAgICAgICAgbGFzdF9uYW1lOiBmb3JtVmFsdWUucGFyZW50X2xhc3RfbmFtZSB8fCBudWxsLFxuICAgICAgICAgICAgaWRfY2FyZF90eXBlOiBmb3JtVmFsdWUucGFyZW50X2lkX2NhcmRfdHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgaWRfY2FyZDogZm9ybVZhbHVlLnBhcmVudF9pZF9jYXJkIHx8IG51bGwsXG4gICAgICAgICAgICBwaG9uZV9pbmRpY2F0aXZlOiBmb3JtVmFsdWUucGFyZW50X3Bob25lX2luZGljYXRpdmUgfHwgbnVsbCxcbiAgICAgICAgICAgIHBob25lX251bWJlcjogZm9ybVZhbHVlLnBhcmVudF9waG9uZV9udW1iZXIgfHwgbnVsbCxcbiAgICAgICAgICAgIG9jY3VwYXRpb246IGZvcm1WYWx1ZS5wYXJlbnRfb2NjdXBhdGlvbiB8fCBudWxsLFxuICAgICAgICAgICAgb2ZmaWNlX2FkcnJlc3M6IGZvcm1WYWx1ZS5wYXJlbnRfb2ZmaWNlX2FkcnJlc3MgfHwgbnVsbCxcbiAgICAgICAgICAgIGVtYWlsOiBmb3JtVmFsdWUucGFyZW50X2VtYWlsIHx8IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuICAgIH07XG4gICAgY29uc29sZS5sb2cocmVxdWVzdCk7XG4gICAgdGhpcy51c2VyU2VydmljZS51cGRhdGVVc2VyQW5kUGFyZW50QnlDb2RlKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIHRoaXMuY291cnNlVHlwZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICBpZiAocmVzcG9uc2UubWVzc2FnZS5jb2RlID09PTEpIHtcbiAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHRpdGxlOiAndXN1YXJpbyBhY3R1YWxpemFkbyBzYXRpc2ZhY3RvcmlhbWVudGUnLFxuICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSxcbiAgICAgICAgICB0aW1lcjogMjUwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMudXNlclVwZGF0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMudXNlclVwZGF0ZWRFdmVudC5lbWl0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VUYWJsZSgpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgcG9zaXRpb246ICdjZW50ZXInLFxuICAgICAgICAgIGljb246ICdlcnJvcicsXG4gICAgICAgICAgdGl0bGU6ICdIYSBvY3VycmlkbyB1biBlcnJvciBpbmVzcGVyYWRvJyxcbiAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgdGltZXI6IDI1MDAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0aGlzLnVzZXJVcGRhdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gIH1cblxuICBoYXNGb3JtQ2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbEZvcm1WYWx1ZSB8fCAhdGhpcy5EYXRhU3R1ZGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0UmF3VmFsdWUoKTtcblxuICAgIGlmIChjdXJyZW50VmFsdWUuY2hhbmdlUGFzc3dvcmQpIHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gY3VycmVudFZhbHVlLnBhc3N3b3JkO1xuICAgICAgY29uc3QgcmVQYXNzd29yZCA9IGN1cnJlbnRWYWx1ZS5yZV9wYXNzd29yZDtcbiAgICAgIGNvbnN0IHBhc3N3b3JkQ29udHJvbCA9IHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KCdwYXNzd29yZCcpO1xuICAgICAgY29uc3QgcmVQYXNzd29yZENvbnRyb2wgPSB0aGlzLnVwZGF0ZVVzZXJGb3JtLmdldCgncmVfcGFzc3dvcmQnKTtcblxuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZENvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgIHJlUGFzc3dvcmRDb250cm9sPy52YWxpZCAmJlxuICAgICAgICBwYXNzd29yZCA9PT0gcmVQYXNzd29yZCAmJlxuICAgICAgICBwYXNzd29yZD8udHJpbSgpICE9PSAnJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkc1RvQ29tcGFyZTogKGtleW9mIElGb3JtRGF0YVJxKVtdID0gW1xuICAgICAgJ25hbWUnLFxuICAgICAgJ2xhc3RfbmFtZScsXG4gICAgICAnZW1haWwnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaWRfY2FyZF90eXBlJyxcbiAgICAgICdpZF9jYXJkJyxcbiAgICAgICdwaG9uZV9pbmRpY2F0aXZlJyxcbiAgICAgICdwaG9uZV9udW1iZXInLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ3N0YXRlJyxcbiAgICAgICdjaXR5JyxcbiAgICAgICdyb2xlJyxcbiAgICAgICdzZXJ2aWNlX2hvdXInLFxuICAgICAgJ3N0YXR1cydcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuc2hvd0VtYWlsSXB0KSB7XG4gICAgICBmaWVsZHNUb0NvbXBhcmUucHVzaCgnZW1haWxfaXB0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd1BhcmVudFNlY3Rpb24pIHtcbiAgICAgIGZpZWxkc1RvQ29tcGFyZS5wdXNoKFxuICAgICAgICAncGFyZW50X25hbWUnLFxuICAgICAgICAncGFyZW50X2xhc3RfbmFtZScsXG4gICAgICAgICdwYXJlbnRfaWRfY2FyZF90eXBlJyxcbiAgICAgICAgJ3BhcmVudF9pZF9jYXJkJyxcbiAgICAgICAgJ3BhcmVudF9waG9uZV9pbmRpY2F0aXZlJyxcbiAgICAgICAgJ3BhcmVudF9waG9uZV9udW1iZXInLFxuICAgICAgICAncGFyZW50X29jY3VwYXRpb24nLFxuICAgICAgICAncGFyZW50X29mZmljZV9hZHJyZXNzJyxcbiAgICAgICAgJ3BhcmVudF9lbWFpbCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb0NvbXBhcmUpIHtcbiAgICAgIGxldCBvcmlnaW5hbFZhbHVlOiBhbnk7XG4gICAgICBsZXQgY3VycmVudEZpZWxkVmFsdWU6IGFueSA9IGN1cnJlbnRWYWx1ZVtmaWVsZF07XG5cbiAgICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQubmFtZSB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGFzdF9uYW1lJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5sYXN0X25hbWUgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5lbWFpbCB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZW1haWxfaXB0JzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5lbWFpbF9pcHQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2dlbmRlcic6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuZ2VuZGVyIHx8IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2lkX2NhcmRfdHlwZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuaWRfY2FyZF90eXBlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpZF9jYXJkJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5pZF9jYXJkIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwaG9uZV9pbmRpY2F0aXZlJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5waG9uZV9pbmRpY2F0aXZlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwaG9uZV9udW1iZXInOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LnBob25lX251bWJlciB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY2l0eT8uY291bnRyeSB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhdGUnOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LnN0YXRlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaXR5JzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jaXR5Py5jb2RlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyb2xlJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy50cmFuc2Zvcm1Sb2xlKHRoaXMuRGF0YVN0dWRlbnQucm9sZSkgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlcnZpY2VfaG91cic6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuc2VydmljZV9ob3VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGF0dXMnOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LnVzZXJfc3RhdHVzIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfbmFtZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5uYW1lIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfbGFzdF9uYW1lJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lmxhc3RfbmFtZSB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFyZW50X2lkX2NhcmRfdHlwZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5pZF9jYXJkX3R5cGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9pZF9jYXJkJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LmlkX2NhcmQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9waG9uZV9pbmRpY2F0aXZlJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LnBob25lX2luZGljYXRpdmUgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9waG9uZV9udW1iZXInOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8ucGhvbmVfbnVtYmVyIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfb2NjdXBhdGlvbic6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5vY2N1cGF0aW9uIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfb2ZmaWNlX2FkcnJlc3MnOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8ub2ZmaWNlX2FkcnJlc3MgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9lbWFpbCc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5lbWFpbCB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50ID0gY3VycmVudEZpZWxkVmFsdWUgIT0gbnVsbCA/IFN0cmluZyhjdXJyZW50RmllbGRWYWx1ZSkudHJpbSgpIDogJyc7XG4gICAgICBjb25zdCBub3JtYWxpemVkT3JpZ2luYWwgPSBvcmlnaW5hbFZhbHVlICE9IG51bGwgPyBTdHJpbmcob3JpZ2luYWxWYWx1ZSkudHJpbSgpIDogJyc7XG5cbiAgICAgIGlmIChub3JtYWxpemVkQ3VycmVudCAhPT0gbm9ybWFsaXplZE9yaWdpbmFsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSIsIjwhLS0gPHAtZGlhbG9nXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZU1vZGFsXCJcbiAgW3N0eWxlXT1cInt3aWR0aDogJzgwJSd9XCJcbiAgaGVhZGVyPVwiQWN0dWFsaXphciB1c3VhcmlvXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBzdHlsZUNsYXNzPVwicC1mbHVpZFwiXG4gIChvbkhpZGUpPVwiY2xvc2VUYWJsZSgpXCJcbiAgW2Rpc21pc3NhYmxlTWFza109XCJ0cnVlXCJcbiAgW2JyZWFrcG9pbnRzXT1cInsnMTkyMHB4JzogJzc1dncnLCAnMTQ0MHB4JzogJzc1dncnLCAnMTAyNHB4JzogJzc1dncnLCAnNTc2cHgnOiAnMTAwdncnfVwiXG4+IC0tPlxuPCEtLSA8ZGl2PlxuICA8cHJlPnt7IHVwZGF0ZVVzZXJGb3JtLnZhbHVlIHwganNvbiB9fTwvcHJlPlxuICA8ZGl2PlxuICAgIDxwcmU+e3sgdXBkYXRlVXNlckZvcm0udmFsaWQgfCBqc29uIH19PC9wcmU+XG4gIDwvZGl2PlxuPC9kaXY+IC0tPlxuICA8ZGl2IGNsYXNzPVwiZ3JpZF9jb250YWluZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPGZvcm0gKm5nSWY9XCJ1cGRhdGVVc2VyRm9ybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtmb3JtR3JvdXBdPVwidXBkYXRlVXNlckZvcm1cIj5cbiAgICAgICAgPCEtLSBVc2VyIEluZm9ybWF0aW9uIFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxoMj5JbmZvcm1hY2nDs24gZGVsIHVzdWFyaW88L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JpZFwiPlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInTm9tYnJlcydcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWyduYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnRGViZSBpbmdyZXNhciBlbCBub21icmUnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXS5oYXNFcnJvcignbWlubGVuZ3RoJykgPyAnTcOtbmltbyAzIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXS5oYXNFcnJvcignbWF4bGVuZ3RoJykgPyAnTcOheGltbyAzMiBjYXJhY3RlcmVzJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWyduYW1lJ10uaGFzRXJyb3IoJ3BhdHRlcm4nKSA/ICdTb2xvIGxldHJhcywgZXNwYWNpb3MgeSBndWlvbmVzJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWyduYW1lJ10uaGFzRXJyb3IoJ2hhc1doaXRlc3BhY2UnKSA/ICdObyBzZSBwZXJtaXRlbiBlc3BhY2lvcyBhbCBpbmljaW8gbyBmaW5hbCcgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbmFtZSddLmhhc0Vycm9yKCdvbmx5V2hpdGVzcGFjZScpID8gJ05vIHNlIHBlcm1pdGVuIHNvbG8gZXNwYWNpb3MnIDpcbiAgICAgICAgICAgICAgJ0RlYmUgaW5ncmVzYXIgZWwgbm9tYnJlJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInQXBlbGxpZG9zJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ11cIlxuICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnRGViZSBpbmdyZXNhciBsb3MgYXBlbGxpZG9zJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydsYXN0X25hbWUnXS5oYXNFcnJvcignbWlubGVuZ3RoJykgPyAnTcOtbmltbyAzIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2xhc3RfbmFtZSddLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSA/ICdNw6F4aW1vIDMyIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2xhc3RfbmFtZSddLmhhc0Vycm9yKCdwYXR0ZXJuJykgPyAnU29sbyBsZXRyYXMsIGVzcGFjaW9zIHkgZ3Vpb25lcycgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ10uaGFzRXJyb3IoJ2hhc1doaXRlc3BhY2UnKSA/ICdObyBzZSBwZXJtaXRlbiBlc3BhY2lvcyBhbCBpbmljaW8gbyBmaW5hbCcgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ10uaGFzRXJyb3IoJ29ubHlXaGl0ZXNwYWNlJykgPyAnTm8gc2UgcGVybWl0ZW4gc29sbyBlc3BhY2lvcycgOlxuICAgICAgICAgICAgICAnRGViZSBpbmdyZXNhciBsb3MgYXBlbGxpZG9zJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ2VtYWlsJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VtYWlsJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZW1haWwnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ0RlYmUgaW5ncmVzYXIgdW4gY29ycmVvIHbDoWxpZG8nIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ21heGxlbmd0aCcpID8gJ03DoXhpbW8gMzAwIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ3BhdHRlcm4nKSA/ICdUaWVuZSBxdWUgc2VyIHVuIGVtYWlsIGNvcnJlY3RvJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbCddLmhhc0Vycm9yKCdoYXNXaGl0ZXNwYWNlJykgPyAnTm8gc2UgcGVybWl0ZW4gZXNwYWNpb3MgYWwgaW5pY2lvIG8gZmluYWwnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ29ubHlXaGl0ZXNwYWNlJykgPyAnTm8gc2UgcGVybWl0ZW4gc29sbyBlc3BhY2lvcycgOlxuICAgICAgICAgICAgICAnRGViZSBpbmdyZXNhciB1biBjb3JyZW8gdsOhbGlkbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dFbWFpbElwdFwiXG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VtYWlsIElQVCdcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsX2lwdCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsX2lwdCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ0RlYmUgaW5ncmVzYXIgdW4gY29ycmVvIElQVCB2w6FsaWRvJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbF9pcHQnXS5oYXNFcnJvcignbWF4bGVuZ3RoJykgPyAnTcOheGltbyAyNTUgY2FyYWN0ZXJlcycgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZW1haWxfaXB0J10uaGFzRXJyb3IoJ3BhdHRlcm4nKSA/ICdUaWVuZSBxdWUgc2VyIHVuIGVtYWlsIGNvcnJlY3RvJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbF9pcHQnXS5oYXNFcnJvcignaGFzV2hpdGVzcGFjZScpID8gJ05vIHNlIHBlcm1pdGVuIGVzcGFjaW9zIGFsIGluaWNpbyBvIGZpbmFsJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbF9pcHQnXS5oYXNFcnJvcignb25seVdoaXRlc3BhY2UnKSA/ICdObyBzZSBwZXJtaXRlbiBzb2xvIGVzcGFjaW9zJyA6XG4gICAgICAgICAgICAgICdEZWJlIGluZ3Jlc2FyIHVuIGNvcnJlbyBJUFQgdsOhbGlkbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dFbWFpbElwdFwiXG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInSG9yYXMgZGUgc2VydmljaW8nXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzZXJ2aWNlX2hvdXInXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIGxhcyBob3JhcyBkZSBzZXJ2aWNpbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ1JvbCdcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3JvbGUnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidSb2wgcmVxdWVyaWRvJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDwhLS0gPGlwdC1zZWxlY3RcbiAgICAgICAgICAgIFtpbml0aWFsVmFsdWVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2dlbmRlciddLnZhbHVlXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydnZW5kZXInXVwiXG4gICAgICAgICAgICBbc2VsZWN0Q29kZV09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZ2VuZGVyJ10udmFsdWUgPT09IG51bGwgPyAnU2VsZWNjaW9uZSBnw6luZXJvJyA6ICh1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZ2VuZGVyJ10udmFsdWUgfCBnZW5kZXJEaXNwbGF5KVwiXG4gICAgICAgICAgICBbZGF0YV09XCJnZW5kZXJzXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RHZW5kZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1NlbGVjY2lvbmUgZ8OpbmVybydcIlxuICAgICAgICAgID48L2lwdC1zZWxlY3Q+IC0tPlxuICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwaG9uZV9pbmRpY2F0aXZlJ10udmFsdWVcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bob25lX2luZGljYXRpdmUnXVwiXG4gICAgICAgICAgICBbZGF0YV09XCJpbmRpY2F0aXZlc1wiXG4gICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0SW5kaWNhdGl2ZSgncGhvbmVfaW5kaWNhdGl2ZScsICRldmVudClcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXh0XT1cIidJbmRpY2F0aXZvJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInVGVsw6lmb25vJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGhvbmVfbnVtYmVyJ11cIlxuICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciB1biBuw7ptZXJvIGRlIHRlbMOpZm9ubyB2w6FsaWRvJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydpZF9jYXJkX3R5cGUnXS52YWx1ZVwiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZF90eXBlJ11cIlxuICAgICAgICAgICAgW3NlbGVjdENvZGVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2lkX2NhcmRfdHlwZSddLnZhbHVlID09PSBudWxsID8gJ1RpcG8gZGUgZG9jdW1lbnRvJyA6IHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydpZF9jYXJkX3R5cGUnXS52YWx1ZVwiXG4gICAgICAgICAgICBbaXNSZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImlkVHlwZXNcIlxuICAgICAgICAgICAgKGV2ZW50U2VsZWN0KT1cInNlbGVjdElkVHlwZSgnaWRfY2FyZF90eXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1RpcG8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInRG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgZWwgbsO6bWVybyBkZSBkb2N1bWVudG8nXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgICA8aXB0LXNlbGVjdFxuICAgICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjb3VudHJ5J10udmFsdWVcIlxuICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY291bnRyeSddXCJcbiAgICAgICAgICAgICAgW3NlbGVjdENvZGVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NvdW50cnknXS52YWx1ZSA9PT0gbnVsbCA/ICdQYcOtcyBkZSByZXNpZGVuY2lhJyA6IHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjb3VudHJ5J10udmFsdWVcIlxuICAgICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0Q291bnRyeSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwiY291bnRyaWVzXCJcbiAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0XT1cIidQYcOtcyBkZSByZXNpZGVuY2lhJ1wiXG4gICAgICAgICAgICA+PC9pcHQtc2VsZWN0PlxuICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddLnZhbHVlXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddXCJcbiAgICAgICAgICAgIFtzZWxlY3RDb2RlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddLnZhbHVlID09PSBudWxsID8gJ0RlcGFydGFtZW50byBvIGVzdGFkbycgOiB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS52YWx1ZVwiXG4gICAgICAgICAgICBbaXNSZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RTdGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkYXRhXT1cInN0YXRlc1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ0RlcGFydGFtZW50byBvIGVzdGFkbydcIlxuICAgICAgICAgID48L2lwdC1zZWxlY3Q+XG4gICAgICAgICAgPGlwdC1zZWxlY3RcbiAgICAgICAgICAgIFtpbml0aWFsVmFsdWVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS52YWx1ZVwiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY2l0eSddXCJcbiAgICAgICAgICAgIFtzZWxlY3RDb2RlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaXR5J10udmFsdWUgPT09IG51bGwgPyAnQ2l1ZGFkIGRlIHJlc2lkZW5jaWEnIDogdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS52YWx1ZVwiXG4gICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0Q2l0eSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImNpdGllc1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ0NpdWRhZCBkZSByZXNpZGVuY2lhJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJ0aGlzLkRhdGFTdHVkZW50LnJvbGUgIT09IDEzXCIgY2xhc3M9XCJjYXJkIGZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1lbmQgdGV4dC1jZW4gdGVyIFwiPlxuICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uIFtvcHRpb25zXT1cImp1c3RpZnlPcHRpb25zXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJjb2RlXCI+PC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNoYW5nZVBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJDYW1iaW8gZGUgY29udHJhc2XDsWFcIlxuICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncmlkXCIgKm5nSWY9XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY2hhbmdlUGFzc3dvcmQnXS52YWx1ZVwiPlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3Bhc3N3b3JkJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0NvbnRyYXNlw7FhJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFzc3dvcmQnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXNzd29yZCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ0xhIGNvbnRyYXNlw7FhIGVzIHJlcXVlcmlkYScgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFzc3dvcmQnXS5oYXNFcnJvcignbWlubGVuZ3RoJykgPyAnTcOtbmltbyA1IGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bhc3N3b3JkJ10uaGFzRXJyb3IoJ21heGxlbmd0aCcpID8gJ03DoXhpbW8gMzIgY2FyYWN0ZXJlcycgOlxuICAgICAgICAgICAgICAnSW5ncmVzZSB1bmEgY29udHJhc2XDsWEgdsOhbGlkYSdcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cblxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3Bhc3N3b3JkJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ1JlcGV0aXIgY29udHJhc2XDsWEnXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydyZV9wYXNzd29yZCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3JlX3Bhc3N3b3JkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnRGViZSByZXBldGlyIGxhIGNvbnRyYXNlw7FhJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydyZV9wYXNzd29yZCddLmhhc0Vycm9yKCdtaW5sZW5ndGgnKSA/ICdNw61uaW1vIDUgY2FyYWN0ZXJlcycgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncmVfcGFzc3dvcmQnXS5oYXNFcnJvcignbWF4bGVuZ3RoJykgPyAnTcOheGltbyAzMiBjYXJhY3RlcmVzJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmhhc0Vycm9yKCdtaXNtYXRjaCcpID8gJ0xhcyBjb250cmFzZcOxYXMgbm8gY29pbmNpZGVuJyA6XG4gICAgICAgICAgICAgICdSZXBpdGEgbGEgY29udHJhc2XDsWEnXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTWVuc2FqZSBhZGljaW9uYWwgcGFyYSBlbCBlcnJvciBkZSBtaXNtYXRjaCAob3BjaW9uYWwsIHNpIHF1aWVyZXMgbW9zdHJhcmxvIHBvciBzZXBhcmFkbykgLS0+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInVwZGF0ZVVzZXJGb3JtLmhhc0Vycm9yKCdtaXNtYXRjaCcpICYmIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaGFuZ2VQYXNzd29yZCddLnZhbHVlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgPHNtYWxsID5MYXMgY29udHJhc2XDsWFzIG5vIGNvaW5jaWRlbjwvc21hbGw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFBhcmVudCBJbmZvcm1hdGlvbiBTZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIiAqbmdJZj1cIkRhdGFTdHVkZW50Py5jb2RzXCI+XG4gICAgICAgICAgPGgyPkluZm9ybWFjacOzbiBkZWwgYWN1ZGllbnRlPC9oMj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJEYXRhU3R1ZGVudD8uY29kc1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UGFyZW50U2VjdGlvbjsgZWxzZSBub1BhcmVudE1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyaWRcIj5cbiAgICAgICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ05vbWJyZXMnXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X25hbWUnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBlbCBub21icmUnXCJcbiAgICAgICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAgICAgW2lucHV0VHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInQXBlbGxpZG9zJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3BhcmVudF9sYXN0X25hbWUnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBsb3MgYXBlbGxpZG9zJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ09jdXBhY2nDs24nXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X29jY3VwYXRpb24nXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBsYSBvY3VwYWNpw7NuJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ2VtYWlsJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidFbWFpbCdcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfZW1haWwnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciB1biBjb3JyZW8gdsOhbGlkbydcIlxuICAgICAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICAgICAgW2luaXRpYWxWYWx1ZV09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X2lkX2NhcmRfdHlwZSddLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X2lkX2NhcmRfdHlwZSddXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0Q29kZV09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X2lkX2NhcmRfdHlwZSddLnZhbHVlID09PSBudWxsID8gJ1RpcG8gZGUgZG9jdW1lbnRvJyA6IHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfaWRfY2FyZF90eXBlJ10udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImlkVHlwZXNcIlxuICAgICAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RJZFR5cGUoJ3BhcmVudF9pZF9jYXJkX3R5cGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1RpcG8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0RvY3VtZW50bydcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfaWRfY2FyZCddXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIGVsIG7Dum1lcm8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICAgICAgPGlwdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZSddLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X3Bob25lX2luZGljYXRpdmUnXVwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiaW5kaWNhdGl2ZXNcIlxuICAgICAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RJbmRpY2F0aXZlKCdwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dF09XCInSW5kaWNhdGl2bydcIlxuICAgICAgICAgICAgICA+PC9pcHQtc2VsZWN0PlxuICAgICAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAgICAgW2lucHV0VHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidUZWzDqWZvbm8nXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X3Bob25lX251bWJlciddXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIHVuIG7Dum1lcm8gZGUgdGVsw6lmb25vIHbDoWxpZG8nXCJcbiAgICAgICAgICAgICAgPjwvaXB0LWlucHV0PlxuXG4gICAgICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidEaXJlY2Npw7NuIGRlIG9maWNpbmEnXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X29mZmljZV9hZHJyZXNzJ11cIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgbGEgZGlyZWNjacOzbidcIlxuICAgICAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vUGFyZW50TWVzc2FnZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1wYXJlbnQtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8cD5TaW4gYWN1ZGllbnRlPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxpcHQtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIidBY3R1YWxpemFyJ1wiXG4gICAgICAgICAgW2lzRW5hYmxlZF09XCIhbG9hZGVyICYmIHVwZGF0ZVVzZXJGb3JtLnZhbGlkICYmICF1cGRhdGVVc2VyRm9ybS5oYXNFcnJvcignbWlzbWF0Y2gnKSAmJiBoYXNGb3JtQ2hhbmdlZCgpXCJcbiAgICAgICAgICAob25DbGljayk9XCJ1cGRhdGVVc2VyKClcIlxuICAgICAgICAgIFtwcmltYXJ5XT1cInRydWVcIlxuICAgICAgICA+PC9pcHQtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48IS0tIDwvcC1kaWFsb2c+IC0tPiJdfQ==
|