sf-crud 12.0.5 → 12.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/sf-crud.umd.js +2563 -1306
- package/bundles/sf-crud.umd.js.map +1 -1
- package/esm2015/lib/components/control/control.component.js +285 -73
- package/esm2015/lib/components/file-upload/file-upload.component.js +143 -0
- package/esm2015/lib/components/form/form.component.js +267 -0
- package/esm2015/lib/components/registro/registro.component.js +507 -407
- package/esm2015/lib/components/step/step.component.js +79 -0
- package/esm2015/lib/components/tablero/tablero.component.js +87 -27
- package/esm2015/lib/sf-crud.module.js +27 -15
- package/esm2015/lib/sf-crud.routing.module.js +23 -0
- package/esm2015/lib/sf-crud.service.js +486 -12
- package/esm2015/lib/shared/models/Conditions.model.js +81 -0
- package/esm2015/lib/shared/models/Empresa.model.js +2 -0
- package/esm2015/lib/shared/models/Reason.model.js +7 -0
- package/esm2015/lib/shared/models/crud-config.model.js +36 -13
- package/esm2015/lib/shared/models/shema.model.js +5 -1
- package/esm2015/lib/shared/services/general.service.js +41 -17
- package/esm2015/lib/shared/services/notification.service.js +83 -0
- package/esm2015/lib/shared/services/step.service.js +65 -0
- package/esm2015/public-api.js +7 -1
- package/fesm2015/sf-crud.js +2194 -1151
- package/fesm2015/sf-crud.js.map +1 -1
- package/lib/components/control/control.component.d.ts +39 -10
- package/lib/components/file-upload/file-upload.component.d.ts +34 -0
- package/lib/components/form/form.component.d.ts +58 -0
- package/lib/components/registro/registro.component.d.ts +81 -54
- package/lib/components/step/step.component.d.ts +27 -0
- package/lib/components/tablero/tablero.component.d.ts +15 -5
- package/lib/sf-crud.module.d.ts +80 -76
- package/lib/sf-crud.routing.module.d.ts +7 -0
- package/lib/sf-crud.service.d.ts +115 -5
- package/lib/shared/models/Conditions.model.d.ts +32 -0
- package/lib/shared/models/Empresa.model.d.ts +11 -0
- package/lib/shared/models/Reason.model.d.ts +5 -0
- package/lib/shared/models/crud-config.model.d.ts +76 -24
- package/lib/shared/models/shema.model.d.ts +27 -0
- package/lib/shared/services/general.service.d.ts +8 -1
- package/lib/shared/services/notification.service.d.ts +27 -0
- package/lib/shared/services/step.service.d.ts +27 -0
- package/package.json +9 -2
- package/public-api.d.ts +6 -0
- package/esm2015/lib/components/registro-child/registro-child.component.js +0 -348
- package/esm2015/lib/components/registro-detalle/registro-detalle.component.js +0 -232
- package/esm2015/lib/shared/models/data-temp-crud.model.js +0 -6
- package/lib/components/registro-child/registro-child.component.d.ts +0 -48
- package/lib/components/registro-detalle/registro-detalle.component.d.ts +0 -36
- package/lib/shared/models/data-temp-crud.model.d.ts +0 -4
|
@@ -1,480 +1,572 @@
|
|
|
1
|
-
import { Component,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Component, HostBinding, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
//import { ConfigRegistro, Operation, RequestChecking } from '../../shared/models/crud-config.model';
|
|
3
|
+
//import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
|
4
|
+
import { Operation, RequestChecking } from '../../shared/models/crud-config.model';
|
|
4
5
|
import { MessageService } from 'primeng/api';
|
|
5
|
-
import { RegistroChildComponent } from '../registro-child/registro-child.component';
|
|
6
6
|
import * as jsonpath from 'jsonpath';
|
|
7
|
-
import * as
|
|
7
|
+
import * as _ from "lodash";
|
|
8
8
|
import Swal from 'sweetalert2';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "../../shared/services/general.service";
|
|
11
11
|
import * as i2 from "@angular/router";
|
|
12
12
|
import * as i3 from "primeng/api";
|
|
13
|
-
import * as i4 from "
|
|
14
|
-
import * as i5 from "../../
|
|
15
|
-
import * as i6 from "
|
|
16
|
-
import * as i7 from "
|
|
17
|
-
import * as i8 from "
|
|
18
|
-
import * as i9 from "
|
|
19
|
-
import * as i10 from "
|
|
20
|
-
import * as i11 from "primeng/
|
|
21
|
-
import * as i12 from "primeng/
|
|
13
|
+
import * as i4 from "../../sf-crud.service";
|
|
14
|
+
import * as i5 from "../../shared/services/step.service";
|
|
15
|
+
import * as i6 from "sf-pdfsign";
|
|
16
|
+
import * as i7 from "sf-simulador";
|
|
17
|
+
import * as i8 from "../../shared/services/notification.service";
|
|
18
|
+
import * as i9 from "../step/step.component";
|
|
19
|
+
import * as i10 from "../form/form.component";
|
|
20
|
+
import * as i11 from "primeng/dialog";
|
|
21
|
+
import * as i12 from "primeng/button";
|
|
22
|
+
import * as i13 from "primeng/toast";
|
|
23
|
+
import * as i14 from "@angular/common";
|
|
24
|
+
import * as i15 from "primeng/ripple";
|
|
22
25
|
export class RegistroComponent {
|
|
23
|
-
constructor(generalService,
|
|
26
|
+
constructor(generalService, activeRoute, messageService, sfCrudService, stepService, sfPdfSignService, sfSimuladorService, notificationService, router) {
|
|
24
27
|
this.generalService = generalService;
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
27
|
-
this.dialogService = dialogService;
|
|
28
|
+
this.activeRoute = activeRoute;
|
|
29
|
+
this.messageService = messageService;
|
|
28
30
|
this.sfCrudService = sfCrudService;
|
|
31
|
+
this.stepService = stepService;
|
|
32
|
+
this.sfPdfSignService = sfPdfSignService;
|
|
33
|
+
this.sfSimuladorService = sfSimuladorService;
|
|
34
|
+
this.notificationService = notificationService;
|
|
35
|
+
this.router = router;
|
|
29
36
|
this.idKatios = '';
|
|
30
|
-
this.idEntidad = '';
|
|
31
37
|
this.trx = '';
|
|
32
38
|
this.id = '';
|
|
39
|
+
this.ids = [];
|
|
33
40
|
this.sendData = new EventEmitter();
|
|
34
41
|
this.onSubmit = new EventEmitter();
|
|
35
|
-
this.
|
|
36
|
-
this.crudConfig = new CrudConfig();
|
|
37
|
-
this.enProceso = false;
|
|
38
|
-
this.configOperation = new Operations();
|
|
42
|
+
this.subsToKillOnDestroy = [];
|
|
39
43
|
this.isLocal = false;
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
44
|
+
this.displays = [];
|
|
45
|
+
this.firstLoad = true;
|
|
46
|
+
this.dialogElements = [];
|
|
47
|
+
this.items = [];
|
|
48
|
+
this.loading = { inProgress: true, target: undefined };
|
|
42
49
|
}
|
|
43
|
-
|
|
44
|
-
this.
|
|
50
|
+
set idEntidad(value) {
|
|
51
|
+
this.idForm = value;
|
|
45
52
|
}
|
|
46
|
-
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
.
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
ngOnChanges(changes) {
|
|
54
|
+
if (this.idKatios && this.idForm && this.environment && (changes["idKatios"] || changes["idEntidad"])) {
|
|
55
|
+
this.sfCrudService.ids = this.ids;
|
|
56
|
+
this.sfCrudService.idKatios = this.idKatios;
|
|
57
|
+
this.sfCrudService.environment = this.environment;
|
|
58
|
+
this.generalService.idKatios = this.idKatios;
|
|
59
|
+
this.generalService.environment = this.environment;
|
|
60
|
+
this.sfPdfSignService.setEnviroments(this.environment);
|
|
61
|
+
this.sfSimuladorService.environments = this.environment;
|
|
62
|
+
this.sfSimuladorService.idKatios = this.idKatios;
|
|
63
|
+
this.loadConfigCrud();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
ngOnInit() {
|
|
67
|
+
this.instanceSubsStepService();
|
|
68
|
+
this.notificationSubscription = this.notificationService.notificationAdded$().subscribe(notification => {
|
|
69
|
+
var _a, _b;
|
|
70
|
+
if ((_a = notification === null || notification === void 0 ? void 0 : notification.requestChecking) === null || _a === void 0 ? void 0 : _a.useSwal) {
|
|
71
|
+
Swal.fire(notification.msg).then((res) => {
|
|
72
|
+
var _a, _b;
|
|
73
|
+
if (notification.msg.showCancelButton && res.isDismissed && ((_a = notification.requestChecking) === null || _a === void 0 ? void 0 : _a.cancelRedirect)) {
|
|
74
|
+
if (notification.requestChecking.cancelRedirect.toUpperCase() == "INICIO")
|
|
75
|
+
this.sfCrudService.redirectToInicio();
|
|
76
|
+
else
|
|
77
|
+
window.location.href = notification.requestChecking.cancelRedirect;
|
|
78
|
+
}
|
|
79
|
+
else if (res.isConfirmed && ((_b = notification.requestChecking) === null || _b === void 0 ? void 0 : _b.redirect)) {
|
|
80
|
+
if (notification.requestChecking.redirect.toUpperCase() == "INICIO")
|
|
81
|
+
this.sfCrudService.redirectToInicio();
|
|
82
|
+
else
|
|
83
|
+
window.location.href = notification.requestChecking.redirect;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else if ((notification === null || notification === void 0 ? void 0 : notification.msg) && ((_b = notification.requestChecking) === null || _b === void 0 ? void 0 : _b.redirect)) {
|
|
88
|
+
this.messageService.add(notification.msg);
|
|
89
|
+
if (notification.requestChecking.redirect.toUpperCase() == "INICIO")
|
|
90
|
+
this.sfCrudService.redirectToInicio();
|
|
91
|
+
else {
|
|
92
|
+
let newURL = this.sfCrudService.getURLRedirect(notification.requestChecking.redirect);
|
|
93
|
+
window.location.href = newURL;
|
|
94
|
+
window.location.reload();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (notification === null || notification === void 0 ? void 0 : notification.msg) {
|
|
98
|
+
this.messageService.add(notification.msg);
|
|
59
99
|
}
|
|
60
|
-
else
|
|
61
|
-
this.getInfoRegistro(this.crudConfig.registro);
|
|
62
|
-
})
|
|
63
|
-
.catch(err => {
|
|
64
|
-
console.log(err);
|
|
65
|
-
this.enProceso = false;
|
|
66
100
|
});
|
|
67
101
|
}
|
|
68
|
-
|
|
69
|
-
this.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
(_a = layout.elements) === null || _a === void 0 ? void 0 : _a.forEach((element, j) => {
|
|
77
|
-
this.controls[i].push(this.getControl(element.scope));
|
|
78
|
-
this.controls[i][j].scope = element.scope;
|
|
79
|
-
this.values[i].push(this.getValue(element.scope));
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
this.controlsLoaded = true;
|
|
102
|
+
ngOnDestroy() {
|
|
103
|
+
if (this.notificationSubscription) {
|
|
104
|
+
this.notificationSubscription.unsubscribe();
|
|
105
|
+
}
|
|
106
|
+
this.subsToKillOnDestroy.forEach(sub => sub.unsubscribe());
|
|
107
|
+
this.stepService.reset();
|
|
108
|
+
this.sfCrudService.reset();
|
|
109
|
+
console.log("destroy");
|
|
83
110
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
endpoint = endpoint.replace('@ndocactivo', this.user.UsuarioSistema.NDOC);
|
|
99
|
-
endpoint = endpoint.replace('@id', this.id);
|
|
100
|
-
this.generalService.genericRequest((op === null || op === void 0 ? void 0 : op.method) || '', (op === null || op === void 0 ? void 0 : op.server) || '', endpoint)
|
|
101
|
-
.then((res) => {
|
|
102
|
-
if (res === null || res === void 0 ? void 0 : res.data) {
|
|
103
|
-
if (Array.isArray(res.data))
|
|
104
|
-
this.data = res.data[0];
|
|
105
|
-
else
|
|
106
|
-
this.data = res.data;
|
|
107
|
-
this.trx = 'u';
|
|
111
|
+
instanceSubsStepService() {
|
|
112
|
+
this.subsToKillOnDestroy.push(this.stepService.customChildrenEvents$.subscribe((event) => {
|
|
113
|
+
if (!event)
|
|
114
|
+
return;
|
|
115
|
+
switch (event.name.toUpperCase()) {
|
|
116
|
+
case "ONCLICKEDEDITBUTTON":
|
|
117
|
+
this.onClickedEditButton(event.data.element, event.data.data, event.data.index);
|
|
118
|
+
break;
|
|
119
|
+
case "ONCLICKEDDELETEBUTTON":
|
|
120
|
+
this.deleteRow(event.data.element, event.data.index);
|
|
121
|
+
break;
|
|
122
|
+
case "ONCLICKEDADDBUTTON":
|
|
123
|
+
this.onClickedAddButton(event.data.element);
|
|
124
|
+
break;
|
|
108
125
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
126
|
+
}));
|
|
127
|
+
this.subsToKillOnDestroy.push(this.stepService.requestApproval$.subscribe((value) => {
|
|
128
|
+
console.log(value);
|
|
129
|
+
if ((value === null || value === void 0 ? void 0 : value.desired) != undefined) {
|
|
130
|
+
if (value.desired < value.current) {
|
|
131
|
+
this.stepService.requestApproved = true;
|
|
132
|
+
this.sfCrudService.index = this.stepService.currentIndex;
|
|
133
|
+
this.scrollTop();
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const operation = this.sfCrudService.getRegistro(this.indexCrud).operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
137
|
+
if (!this.validateData(operation, this.sfCrudService.getData(this.indexCrud), this.sfCrudService.getRegistro(this.indexCrud).conditions || []))
|
|
138
|
+
this.stepService.requestApproved = false;
|
|
139
|
+
else if (operation.method != null)
|
|
140
|
+
this.uploadInfoStep(value);
|
|
141
|
+
else if (operation.answerChecking) { //no tiene request, solo un mensaje
|
|
142
|
+
this.stepService.requestApproved = true;
|
|
143
|
+
this.loading.inProgress = false;
|
|
144
|
+
this.sfCrudService.formLoading = this.loading;
|
|
145
|
+
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("success", undefined, "Información subida correctamente", operation.answerChecking), {}, operation.answerChecking), operation.answerChecking);
|
|
146
|
+
this.sfCrudService.index = this.stepService.currentIndex;
|
|
147
|
+
this.scrollTop();
|
|
148
|
+
}
|
|
149
|
+
else { //no tiene nada configurado
|
|
150
|
+
this.stepService.requestApproved = true;
|
|
151
|
+
this.sfCrudService.index = this.stepService.currentIndex;
|
|
152
|
+
this.scrollTop();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}));
|
|
157
|
+
console.log("subs step service terminadas");
|
|
158
|
+
}
|
|
159
|
+
uploadInfoStep(position) {
|
|
160
|
+
this.loading.inProgress = true;
|
|
161
|
+
this.sfCrudService.formLoading = this.loading;
|
|
162
|
+
this.submit(position.current).then(() => {
|
|
163
|
+
var _a, _b, _c;
|
|
164
|
+
let tieneRedirect = ((_a = this.sfCrudService.currentOperation) === null || _a === void 0 ? void 0 : _a.answerChecking) !== undefined && ((_c = (_b = this.sfCrudService.currentOperation) === null || _b === void 0 ? void 0 : _b.answerChecking) === null || _c === void 0 ? void 0 : _c.redirect) !== undefined;
|
|
165
|
+
console.log(this.items.length);
|
|
166
|
+
if (this.items.length == 1) {
|
|
167
|
+
this.stepService.requestApproved = false;
|
|
168
|
+
//this.stepService.desiredIndex = undefined
|
|
169
|
+
this.sfCrudService.index = this.stepService.currentIndex;
|
|
170
|
+
}
|
|
171
|
+
else if (!tieneRedirect) {
|
|
172
|
+
this.advance(position.current, position.desired, false);
|
|
112
173
|
}
|
|
113
|
-
this.
|
|
114
|
-
this.enProceso = false;
|
|
115
|
-
this.configOperation = this.crudConfig.registro.operations.find(x => x.type.startsWith(this.trx)) || new Operations();
|
|
116
|
-
this.setLabelSumbit();
|
|
174
|
+
this.scrollTop();
|
|
117
175
|
})
|
|
118
|
-
.catch(
|
|
119
|
-
|
|
120
|
-
|
|
176
|
+
.catch(() => {
|
|
177
|
+
this.stepService.requestApproved = false;
|
|
178
|
+
}).finally(() => {
|
|
179
|
+
this.loading.inProgress = false;
|
|
180
|
+
this.sfCrudService.formLoading = this.loading;
|
|
121
181
|
});
|
|
122
182
|
}
|
|
123
|
-
|
|
124
|
-
this.
|
|
125
|
-
}
|
|
126
|
-
getControl(scope) {
|
|
127
|
-
return jsonpath.query(this.crudConfig.esquema, scope)[0];
|
|
128
|
-
}
|
|
129
|
-
getValue(scope) {
|
|
130
|
-
return jsonpath.query(this.data, scope.replace('.properties', ''))[0];
|
|
131
|
-
}
|
|
132
|
-
setValue(value, scope, i, j) {
|
|
133
|
-
switch (typeof (value)) {
|
|
134
|
-
case 'object':
|
|
135
|
-
if (Array.isArray(value))
|
|
136
|
-
value.forEach((val) => {
|
|
137
|
-
this.setValueByScope(val.scope, val.value);
|
|
138
|
-
jsonpath.value(this.data, val.scope.replace('.properties', ''), val.value);
|
|
139
|
-
});
|
|
140
|
-
else {
|
|
141
|
-
this.values[i][j] = value;
|
|
142
|
-
jsonpath.value(this.data, scope.replace('.properties', ''), value);
|
|
143
|
-
}
|
|
144
|
-
break;
|
|
145
|
-
default:
|
|
146
|
-
this.values[i][j] = value;
|
|
147
|
-
jsonpath.value(this.data, scope.replace('.properties', ''), value);
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
this.applyValuesOnEvent('onChange', this.crudConfig.esquema);
|
|
151
|
-
}
|
|
152
|
-
createObject(esquema) {
|
|
153
|
-
const object = {};
|
|
154
|
-
switch (esquema.type) {
|
|
155
|
-
case 'numeric':
|
|
156
|
-
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || 0;
|
|
157
|
-
case 'string':
|
|
158
|
-
case 'date':
|
|
159
|
-
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) ? this.setDefaultValue(esquema.default) : null;
|
|
160
|
-
case 'boolean':
|
|
161
|
-
return (esquema === null || esquema === void 0 ? void 0 : esquema.default) || false;
|
|
162
|
-
case 'array':
|
|
163
|
-
return [];
|
|
164
|
-
case 'file':
|
|
165
|
-
return null;
|
|
166
|
-
case 'object':
|
|
167
|
-
Object.getOwnPropertyNames(esquema === null || esquema === void 0 ? void 0 : esquema.properties).forEach(key => {
|
|
168
|
-
let aux = esquema === null || esquema === void 0 ? void 0 : esquema.properties[key];
|
|
169
|
-
if (aux)
|
|
170
|
-
object[key] = this.createObject(aux);
|
|
171
|
-
});
|
|
172
|
-
return object;
|
|
173
|
-
default:
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
183
|
+
onClickBtnSubmit() {
|
|
184
|
+
this.stepService.requestApproval = this.indexCrud;
|
|
176
185
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
186
|
+
loadConfigCrud() {
|
|
187
|
+
this.loading.inProgress = true;
|
|
188
|
+
this.sfCrudService.formLoading = this.loading;
|
|
189
|
+
this.sfCrudService.dataExt = this.dataExt;
|
|
190
|
+
this.sfCrudService.crudLoaded = false;
|
|
191
|
+
if (this.loadSession()) {
|
|
192
|
+
this.sfCrudService.crudLoaded = true;
|
|
180
193
|
return;
|
|
181
|
-
|
|
182
|
-
this.
|
|
183
|
-
let endpoint = this.configOperation.endpoint;
|
|
184
|
-
endpoint = endpoint.replace('@idKatios', this.idKatios);
|
|
185
|
-
endpoint = endpoint.replace('@id', this.id);
|
|
186
|
-
this.generalService.genericRequest(this.configOperation.method, this.configOperation.server, endpoint, this.data)
|
|
194
|
+
}
|
|
195
|
+
this.generalService.getCrudByEntidad(this.idKatios, this.idForm)
|
|
187
196
|
.then((res) => {
|
|
188
|
-
|
|
189
|
-
this.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
197
|
+
console.log("crud cargado");
|
|
198
|
+
this.sfCrudService.uiEsquemas = res.uiEsquemas;
|
|
199
|
+
this.sfCrudService.esquemas = res.esquemas;
|
|
200
|
+
this.sfCrudService.registros = res.registros;
|
|
201
|
+
this.customizeCompany(res.uiEsquemas);
|
|
202
|
+
this.sfCrudService.registros.forEach((_, i) => this.sfCrudService.setTrx("c", i));
|
|
203
|
+
this.loadData()
|
|
204
|
+
.then(() => {
|
|
205
|
+
this.setLabelSumbit();
|
|
206
|
+
this.sfCrudService.dataset.forEach((data, i) => {
|
|
207
|
+
var _a;
|
|
208
|
+
if (this.activeRoute.snapshot.queryParams["_idGWVADO"] && ((_a = data.ADO) === null || _a === void 0 ? void 0 : _a.dataProceso)) {
|
|
209
|
+
data.ADO.dataProceso.idProceso = this.activeRoute.snapshot.queryParams["_idGWVADO"];
|
|
210
|
+
}
|
|
211
|
+
if (this.activeRoute.snapshot.queryParams["_idADO"] && data.ADO) {
|
|
212
|
+
data.ADO.idTransaction = this.activeRoute.snapshot.queryParams["_idADO"];
|
|
213
|
+
}
|
|
214
|
+
this.sfCrudService.setDataSet(data, i);
|
|
215
|
+
});
|
|
216
|
+
})
|
|
217
|
+
.finally(() => {
|
|
218
|
+
let willExecuteRequest = this.advance(0, this.sfCrudService.uiEsquemas.length - 1, true);
|
|
219
|
+
this.createSteps(res.uiEsquemas);
|
|
220
|
+
this.sfCrudService.crudLoaded = true;
|
|
221
|
+
if (!willExecuteRequest) {
|
|
222
|
+
this.loading.inProgress = false;
|
|
223
|
+
this.sfCrudService.formLoading = this.loading;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}).catch((ex) => {
|
|
227
|
+
console.error(ex);
|
|
228
|
+
this.loading.inProgress = false;
|
|
229
|
+
this.sfCrudService.formLoading = this.loading;
|
|
202
230
|
});
|
|
203
231
|
}
|
|
204
232
|
/**
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
if (dynamics) {
|
|
221
|
-
for (const property in dynamics) {
|
|
222
|
-
currentMsg[property] = jsonpath.query(rta, dynamics[property])[0];
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (error) { //es una respuesta sin JSON
|
|
227
|
-
if (dynamics)
|
|
228
|
-
currentMsg.detail = rta;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
233
|
+
* Step will advance until esquema is not completed
|
|
234
|
+
*/
|
|
235
|
+
advance(start, limit, executeRequest) {
|
|
236
|
+
var _a;
|
|
237
|
+
console.log("advance desde ", start, " hasta ", limit);
|
|
238
|
+
let i = start;
|
|
239
|
+
let op;
|
|
240
|
+
let willExecuteRequest = false;
|
|
241
|
+
let registro;
|
|
242
|
+
while (i < limit) {
|
|
243
|
+
registro = this.sfCrudService.getRegistro(i);
|
|
244
|
+
op = registro.operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(i)));
|
|
245
|
+
if (!this.validateData(op, this.sfCrudService.getData(i), registro.conditions || [], false))
|
|
246
|
+
break;
|
|
247
|
+
i++;
|
|
231
248
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
249
|
+
this.sfCrudService.index = i;
|
|
250
|
+
this.stepService.currentIndex = i;
|
|
251
|
+
this.stepService.desiredIndex = i;
|
|
252
|
+
console.log("advance", i);
|
|
253
|
+
this.stepService.requestApproved = true;
|
|
254
|
+
registro = this.sfCrudService.getRegistro(i);
|
|
255
|
+
let dataCurrentStep = this.sfCrudService.getData(i);
|
|
256
|
+
op = this.sfCrudService.getRegistro(i).operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(i)));
|
|
257
|
+
if (executeRequest && (this.activeRoute.snapshot.queryParams["_idGWVADO"] || this.activeRoute.snapshot.queryParams["_idADO"]) //Viene de ADO
|
|
258
|
+
&& dataCurrentStep.ADO && this.validateData(op, dataCurrentStep, (_a = registro.conditions) !== null && _a !== void 0 ? _a : [], false) //El step esta completo
|
|
259
|
+
) {
|
|
260
|
+
console.log("advance with approval", i);
|
|
261
|
+
this.stepService.requestApproval = i;
|
|
262
|
+
willExecuteRequest = true;
|
|
263
|
+
}
|
|
264
|
+
return willExecuteRequest;
|
|
239
265
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
266
|
+
loadSession() {
|
|
267
|
+
const wasLoaded = this.sfCrudService.loadSession();
|
|
268
|
+
if (wasLoaded) {
|
|
269
|
+
this.customizeCompany(this.sfCrudService.uiEsquemas);
|
|
270
|
+
this.stepService.currentIndex = this.sfCrudService.index;
|
|
271
|
+
this.createSteps(this.sfCrudService.uiEsquemas);
|
|
272
|
+
this.loading.inProgress = false;
|
|
273
|
+
this.sfCrudService.formLoading = this.loading;
|
|
274
|
+
}
|
|
275
|
+
return wasLoaded;
|
|
244
276
|
}
|
|
245
|
-
|
|
246
|
-
var _a, _b, _c, _d;
|
|
247
|
-
|
|
248
|
-
(
|
|
249
|
-
|
|
250
|
-
|
|
277
|
+
customizeCompany(uiEsquemas) {
|
|
278
|
+
var _a, _b, _c, _d, _e, _f;
|
|
279
|
+
this.sfCrudService.configEmpresa = (_a = uiEsquemas.find(ui => ui.general)) === null || _a === void 0 ? void 0 : _a.general;
|
|
280
|
+
this.logo = (_c = (_b = this.sfCrudService.configEmpresa) === null || _b === void 0 ? void 0 : _b.icons) === null || _c === void 0 ? void 0 : _c.carga;
|
|
281
|
+
if (this.sfCrudService.configEmpresa) {
|
|
282
|
+
if ((_d = this.sfCrudService.configEmpresa.colors) === null || _d === void 0 ? void 0 : _d.main)
|
|
283
|
+
this.color = this.sfCrudService.configEmpresa.colors.main;
|
|
284
|
+
if ((_e = this.sfCrudService.configEmpresa.colors) === null || _e === void 0 ? void 0 : _e.secondary)
|
|
285
|
+
this.color2 = this.sfCrudService.configEmpresa.colors.secondary;
|
|
286
|
+
if ((_f = this.sfCrudService.configEmpresa.colors) === null || _f === void 0 ? void 0 : _f.button)
|
|
287
|
+
this.colorButton = this.sfCrudService.configEmpresa.colors.button;
|
|
288
|
+
}
|
|
289
|
+
if (!this.colorButton)
|
|
290
|
+
this.colorButton = "blue";
|
|
291
|
+
if (!this.color2)
|
|
292
|
+
this.color2 = "blue";
|
|
293
|
+
if (!this.color)
|
|
294
|
+
this.color = "blue";
|
|
295
|
+
}
|
|
296
|
+
scrollTop() {
|
|
297
|
+
window.scroll({
|
|
298
|
+
top: 0,
|
|
299
|
+
left: 0,
|
|
300
|
+
behavior: 'smooth'
|
|
251
301
|
});
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
302
|
+
}
|
|
303
|
+
createSteps(uiEsquemas) {
|
|
304
|
+
this.items = [];
|
|
305
|
+
uiEsquemas.forEach((uiEsq, index) => {
|
|
306
|
+
if (uiEsq.step)
|
|
307
|
+
this.items.push({ label: uiEsq.step, routerLink: index, queryParamsHandling: "preserve" });
|
|
308
|
+
else
|
|
309
|
+
this.items.push({ label: `paso ${index}`, routerLink: index });
|
|
310
|
+
this.sfCrudService.getRegistro(index); //ver si tiene un change
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Instancia todos los esquemas, y realiza los requests para traer la data de todos los step.
|
|
315
|
+
* @param esquema
|
|
316
|
+
* @param registro
|
|
317
|
+
* @returns
|
|
318
|
+
*/
|
|
319
|
+
loadData() {
|
|
320
|
+
this.sfCrudService.esquemas.forEach((esquema, i) => {
|
|
321
|
+
const op = this.sfCrudService.registros[i].operations.find(x => x.type.startsWith(this.sfCrudService.getTrx(i)));
|
|
322
|
+
this.sfCrudService.setDataSet(this.sfCrudService.createObject(esquema, op), i);
|
|
323
|
+
});
|
|
324
|
+
console.log("loadData");
|
|
325
|
+
return Promise.all(this.sfCrudService.registros.map((registro, i) => this.ids.length > 0 ? this.getInfoRegistro(registro, i, this.ids[i]) : Promise.resolve()));
|
|
326
|
+
}
|
|
327
|
+
getInfoRegistro(configRegistro, index, id) {
|
|
328
|
+
const op = configRegistro.operations.find(x => x.type == 'read');
|
|
329
|
+
if (!op)
|
|
330
|
+
return;
|
|
331
|
+
const url = this.sfCrudService.getURL(op, index, id);
|
|
332
|
+
return this.generalService.genericRequest(op.method, url)
|
|
333
|
+
.then((res) => {
|
|
334
|
+
let value = undefined;
|
|
335
|
+
if (res === null || res === void 0 ? void 0 : res.data) {
|
|
336
|
+
value = Array.isArray(res.data) ? res.data[0] : res.data;
|
|
262
337
|
}
|
|
338
|
+
else
|
|
339
|
+
value = Array.isArray(res) ? res[0] : res;
|
|
340
|
+
this.sfCrudService.applyObjectKeys(value, op.keysEsquema || [], configRegistro);
|
|
341
|
+
if (op.changeTrx)
|
|
342
|
+
op.changeTrx.forEach(x => this.sfCrudService.setTrx(x.trx, x.index));
|
|
343
|
+
console.log("getInfoRegistro", op.changeTrx);
|
|
344
|
+
})
|
|
345
|
+
.catch((error) => {
|
|
346
|
+
console.log(error);
|
|
347
|
+
let errorChecking;
|
|
348
|
+
if (Array.isArray(op.errorChecking))
|
|
349
|
+
errorChecking = op.errorChecking[0];
|
|
350
|
+
else
|
|
351
|
+
errorChecking = op.errorChecking;
|
|
352
|
+
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("error", "Formulario no cargado correctamente", "", errorChecking), error.error, errorChecking), errorChecking);
|
|
353
|
+
throw error;
|
|
263
354
|
});
|
|
264
|
-
if (err.length != 0)
|
|
265
|
-
this.messageSerice.add({ severity: 'warn', detail: err.join('. ') });
|
|
266
|
-
return err.length == 0;
|
|
267
355
|
}
|
|
268
356
|
setDefaultValue(value) {
|
|
357
|
+
var _a;
|
|
269
358
|
let data = null;
|
|
270
|
-
if (value.key && this.
|
|
271
|
-
data = this.getValueKey(this.
|
|
359
|
+
if (value.key && ((_a = this.sfCrudService.currentOperation) === null || _a === void 0 ? void 0 : _a.keys)) {
|
|
360
|
+
data = this.sfCrudService.getValueKey(this.sfCrudService.currentOperation.keys.find(k => k.key == value.key));
|
|
272
361
|
value = data;
|
|
273
362
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
363
|
+
else {
|
|
364
|
+
switch (value) {
|
|
365
|
+
case '@uactivo':
|
|
366
|
+
data = `${this.user.UsuarioSistema.TDOC}-${this.user.UsuarioSistema.NDOC}`;
|
|
367
|
+
break;
|
|
368
|
+
case '@tdocactivo':
|
|
369
|
+
data = this.user.UsuarioSistema.TDOC;
|
|
370
|
+
break;
|
|
371
|
+
case '@ndocactivo':
|
|
372
|
+
data = this.user.UsuarioSistema.NDOC;
|
|
373
|
+
break;
|
|
374
|
+
case '@hoy':
|
|
375
|
+
data = new Date();
|
|
376
|
+
break;
|
|
377
|
+
default:
|
|
378
|
+
data = value;
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
return data;
|
|
290
382
|
}
|
|
291
|
-
return data;
|
|
292
383
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
switch (key.data || 'externa') {
|
|
296
|
-
case "user":
|
|
297
|
-
data = this.user;
|
|
298
|
-
break;
|
|
299
|
-
default:
|
|
300
|
-
data = this.dataExt;
|
|
301
|
-
break;
|
|
302
|
-
}
|
|
303
|
-
if (data) {
|
|
304
|
-
const aux = jsonpath.query(data, key.scope);
|
|
305
|
-
if (aux.length == 0)
|
|
306
|
-
return undefined;
|
|
307
|
-
if (aux.length == 1)
|
|
308
|
-
return aux[0];
|
|
309
|
-
else
|
|
310
|
-
return aux;
|
|
311
|
-
}
|
|
312
|
-
return undefined;
|
|
313
|
-
}
|
|
314
|
-
sendNotification(message) {
|
|
315
|
-
this.messageSerice.add(message);
|
|
316
|
-
}
|
|
317
|
-
addObjectArray(element) {
|
|
318
|
-
this.dialogRef = this.dialogService.open(RegistroChildComponent, {
|
|
319
|
-
header: element.label ? element.label : 'Detalle',
|
|
320
|
-
width: '70%',
|
|
321
|
-
modal: true,
|
|
322
|
-
closable: true,
|
|
323
|
-
data: {
|
|
324
|
-
uiEsquema: Object.assign({}, element.elements),
|
|
325
|
-
esquema: this.getControl(element.scope),
|
|
326
|
-
id: this.getValue(element.scope).length + 1
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
this.dialogRef.onClose.subscribe((data) => {
|
|
330
|
-
if (data)
|
|
331
|
-
this.data[element.scope.replace('$..properties.', '')].push(data);
|
|
332
|
-
this.applyValuesOnEvent('onChange', this.crudConfig.esquema, element.scope.replace('$..properties.', ''));
|
|
333
|
-
});
|
|
384
|
+
get indexCrud() {
|
|
385
|
+
return this.stepService.currentIndex;
|
|
334
386
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
header: element.label ? element.label : 'Detalle',
|
|
338
|
-
width: '70%',
|
|
339
|
-
modal: true,
|
|
340
|
-
closable: true,
|
|
341
|
-
data: {
|
|
342
|
-
uiEsquema: Object.assign({}, element.elements),
|
|
343
|
-
esquema: this.getControl(element.scope),
|
|
344
|
-
data: Object.assign({}, data)
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
this.dialogRef.onClose.subscribe((data) => {
|
|
348
|
-
if (data)
|
|
349
|
-
this.data[element.scope.replace('$..properties.', '')][index] = data;
|
|
350
|
-
this.applyValuesOnEvent('onChange', this.crudConfig.esquema, element.scope.replace('$..properties.', ''));
|
|
351
|
-
});
|
|
387
|
+
primeChecking() {
|
|
388
|
+
return new RequestChecking(undefined, undefined, false, undefined, undefined, false, undefined);
|
|
352
389
|
}
|
|
353
|
-
|
|
354
|
-
this.
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
390
|
+
submit(index) {
|
|
391
|
+
this.sfCrudService.applyValuesOnEvent('onSubmit', this.sfCrudService.getEsquema(index), undefined, this.sfCrudService.getData(index));
|
|
392
|
+
let registro = this.sfCrudService.getRegistro(index);
|
|
393
|
+
console.log("trx actual: ", this.sfCrudService.getTrx(this.indexCrud));
|
|
394
|
+
const operation = registro.operations.find(op => op.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
395
|
+
let url = this.sfCrudService.getURL(operation, index);
|
|
396
|
+
return this.generalService.genericRequest(operation.method, url, this.sfCrudService.getData(index))
|
|
397
|
+
.then((res) => {
|
|
398
|
+
if (res === null)
|
|
399
|
+
res = {};
|
|
400
|
+
res = this.sfCrudService.applyObjectKeys(res, operation.keysEsquema || [], registro);
|
|
401
|
+
this.sfCrudService.setAnswers(res, this.indexCrud);
|
|
402
|
+
if (operation.changeTrx)
|
|
403
|
+
operation.changeTrx.forEach(x => this.sfCrudService.setTrx(x.trx, x.index));
|
|
404
|
+
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("success", undefined, "Información subida correctamente", operation.answerChecking), res, operation.answerChecking), operation.answerChecking);
|
|
405
|
+
return res;
|
|
406
|
+
})
|
|
407
|
+
.catch(err => {
|
|
408
|
+
this.notificationService.addNotification(this.notificationService.generateMessage(this.notificationService.genDefaultMessage("error", "Error no controlado", "Por favor comunicarse con el admin", operation.errorChecking), err.error, operation.errorChecking), operation.errorChecking);
|
|
409
|
+
throw new Error(err);
|
|
359
410
|
});
|
|
360
|
-
|
|
411
|
+
// return Promise.resolve({})
|
|
361
412
|
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
});
|
|
368
|
-
}
|
|
413
|
+
onCloseAddItem(index) {
|
|
414
|
+
const scope = this.dialogElements[index].scope.replaceAll('.properties', '');
|
|
415
|
+
const item = _.cloneDeep(this.dialogElements[index].data);
|
|
416
|
+
if (index == 0) {
|
|
417
|
+
jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope)[0].push(item);
|
|
369
418
|
}
|
|
419
|
+
else
|
|
420
|
+
jsonpath.query(this.dialogElements[index - 1].data, scope)[0].push(item);
|
|
421
|
+
}
|
|
422
|
+
deleteRow(element, indexElement) {
|
|
423
|
+
const scope = element.scope.replaceAll('.properties', '');
|
|
424
|
+
let indexDialog = this.dialogElements.length - 1;
|
|
425
|
+
if (indexDialog == -1)
|
|
426
|
+
jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope)[0].splice(indexElement, 1);
|
|
370
427
|
else {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
428
|
+
indexDialog = indexDialog == 0 ? 1 : indexDialog;
|
|
429
|
+
jsonpath.query(this.dialogElements[indexDialog - 1].data, scope)[0].splice(indexElement, 1);
|
|
430
|
+
}
|
|
431
|
+
this.sfCrudService.applyValuesOnEvent('onChange', this.sfCrudService.getEsquema(this.indexCrud), element.scope.replace('$..properties.', ''), this.sfCrudService.getData(this.indexCrud));
|
|
432
|
+
}
|
|
433
|
+
onCloseEditRow(index) {
|
|
434
|
+
let scope = undefined;
|
|
435
|
+
try {
|
|
436
|
+
const iArray = this.dialogElements[index].index;
|
|
437
|
+
scope = this.dialogElements[index].scope.replaceAll('.properties', '');
|
|
438
|
+
const item = _.cloneDeep(this.dialogElements[index].data);
|
|
439
|
+
if (index == 0) {
|
|
440
|
+
jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope)[0][iArray] = item;
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
jsonpath.query(this.dialogElements[index - 1].data, scope)[0][iArray] = item;
|
|
377
444
|
}
|
|
378
445
|
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
console.error(error);
|
|
448
|
+
console.log(this.dialogElements);
|
|
449
|
+
console.log(index);
|
|
450
|
+
console.log(scope);
|
|
451
|
+
console.log(this.indexCrud);
|
|
452
|
+
console.log(this.sfCrudService.getData(this.indexCrud));
|
|
453
|
+
if (index == 0 && scope) {
|
|
454
|
+
console.log(jsonpath.query(this.sfCrudService.getData(this.indexCrud), scope));
|
|
455
|
+
}
|
|
456
|
+
else if (scope) {
|
|
457
|
+
console.log(jsonpath.query(this.dialogElements[index - 1].data, scope));
|
|
458
|
+
}
|
|
459
|
+
throw error;
|
|
460
|
+
}
|
|
379
461
|
}
|
|
380
|
-
|
|
462
|
+
validateData(operation, data, conditions, printErrors = true) {
|
|
381
463
|
var _a;
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
case 'concat':
|
|
388
|
-
let array = [];
|
|
389
|
-
(_a = params === null || params === void 0 ? void 0 : params.key) === null || _a === void 0 ? void 0 : _a.reduce((acc, cur) => {
|
|
390
|
-
array.push(jsonpath.query(data, cur)[0]);
|
|
391
|
-
}, []);
|
|
392
|
-
if (params === null || params === void 0 ? void 0 : params.separator)
|
|
393
|
-
jsonpath.value(data, params.scope[0], array.join((params === null || params === void 0 ? void 0 : params.separator) || ' '));
|
|
394
|
-
break;
|
|
395
|
-
case 'enable':
|
|
396
|
-
jsonpath.value(this.crudConfig.esquema, params.scope[0], false);
|
|
397
|
-
break;
|
|
398
|
-
case 'disabled':
|
|
399
|
-
jsonpath.value(this.crudConfig.esquema, params.scope[0], true);
|
|
400
|
-
break;
|
|
401
|
-
case 'replace:endpoint':
|
|
402
|
-
jsonpath.value(this.crudConfig.esquema, params.scope[0], this.crudConfig.esquema.config.endpointtemp.replace(params.scope[1], jsonpath.query(data, `$..${params.key}`)));
|
|
403
|
-
break;
|
|
404
|
-
case 'setNull':
|
|
405
|
-
jsonpath.value(this.data, `$.${params.key}`, null);
|
|
406
|
-
break;
|
|
407
|
-
case 'datediff:years':
|
|
408
|
-
jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'years'));
|
|
409
|
-
break;
|
|
410
|
-
case 'datediff:months':
|
|
411
|
-
jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'months'));
|
|
412
|
-
break;
|
|
413
|
-
case 'datediff:weeks':
|
|
414
|
-
jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'weeks'));
|
|
415
|
-
break;
|
|
416
|
-
case 'datediff:days':
|
|
417
|
-
jsonpath.value(this.data, params.scope[0], date.diff(moment(jsonpath.query(this.data, params.scope[1])[0]), 'days'));
|
|
418
|
-
break;
|
|
419
|
-
default:
|
|
420
|
-
break;
|
|
464
|
+
if (((_a = operation === null || operation === void 0 ? void 0 : operation.validations) === null || _a === void 0 ? void 0 : _a.type) == 'local') {
|
|
465
|
+
let err = this.sfCrudService.validateDataLocal(operation, data, conditions);
|
|
466
|
+
if (err.length != 0 && printErrors)
|
|
467
|
+
this.notificationService.addNotification({ severity: 'warn', detail: err.slice(0, 5).join('. ') }, this.primeChecking());
|
|
468
|
+
return err.length == 0;
|
|
421
469
|
}
|
|
470
|
+
return true;
|
|
422
471
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
jsonpath.value(esquema, data.scope, data.value);
|
|
426
|
-
});
|
|
472
|
+
onConfirm() {
|
|
473
|
+
this.messageService.clear('c');
|
|
427
474
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
for (let i = 0; i < event.optionValue.length; i++) {
|
|
431
|
-
const optionVal = event.optionValue[i];
|
|
432
|
-
const newVal = event.data ? this.aplyFormatValue(optionVal.scope, event.data[optionVal.key]) : null;
|
|
433
|
-
jsonpath.value(this.data, optionVal.scope.replace('.properties', ''), this.aplyFormatValue(optionVal.scope, event.data[optionVal.key]));
|
|
434
|
-
this.setValueByScope(optionVal.scope, newVal);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
475
|
+
onReject() {
|
|
476
|
+
this.messageService.clear('c');
|
|
437
477
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
478
|
+
onClickedEditButton(element, data, index) {
|
|
479
|
+
this.dialogOperation = "u";
|
|
480
|
+
const esquema = _.cloneDeep(this.sfCrudService.getControl(element.scope, this.sfCrudService.getEsquema(this.indexCrud)));
|
|
481
|
+
esquema.type = "object";
|
|
482
|
+
const currentElement = {
|
|
483
|
+
data: _.cloneDeep(data),
|
|
484
|
+
uiEsquema: _.cloneDeep(element.elements[0]),
|
|
485
|
+
esquema: esquema,
|
|
486
|
+
scope: element.scope,
|
|
487
|
+
index: index
|
|
488
|
+
};
|
|
489
|
+
this.displays.push(true);
|
|
490
|
+
this.dialogElements.push(currentElement);
|
|
491
|
+
}
|
|
492
|
+
onClickedAddButton(element) {
|
|
493
|
+
this.dialogOperation = "c";
|
|
494
|
+
const esquema = _.cloneDeep(this.sfCrudService.getControl(element.scope, this.sfCrudService.getEsquema(this.indexCrud)));
|
|
495
|
+
const op = this.sfCrudService.registros[this.indexCrud].operations.find(x => x.type.startsWith(this.sfCrudService.getTrx(this.indexCrud)));
|
|
496
|
+
esquema.type = "object";
|
|
497
|
+
const currentElement = {
|
|
498
|
+
data: this.sfCrudService.createObject(esquema, op),
|
|
499
|
+
uiEsquema: _.cloneDeep(element.elements[0]),
|
|
500
|
+
esquema: esquema,
|
|
501
|
+
scope: element.scope,
|
|
502
|
+
index: 0
|
|
503
|
+
};
|
|
504
|
+
try {
|
|
505
|
+
currentElement.data.id = this.sfCrudService.getValue(element.scope, this.sfCrudService.getData(this.indexCrud)).length + 1;
|
|
446
506
|
}
|
|
507
|
+
catch (error) {
|
|
508
|
+
console.log("error agregando un id");
|
|
509
|
+
console.error(error);
|
|
510
|
+
}
|
|
511
|
+
this.displays.push(true);
|
|
512
|
+
this.dialogElements.push(currentElement);
|
|
447
513
|
}
|
|
448
|
-
|
|
449
|
-
let
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
514
|
+
onCloseDialog(index) {
|
|
515
|
+
let validated = true;
|
|
516
|
+
if (this.dialogElements[index].esquema.validations) {
|
|
517
|
+
const op = new Operation();
|
|
518
|
+
op.validations = this.dialogElements[index].esquema.validations;
|
|
519
|
+
validated = this.validateData(op, this.dialogElements[index].data, this.sfCrudService.getRegistro(this.indexCrud).conditions || []);
|
|
520
|
+
}
|
|
521
|
+
console.log(this.dialogElements[index].esquema);
|
|
522
|
+
if (validated) {
|
|
523
|
+
switch (this.dialogOperation) {
|
|
524
|
+
case "c":
|
|
525
|
+
this.onCloseAddItem(index);
|
|
526
|
+
break;
|
|
527
|
+
case "u":
|
|
528
|
+
this.onCloseEditRow(index);
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
this.removeDialogItem();
|
|
461
532
|
}
|
|
462
|
-
|
|
533
|
+
}
|
|
534
|
+
removeDialogItem() {
|
|
535
|
+
this.dialogElements.pop();
|
|
536
|
+
this.displays.pop();
|
|
537
|
+
}
|
|
538
|
+
setLabelSumbit() {
|
|
539
|
+
let x = { "c": { label: 'Guardar', icon: 'pi pi-save' },
|
|
540
|
+
"u": { label: 'Actualizar', icon: 'pi pi-sync' },
|
|
541
|
+
"d": { label: 'Eliminar', icon: 'pi pi-trash' }
|
|
542
|
+
};
|
|
543
|
+
this.btnSubmit = x[this.sfCrudService.getTrx(0)];
|
|
544
|
+
}
|
|
545
|
+
back() {
|
|
546
|
+
this.router.navigateByUrl(this.sfCrudService.registros[0].btnBack);
|
|
463
547
|
}
|
|
464
548
|
}
|
|
465
|
-
RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.
|
|
466
|
-
RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", idEntidad: "idEntidad", trx: "trx", id: "id", user: "user", dataExt: "dataExt" }, outputs: { sendData: "sendData", onSubmit: "onSubmit" }, providers: [MessageService, DialogService, DynamicDialogConfig, DynamicDialogRef], ngImport: i0, template: "<p-blockUI [blocked]=\"enProceso\">\r\n <i class=\"pi pi-cog pi-spin\" style=\"font-size: 50px\"></i>\r\n</p-blockUI>\r\n\r\n<p-toast></p-toast>\r\n\r\n<div class=\"card\" *ngIf=\"!enProceso && controlsLoaded\">\r\n <h5 class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{crudConfig.registro?.label || idEntidad}} {{id != '' ? '-' + id : ''}}</span>\r\n <button *ngIf=\"crudConfig.registro?.canBack\" pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngFor=\"let element of crudConfig.uiEsquema.elements; let i = index\" [class]=\"element?.class\">\r\n <ng-container [ngSwitch]=\"element.type\">\r\n <div *ngSwitchCase=\"'Label'\" [style]=\"element?.style\">\r\n {{element?.label}}\r\n </div>\r\n <ng-container *ngSwitchCase=\"'HorizontalLayout'\">\r\n <div *ngFor=\"let el of element.elements;let j = index\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"controls[i][j]\" [label]=\"el.label\"\r\n [value]=\"values[i][j]\" (setValue)=\"setValue($event, el.scope, i, j)\"\r\n (sendNotification)=\"sendNotification($event)\" (sendObject)=\"applyValuesFromObject($event)\"></sf-control>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'VerticalLayout'\">\r\n <div *ngFor=\"let el of element.elements;let j = index\" [class]=\"el?.class\">\r\n <ng-container [ngSwitch]=\"el.type\">\r\n <sf-control *ngSwitchCase=\"'Control'\" [control]=\"controls[i][j]\" [label]=\"el.label\"\r\n [value]=\"values[i][j]\" (setValue)=\"setValue($event, el.scope, i, j)\"\r\n (sendNotification)=\"sendNotification($event)\" (sendObject)=\"applyValuesFromObject($event)\"></sf-control>\r\n <ng-container *ngSwitchCase=\"'Table'\">\r\n <p-table [value]=\"getValue(el.scope)\" [columns]=\"getControl(el.scope).config.columns\">\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex align-items-center justify-content-between\">\r\n <button pButton pRipple icon=\"pi pi-plus\" (click)=\"addObjectArray(el)\"\r\n class=\"p-button-success\"></button>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n {{col.label}}\r\n </th>\r\n <ng-container *ngIf=\"trx == 'c' || trx == 'u'\">\r\n <th></th>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n <tr>\r\n <ng-container *ngFor=\"let col of columns\" [ngSwitch]=\"col.type\">\r\n <ng-container *ngSwitchCase=\"'text'\">\r\n <td>{{rowData[col.col]}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'currency:USD'\">\r\n <td>{{rowData[col.col] | currency: 'USD'}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date:yyyy-mm-dd'\">\r\n <td>{{rowData[col.col] | date: 'yyyy-mm-dd'}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date:dd/mm/yyyy'\">\r\n <td>{{rowData[col.col] | date: 'dd/MM/yyyy'}}</td>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <td>\r\n <i *ngIf=\"rowData[col.col]\" class=\"pi pi-check\"></i>\r\n <i *ngIf=\"!rowData[col.col]\" class=\"pi pi-times\"></i>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"trx == 'c' || trx == 'u'\">\r\n <td>\r\n <button pButton pRipple type=\"button\" (click)=\"editRow(el, rowData, rowIndex)\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-info mr-1\"></button>\r\n <button pButton pRipple type=\"button\" (click)=\"deleteRow(el, rowIndex)\" icon=\"pi pi-trash\" class=\"p-button-rounded p-button-danger\"></button>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'Control'\">\r\n <sf-control [control]=\"getControl(element.scope)\" [label]=\"element.label\"></sf-control>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"card-footer mt-2\" *ngIf=\"btnSubmit\">\r\n <button pButton pRipple type=\"button\" [icon]=\"btnSubmit.icon\" [label]=\"btnSubmit.label\"\r\n (click)=\"submit()\"></button>\r\n </div>\r\n</div>\r\n", components: [{ type: i6.BlockUI, selector: "p-blockUI", inputs: ["target", "autoZIndex", "baseZIndex", "styleClass", "blocked"] }, { type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { type: i8.ControlComponent, selector: "sf-control", inputs: ["control", "label", "value", "appendTo"], outputs: ["setValue", "sendNotification", "sendObject"] }, { type: i9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "stateKey", "stateStorage", "editMode", "groupRowsBy", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i12.Ripple, selector: "[pRipple]" }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }], pipes: { "currency": i10.CurrencyPipe, "date": i10.DatePipe } });
|
|
549
|
+
RegistroComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, deps: [{ token: i1.GeneralService }, { token: i2.ActivatedRoute }, { token: i3.MessageService }, { token: i4.SfCrudService }, { token: i5.StepService }, { token: i6.SfPdfsignService }, { token: i7.SfSimuladorService }, { token: i8.NotificationService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
550
|
+
RegistroComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RegistroComponent, selector: "sf-registro", inputs: { idKatios: "idKatios", trx: "trx", id: "id", user: "user", dataExt: "dataExt", ids: "ids", environment: "environment", buttonsFooterTemplate: "buttonsFooterTemplate", idEntidad: "idEntidad" }, outputs: { sendData: "sendData", onSubmit: "onSubmit" }, host: { properties: { "style.--primary-color": "this.color", "style.--secondary-color": "this.color2", "style.--button-color": "this.colorButton" } }, providers: [MessageService], usesOnChanges: true, ngImport: i0, template: "<div class=\"card\">\r\n <!--TODO convertir en template y editarla en -->\r\n <h5 *ngIf=\"sfCrudService.registros.length == 1\" class=\"card-header mb-2\" style=\"display: flex; justify-content: space-between;align-items: center;\">\r\n <span>{{sfCrudService.registros[0]?.label || idForm.replaceAll('_', ' ')}} {{ids.length > 0 ? '-' + ids[0] : ''}}</span>\r\n <button *ngIf=\"sfCrudService.registros[0]?.canBack\" pButton pRipple type=\"button\" icon=\"pi pi-arrow-left\" (click)=\"back()\"></button>\r\n </h5>\r\n <div *ngIf=\"items.length > 1\">\r\n <app-step [items]=\"items\"></app-step>\r\n </div>\r\n <div *ngIf=\"items.length == 1\">\r\n <app-form [data]=\"sfCrudService.dataset[0]\" [esquema]=\"sfCrudService.esquemas[0]\"\r\n [uiEsquema]=\"sfCrudService.uiEsquemas[0]\" [isDialog]=\"false\"></app-form>\r\n\r\n <!--renderizar un codigo personalizado desde el componente padre o renderizar el que se tiene por defecto-->\r\n <ng-container *ngTemplateOutlet=\"buttonsFooterTemplate || defaultButtonsFooterTemplate\"></ng-container>\r\n <ng-template #defaultButtonsFooterTemplate>\r\n <div class=\"card-footer mt-2\" *ngIf=\"btnSubmit\">\r\n <button pButton pRipple type=\"button\" [icon]=\"btnSubmit.icon\" [label]=\"btnSubmit.label\" (click)=\"onClickBtnSubmit()\"></button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n\r\n<span *ngFor=\"let item of dialogElements; let $index=index\">\r\n <p-dialog [(visible)]=\"displays[$index]\" [modal]=\"true\" [header]=\"'Detalle'\" [closable]=\"false\">\r\n <!-- TODO header = currentElement.element.label ? currentElement.element.label: -->\r\n <app-form [data]=\"item.data\" [esquema]=\"item.esquema\" [uiEsquema]=\"item.uiEsquema\" [isDialog]=\"true\"\r\n [id]=\"ids[indexCrud]\"></app-form>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button icon=\"pi pi-times\" (onClick)=\"removeDialogItem()\" label=\"Cancelar\" ></p-button>\r\n <p-button icon=\"pi pi-check\" [disabled]=\"item.esquema.disabled === true\" (onClick)=\"onCloseDialog($index)\" label=\"Ok\" pAutoFocus\r\n [autofocus]=\"true\"></p-button>\r\n </ng-template>\r\n </p-dialog>\r\n</span>\r\n\r\n<p-toast *ngIf=\"dialogElements.length == 0\">\r\n <ng-template let-message pTemplate=\"message\">\r\n <div class=\"custom-toast\">\r\n <i class=\"pi\" [ngClass]=\"{\r\n 'pi-check-circle': message.severity === 'success',\r\n 'pi-info-circle': message.severity === 'info',\r\n 'pi-exclamation-triangle': message.severity === 'warn',\r\n 'pi-times-circle': message.severity === 'error'\r\n }\"></i>\r\n <div class=\"custom-toast-content\">\r\n <span class=\"custom-toast-detail\">{{message.detail}}</span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</p-toast>\r\n\r\n\r\n", styles: ["@media screen and (max-width: 600px){::ng-deep .p-toast{width:90vw!important;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:1}::ng-deep .p-dialog-mask .p-dialog{width:95vw}}@media screen and (min-width: 601px){::ng-deep .p-toast{width:25rem!important;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:1}}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.custom-toast{padding:8px;display:-webkit-box;z-index:inherit;justify-content:center;width:100%}.custom-toast-detail{display:flex;font-family:sans-serif;font-size:1.05rem;font-weight:400;margin:.5rem 0 0 .5rem;width:80%}.custom-toast i{margin-right:.5rem;font-size:2rem;width:100%;height:100%}::ng-deep .p-toast-message{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}::ng-deep .p-toast .p-toast-message.p-toast-message-info{background:#B3E5FC;border:solid #0891cf;color:#0891cf;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message{border-radius:6px}::ng-deep .p-toast .p-toast-message.p-toast-message-warn{background:rgba(255,242,226,.7);border:solid #cc8925;color:#cc8925;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message.p-toast-message-error{background:#FFCDD2;border:solid #e60017;color:#e60017;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message.p-toast-message-success{background:#C8E6C9;border:solid #439446;color:#439446;border-width:0 0 0 6px}::ng-deep .p-toast .p-toast-message .p-toast-icon-close{margin-top:1rem;margin-right:1.5rem}::ng-deep .p-toast .p-toast-message.p-toast-message-warn .p-toast-icon-close{color:#cc8925}::ng-deep .p-toast .p-toast-message.p-toast-message-info .p-toast-icon-close{color:#0891cf}::ng-deep .p-toast .p-toast-message.p-toast-message-error .p-toast-icon-close{color:#e60017}::ng-deep .p-toast .p-toast-message.p-toast-message-succes .p-toast-icon-close{color:#439446}\n"], components: [{ type: i9.StepComponent, selector: "app-step", inputs: ["items"] }, { type: i10.FormComponent, selector: "app-form", inputs: ["uiEsquema", "esquema", "data", "isDialog"] }, { type: i11.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { type: i12.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { type: i13.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i15.Ripple, selector: "[pRipple]" }, { type: i14.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
467
551
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RegistroComponent, decorators: [{
|
|
468
552
|
type: Component,
|
|
469
553
|
args: [{
|
|
470
554
|
selector: 'sf-registro',
|
|
471
555
|
templateUrl: './registro.component.html',
|
|
472
|
-
providers: [MessageService
|
|
473
|
-
entryComponents: [RegistroComponent]
|
|
556
|
+
providers: [MessageService],
|
|
557
|
+
entryComponents: [RegistroComponent],
|
|
558
|
+
styleUrls: ['./registro.component.css']
|
|
474
559
|
}]
|
|
475
|
-
}], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.
|
|
476
|
-
type:
|
|
477
|
-
|
|
560
|
+
}], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.ActivatedRoute }, { type: i3.MessageService }, { type: i4.SfCrudService }, { type: i5.StepService }, { type: i6.SfPdfsignService }, { type: i7.SfSimuladorService }, { type: i8.NotificationService }, { type: i2.Router }]; }, propDecorators: { color: [{
|
|
561
|
+
type: HostBinding,
|
|
562
|
+
args: ["style.--primary-color"]
|
|
563
|
+
}], color2: [{
|
|
564
|
+
type: HostBinding,
|
|
565
|
+
args: ["style.--secondary-color"]
|
|
566
|
+
}], colorButton: [{
|
|
567
|
+
type: HostBinding,
|
|
568
|
+
args: ["style.--button-color"]
|
|
569
|
+
}], idKatios: [{
|
|
478
570
|
type: Input
|
|
479
571
|
}], trx: [{
|
|
480
572
|
type: Input
|
|
@@ -484,9 +576,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
484
576
|
type: Input
|
|
485
577
|
}], dataExt: [{
|
|
486
578
|
type: Input
|
|
579
|
+
}], ids: [{
|
|
580
|
+
type: Input
|
|
581
|
+
}], environment: [{
|
|
582
|
+
type: Input
|
|
583
|
+
}], buttonsFooterTemplate: [{
|
|
584
|
+
type: Input
|
|
487
585
|
}], sendData: [{
|
|
488
586
|
type: Output
|
|
489
587
|
}], onSubmit: [{
|
|
490
588
|
type: Output
|
|
589
|
+
}], idEntidad: [{
|
|
590
|
+
type: Input
|
|
491
591
|
}] } });
|
|
492
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQWtCLFVBQVUsRUFBTyxVQUFVLEVBQW1CLE1BQU0sdUNBQXVDLENBQUM7QUFDckgsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTdGLE9BQU8sRUFBVyxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHcEYsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFHckMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVEvQixNQUFNLE9BQU8saUJBQWlCO0lBdUI1QixZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxhQUE2QixFQUM3QixhQUE0QixFQUM1QixhQUE0QjtRQUo1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtRQUM3QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQTFCN0IsYUFBUSxH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Q0FBQTtRQUMvRCxJQUFJLElBQUksQ0FBQztRQUNULFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNwQixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQTtnQkFDM0IsTUFBTTtZQUNSLEtBQUssU0FBUztnQkFDWixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUE7Z0JBQ2IsTUFBTTtZQUNSO2dCQUNFLElBQUksR0FBRyxLQUFLLENBQUE7Z0JBQ1osTUFBTTtTQUNUO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDOzsrR0EvYlUsaUJBQWlCO21HQUFqQixpQkFBaUIsaU5BSGpCLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQywwQkNqQm5GLHdqTkE4RkE7NEZEMUVhLGlCQUFpQjtrQkFON0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsV0FBVyxFQUFFLDJCQUEyQjtvQkFDeEMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQztvQkFDakYsZUFBZSxFQUFFLG1CQUFtQjtpQkFDckM7K01BR1UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpZ1JlZ2lzdHJvLCBDcnVkQ29uZmlnLCBLZXksIE9wZXJhdGlvbnMsIFJlcXVlc3RDaGVja2luZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvY3J1ZC1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgR2VuZXJhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvZ2VuZXJhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFJlZ2lzdHJvQ2hpbGRDb21wb25lbnQgfSBmcm9tICcuLi9yZWdpc3Ryby1jaGlsZC9yZWdpc3Ryby1jaGlsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBqc29ucGF0aCBmcm9tICdqc29ucGF0aCc7XHJcbmltcG9ydCB7IERhdGFUZW1wQ3J1ZCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvZGF0YS10ZW1wLWNydWQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZkNydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2YtY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2YtcmVnaXN0cm8nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpc3Ryby5jb21wb25lbnQuaHRtbCcsXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2UsIERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWZdLFxyXG4gIGVudHJ5Q29tcG9uZW50czogW1JlZ2lzdHJvQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVnaXN0cm9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBpZEthdGlvczogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaWRFbnRpZGFkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB0cng6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB1c2VyOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YUV4dDogYW55O1xyXG4gIEBPdXRwdXQoKSBzZW5kRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25TdWJtaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgZGF0YVRlbXA6IERhdGFUZW1wQ3J1ZFtdID0gW107XHJcbiAgcHVibGljIGNydWRDb25maWc6IENydWRDb25maWcgPSBuZXcgQ3J1ZENvbmZpZygpO1xyXG4gIHB1YmxpYyBlblByb2Nlc286IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYnRuU3VibWl0OiBhbnk7XHJcbiAgcHVibGljIGRhdGE6IGFueTtcclxuICBwdWJsaWMgY29uZmlnT3BlcmF0aW9uOiBPcGVyYXRpb25zID0gbmV3IE9wZXJhdGlvbnMoKTtcclxuICBwdWJsaWMgaXNMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbHVlcyE6IGFueVtdW107XHJcbiAgY29udHJvbHMhOiBhbnlbXVtdO1xyXG4gIGNvbnRyb2xzTG9hZGVkID0gZmFsc2U7XHJcbiAgcHVibGljIGRpYWxvZ1JlZj86IER5bmFtaWNEaWFsb2dSZWZcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGdlbmVyYWxTZXJ2aWNlOiBHZW5lcmFsU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzZkNydWRTZXJ2aWNlOiBTZkNydWRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmRhdGFUZW1wID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGFUZW1wKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZENvbmZpZ0NydWQoKTtcclxuICB9XHJcblxyXG4gIGxvYWRDb25maWdDcnVkKCkge1xyXG4gICAgdGhpcy5lblByb2Nlc28gPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZXRDcnVkQnlFbnRpZGFkKHRoaXMuaWRLYXRpb3MsIHRoaXMuaWRFbnRpZGFkKVxyXG4gICAgICAudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0RGF0YVRlbXAocmVzLmVzcXVlbWEsIHRoaXMuZGF0YVRlbXApO1xyXG4gICAgICAgIHRoaXMuY3J1ZENvbmZpZyA9IHJlcztcclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy50cnggPT0gJ2MnKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbiA9IHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5vcGVyYXRpb25zLmZpbmQoeCA9PiB4LnR5cGUuc3RhcnRzV2l0aCh0aGlzLnRyeCkpIHx8IG5ldyBPcGVyYXRpb25zKCk7XHJcbiAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmNyZWF0ZU9iamVjdCh0aGlzLmNydWRDb25maWcuZXNxdWVtYSk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmRhdGEpXHJcbiAgICAgICAgICB0aGlzLnNldExhYmVsU3VtYml0KCk7XHJcbiAgICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5idWlsZENvbnRyb2xzKClcclxuICAgICAgICB9IGVsc2UgdGhpcy5nZXRJbmZvUmVnaXN0cm8odGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgICAgIGJ1aWxkQ29udHJvbHMoKXtcclxuICAgICAgdGhpcy5jb250cm9sc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNvbnRyb2xzID0gW11cclxuICAgICAgdGhpcy52YWx1ZXMgPSBbXVxyXG4gICAgICB0aGlzLmNydWRDb25maWcudWlFc3F1ZW1hLmVsZW1lbnRzLmZvckVhY2goKGxheW91dDogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xzLnB1c2goW10pXHJcbiAgICAgICAgdGhpcy52YWx1ZXMucHVzaChbXSlcclxuICAgICAgICBsYXlvdXQuZWxlbWVudHM/LmZvckVhY2goKGVsZW1lbnQ6IGFueSwgajpudW1iZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMuY29udHJvbHNbaV0ucHVzaCh0aGlzLmdldENvbnRyb2woZWxlbWVudC5zY29wZSkpXHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2xzW2ldW2pdLnNjb3BlID0gZWxlbWVudC5zY29wZVxyXG4gICAgICAgICAgdGhpcy52YWx1ZXNbaV0ucHVzaCh0aGlzLmdldFZhbHVlKGVsZW1lbnQuc2NvcGUpKVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY29udHJvbHNMb2FkZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2V0TGFiZWxTdW1iaXQoKSB7XHJcbiAgICBpZiAodGhpcy50cnggPT0gJ2MnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdHdWFyZGFyJywgaWNvbjogJ3BpIHBpLXNhdmUnIH1cclxuICAgIGVsc2UgaWYgKHRoaXMudHJ4ID09ICdyJykgdGhpcy5idG5TdWJtaXQgPSB1bmRlZmluZWQ7XHJcbiAgICBlbHNlIGlmICh0aGlzLnRyeCA9PSAndScpIHRoaXMuYnRuU3VibWl0ID0geyBsYWJlbDogJ0FjdHVhbGl6YXInLCBpY29uOiAncGkgcGktc3luYycgfVxyXG4gICAgZWxzZSBpZiAodGhpcy50cnggPT0gJ2QnKSB0aGlzLmJ0blN1Ym1pdCA9IHsgbGFiZWw6ICdFbGltaW5hcicsIGljb246ICdwaSBwaS10cmFzaCcgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SW5mb1JlZ2lzdHJvKGNvbmZpZ1JlZ2lzdHJvOiBDb25maWdSZWdpc3Rybykge1xyXG4gICAgbGV0IG9wID0gY29uZmlnUmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlID09ICdyZWFkJyk7XHJcbiAgICBsZXQgZW5kcG9pbnQgPSBvcD8uZW5kcG9pbnQgfHwgJyc7XHJcbiAgICBlbmRwb2ludCA9IGVuZHBvaW50LnJlcGxhY2UoJ0BpZEthdGlvcycsIHRoaXMuaWRLYXRpb3MpO1xyXG4gICAgZW5kcG9pbnQgPSBlbmRwb2ludC5yZXBsYWNlKCdAbmRvY2FjdGl2bycsIHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DKTtcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkJywgdGhpcy5pZCk7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KG9wPy5tZXRob2QgfHwgJycsIG9wPy5zZXJ2ZXIgfHwgJycsIGVuZHBvaW50KVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhKXtcclxuICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzLmRhdGEpKSB0aGlzLmRhdGEgPSByZXMuZGF0YVswXVxyXG4gICAgICAgICAgZWxzZSB0aGlzLmRhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgIHRoaXMudHJ4ID0gJ3UnO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRyeCA9ICdjJztcclxuICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuY3JlYXRlT2JqZWN0KHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5idWlsZENvbnRyb2xzKClcclxuICAgICAgICB0aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY29uZmlnT3BlcmF0aW9uID0gdGhpcy5jcnVkQ29uZmlnLnJlZ2lzdHJvLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZS5zdGFydHNXaXRoKHRoaXMudHJ4KSkgfHwgbmV3IE9wZXJhdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnNldExhYmVsU3VtYml0KCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGJhY2soKSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5idG5CYWNrKTtcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2woc2NvcGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGpzb25wYXRoLnF1ZXJ5KHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBzY29wZSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRWYWx1ZShzY29wZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBzY29wZS5yZXBsYWNlKCcucHJvcGVydGllcycsICcnKSlbMF07XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZSh2YWx1ZTogYW55LCBzY29wZTogc3RyaW5nLCBpOiBudW1iZXIsIGo6IG51bWJlcikge1xyXG4gICAgc3dpdGNoICh0eXBlb2YgKHZhbHVlKSkge1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgdmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0VmFsdWVCeVNjb3BlKHZhbC5zY29wZSwgdmFsLnZhbHVlKVxyXG4gICAgICAgICAganNvbnBhdGgudmFsdWUodGhpcy5kYXRhLCB2YWwuc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCAnJyksIHZhbC52YWx1ZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWx1ZXNbaV1bal0gPSB2YWx1ZTtcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgc2NvcGUucmVwbGFjZSgnLnByb3BlcnRpZXMnLCAnJyksIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy52YWx1ZXNbaV1bal0gPSB2YWx1ZTtcclxuICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywgJycpLCB2YWx1ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGx5VmFsdWVzT25FdmVudCgnb25DaGFuZ2UnLCB0aGlzLmNydWRDb25maWcuZXNxdWVtYSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVPYmplY3QoZXNxdWVtYTogU2hlbWEpIHtcclxuICAgIGNvbnN0IG9iamVjdDogYW55ID0ge307XHJcbiAgICBzd2l0Y2ggKGVzcXVlbWEudHlwZSkge1xyXG4gICAgICBjYXNlICdudW1lcmljJzpcclxuICAgICAgICByZXR1cm4gZXNxdWVtYT8uZGVmYXVsdCB8fCAwO1xyXG4gICAgICBjYXNlICdzdHJpbmcnOlxyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICByZXR1cm4gZXNxdWVtYT8uZGVmYXVsdCA/IHRoaXMuc2V0RGVmYXVsdFZhbHVlKGVzcXVlbWEuZGVmYXVsdCkgOiBudWxsO1xyXG4gICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICByZXR1cm4gZXNxdWVtYT8uZGVmYXVsdCB8fCBmYWxzZTtcclxuICAgICAgY2FzZSAnYXJyYXknOlxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgY2FzZSAnZmlsZSc6XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXNxdWVtYT8ucHJvcGVydGllcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgbGV0IGF1eCA9IGVzcXVlbWE/LnByb3BlcnRpZXNba2V5XVxyXG4gICAgICAgICAgaWYgKGF1eCkgb2JqZWN0W2tleV0gPSB0aGlzLmNyZWF0ZU9iamVjdChhdXgpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1Ym1pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuZGF0YSlcclxuICAgIGlmICghdGhpcy52YWxpZGF0ZURhdGEoKSkgcmV0dXJuO1xyXG4gICAgdGhpcy5hcHBseVZhbHVlc09uRXZlbnQoJ29uU3VibWl0JywgdGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEpXHJcbiAgICB0aGlzLmVuUHJvY2VzbyA9IHRydWU7XHJcbiAgICBsZXQgZW5kcG9pbnQgPSB0aGlzLmNvbmZpZ09wZXJhdGlvbi5lbmRwb2ludDtcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkS2F0aW9zJywgdGhpcy5pZEthdGlvcylcclxuICAgIGVuZHBvaW50ID0gZW5kcG9pbnQucmVwbGFjZSgnQGlkJywgdGhpcy5pZClcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QodGhpcy5jb25maWdPcGVyYXRpb24ubWV0aG9kLCB0aGlzLmNvbmZpZ09wZXJhdGlvbi5zZXJ2ZXIsIGVuZHBvaW50LCB0aGlzLmRhdGEpXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlTWVzc2FnZSh7IHNldmVyaXR5OiAnc3VjY2VzcycsIGRldGFpbDogYFByb2Nlc28gZXhpdG9zbyFgIH0sIHJlcywgdGhpcy5jb25maWdPcGVyYXRpb24uYW5zd2VyQ2hlY2tpbmcpXHJcbiAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ09wZXJhdGlvbj8ucmVkaXJlY3QpIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLmNvbmZpZ09wZXJhdGlvbj8ucmVkaXJlY3RdKVxyXG4gICAgICAgICAgZWxzZSB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy5kYXRhKVxyXG4gICAgICAgIH0sIDIwMDApO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuY3J1ZENvbmZpZy5yZWdpc3Ryby5vcGVyYXRpb25zLmZpbmQob3AgPT4gb3AudHlwZS5zdGFydHNXaXRoKHRoaXMudHJ4KSkhXHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTWVzc2FnZSh7c2V2ZXJpdHk6IFwiZXJyb3JcIiwgZGV0YWlsOiBcIlBvciBmYXZvciBjb211bmljYXJzZSBjb24gZWwgYWRtaW5cIiwgc3VtbWFyeTogXCJFcnJvciBubyBjb250cm9sYWRvXCJ9LCBlcnIuZXJyb3IsIG9wZXJhdGlvbi5lcnJvckNoZWNraW5nKVxyXG4gICAgICAgICAgdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogR2VuZXJhdGVzIG1lc3NhZ2UgdXNpbmcgYW5zd2VyY2hlY2tpbmdcclxuICAgKiBAcGFyYW0gY3VycmVudE1zZyBEZWZhdWx0IG1lc3NhZ2U6IE1lc3NhZ2VcclxuICAgKiBAcGFyYW0gcnRhIFJlc3F1ZXN0J3MgcmVzcG9uc2VcclxuICAgKiBAcGFyYW0gYW5zd2VyQ2hlY2tpbmcgXHJcbiAgICovXHJcbiAgZ2VuZXJhdGVNZXNzYWdlKGN1cnJlbnRNc2c6IE1lc3NhZ2UgfCBhbnksIHJ0YTogYW55LCByZXF1ZXN0Q2hlY2tpbmc/OiBSZXF1ZXN0Q2hlY2tpbmcpe1xyXG4gICAgaWYgKHJlcXVlc3RDaGVja2luZyl7XHJcbiAgICAgICAgaWYgKHJlcXVlc3RDaGVja2luZy5zdGF0aWNzKSBPYmplY3QuYXNzaWduKGN1cnJlbnRNc2csIHJlcXVlc3RDaGVja2luZy5zdGF0aWNzKVxyXG4gICAgICAgIC8vbWFwZWFyIGxvcyBkaW5hbWljb3NcclxuICAgICAgICBpZiAocmVxdWVzdENoZWNraW5nLmR5bmFtaWNzKXtcclxuICAgICAgICAgIGNvbnN0IGR5bmFtaWNzOiBhbnkgPSByZXF1ZXN0Q2hlY2tpbmcuZHluYW1pY3NcclxuICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgaWYgKGR5bmFtaWNzICYmIHR5cGVvZihydGEpID09IFwic3RyaW5nXCIpIHJ0YSA9IEpTT04ucGFyc2UocnRhKVxyXG4gICAgICAgICAgICBpZiAoZHluYW1pY3MpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGR5bmFtaWNzKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50TXNnW3Byb3BlcnR5XSA9IGpzb25wYXRoLnF1ZXJ5KHJ0YSwgZHluYW1pY3NbcHJvcGVydHldKVswXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1jYXRjaChlcnJvcil7Ly9lcyB1bmEgcmVzcHVlc3RhIHNpbiBKU09OXHJcbiAgICAgICAgICAgIGlmIChkeW5hbWljcykgY3VycmVudE1zZy5kZXRhaWwgPSBydGFcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RDaGVja2luZz8ucmVkaXJlY3QgfHwgcmVxdWVzdENoZWNraW5nPy5zd2FsKSBTd2FsLmZpcmUoY3VycmVudE1zZy5zdW1tYXJ5LCBjdXJyZW50TXNnLmRldGFpbCwgY3VycmVudE1zZy5zZXZlcml0eSkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMuaXNDb25maXJtZWQgJiYgcmVxdWVzdENoZWNraW5nLnJlZGlyZWN0KSB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlcXVlc3RDaGVja2luZy5yZWRpcmVjdFxyXG4gICAgfSlcclxuICAgIGVsc2UgdGhpcy5tZXNzYWdlU2VyaWNlLmFkZChjdXJyZW50TXNnKVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnT3BlcmF0aW9uLnZhbGlkYXRpb25zLnR5cGUgPT0gJ2xvY2FsJykgcmV0dXJuIHRoaXMudmFsaWRhdGVEYXRhTG9jYWwoKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVEYXRhTG9jYWwoKSB7XHJcbiAgICBsZXQgZXJyOiBzdHJpbmdbXSA9IFtdXHJcbiAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbi52YWxpZGF0aW9ucz8ucmVxdWlyZWQ/LmZvckVhY2goeCA9PiB7XHJcbiAgICAgIGlmICghanNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCB4LmZpZWxkKVswXSkgZXJyLnB1c2goeC5tZXNzYWdlKTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmNvbmZpZ09wZXJhdGlvbi52YWxpZGF0aW9ucz8ub3BlcmF0aW9ucz8uZm9yRWFjaCgob3A6IGFueSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKG9wLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3N1bUFycmF5JzpcclxuICAgICAgICAgIGxldCB2YXIxID0ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBvcC5zY29wZVswXSkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICs9IGN1cltvcC5rZXldLCAwKTtcclxuICAgICAgICAgIGxldCB2YXIyID0ganNvbnBhdGgucXVlcnkodGhpcy5kYXRhLCBvcC5zY29wZVsxXSkucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICs9IGN1cltvcC5rZXldLCAwKTtcclxuICAgICAgICAgIGlmICh2YXIxICE9IHZhcjIpIGVyci5wdXNoKG9wLm1lc3NhZ2UpXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoZXJyLmxlbmd0aCAhPSAwKSB0aGlzLm1lc3NhZ2VTZXJpY2UuYWRkKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiBlcnIuam9pbignLiAnKSB9KVxyXG4gICAgcmV0dXJuIGVyci5sZW5ndGggPT0gMDtcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICBpZiAodmFsdWUua2V5ICYmIHRoaXMuY29uZmlnT3BlcmF0aW9uLmtleXMpe1xyXG4gICAgICBkYXRhID0gdGhpcy5nZXRWYWx1ZUtleSh0aGlzLmNvbmZpZ09wZXJhdGlvbi5rZXlzLmZpbmQoayA9PiBrLmtleSA9PSB2YWx1ZS5rZXkpISlcclxuICAgICAgdmFsdWUgPSBkYXRhXHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgIGNhc2UgJ0B1YWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gYCR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLlRET0N9LSR7dGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0N9YFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdAdGRvY2FjdGl2byc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0BuZG9jYWN0aXZvJzpcclxuICAgICAgICBkYXRhID0gdGhpcy51c2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0NcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQGhveSc6XHJcbiAgICAgICAgZGF0YSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IHZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGFcclxuICB9XHJcblxyXG4gICBnZXRWYWx1ZUtleShrZXk6IEtleSk6IGFueSB7XHJcbiAgICBsZXQgZGF0YTtcclxuICAgIHN3aXRjaCAoa2V5LmRhdGEgfHwgJ2V4dGVybmEnKSB7XHJcbiAgICAgIGNhc2UgXCJ1c2VyXCI6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMudXNlclxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRhdGFFeHRcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChkYXRhKXtcclxuICAgICAgY29uc3QgYXV4ID0ganNvbnBhdGgucXVlcnkoZGF0YSwga2V5LnNjb3BlKVxyXG4gICAgICBpZiAoYXV4Lmxlbmd0aCA9PSAwKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgIGlmIChhdXgubGVuZ3RoID09IDEpIHJldHVybiBhdXhbMF1cclxuICAgICAgZWxzZSByZXR1cm4gYXV4XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG5cclxuICBzZW5kTm90aWZpY2F0aW9uKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcclxuICAgIHRoaXMubWVzc2FnZVNlcmljZS5hZGQobWVzc2FnZSlcclxuICB9XHJcblxyXG4gIGFkZE9iamVjdEFycmF5KGVsZW1lbnQ6IGFueSkge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihSZWdpc3Ryb0NoaWxkQ29tcG9uZW50LCB7XHJcbiAgICAgIGhlYWRlcjogZWxlbWVudC5sYWJlbCA/IGVsZW1lbnQubGFiZWwgOiAnRGV0YWxsZScsXHJcbiAgICAgIHdpZHRoOiAnNzAlJyxcclxuICAgICAgbW9kYWw6IHRydWUsXHJcbiAgICAgIGNsb3NhYmxlOiB0cnVlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdWlFc3F1ZW1hOiB7IC4uLmVsZW1lbnQuZWxlbWVudHMgfSxcclxuICAgICAgICBlc3F1ZW1hOiB0aGlzLmdldENvbnRyb2woZWxlbWVudC5zY29wZSksXHJcbiAgICAgICAgaWQ6IHRoaXMuZ2V0VmFsdWUoZWxlbWVudC5zY29wZSkubGVuZ3RoICsgMVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgdGhpcy5kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZGF0YSkgdGhpcy5kYXRhW2VsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJyldLnB1c2goZGF0YSk7XHJcbiAgICAgIHRoaXMuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvbkNoYW5nZScsIHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGVkaXRSb3coZWxlbWVudDogYW55LCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oUmVnaXN0cm9DaGlsZENvbXBvbmVudCwge1xyXG4gICAgICBoZWFkZXI6IGVsZW1lbnQubGFiZWwgPyBlbGVtZW50LmxhYmVsIDogJ0RldGFsbGUnLFxyXG4gICAgICB3aWR0aDogJzcwJScsXHJcbiAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICBjbG9zYWJsZTogdHJ1ZSxcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHVpRXNxdWVtYTogeyAuLi5lbGVtZW50LmVsZW1lbnRzIH0sXHJcbiAgICAgICAgZXNxdWVtYTogdGhpcy5nZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpLFxyXG4gICAgICAgIGRhdGE6IHsgLi4uZGF0YSB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5vbkNsb3NlLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChkYXRhKSB0aGlzLmRhdGFbZWxlbWVudC5zY29wZS5yZXBsYWNlKCckLi5wcm9wZXJ0aWVzLicsICcnKV1baW5kZXhdID0gZGF0YTtcclxuICAgICAgdGhpcy5hcHBseVZhbHVlc09uRXZlbnQoJ29uQ2hhbmdlJywgdGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEsIGVsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJykpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZGVsZXRlUm93KGVsZW1lbnQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5kYXRhW2VsZW1lbnQuc2NvcGUucmVwbGFjZSgnJC4ucHJvcGVydGllcy4nLCAnJyldLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICBpbmRleCA9IDE7XHJcbiAgICB0aGlzLmRhdGFbZWxlbWVudC5zY29wZS5yZXBsYWNlKCckLi5wcm9wZXJ0aWVzLicsICcnKV0uZm9yRWFjaCgoZWw6IGFueSkgPT4ge1xyXG4gICAgICBlbC5pZCA9IGluZGV4O1xyXG4gICAgICBpbmRleCsrO1xyXG4gICAgfSlcclxuICAgIHRoaXMuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvbkNoYW5nZScsIHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBlbGVtZW50LnNjb3BlLnJlcGxhY2UoJyQuLnByb3BlcnRpZXMuJywgJycpKVxyXG4gIH1cclxuXHJcbiAgYXBwbHlWYWx1ZXNPbkV2ZW50KGV2ZW50OiBzdHJpbmcsIGVzcXVlbWE6IFNoZW1hLCBrZXk/OiBzdHJpbmcpIHtcclxuICAgIGlmIChrZXkpIHtcclxuICAgICAgaWYgKGVzcXVlbWEucHJvcGVydGllc1trZXldW2V2ZW50XSkge1xyXG4gICAgICAgIGVzcXVlbWEucHJvcGVydGllc1trZXldW2V2ZW50XS5mb3JFYWNoKCh2YWx1ZTogeyBzY29wZTogc3RyaW5nW10sIG9wOiBzdHJpbmcsIGtleT86IHN0cmluZyB9KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNldFZhbHVlRXZlbnQodGhpcy5kYXRhLCB2YWx1ZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXNxdWVtYS5wcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgaWYgKGVzcXVlbWEucHJvcGVydGllc1trZXldW2V2ZW50XSkge1xyXG4gICAgICAgICAgZXNxdWVtYS5wcm9wZXJ0aWVzW2tleV1bZXZlbnRdLmZvckVhY2goKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUV2ZW50KHRoaXMuZGF0YSwgdmFsdWUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFZhbHVlRXZlbnQoZGF0YTogYW55LCBwYXJhbXM6IHsgc2NvcGU6IHN0cmluZ1tdLCBvcDogc3RyaW5nLCBrZXk/OiBhbnksIHNlcGFyYXRvcj86IHN0cmluZyB9KSB7XHJcbiAgICBsZXQgZGF0ZSA9IG1vbWVudChuZXcgRGF0ZSgpKTtcclxuICAgIHN3aXRjaCAocGFyYW1zLm9wKSB7XHJcbiAgICAgIGNhc2UgJ3N1bSc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUoZGF0YSwgcGFyYW1zLnNjb3BlWzFdLCBqc29ucGF0aC5xdWVyeShkYXRhLCBwYXJhbXMuc2NvcGVbMF0pLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArPSBwYXJhbXM/LmtleSA/IGN1cltwYXJhbXMua2V5XSA6IGN1ciwgMCkpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2NvbmNhdCc6XHJcbiAgICAgICAgbGV0IGFycmF5OiBzdHJpbmdbXSA9IFtdXHJcbiAgICAgICAgcGFyYW1zPy5rZXk/LnJlZHVjZSgoYWNjOiBhbnlbXSwgY3VyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGFycmF5LnB1c2goanNvbnBhdGgucXVlcnkoZGF0YSwgY3VyKVswXSlcclxuICAgICAgICB9LCBbXSlcclxuICAgICAgICBpZiAocGFyYW1zPy5zZXBhcmF0b3IpIGpzb25wYXRoLnZhbHVlKGRhdGEsIHBhcmFtcy5zY29wZVswXSwgYXJyYXkuam9pbihwYXJhbXM/LnNlcGFyYXRvciB8fCAnICcpKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdlbmFibGUnOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuY3J1ZENvbmZpZy5lc3F1ZW1hLCBwYXJhbXMuc2NvcGVbMF0sIGZhbHNlKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkaXNhYmxlZCc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUodGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEsIHBhcmFtcy5zY29wZVswXSwgdHJ1ZSlcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVwbGFjZTplbmRwb2ludCc6XHJcbiAgICAgICAganNvbnBhdGgudmFsdWUodGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEsIHBhcmFtcy5zY29wZVswXSwgdGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEuY29uZmlnLmVuZHBvaW50dGVtcC5yZXBsYWNlKHBhcmFtcy5zY29wZVsxXSwganNvbnBhdGgucXVlcnkoZGF0YSwgYCQuLiR7cGFyYW1zLmtleX1gKSkpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3NldE51bGwnOlxyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgYCQuJHtwYXJhbXMua2V5fWAsIG51bGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOnllYXJzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBkYXRlLmRpZmYobW9tZW50KGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGF0YSwgcGFyYW1zLnNjb3BlWzFdKVswXSksICd5ZWFycycpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZGF0ZWRpZmY6bW9udGhzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBkYXRlLmRpZmYobW9tZW50KGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGF0YSwgcGFyYW1zLnNjb3BlWzFdKVswXSksICdtb250aHMnKSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RhdGVkaWZmOndlZWtzJzpcclxuICAgICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgcGFyYW1zLnNjb3BlWzBdLCBkYXRlLmRpZmYobW9tZW50KGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGF0YSwgcGFyYW1zLnNjb3BlWzFdKVswXSksICd3ZWVrcycpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZGF0ZWRpZmY6ZGF5cyc6XHJcbiAgICAgICAgICBqc29ucGF0aC52YWx1ZSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVswXSwgZGF0ZS5kaWZmKG1vbWVudChqc29ucGF0aC5xdWVyeSh0aGlzLmRhdGEsIHBhcmFtcy5zY29wZVsxXSlbMF0pLCAnZGF5cycpKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXREYXRhVGVtcChlc3F1ZW1hOiBTaGVtYSwgZGF0YVRlbXA6IGFueVtdKSB7XHJcbiAgICBkYXRhVGVtcC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICBqc29ucGF0aC52YWx1ZShlc3F1ZW1hLCBkYXRhLnNjb3BlLCBkYXRhLnZhbHVlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhcHBseVZhbHVlc0Zyb21PYmplY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50Lm9wdGlvblZhbHVlKXtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudC5vcHRpb25WYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvblZhbCA9IGV2ZW50Lm9wdGlvblZhbHVlW2ldO1xyXG4gICAgICAgIGNvbnN0IG5ld1ZhbCA9IGV2ZW50LmRhdGEgPyB0aGlzLmFwbHlGb3JtYXRWYWx1ZShvcHRpb25WYWwuc2NvcGUsIGV2ZW50LmRhdGFbb3B0aW9uVmFsLmtleV0pOiBudWxsO1xyXG4gICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuZGF0YSwgb3B0aW9uVmFsLnNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywnJyksIHRoaXMuYXBseUZvcm1hdFZhbHVlKG9wdGlvblZhbC5zY29wZSwgZXZlbnQuZGF0YVtvcHRpb25WYWwua2V5XSkpXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZUJ5U2NvcGUob3B0aW9uVmFsLnNjb3BlLCBuZXdWYWwpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIFxyXG4gIHNldFZhbHVlQnlTY29wZShzY29wZTogc3RyaW5nLCBuZXdWYWw6IGFueSl7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udHJvbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgcm93ID0gdGhpcy5jb250cm9sc1tpXTtcclxuICAgICAgcm93LmZvckVhY2goKGVsLCBqKSA9PiB7XHJcbiAgICAgICAgaWYgKGVsLnNjb3BlICYmIGVsLnNjb3BlLnJlcGxhY2UoJy5wcm9wZXJ0aWVzJywnJyk9PSBzY29wZS5yZXBsYWNlKCcucHJvcGVydGllcycsJycpKXtcclxuICAgICAgICAgIHRoaXMudmFsdWVzW2ldW2pdID0gbmV3VmFsXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBseUZvcm1hdFZhbHVlKHNjb3BlOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIGxldCBjb250cm9sID0ganNvbnBhdGgucXVlcnkodGhpcy5jcnVkQ29uZmlnLmVzcXVlbWEsIHNjb3BlKVswXVxyXG4gICAgbGV0IHJlc3A7XHJcbiAgICBzd2l0Y2ggKGNvbnRyb2wudHlwZSkge1xyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICByZXNwID0gbmV3IERhdGUoYCR7dmFsdWV9YClcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbnVtZXJpYyc6XHJcbiAgICAgICAgcmVzcCA9ICt2YWx1ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJlc3AgPSB2YWx1ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BcclxuICB9XHJcbn1cclxuIiwiPHAtYmxvY2tVSSBbYmxvY2tlZF09XCJlblByb2Nlc29cIj5cclxuICAgIDxpIGNsYXNzPVwicGkgcGktY29nIHBpLXNwaW5cIiBzdHlsZT1cImZvbnQtc2l6ZTogNTBweFwiPjwvaT5cclxuPC9wLWJsb2NrVUk+XHJcblxyXG48cC10b2FzdD48L3AtdG9hc3Q+XHJcblxyXG48ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwiIWVuUHJvY2VzbyAmJiBjb250cm9sc0xvYWRlZFwiPlxyXG4gICAgPGg1IGNsYXNzPVwiY2FyZC1oZWFkZXIgbWItMlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgPHNwYW4+e3tjcnVkQ29uZmlnLnJlZ2lzdHJvPy5sYWJlbCB8fCBpZEVudGlkYWR9fSB7e2lkICE9ICcnID8gJy0nICsgaWQgOiAnJ319PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjcnVkQ29uZmlnLnJlZ2lzdHJvPy5jYW5CYWNrXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktYXJyb3ctbGVmdFwiIChjbGljayk9XCJiYWNrKClcIj48L2J1dHRvbj5cclxuICAgIDwvaDU+XHJcbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGNydWRDb25maWcudWlFc3F1ZW1hLmVsZW1lbnRzOyBsZXQgaSA9IGluZGV4XCIgW2NsYXNzXT1cImVsZW1lbnQ/LmNsYXNzXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZWxlbWVudC50eXBlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidMYWJlbCdcIiBbc3R5bGVdPVwiZWxlbWVudD8uc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgIHt7ZWxlbWVudD8ubGFiZWx9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0hvcml6b250YWxMYXlvdXQnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbCBvZiBlbGVtZW50LmVsZW1lbnRzO2xldCBqID0gaW5kZXhcIiBbY2xhc3NdPVwiZWw/LmNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZWwudHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2YtY29udHJvbCAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCIgW2NvbnRyb2xdPVwiY29udHJvbHNbaV1bal1cIiBbbGFiZWxdPVwiZWwubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tpXVtqXVwiIChzZXRWYWx1ZSk9XCJzZXRWYWx1ZSgkZXZlbnQsIGVsLnNjb3BlLCBpLCBqKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZE5vdGlmaWNhdGlvbik9XCJzZW5kTm90aWZpY2F0aW9uKCRldmVudClcIiAoc2VuZE9iamVjdCk9XCJhcHBseVZhbHVlc0Zyb21PYmplY3QoJGV2ZW50KVwiPjwvc2YtY29udHJvbD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1ZlcnRpY2FsTGF5b3V0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZWwgb2YgZWxlbWVudC5lbGVtZW50cztsZXQgaiA9IGluZGV4XCIgW2NsYXNzXT1cImVsPy5jbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImVsLnR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNmLWNvbnRyb2wgKm5nU3dpdGNoQ2FzZT1cIidDb250cm9sJ1wiIFtjb250cm9sXT1cImNvbnRyb2xzW2ldW2pdXCIgW2xhYmVsXT1cImVsLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbaV1bal1cIiAoc2V0VmFsdWUpPVwic2V0VmFsdWUoJGV2ZW50LCBlbC5zY29wZSwgaSwgailcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmROb3RpZmljYXRpb24pPVwic2VuZE5vdGlmaWNhdGlvbigkZXZlbnQpXCIgKHNlbmRPYmplY3QpPVwiYXBwbHlWYWx1ZXNGcm9tT2JqZWN0KCRldmVudClcIj48L3NmLWNvbnRyb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidUYWJsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlIFt2YWx1ZV09XCJnZXRWYWx1ZShlbC5zY29wZSlcIiBbY29sdW1uc109XCJnZXRDb250cm9sKGVsLnNjb3BlKS5jb25maWcuY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXBsdXNcIiAoY2xpY2spPVwiYWRkT2JqZWN0QXJyYXkoZWwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3NcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbC5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyeCA9PSAnYycgfHwgdHJ4ID09ICd1J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW25nU3dpdGNoXT1cImNvbC50eXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jvd0RhdGFbY29sLmNvbF19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5OlVTRCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7cm93RGF0YVtjb2wuY29sXSB8IGN1cnJlbmN5OiAnVVNEJ319PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZTp5eXl5LW1tLWRkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tyb3dEYXRhW2NvbC5jb2xdIHwgZGF0ZTogJ3l5eXktbW0tZGQnfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlOmRkL21tL3l5eXknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3Jvd0RhdGFbY29sLmNvbF0gfCBkYXRlOiAnZGQvTU0veXl5eSd9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwicm93RGF0YVtjb2wuY29sXVwiIGNsYXNzPVwicGkgcGktY2hlY2tcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFyb3dEYXRhW2NvbC5jb2xdXCIgY2xhc3M9XCJwaSBwaS10aW1lc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyeCA9PSAnYycgfHwgdHJ4ID09ICd1J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJlZGl0Um93KGVsLCByb3dEYXRhLCByb3dJbmRleClcIiBpY29uPVwicGkgcGktcGVuY2lsXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWluZm8gbXItMVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhlbCwgcm93SW5kZXgpXCIgaWNvbj1cInBpIHBpLXRyYXNoXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLWRhbmdlclwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0NvbnRyb2wnXCI+XHJcbiAgICAgICAgICAgICAgICA8c2YtY29udHJvbCBbY29udHJvbF09XCJnZXRDb250cm9sKGVsZW1lbnQuc2NvcGUpXCIgW2xhYmVsXT1cImVsZW1lbnQubGFiZWxcIj48L3NmLWNvbnRyb2w+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgbXQtMlwiICpuZ0lmPVwiYnRuU3VibWl0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIFtpY29uXT1cImJ0blN1Ym1pdC5pY29uXCIgW2xhYmVsXT1cImJ0blN1Ym1pdC5sYWJlbFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXQoKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
592
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvcmVnaXN0cm8vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUE0RCxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLHFHQUFxRztBQUNyRyxpRkFBaUY7QUFDakYsT0FBTyxFQUFtQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHcEgsT0FBTyxFQUFZLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsQ0FBQztBQU1yQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLElBQTJCLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVd0RCxNQUFNLE9BQU8saUJBQWlCO0lBbUM1QixZQUNVLGNBQThCLEVBQzlCLFdBQTJCLEVBQzNCLGNBQThCLEVBQy9CLGFBQTRCLEVBQzNCLFdBQXdCLEVBQ3hCLGdCQUFrQyxFQUNsQyxrQkFBc0MsRUFDdEMsbUJBQXdDLEVBQ3hDLE1BQWM7UUFSZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUMvQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtC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QUFDLCtDQ3ZCN0IsZytGQXFEQTs0RkQxQmEsaUJBQWlCO2tCQVA3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixXQUFXLEVBQUUsMkJBQTJCO29CQUN4QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7b0JBQzNCLGVBQWUsRUFBRSxtQkFBbUI7b0JBQ3BDLFNBQVMsRUFBRSxDQUFDLDBCQUEwQixDQUFDO2lCQUN4Qzs0VUFHdUMsS0FBSztzQkFBMUMsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBQ0ksTUFBTTtzQkFBN0MsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBQ0QsV0FBVztzQkFBL0MsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBQzFCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBT00sU0FBUztzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuLy9pbXBvcnQgeyBDb25maWdSZWdpc3RybywgT3BlcmF0aW9uLCBSZXF1ZXN0Q2hlY2tpbmcgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL2NydWQtY29uZmlnLm1vZGVsJztcclxuLy9pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpZ1JlZ2lzdHJvLCBDcnVkQ29uZmlnLCBLZXksIE9wZXJhdGlvbiwgUmVxdWVzdENoZWNraW5nIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9jcnVkLWNvbmZpZy5tb2RlbCc7XHJcbi8vaW1wb3J0IHsgRGlhbG9nU2VydmljZSwgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFNoZW1hIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9zaGVtYS5tb2RlbCc7XHJcbmltcG9ydCAqIGFzIGpzb25wYXRoIGZyb20gJ2pzb25wYXRoJztcclxuaW1wb3J0IHsgTG9hZGluZywgU2ZDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NmLWNydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNmUGRmc2lnblNlcnZpY2UgfSBmcm9tICdzZi1wZGZzaWduJztcclxuaW1wb3J0IHsgU2ZTaW11bGFkb3JTZXJ2aWNlIH0gZnJvbSAnc2Ytc2ltdWxhZG9yJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9Db25kaXRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgU3RlcFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RlcC5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCBTd2FsLCB7IFN3ZWV0QWxlcnRPcHRpb25zIH0gZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NmLXJlZ2lzdHJvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVnaXN0cm8uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcclxuICBlbnRyeUNvbXBvbmVudHM6IFtSZWdpc3Ryb0NvbXBvbmVudF0sXHJcbiAgc3R5bGVVcmxzOiBbJy4vcmVnaXN0cm8uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWdpc3Ryb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3l7XHJcblxyXG4gIEBIb3N0QmluZGluZyhcInN0eWxlLi0tcHJpbWFyeS1jb2xvclwiKSBjb2xvciE6IHN0cmluZztcclxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLXNlY29uZGFyeS1jb2xvclwiKSBjb2xvcjIhOiBzdHJpbmc7XHJcbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1idXR0b24tY29sb3JcIikgY29sb3JCdXR0b24hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaWRLYXRpb3M6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHRyeDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIHVzZXI6IGFueTtcclxuICBASW5wdXQoKSBkYXRhRXh0OiBhbnk7XHJcbiAgQElucHV0KCkgaWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGVudmlyb25tZW50OiBhbnk7XHJcbiAgQElucHV0KCkgYnV0dG9uc0Zvb3RlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAT3V0cHV0KCkgc2VuZERhdGE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHJcbiAgcHVibGljIGJ0blN1Ym1pdDogYW55O1xyXG4gIG5vdGlmaWNhdGlvblN1YnNjcmlwdGlvbjogYW55O1xyXG4gIHN1YnNUb0tpbGxPbkRlc3Ryb3k6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHNldCBpZEVudGlkYWQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5pZEZvcm0gPSB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlkRm9ybSE6IHN0cmluZztcclxuICBwdWJsaWMgaXNMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkaXNwbGF5czogYm9vbGVhbltdPVtdO1xyXG4gIHB1YmxpYyBmaXJzdExvYWQgPSB0cnVlO1xyXG4gIHB1YmxpYyBsb2dvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGRpYWxvZ0VsZW1lbnRzOiB7ZGF0YTogYW55LCB1aUVzcXVlbWE6IGFueSwgZXNxdWVtYTogU2hlbWEsIHNjb3BlOiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9W109W107XHJcbiAgcHJpdmF0ZSBkaWFsb2dPcGVyYXRpb24hOiBcImNcIiB8IFwidVwiO1xyXG4gIHByaXZhdGUgbG9hZGluZyE6TG9hZGluZztcclxuICBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZ2VuZXJhbFNlcnZpY2U6IEdlbmVyYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcclxuICAgIHB1YmxpYyBzZkNydWRTZXJ2aWNlOiBTZkNydWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdGVwU2VydmljZTogU3RlcFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNmUGRmU2lnblNlcnZpY2U6IFNmUGRmc2lnblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNmU2ltdWxhZG9yU2VydmljZTogU2ZTaW11bGFkb3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxyXG4gICkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0ge2luUHJvZ3Jlc3M6IHRydWUsIHRhcmdldDogdW5kZWZpbmVkfTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5pZEthdGlvcyAmJiB0aGlzLmlkRm9ybSAmJiB0aGlzLmVudmlyb25tZW50ICAmJiAoY2hhbmdlc1tcImlkS2F0aW9zXCJdIHx8IGNoYW5nZXNbXCJpZEVudGlkYWRcIl0pKXtcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmlkcyA9IHRoaXMuaWRzXHJcbiAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5pZEthdGlvcyA9IHRoaXMuaWRLYXRpb3NcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmVudmlyb25tZW50ID0gdGhpcy5lbnZpcm9ubWVudFxyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmlkS2F0aW9zID0gdGhpcy5pZEthdGlvc1xyXG4gICAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmVudmlyb25tZW50ID0gdGhpcy5lbnZpcm9ubWVudFxyXG4gICAgICB0aGlzLnNmUGRmU2lnblNlcnZpY2Uuc2V0RW52aXJvbWVudHModGhpcy5lbnZpcm9ubWVudClcclxuICAgICAgdGhpcy5zZlNpbXVsYWRvclNlcnZpY2UuZW52aXJvbm1lbnRzID0gdGhpcy5lbnZpcm9ubWVudFxyXG4gICAgICB0aGlzLnNmU2ltdWxhZG9yU2VydmljZS5pZEthdGlvcyA9IHRoaXMuaWRLYXRpb3NcclxuXHJcbiAgICAgIHRoaXMubG9hZENvbmZpZ0NydWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnN0YW5jZVN1YnNTdGVwU2VydmljZSgpO1xyXG4gICAgdGhpcy5ub3RpZmljYXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZpY2F0aW9uQWRkZWQkKCkuc3Vic2NyaWJlKG5vdGlmaWNhdGlvbiA9PiB7XHJcbiAgICAgICAgaWYobm90aWZpY2F0aW9uPy5yZXF1ZXN0Q2hlY2tpbmc/LnVzZVN3YWwpe1xyXG4gICAgICAgICAgU3dhbC5maXJlKG5vdGlmaWNhdGlvbi5tc2cgYXMgU3dlZXRBbGVydE9wdGlvbnMpLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoKG5vdGlmaWNhdGlvbi5tc2cgYXMgU3dlZXRBbGVydE9wdGlvbnMpLnNob3dDYW5jZWxCdXR0b24gJiYgcmVzLmlzRGlzbWlzc2VkICYmIG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmc/LmNhbmNlbFJlZGlyZWN0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmcuY2FuY2VsUmVkaXJlY3QudG9VcHBlckNhc2UoKSA9PSBcIklOSUNJT1wiKSB0aGlzLnNmQ3J1ZFNlcnZpY2UucmVkaXJlY3RUb0luaWNpbygpXHJcbiAgICAgICAgICAgICAgZWxzZSB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG5vdGlmaWNhdGlvbi5yZXF1ZXN0Q2hlY2tpbmcuY2FuY2VsUmVkaXJlY3RcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuaXNDb25maXJtZWQgJiYgbm90aWZpY2F0aW9uLnJlcXVlc3RDaGVja2luZz8ucmVkaXJlY3QpIHtcclxuICAgICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uLnJlcXVlc3RDaGVja2luZy5yZWRpcmVjdC50b1VwcGVyQ2FzZSgpID09IFwiSU5JQ0lPXCIpIHRoaXMuc2ZDcnVkU2VydmljZS5yZWRpcmVjdFRvSW5pY2lvKClcclxuICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbm90aWZpY2F0aW9uLnJlcXVlc3RDaGVja2luZy5yZWRpcmVjdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChub3RpZmljYXRpb24/Lm1zZyAmJiBub3RpZmljYXRpb24ucmVxdWVzdENoZWNraW5nPy5yZWRpcmVjdCl7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZChub3RpZmljYXRpb24ubXNnKTtcclxuICAgICAgICAgIGlmIChub3RpZmljYXRpb24ucmVxdWVzdENoZWNraW5nLnJlZGlyZWN0LnRvVXBwZXJDYXNlKCkgPT0gXCJJTklDSU9cIikgdGhpcy5zZkNydWRTZXJ2aWNlLnJlZGlyZWN0VG9JbmljaW8oKVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBuZXdVUkwgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VVJMUmVkaXJlY3Qobm90aWZpY2F0aW9uLnJlcXVlc3RDaGVja2luZy5yZWRpcmVjdClcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBuZXdVUkxcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vdGlmaWNhdGlvbj8ubXNnKXtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKG5vdGlmaWNhdGlvbi5tc2cpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25TdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3Vic1RvS2lsbE9uRGVzdHJveS5mb3JFYWNoKHN1YiA9PiBzdWIudW5zdWJzY3JpYmUoKSlcclxuICAgIHRoaXMuc3RlcFNlcnZpY2UucmVzZXQoKVxyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLnJlc2V0KClcclxuICAgIGNvbnNvbGUubG9nKFwiZGVzdHJveVwiKVxyXG4gIH1cclxuXHJcbiAgaW5zdGFuY2VTdWJzU3RlcFNlcnZpY2UoKXtcclxuICAgIHRoaXMuc3Vic1RvS2lsbE9uRGVzdHJveS5wdXNoKHRoaXMuc3RlcFNlcnZpY2UuY3VzdG9tQ2hpbGRyZW5FdmVudHMkLnN1YnNjcmliZSgoZXZlbnQ6IHtuYW1lOiBzdHJpbmcsIGRhdGE6IGFueX0pID0+IHtcclxuICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm47XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgIGNhc2UgXCJPTkNMSUNLRURFRElUQlVUVE9OXCI6XHJcbiAgICAgICAgICAgIHRoaXMub25DbGlja2VkRWRpdEJ1dHRvbihldmVudC5kYXRhLmVsZW1lbnQsIGV2ZW50LmRhdGEuZGF0YSwgZXZlbnQuZGF0YS5pbmRleClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiT05DTElDS0VEREVMRVRFQlVUVE9OXCI6XHJcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlUm93KGV2ZW50LmRhdGEuZWxlbWVudCwgZXZlbnQuZGF0YS5pbmRleClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiT05DTElDS0VEQUREQlVUVE9OXCI6XHJcbiAgICAgICAgICAgIHRoaXMub25DbGlja2VkQWRkQnV0dG9uKGV2ZW50LmRhdGEuZWxlbWVudClcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSlcclxuXHJcbiAgICAgIHRoaXMuc3Vic1RvS2lsbE9uRGVzdHJveS5wdXNoKHRoaXMuc3RlcFNlcnZpY2UucmVxdWVzdEFwcHJvdmFsJC5zdWJzY3JpYmUoKHZhbHVlKSA9PntcclxuICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcclxuICAgICAgICBpZiAodmFsdWU/LmRlc2lyZWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWUuZGVzaXJlZCA8IHZhbHVlLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGVwU2VydmljZS5yZXF1ZXN0QXBwcm92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuaW5kZXggPSB0aGlzLnN0ZXBTZXJ2aWNlLmN1cnJlbnRJbmRleFxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPXRoaXMuc2ZDcnVkU2VydmljZS5nZXRSZWdpc3Rybyh0aGlzLmluZGV4Q3J1ZCkub3BlcmF0aW9ucy5maW5kKG9wID0+IG9wLnR5cGUuc3RhcnRzV2l0aCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KHRoaXMuaW5kZXhDcnVkKSkpIVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVEYXRhKG9wZXJhdGlvbiwgdGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5pbmRleENydWQpLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8odGhpcy5pbmRleENydWQpLmNvbmRpdGlvbnMgfHwgW10pKSB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBlbHNlIGlmKG9wZXJhdGlvbi5tZXRob2QgIT0gbnVsbCkgdGhpcy51cGxvYWRJbmZvU3RlcCh2YWx1ZSlcclxuICAgICAgICAgICAgZWxzZSBpZiAob3BlcmF0aW9uLmFuc3dlckNoZWNraW5nKXsgLy9ubyB0aWVuZSByZXF1ZXN0LCBzb2xvIHVuIG1lbnNhamVcclxuICAgICAgICAgICAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZlZCA9IHRydWVcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5mb3JtTG9hZGluZyA9IHRoaXMubG9hZGluZztcclxuICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZW5lcmF0ZU1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuRGVmYXVsdE1lc3NhZ2UoXCJzdWNjZXNzXCIsIHVuZGVmaW5lZCwgXCJJbmZvcm1hY2nDs24gc3ViaWRhIGNvcnJlY3RhbWVudGVcIiwgb3BlcmF0aW9uLmFuc3dlckNoZWNraW5nKSwge30sIG9wZXJhdGlvbi5hbnN3ZXJDaGVja2luZyksXHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpb24uYW5zd2VyQ2hlY2tpbmdcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5pbmRleCA9IHRoaXMuc3RlcFNlcnZpY2UuY3VycmVudEluZGV4XHJcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AoKVxyXG4gICAgICAgICAgICB9ZWxzZXsvL25vIHRpZW5lIG5hZGEgY29uZmlndXJhZG9cclxuICAgICAgICAgICAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZlZCA9IHRydWVcclxuICAgICAgICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuaW5kZXggPSB0aGlzLnN0ZXBTZXJ2aWNlLmN1cnJlbnRJbmRleFxyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pKVxyXG4gICAgY29uc29sZS5sb2coXCJzdWJzIHN0ZXAgc2VydmljZSB0ZXJtaW5hZGFzXCIpXHJcbiAgfVxyXG5cclxuICB1cGxvYWRJbmZvU3RlcChwb3NpdGlvbjoge2N1cnJlbnQ6IG51bWJlciwgZGVzaXJlZDogbnVtYmVyfSl7XHJcbiAgICB0aGlzLmxvYWRpbmcuaW5Qcm9ncmVzcyA9IHRydWVcclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5mb3JtTG9hZGluZyA9IHRoaXMubG9hZGluZ1xyXG4gICAgdGhpcy5zdWJtaXQocG9zaXRpb24uY3VycmVudCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGxldCB0aWVuZVJlZGlyZWN0ID0gdGhpcy5zZkNydWRTZXJ2aWNlLmN1cnJlbnRPcGVyYXRpb24/LmFuc3dlckNoZWNraW5nICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZkNydWRTZXJ2aWNlLmN1cnJlbnRPcGVyYXRpb24/LmFuc3dlckNoZWNraW5nPy5yZWRpcmVjdCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuaXRlbXMubGVuZ3RoKVxyXG4gICAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIHRoaXMuc3RlcFNlcnZpY2UucmVxdWVzdEFwcHJvdmVkID0gZmFsc2VcclxuICAgICAgICAvL3RoaXMuc3RlcFNlcnZpY2UuZGVzaXJlZEluZGV4ID0gdW5kZWZpbmVkXHJcbiAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmluZGV4ID0gdGhpcy5zdGVwU2VydmljZS5jdXJyZW50SW5kZXhcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICghdGllbmVSZWRpcmVjdCl7XHJcbiAgICAgICAgdGhpcy5hZHZhbmNlKHBvc2l0aW9uLmN1cnJlbnQsIHBvc2l0aW9uLmRlc2lyZWQsIGZhbHNlKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9wKClcclxuICAgIH0pXHJcbiAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZlZCA9IGZhbHNlXHJcblxyXG4gICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZGluZy5pblByb2dyZXNzID0gZmFsc2VcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmZvcm1Mb2FkaW5nID0gdGhpcy5sb2FkaW5nfSlcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tCdG5TdWJtaXQoKSB7XHJcbiAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZhbCA9IHRoaXMuaW5kZXhDcnVkXHJcbiAgfVxyXG5cclxuICBsb2FkQ29uZmlnQ3J1ZCgpIHtcclxuICAgIHRoaXMubG9hZGluZy5pblByb2dyZXNzID0gdHJ1ZVxyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmZvcm1Mb2FkaW5nID0gdGhpcy5sb2FkaW5nO1xyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmRhdGFFeHQgPSB0aGlzLmRhdGFFeHRcclxuICAgIHRoaXMuc2ZDcnVkU2VydmljZS5jcnVkTG9hZGVkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5sb2FkU2Vzc2lvbigpKSB7XHJcbiAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5jcnVkTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2V0Q3J1ZEJ5RW50aWRhZCh0aGlzLmlkS2F0aW9zLCB0aGlzLmlkRm9ybSlcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjcnVkIGNhcmdhZG9cIilcclxuICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UudWlFc3F1ZW1hcyA9IHJlcy51aUVzcXVlbWFzXHJcbiAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmVzcXVlbWFzID0gcmVzLmVzcXVlbWFzXHJcbiAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvcyA9IHJlcy5yZWdpc3Ryb3NcclxuICAgICAgICB0aGlzLmN1c3RvbWl6ZUNvbXBhbnkocmVzLnVpRXNxdWVtYXMpXHJcbiAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvcy5mb3JFYWNoKChfLCBpKSA9PiB0aGlzLnNmQ3J1ZFNlcnZpY2Uuc2V0VHJ4KFwiY1wiLCBpKSlcclxuICAgICAgICB0aGlzLmxvYWREYXRhKClcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNldExhYmVsU3VtYml0KClcclxuICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5kYXRhc2V0LmZvckVhY2goKGRhdGEsIGkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJfaWRHV1ZBRE9cIl0gJiYgZGF0YS5BRE8/LmRhdGFQcm9jZXNvKXtcclxuICAgICAgICAgICAgICBkYXRhLkFETy5kYXRhUHJvY2Vzby5pZFByb2Nlc28gPSB0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiX2lkR1dWQURPXCJdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJfaWRBRE9cIl0gJiYgZGF0YS5BRE8pe1xyXG4gICAgICAgICAgICAgIGRhdGEuQURPLmlkVHJhbnNhY3Rpb24gPSB0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1wiX2lkQURPXCJdXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLnNldERhdGFTZXQoZGF0YSwgaSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB3aWxsRXhlY3V0ZVJlcXVlc3QgPSB0aGlzLmFkdmFuY2UoMCwgdGhpcy5zZkNydWRTZXJ2aWNlLnVpRXNxdWVtYXMubGVuZ3RoIC0gMSwgdHJ1ZSlcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdGVwcyhyZXMudWlFc3F1ZW1hcylcclxuICAgICAgICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmNydWRMb2FkZWQgPSB0cnVlXHJcbiAgICAgICAgICAgIGlmICghd2lsbEV4ZWN1dGVSZXF1ZXN0KXtcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuaW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5mb3JtTG9hZGluZyA9IHRoaXMubG9hZGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pLmNhdGNoKChleCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXgpXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nLmluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuZm9ybUxvYWRpbmcgPSB0aGlzLmxvYWRpbmdcclxuICAgICAgfSlcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGVwIHdpbGwgYWR2YW5jZSB1bnRpbCBlc3F1ZW1hIGlzIG5vdCBjb21wbGV0ZWRcclxuICAgKi9cclxuICBhZHZhbmNlKHN0YXJ0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIGV4ZWN1dGVSZXF1ZXN0OiBib29sZWFuKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImFkdmFuY2UgZGVzZGUgXCIsIHN0YXJ0LCBcIiBoYXN0YSBcIiwgbGltaXQpXHJcbiAgICBsZXQgaSA9IHN0YXJ0XHJcbiAgICBsZXQgb3A7XHJcbiAgICBsZXQgd2lsbEV4ZWN1dGVSZXF1ZXN0ID0gZmFsc2U7XHJcbiAgICBsZXQgcmVnaXN0cm87XHJcbiAgICB3aGlsZSAoaSA8IGxpbWl0KXtcclxuICAgICAgcmVnaXN0cm8gPXRoaXMuc2ZDcnVkU2VydmljZS5nZXRSZWdpc3RybyhpKVxyXG4gICAgICAgb3AgPSByZWdpc3Ryby5vcGVyYXRpb25zLmZpbmQob3AgPT4gb3AudHlwZS5zdGFydHNXaXRoKHRoaXMuc2ZDcnVkU2VydmljZS5nZXRUcngoaSkpKSFcclxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlRGF0YShvcCwgdGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEoaSksIHJlZ2lzdHJvLmNvbmRpdGlvbnMgfHwgW10sIGZhbHNlKSkgYnJlYWs7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuaW5kZXggPSBpXHJcbiAgICB0aGlzLnN0ZXBTZXJ2aWNlLmN1cnJlbnRJbmRleCA9IGlcclxuICAgIHRoaXMuc3RlcFNlcnZpY2UuZGVzaXJlZEluZGV4ID0gaVxyXG4gICAgY29uc29sZS5sb2coXCJhZHZhbmNlXCIsIGkpXHJcbiAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZlZCA9IHRydWVcclxuICAgIHJlZ2lzdHJvID10aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8oaSlcclxuICAgIGxldCBkYXRhQ3VycmVudFN0ZXAgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YShpKVxyXG4gICAgb3AgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8oaSkub3BlcmF0aW9ucy5maW5kKG9wID0+IG9wLnR5cGUuc3RhcnRzV2l0aCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KGkpKSkhXHJcbiAgICBpZiAoZXhlY3V0ZVJlcXVlc3QgJiYgKHRoaXMuYWN0aXZlUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbXCJfaWRHV1ZBRE9cIl0gfHwgdGhpcy5hY3RpdmVSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcIl9pZEFET1wiXSkgLy9WaWVuZSBkZSBBRE9cclxuICAgICAgJiYgZGF0YUN1cnJlbnRTdGVwLkFETyAmJiB0aGlzLnZhbGlkYXRlRGF0YShvcCwgZGF0YUN1cnJlbnRTdGVwLCByZWdpc3Ryby5jb25kaXRpb25zID8/IFtdLCBmYWxzZSkgLy9FbCBzdGVwIGVzdGEgY29tcGxldG9cclxuICAgICkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImFkdmFuY2Ugd2l0aCBhcHByb3ZhbFwiLCBpKVxyXG4gICAgICB0aGlzLnN0ZXBTZXJ2aWNlLnJlcXVlc3RBcHByb3ZhbCA9IGlcclxuICAgICAgd2lsbEV4ZWN1dGVSZXF1ZXN0ID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdpbGxFeGVjdXRlUmVxdWVzdDtcclxuICB9XHJcbiAgbG9hZFNlc3Npb24oKSB7XHJcbiAgICBjb25zdCB3YXNMb2FkZWQgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UubG9hZFNlc3Npb24oKVxyXG4gICAgaWYgKHdhc0xvYWRlZCl7XHJcbiAgICAgIHRoaXMuY3VzdG9taXplQ29tcGFueSh0aGlzLnNmQ3J1ZFNlcnZpY2UudWlFc3F1ZW1hcylcclxuICAgICAgdGhpcy5zdGVwU2VydmljZS5jdXJyZW50SW5kZXggPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuaW5kZXhcclxuICAgICAgdGhpcy5jcmVhdGVTdGVwcyh0aGlzLnNmQ3J1ZFNlcnZpY2UudWlFc3F1ZW1hcylcclxuICAgICAgdGhpcy5sb2FkaW5nLmluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZkNydWRTZXJ2aWNlLmZvcm1Mb2FkaW5nID0gdGhpcy5sb2FkaW5nXHJcbiAgICB9XHJcbiAgICByZXR1cm4gd2FzTG9hZGVkXHJcbiAgfVxyXG5cclxuICBjdXN0b21pemVDb21wYW55KHVpRXNxdWVtYXM6IGFueVtdKSB7XHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYSA9IHVpRXNxdWVtYXMuZmluZCh1aSA9PiB1aS5nZW5lcmFsKT8uZ2VuZXJhbFxyXG4gICAgdGhpcy5sb2dvID0gdGhpcy5zZkNydWRTZXJ2aWNlLmNvbmZpZ0VtcHJlc2E/Lmljb25zPy5jYXJnYTtcclxuICAgIGlmKHRoaXMuc2ZDcnVkU2VydmljZS5jb25maWdFbXByZXNhKXtcclxuICAgICAgaWYgKHRoaXMuc2ZDcnVkU2VydmljZS5jb25maWdFbXByZXNhLmNvbG9ycz8ubWFpbikgdGhpcy5jb2xvciA9IHRoaXMuc2ZDcnVkU2VydmljZS5jb25maWdFbXByZXNhLmNvbG9ycy5tYWluXHJcbiAgICAgIGlmICh0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYS5jb2xvcnM/LnNlY29uZGFyeSkgdGhpcy5jb2xvcjIgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYS5jb2xvcnMuc2Vjb25kYXJ5XHJcbiAgICAgIGlmICh0aGlzLnNmQ3J1ZFNlcnZpY2UuY29uZmlnRW1wcmVzYS5jb2xvcnM/LmJ1dHRvbikgdGhpcy5jb2xvckJ1dHRvbiA9IHRoaXMuc2ZDcnVkU2VydmljZS5jb25maWdFbXByZXNhLmNvbG9ycy5idXR0b25cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5jb2xvckJ1dHRvbikgdGhpcy5jb2xvckJ1dHRvbiA9IFwiYmx1ZVwiO1xyXG4gICAgaWYgKCF0aGlzLmNvbG9yMikgdGhpcy5jb2xvcjIgPSBcImJsdWVcIjtcclxuICAgIGlmICghdGhpcy5jb2xvcikgdGhpcy5jb2xvciA9IFwiYmx1ZVwiO1xyXG4gIH1cclxuXHJcbiAgc2Nyb2xsVG9wKCl7XHJcbiAgICB3aW5kb3cuc2Nyb2xsKHtcclxuICAgICAgdG9wOiAwLFxyXG4gICAgICBsZWZ0OiAwLFxyXG4gICAgICBiZWhhdmlvcjogJ3Ntb290aCdcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU3RlcHModWlFc3F1ZW1hczogYW55W10pe1xyXG4gICAgdGhpcy5pdGVtcyA9IFtdXHJcbiAgICB1aUVzcXVlbWFzLmZvckVhY2goKHVpRXNxLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAodWlFc3Euc3RlcCkgdGhpcy5pdGVtcy5wdXNoKHtsYWJlbDogdWlFc3Euc3RlcCwgcm91dGVyTGluazogaW5kZXgsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwicHJlc2VydmVcIn0pXHJcbiAgICAgIGVsc2UgdGhpcy5pdGVtcy5wdXNoKHtsYWJlbDogYHBhc28gJHtpbmRleH1gLCByb3V0ZXJMaW5rOiBpbmRleH0pXHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8oaW5kZXgpIC8vdmVyIHNpIHRpZW5lIHVuIGNoYW5nZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc3RhbmNpYSB0b2RvcyBsb3MgZXNxdWVtYXMsIHkgcmVhbGl6YSBsb3MgcmVxdWVzdHMgcGFyYSB0cmFlciBsYSBkYXRhIGRlIHRvZG9zIGxvcyBzdGVwLlxyXG4gICAqIEBwYXJhbSBlc3F1ZW1hXHJcbiAgICogQHBhcmFtIHJlZ2lzdHJvXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBsb2FkRGF0YSgpe1xyXG4gICAgdGhpcy5zZkNydWRTZXJ2aWNlLmVzcXVlbWFzLmZvckVhY2goKGVzcXVlbWEsIGkpID0+IHtcclxuICAgICAgY29uc3Qgb3AgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UucmVnaXN0cm9zW2ldLm9wZXJhdGlvbnMuZmluZCh4ID0+IHgudHlwZS5zdGFydHNXaXRoKHRoaXMuc2ZDcnVkU2VydmljZS5nZXRUcngoaSkpKVxyXG4gICAgICB0aGlzLnNmQ3J1ZFNlcnZpY2Uuc2V0RGF0YVNldCh0aGlzLnNmQ3J1ZFNlcnZpY2UuY3JlYXRlT2JqZWN0KGVzcXVlbWEsIG9wKSwgaSlcclxuICAgIH0pXHJcbiAgICBjb25zb2xlLmxvZyhcImxvYWREYXRhXCIpXHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvcy5tYXAoKHJlZ2lzdHJvLCBpKSA9PiB0aGlzLmlkcy5sZW5ndGggPiAwID8gdGhpcy5nZXRJbmZvUmVnaXN0cm8ocmVnaXN0cm8sIGksIHRoaXMuaWRzW2ldKTogUHJvbWlzZS5yZXNvbHZlKCkpKVxyXG4gIH1cclxuXHJcbiAgZ2V0SW5mb1JlZ2lzdHJvKGNvbmZpZ1JlZ2lzdHJvOiBDb25maWdSZWdpc3RybywgaW5kZXg6IG51bWJlciwgaWQ6IGFueSkge1xyXG5cclxuICAgIGNvbnN0IG9wID0gY29uZmlnUmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlID09ICdyZWFkJyk7XHJcbiAgICBpZiAoIW9wKSByZXR1cm47XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VVJMKG9wLCBpbmRleCwgaWQpXHJcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdChvcC5tZXRob2QsIHVybClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdW5kZWZpbmVkXHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YSl7XHJcbiAgICAgICAgICB2YWx1ZSA9ICBBcnJheS5pc0FycmF5KHJlcy5kYXRhKSA/IHJlcy5kYXRhWzBdIDogcmVzLmRhdGFcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmVzKSA/IHJlc1swXTogcmVzXHJcblxyXG4gICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5hcHBseU9iamVjdEtleXModmFsdWUsIG9wLmtleXNFc3F1ZW1hIHx8IFtdLCBjb25maWdSZWdpc3RybylcclxuICAgICAgICBpZiAob3AuY2hhbmdlVHJ4KSBvcC5jaGFuZ2VUcnguZm9yRWFjaCh4ID0+ICB0aGlzLnNmQ3J1ZFNlcnZpY2Uuc2V0VHJ4KHgudHJ4LCB4LmluZGV4KSlcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0SW5mb1JlZ2lzdHJvXCIsIG9wLmNoYW5nZVRyeClcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgIGxldCBlcnJvckNoZWNraW5nO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wLmVycm9yQ2hlY2tpbmcpKSBlcnJvckNoZWNraW5nID0gb3AuZXJyb3JDaGVja2luZ1swXVxyXG4gICAgICAgIGVsc2UgZXJyb3JDaGVja2luZyA9IG9wLmVycm9yQ2hlY2tpbmdcclxuXHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuZXJhdGVNZXNzYWdlKFxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmdlbkRlZmF1bHRNZXNzYWdlKFwiZXJyb3JcIiwgXCJGb3JtdWxhcmlvIG5vIGNhcmdhZG8gY29ycmVjdGFtZW50ZVwiLCBcIlwiLCBlcnJvckNoZWNraW5nKSwgZXJyb3IuZXJyb3IsIGVycm9yQ2hlY2tpbmcpLFxyXG4gICAgICAgICAgZXJyb3JDaGVja2luZ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhyb3cgZXJyb3JcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICBsZXQgZGF0YSA9IG51bGw7XHJcbiAgICBpZiAodmFsdWUua2V5ICYmIHRoaXMuc2ZDcnVkU2VydmljZS5jdXJyZW50T3BlcmF0aW9uPy5rZXlzKXtcclxuICAgICAgZGF0YSA9IHRoaXMuc2ZDcnVkU2VydmljZS5nZXRWYWx1ZUtleSh0aGlzLnNmQ3J1ZFNlcnZpY2UuY3VycmVudE9wZXJhdGlvbi5rZXlzLmZpbmQoayA9PiBrLmtleSA9PSB2YWx1ZS5rZXkpKVxyXG4gICAgICB2YWx1ZSA9IGRhdGFcclxuICAgIH1lbHNle1xyXG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgY2FzZSAnQHVhY3Rpdm8nOlxyXG4gICAgICAgICAgZGF0YSA9IGAke3RoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DfS0ke3RoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DfWBcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0B0ZG9jYWN0aXZvJzpcclxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQ1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnQG5kb2NhY3Rpdm8nOlxyXG4gICAgICAgICAgZGF0YSA9IHRoaXMudXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdAaG95JzpcclxuICAgICAgICAgIGRhdGEgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBkYXRhXHJcbiAgICB9XHJcbiAgICBcclxuICB9XHJcbiAgZ2V0IGluZGV4Q3J1ZCgpe1xyXG4gICAgcmV0dXJuIHRoaXMuc3RlcFNlcnZpY2UuY3VycmVudEluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHJpbWVDaGVja2luZygpe1xyXG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q2hlY2tpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZClcclxuICB9XHJcblxyXG4gIHN1Ym1pdChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvblN1Ym1pdCcsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXRFc3F1ZW1hKGluZGV4KSwgdW5kZWZpbmVkLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YShpbmRleCkpXHJcbiAgICBsZXQgcmVnaXN0cm8gPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8oaW5kZXgpXHJcbiAgICBjb25zb2xlLmxvZyhcInRyeCBhY3R1YWw6IFwiICx0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KHRoaXMuaW5kZXhDcnVkKSlcclxuICAgICAgY29uc3Qgb3BlcmF0aW9uID0gcmVnaXN0cm8ub3BlcmF0aW9ucy5maW5kKG9wID0+IG9wLnR5cGUuc3RhcnRzV2l0aCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0VHJ4KHRoaXMuaW5kZXhDcnVkKSkpIVxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5zZkNydWRTZXJ2aWNlLmdldFVSTChvcGVyYXRpb24sIGluZGV4KVxyXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdChvcGVyYXRpb24ubWV0aG9kLCB1cmwsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKGluZGV4KSlcclxuICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgPT09IG51bGwpIHJlcyA9IHt9XHJcbiAgICAgICAgICByZXMgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UuYXBwbHlPYmplY3RLZXlzKHJlcywgb3BlcmF0aW9uLmtleXNFc3F1ZW1hIHx8IFtdLCByZWdpc3RybylcclxuICAgICAgICAgIHRoaXMuc2ZDcnVkU2VydmljZS5zZXRBbnN3ZXJzKHJlcywgdGhpcy5pbmRleENydWQpXHJcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLmNoYW5nZVRyeCkgb3BlcmF0aW9uLmNoYW5nZVRyeC5mb3JFYWNoKHggPT4gIHRoaXMuc2ZDcnVkU2VydmljZS5zZXRUcngoeC50cngsIHguaW5kZXgpKVxyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuZXJhdGVNZXNzYWdlKFxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuRGVmYXVsdE1lc3NhZ2UoXCJzdWNjZXNzXCIsIHVuZGVmaW5lZCwgXCJJbmZvcm1hY2nDs24gc3ViaWRhIGNvcnJlY3RhbWVudGVcIiwgb3BlcmF0aW9uLmFuc3dlckNoZWNraW5nKSwgcmVzLCBvcGVyYXRpb24uYW5zd2VyQ2hlY2tpbmcpLFxyXG4gICAgICAgICAgICBvcGVyYXRpb24uYW5zd2VyQ2hlY2tpbmdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKFxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZ2VuZXJhdGVNZXNzYWdlKHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5nZW5EZWZhdWx0TWVzc2FnZShcImVycm9yXCIsIFwiRXJyb3Igbm8gY29udHJvbGFkb1wiLCBcIlBvciBmYXZvciBjb211bmljYXJzZSBjb24gZWwgYWRtaW5cIixvcGVyYXRpb24uZXJyb3JDaGVja2luZyksIGVyci5lcnJvciwgb3BlcmF0aW9uLmVycm9yQ2hlY2tpbmcpXHJcbiAgICAgICAgICAgICwgb3BlcmF0aW9uLmVycm9yQ2hlY2tpbmdcclxuICAgICAgICAgIClcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpXHJcbiAgICAgICAgfSlcclxuICAgICAgLy8gcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSlcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VBZGRJdGVtKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNjb3BlID0gKHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhdLnNjb3BlIGFzIGFueSkucmVwbGFjZUFsbCgnLnByb3BlcnRpZXMnLCAnJylcclxuICAgIGNvbnN0IGl0ZW0gPSBfLmNsb25lRGVlcCh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5kYXRhKTtcclxuICAgIGlmIChpbmRleCA9PSAwKSB7XHJcbiAgICAgIGpzb25wYXRoLnF1ZXJ5KHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKHRoaXMuaW5kZXhDcnVkKSwgc2NvcGUpWzBdLnB1c2goaXRlbSlcclxuICAgIH1cclxuICAgIGVsc2UganNvbnBhdGgucXVlcnkodGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleCAtIDFdLmRhdGEsIHNjb3BlKVswXS5wdXNoKGl0ZW0pXHJcbiAgfVxyXG5cclxuICBkZWxldGVSb3coZWxlbWVudDogYW55LCBpbmRleEVsZW1lbnQ6IG51bWJlcikge1xyXG4gICAgY29uc3Qgc2NvcGUgPSBlbGVtZW50LnNjb3BlLnJlcGxhY2VBbGwoJy5wcm9wZXJ0aWVzJywgJycpXHJcbiAgICBsZXQgaW5kZXhEaWFsb2cgPSB0aGlzLmRpYWxvZ0VsZW1lbnRzLmxlbmd0aCAtIDFcclxuXHJcbiAgICBpZiAoaW5kZXhEaWFsb2cgPT0gLTEpIChqc29ucGF0aC5xdWVyeSh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YSh0aGlzLmluZGV4Q3J1ZCksIHNjb3BlKVswXSBhcyBhbnlbXSkuc3BsaWNlKGluZGV4RWxlbWVudCwgMSlcclxuICAgIGVsc2Uge1xyXG4gICAgICBpbmRleERpYWxvZyA9IGluZGV4RGlhbG9nID09IDAgPyAxOiBpbmRleERpYWxvZztcclxuICAgICAgKGpzb25wYXRoLnF1ZXJ5KHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhEaWFsb2cgLSAxXS5kYXRhLCBzY29wZSlbMF0gYXMgYW55W10pLnNwbGljZShpbmRleEVsZW1lbnQsIDEpXHJcbiAgICB9XHJcbiAgICB0aGlzLnNmQ3J1ZFNlcnZpY2UuYXBwbHlWYWx1ZXNPbkV2ZW50KCdvbkNoYW5nZScsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXRFc3F1ZW1hKHRoaXMuaW5kZXhDcnVkKSwgZWxlbWVudC5zY29wZS5yZXBsYWNlKCckLi5wcm9wZXJ0aWVzLicsICcnKSwgdGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5pbmRleENydWQpKVxyXG4gIH1cclxuXHJcbiAgb25DbG9zZUVkaXRSb3coaW5kZXg6IG51bWJlcikge1xyXG4gICAgbGV0IHNjb3BlID0gdW5kZWZpbmVkXHJcbiAgICB0cnl7XHJcbiAgICAgIGNvbnN0IGlBcnJheSA9IHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhdLmluZGV4XHJcbiAgICAgIHNjb3BlID0gKHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhdLnNjb3BlIGFzIGFueSkucmVwbGFjZUFsbCgnLnByb3BlcnRpZXMnLCAnJylcclxuICAgICAgY29uc3QgaXRlbSA9IF8uY2xvbmVEZWVwKHRoaXMuZGlhbG9nRWxlbWVudHNbaW5kZXhdLmRhdGEpO1xyXG4gICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICAgIGpzb25wYXRoLnF1ZXJ5KHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKHRoaXMuaW5kZXhDcnVkKSwgc2NvcGUpWzBdW2lBcnJheV0gPSBpdGVtXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAganNvbnBhdGgucXVlcnkodGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleCAtIDFdLmRhdGEsIHNjb3BlKVswXVtpQXJyYXldID0gaXRlbVxyXG4gICAgICB9XHJcbiAgICB9Y2F0Y2ggKGVycm9yKXtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgY29uc29sZS5sb2codGhpcy5kaWFsb2dFbGVtZW50cylcclxuICAgICAgY29uc29sZS5sb2coaW5kZXgpXHJcbiAgICAgIGNvbnNvbGUubG9nKHNjb3BlKVxyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmluZGV4Q3J1ZClcclxuICAgICAgY29uc29sZS5sb2codGhpcy5zZkNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5pbmRleENydWQpKVxyXG4gICAgICBpZiAoaW5kZXggPT0gMCAmJiBzY29wZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGpzb25wYXRoLnF1ZXJ5KHRoaXMuc2ZDcnVkU2VydmljZS5nZXREYXRhKHRoaXMuaW5kZXhDcnVkKSwgc2NvcGUpKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHNjb3BlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coanNvbnBhdGgucXVlcnkodGhpcy5kaWFsb2dFbGVtZW50c1tpbmRleCAtIDFdLmRhdGEsIHNjb3BlKSlcclxuICAgICAgfVxyXG4gICAgICB0aHJvdyBlcnJvclxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRGF0YShvcGVyYXRpb246IE9wZXJhdGlvbiwgZGF0YTogYW55LCBjb25kaXRpb25zOiBDb25kaXRpb25bXSwgcHJpbnRFcnJvcnM6Ym9vbGVhbj10cnVlKSB7XHJcbiAgICBpZiAob3BlcmF0aW9uPy52YWxpZGF0aW9ucz8udHlwZSA9PSAnbG9jYWwnKSB7XHJcbiAgICAgIGxldCBlcnIgPSB0aGlzLnNmQ3J1ZFNlcnZpY2UudmFsaWRhdGVEYXRhTG9jYWwob3BlcmF0aW9uLCBkYXRhLCBjb25kaXRpb25zKTtcclxuICAgICAgaWYgKGVyci5sZW5ndGggIT0gMCAmJiBwcmludEVycm9ycykgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogZXJyLnNsaWNlKDAsIDUpLmpvaW4oJy4gJyl9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSlcclxuICAgICAgcmV0dXJuIGVyci5sZW5ndGggPT0gMDtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25Db25maXJtKCkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY2xlYXIoJ2MnKTtcclxuICB9XHJcblxyXG4gIG9uUmVqZWN0KCkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNsZWFyKCdjJyk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrZWRFZGl0QnV0dG9uKGVsZW1lbnQ6IGFueSwgZGF0YTogYW55LCBpbmRleDpudW1iZXIpe1xyXG4gICAgdGhpcy5kaWFsb2dPcGVyYXRpb24gPSBcInVcIlxyXG4gICAgY29uc3QgZXNxdWVtYSA9IF8uY2xvbmVEZWVwKHRoaXMuc2ZDcnVkU2VydmljZS5nZXRDb250cm9sKGVsZW1lbnQuc2NvcGUsIHRoaXMuc2ZDcnVkU2VydmljZS5nZXRFc3F1ZW1hKHRoaXMuaW5kZXhDcnVkKSkpO1xyXG4gICAgZXNxdWVtYS50eXBlID0gXCJvYmplY3RcIlxyXG4gICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB7XHJcbiAgICAgIGRhdGE6IF8uY2xvbmVEZWVwKGRhdGEpLFxyXG4gICAgICB1aUVzcXVlbWE6IF8uY2xvbmVEZWVwKGVsZW1lbnQuZWxlbWVudHNbMF0pLFxyXG4gICAgICBlc3F1ZW1hOiBlc3F1ZW1hLFxyXG4gICAgICBzY29wZTogZWxlbWVudC5zY29wZSxcclxuICAgICAgaW5kZXg6IGluZGV4XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpc3BsYXlzLnB1c2godHJ1ZSlcclxuICAgIHRoaXMuZGlhbG9nRWxlbWVudHMucHVzaChjdXJyZW50RWxlbWVudClcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tlZEFkZEJ1dHRvbihlbGVtZW50OiBhbnkpe1xyXG4gICAgdGhpcy5kaWFsb2dPcGVyYXRpb24gPSBcImNcIlxyXG5cclxuICAgIGNvbnN0IGVzcXVlbWEgPSBfLmNsb25lRGVlcCh0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0Q29udHJvbChlbGVtZW50LnNjb3BlLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RXNxdWVtYSh0aGlzLmluZGV4Q3J1ZCkpKTtcclxuICAgIGNvbnN0IG9wID0gdGhpcy5zZkNydWRTZXJ2aWNlLnJlZ2lzdHJvc1t0aGlzLmluZGV4Q3J1ZF0ub3BlcmF0aW9ucy5maW5kKHggPT4geC50eXBlLnN0YXJ0c1dpdGgodGhpcy5zZkNydWRTZXJ2aWNlLmdldFRyeCh0aGlzLmluZGV4Q3J1ZCkpKVxyXG4gICAgZXNxdWVtYS50eXBlID0gXCJvYmplY3RcIlxyXG4gICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB7XHJcbiAgICAgIGRhdGE6IHRoaXMuc2ZDcnVkU2VydmljZS5jcmVhdGVPYmplY3QoZXNxdWVtYSwgb3ApLFxyXG4gICAgICB1aUVzcXVlbWE6IF8uY2xvbmVEZWVwKGVsZW1lbnQuZWxlbWVudHNbMF0pLFxyXG4gICAgICBlc3F1ZW1hOiBlc3F1ZW1hLFxyXG4gICAgICBzY29wZTogZWxlbWVudC5zY29wZSxcclxuICAgICAgaW5kZXg6IDBcclxuICAgIH1cclxuICAgIHRyeXtcclxuICAgICAgY3VycmVudEVsZW1lbnQuZGF0YS5pZCA9IHRoaXMuc2ZDcnVkU2VydmljZS5nZXRWYWx1ZShlbGVtZW50LnNjb3BlLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0RGF0YSh0aGlzLmluZGV4Q3J1ZCkpLmxlbmd0aCArIDFcclxuICAgIH1jYXRjaChlcnJvcil7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgYWdyZWdhbmRvIHVuIGlkXCIpXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICB9XHJcbiAgICB0aGlzLmRpc3BsYXlzLnB1c2godHJ1ZSlcclxuICAgIHRoaXMuZGlhbG9nRWxlbWVudHMucHVzaChjdXJyZW50RWxlbWVudClcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VEaWFsb2coaW5kZXg6IG51bWJlcil7XHJcbiAgICBsZXQgdmFsaWRhdGVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5lc3F1ZW1hLnZhbGlkYXRpb25zKXtcclxuICAgICAgY29uc3Qgb3AgPSBuZXcgT3BlcmF0aW9uKClcclxuICAgICAgb3AudmFsaWRhdGlvbnMgPSB0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5lc3F1ZW1hLnZhbGlkYXRpb25zXHJcbiAgICAgIHZhbGlkYXRlZCA9IHRoaXMudmFsaWRhdGVEYXRhKG9wLCB0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5kYXRhLCB0aGlzLnNmQ3J1ZFNlcnZpY2UuZ2V0UmVnaXN0cm8odGhpcy5pbmRleENydWQpLmNvbmRpdGlvbnMgfHwgW10pXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmRpYWxvZ0VsZW1lbnRzW2luZGV4XS5lc3F1ZW1hKVxyXG4gICAgaWYgKHZhbGlkYXRlZCl7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5kaWFsb2dPcGVyYXRpb24pIHtcclxuICAgICAgICBjYXNlIFwiY1wiOlxyXG4gICAgICAgICAgdGhpcy5vbkNsb3NlQWRkSXRlbShpbmRleClcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJ1XCI6XHJcbiAgICAgICAgICB0aGlzLm9uQ2xvc2VFZGl0Um93KGluZGV4KVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZW1vdmVEaWFsb2dJdGVtKClcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICByZW1vdmVEaWFsb2dJdGVtKCl7XHJcbiAgICB0aGlzLmRpYWxvZ0VsZW1lbnRzLnBvcCgpXHJcbiAgICB0aGlzLmRpc3BsYXlzLnBvcCgpXHJcbiAgfVxyXG5cclxuICBzZXRMYWJlbFN1bWJpdCgpIHtcclxuICAgIGxldCB4OiBhbnkgPSB7XCJjXCI6IHsgbGFiZWw6ICdHdWFyZGFyJywgaWNvbjogJ3BpIHBpLXNhdmUnIH0sXHJcbiAgICAgIFwidVwiOiB7IGxhYmVsOiAnQWN0dWFsaXphcicsIGljb246ICdwaSBwaS1zeW5jJyB9LFxyXG4gICAgICBcImRcIjogeyBsYWJlbDogJ0VsaW1pbmFyJywgaWNvbjogJ3BpIHBpLXRyYXNoJyB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idG5TdWJtaXQgPSB4W3RoaXMuc2ZDcnVkU2VydmljZS5nZXRUcngoMCldXHJcbiAgfVxyXG5cclxuICBiYWNrKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLnNmQ3J1ZFNlcnZpY2UucmVnaXN0cm9zWzBdLmJ0bkJhY2spO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgPCEtLVRPRE8gY29udmVydGlyIGVuIHRlbXBsYXRlIHkgZWRpdGFybGEgZW4gLS0+XHJcbiAgICA8aDUgKm5nSWY9XCJzZkNydWRTZXJ2aWNlLnJlZ2lzdHJvcy5sZW5ndGggPT0gMVwiIGNsYXNzPVwiY2FyZC1oZWFkZXIgbWItMlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgPHNwYW4+e3tzZkNydWRTZXJ2aWNlLnJlZ2lzdHJvc1swXT8ubGFiZWwgfHwgaWRGb3JtLnJlcGxhY2VBbGwoJ18nLCAnICcpfX0ge3tpZHMubGVuZ3RoID4gMCA/ICctJyArIGlkc1swXSA6ICcnfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNmQ3J1ZFNlcnZpY2UucmVnaXN0cm9zWzBdPy5jYW5CYWNrXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktYXJyb3ctbGVmdFwiIChjbGljayk9XCJiYWNrKClcIj48L2J1dHRvbj5cclxuICAgIDwvaDU+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbXMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgIDxhcHAtc3RlcCBbaXRlbXNdPVwiaXRlbXNcIj48L2FwcC1zdGVwPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbXMubGVuZ3RoID09IDFcIj5cclxuICAgICAgICA8YXBwLWZvcm0gW2RhdGFdPVwic2ZDcnVkU2VydmljZS5kYXRhc2V0WzBdXCIgW2VzcXVlbWFdPVwic2ZDcnVkU2VydmljZS5lc3F1ZW1hc1swXVwiXHJcbiAgICAgICAgW3VpRXNxdWVtYV09XCJzZkNydWRTZXJ2aWNlLnVpRXNxdWVtYXNbMF1cIiBbaXNEaWFsb2ddPVwiZmFsc2VcIj48L2FwcC1mb3JtPlxyXG5cclxuICAgICAgICA8IS0tcmVuZGVyaXphciB1biBjb2RpZ28gcGVyc29uYWxpemFkbyBkZXNkZSBlbCBjb21wb25lbnRlIHBhZHJlIG8gcmVuZGVyaXphciBlbCBxdWUgc2UgdGllbmUgcG9yIGRlZmVjdG8tLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc0Zvb3RlclRlbXBsYXRlIHx8IGRlZmF1bHRCdXR0b25zRm9vdGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRCdXR0b25zRm9vdGVyVGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBtdC0yXCIgKm5nSWY9XCJidG5TdWJtaXRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBbaWNvbl09XCJidG5TdWJtaXQuaWNvblwiIFtsYWJlbF09XCJidG5TdWJtaXQubGFiZWxcIiAoY2xpY2spPVwib25DbGlja0J0blN1Ym1pdCgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkaWFsb2dFbGVtZW50czsgbGV0ICRpbmRleD1pbmRleFwiPlxyXG4gICAgPHAtZGlhbG9nIFsodmlzaWJsZSldPVwiZGlzcGxheXNbJGluZGV4XVwiIFttb2RhbF09XCJ0cnVlXCIgW2hlYWRlcl09XCInRGV0YWxsZSdcIiBbY2xvc2FibGVdPVwiZmFsc2VcIj5cclxuICAgICAgICA8IS0tIFRPRE8gaGVhZGVyID0gY3VycmVudEVsZW1lbnQuZWxlbWVudC5sYWJlbCA/IGN1cnJlbnRFbGVtZW50LmVsZW1lbnQubGFiZWw6IC0tPlxyXG4gICAgICAgIDxhcHAtZm9ybSBbZGF0YV09XCJpdGVtLmRhdGFcIiBbZXNxdWVtYV09XCJpdGVtLmVzcXVlbWFcIiBbdWlFc3F1ZW1hXT1cIml0ZW0udWlFc3F1ZW1hXCIgW2lzRGlhbG9nXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbaWRdPVwiaWRzW2luZGV4Q3J1ZF1cIj48L2FwcC1mb3JtPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uIGljb249XCJwaSBwaS10aW1lc1wiIChvbkNsaWNrKT1cInJlbW92ZURpYWxvZ0l0ZW0oKVwiIGxhYmVsPVwiQ2FuY2VsYXJcIiA+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgPHAtYnV0dG9uIGljb249XCJwaSBwaS1jaGVja1wiIFtkaXNhYmxlZF09XCJpdGVtLmVzcXVlbWEuZGlzYWJsZWQgPT09IHRydWVcIiAob25DbGljayk9XCJvbkNsb3NlRGlhbG9nKCRpbmRleClcIiBsYWJlbD1cIk9rXCIgcEF1dG9Gb2N1c1xyXG4gICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJ0cnVlXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLWRpYWxvZz5cclxuPC9zcGFuPlxyXG5cclxuPHAtdG9hc3QgKm5nSWY9XCJkaWFsb2dFbGVtZW50cy5sZW5ndGggPT0gMFwiPlxyXG4gICAgPG5nLXRlbXBsYXRlIGxldC1tZXNzYWdlIHBUZW1wbGF0ZT1cIm1lc3NhZ2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRvYXN0XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGlcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAncGktY2hlY2stY2lyY2xlJzogbWVzc2FnZS5zZXZlcml0eSA9PT0gJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICAgICAgICAgJ3BpLWluZm8tY2lyY2xlJzogbWVzc2FnZS5zZXZlcml0eSA9PT0gJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgJ3BpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJzogbWVzc2FnZS5zZXZlcml0eSA9PT0gJ3dhcm4nLFxyXG4gICAgICAgICAgICAgICAgJ3BpLXRpbWVzLWNpcmNsZSc6IG1lc3NhZ2Uuc2V2ZXJpdHkgPT09ICdlcnJvcidcclxuICAgICAgICAgICAgfVwiPjwvaT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10b2FzdC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS10b2FzdC1kZXRhaWxcIj57e21lc3NhZ2UuZGV0YWlsfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9wLXRvYXN0PlxyXG5cclxuXHJcbiJdfQ==
|