@openziti/ziti-console-lib 0.3.0 → 0.4.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/README.md +68 -11
- package/assets/banners/ZAC.jpg +0 -0
- package/assets/html/index.htm +21 -3
- package/assets/images/Icon_Minus.png +0 -0
- package/assets/languages/en-us.json +3 -1
- package/assets/styles/global.scss +17 -0
- package/assets/styles/tables.css +28 -3
- package/assets/styles/ziti.css +29 -2
- package/assets/svgs/v8visualizer.svg +60 -0
- package/esm2022/lib/features/creation-summary-dialog/creation-summary-dialog.component.mjs +1 -1
- package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +31 -0
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +260 -0
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.mjs +177 -0
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +8 -5
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +10 -6
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +23 -1
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +3 -3
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +1 -1
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +37 -3
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +3 -3
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +1508 -0
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.helper.mjs +578 -0
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.mjs +695 -0
- package/esm2022/lib/features/visualizer/visualizer-service.class.mjs +33 -0
- package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +6 -1
- package/esm2022/lib/models/edge-router-policy.mjs +10 -0
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +132 -0
- package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +418 -0
- package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +3 -3
- package/esm2022/lib/pages/identities/identities-page.service.mjs +2 -2
- package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +7 -6
- package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +3 -3
- package/esm2022/lib/pages/services/services-page.service.mjs +3 -3
- package/esm2022/lib/services/node-data.service.mjs +56 -29
- package/esm2022/lib/shared/list-page-service.class.mjs +12 -5
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/lib/ziti-console-lib.module.mjs +23 -5
- package/esm2022/public-api.mjs +8 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +4098 -246
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/multi-action-button/multi-action-button.component.d.ts +13 -0
- package/lib/features/multi-action-button/multi-action-button.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +56 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts +32 -0
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts +3 -2
- package/lib/features/projectable-forms/form-field-container/form-field-container.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/form-header/form-header.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/projectable-form.class.d.ts +6 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +3 -0
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts +129 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.component.d.ts.map +1 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts +131 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.helper.d.ts.map +1 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts +31 -0
- package/lib/features/visualizer/network-visualizer/network-visualizer.treenodeprocessor.d.ts.map +1 -0
- package/lib/features/visualizer/visualizer-service.class.d.ts +10 -0
- package/lib/features/visualizer/visualizer-service.class.d.ts.map +1 -0
- package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -1
- package/lib/models/edge-router-policy.d.ts +7 -0
- package/lib/models/edge-router-policy.d.ts.map +1 -0
- package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts +35 -0
- package/lib/pages/edge-router-policies/edge-router-policies-page.component.d.ts.map +1 -0
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +63 -0
- package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -0
- package/lib/services/node-data.service.d.ts +1 -0
- package/lib/services/node-data.service.d.ts.map +1 -1
- package/lib/shared/list-page-service.class.d.ts.map +1 -1
- package/lib/ziti-console-lib.module.d.ts +33 -29
- package/lib/ziti-console-lib.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +7 -0
- package/public-api.d.ts.map +1 -1
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class Identity {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.rootNode = 'No';
|
|
6
|
+
this.children = [];
|
|
7
|
+
this.contextMenu = 'Yes';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class Service {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.rootNode = 'No';
|
|
13
|
+
this.children = [];
|
|
14
|
+
this.contextMenu = 'Yes';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class Group {
|
|
18
|
+
constructor(idv, s, g) {
|
|
19
|
+
this.id = idv;
|
|
20
|
+
this.name = s;
|
|
21
|
+
this.group = g;
|
|
22
|
+
this.type = 'Group';
|
|
23
|
+
this.children = [];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class ServicePolicy {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.rootNode = 'No';
|
|
29
|
+
this.children = [];
|
|
30
|
+
this.contextMenu = 'Yes';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class Attribute {
|
|
34
|
+
constructor() {
|
|
35
|
+
this.children = [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class ERPolicy {
|
|
39
|
+
constructor() {
|
|
40
|
+
this.rootNode = 'No';
|
|
41
|
+
this.children = [];
|
|
42
|
+
this.contextMenu = 'Yes';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export class ServiceERPolicy {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.rootNode = 'No';
|
|
48
|
+
this.children = [];
|
|
49
|
+
this.contextMenu = 'Yes';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class ERouter {
|
|
53
|
+
constructor() {
|
|
54
|
+
this.rootNode = 'No';
|
|
55
|
+
this.children = [];
|
|
56
|
+
this.contextMenu = 'Yes';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class Children {
|
|
60
|
+
constructor() {
|
|
61
|
+
this.type = 'Children';
|
|
62
|
+
this.children = [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
class NetworkVisualizerHelper {
|
|
66
|
+
getResourceTreeObj(networkName, networkStatus, services, endpoints, appwans, edgerouters, edgeRouterPolicies, serviceEdgeRouterPolicies,
|
|
67
|
+
// networkProductVersion,
|
|
68
|
+
uniqId, logger) {
|
|
69
|
+
function createId() {
|
|
70
|
+
++uniqId;
|
|
71
|
+
return uniqId;
|
|
72
|
+
}
|
|
73
|
+
class RootJson {
|
|
74
|
+
constructor() {
|
|
75
|
+
this.id = createId();
|
|
76
|
+
this.lastId = 0;
|
|
77
|
+
this.children = [];
|
|
78
|
+
this.contextMenu = 'Yes';
|
|
79
|
+
this.type = 'Network';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const rootJson = new RootJson();
|
|
83
|
+
rootJson.name = 'Network';
|
|
84
|
+
rootJson.status = 'Provisioned';
|
|
85
|
+
function processIdentitiesForTree(identitiesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
|
|
86
|
+
identitiesChildren.name = identitiesChildren.name + ' (' + ny + ')';
|
|
87
|
+
const unregisteredGrp = new Group(createId(), 'Identities[Unregistered]', 'Identities that are not registered');
|
|
88
|
+
const abcdGrp = new Group(createId(), 'Identities [A-D]', 'Identity name starts with A to D');
|
|
89
|
+
const efghGrp = new Group(createId(), 'Identities [E-H]', 'Identity name starts with E to H');
|
|
90
|
+
const ijklGrp = new Group(createId(), 'Identities [I-L]', 'Identity name starts with I to L');
|
|
91
|
+
const mnopGrp = new Group(createId(), 'Identities [M-P]', 'Identity name starts with M to P');
|
|
92
|
+
const qrstGrp = new Group(createId(), 'Identities [Q-T]', 'Identity name starts with Q to T');
|
|
93
|
+
const uvwxGrp = new Group(createId(), 'Identities [U-X]', 'Identity name starts with U to X');
|
|
94
|
+
const yzGrp = new Group(createId(), 'Identities [Y-Z]', 'Identity name starts with Y and Z');
|
|
95
|
+
const oneTo9Grp = new Group(createId(), 'Identities [1-9]', 'Identity name starts with 0 to 9');
|
|
96
|
+
const specialCharGrp = new Group(createId(), 'Identities [others]', 'Identity name starts with special characters');
|
|
97
|
+
for (let j = nx; j < ny; j++) {
|
|
98
|
+
const endpoint = new Identity();
|
|
99
|
+
endpoint.rootNode = 'Yes';
|
|
100
|
+
endpoint.id = createId();
|
|
101
|
+
endpoint.uuid = endpoints[j].id;
|
|
102
|
+
endpoint.name = endpoints[j].name;
|
|
103
|
+
endpoint.online = endpoints[j].hasApiSession === true ? 'Yes' : 'No';
|
|
104
|
+
endpoint.type = 'Identity';
|
|
105
|
+
endpoint.status = endpoints[j].osRelease !== null ? 'Registered' : 'Not Registered';
|
|
106
|
+
if (endpoints[j].osRelease === null && endpoints[j].type && endpoints[j].type.includes('browzer')) {
|
|
107
|
+
endpoint.status = 'Registered';
|
|
108
|
+
// endpoint.type = 'Browzer Endpoint';
|
|
109
|
+
}
|
|
110
|
+
endpoint.os = endpoints[j].os;
|
|
111
|
+
const cha = endpoint.name.charAt(0).toLowerCase();
|
|
112
|
+
if (endpoint.status === 'Not Registered') {
|
|
113
|
+
unregisteredGrp.children.push(endpoint);
|
|
114
|
+
}
|
|
115
|
+
else if (cha === 'a' || cha === 'b' || cha === 'c' || cha === 'd') {
|
|
116
|
+
abcdGrp.children.push(endpoint);
|
|
117
|
+
}
|
|
118
|
+
else if (cha === 'e' || cha === 'f' || cha === 'g' || cha === 'h') {
|
|
119
|
+
efghGrp.children.push(endpoint);
|
|
120
|
+
}
|
|
121
|
+
else if (cha === 'i' || cha === 'j' || cha === 'k' || cha === 'l') {
|
|
122
|
+
ijklGrp.children.push(endpoint);
|
|
123
|
+
}
|
|
124
|
+
else if (cha === 'm' || cha === 'n' || cha === 'o' || cha === 'p') {
|
|
125
|
+
mnopGrp.children.push(endpoint);
|
|
126
|
+
}
|
|
127
|
+
else if (cha === 'q' || cha === 'r' || cha === 's' || cha === 't') {
|
|
128
|
+
qrstGrp.children.push(endpoint);
|
|
129
|
+
}
|
|
130
|
+
else if (cha === 'u' || cha === 'v' || cha === 'w' || cha === 'x') {
|
|
131
|
+
uvwxGrp.children.push(endpoint);
|
|
132
|
+
}
|
|
133
|
+
else if (cha === 'y' || cha === 'z') {
|
|
134
|
+
yzGrp.children.push(endpoint);
|
|
135
|
+
}
|
|
136
|
+
else if (cha === '0' ||
|
|
137
|
+
cha === '1' ||
|
|
138
|
+
cha === '2' ||
|
|
139
|
+
cha === '3' ||
|
|
140
|
+
cha === '4' ||
|
|
141
|
+
cha === '5' ||
|
|
142
|
+
cha === '6' ||
|
|
143
|
+
cha === '7' ||
|
|
144
|
+
cha === '8' ||
|
|
145
|
+
cha === '9') {
|
|
146
|
+
oneTo9Grp.children.push(endpoint);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
specialCharGrp.children.push(endpoint);
|
|
150
|
+
}
|
|
151
|
+
} // end of main for loop
|
|
152
|
+
if (unregisteredGrp.children.length > 0) {
|
|
153
|
+
unregisteredGrp.children.sort(function (a, b) {
|
|
154
|
+
return a.name.localeCompare(b.name);
|
|
155
|
+
});
|
|
156
|
+
unregisteredGrp.name = unregisteredGrp.name + '(' + unregisteredGrp.children.length + ')';
|
|
157
|
+
identitiesChildren.children.push(unregisteredGrp);
|
|
158
|
+
}
|
|
159
|
+
if (abcdGrp.children.length > 0) {
|
|
160
|
+
abcdGrp.children.sort(function (a, b) {
|
|
161
|
+
return a.name.localeCompare(b.name);
|
|
162
|
+
});
|
|
163
|
+
abcdGrp.name = abcdGrp.name + ' (' + abcdGrp.children.length + ')';
|
|
164
|
+
identitiesChildren.children.push(abcdGrp);
|
|
165
|
+
}
|
|
166
|
+
if (efghGrp.children.length > 0) {
|
|
167
|
+
efghGrp.children.sort(function (a, b) {
|
|
168
|
+
return a.name.localeCompare(b.name);
|
|
169
|
+
});
|
|
170
|
+
efghGrp.name = efghGrp.name + ' (' + efghGrp.children.length + ')';
|
|
171
|
+
identitiesChildren.children.push(efghGrp);
|
|
172
|
+
}
|
|
173
|
+
if (ijklGrp.children.length > 0) {
|
|
174
|
+
ijklGrp.children.sort(function (a, b) {
|
|
175
|
+
return a.name.localeCompare(b.name);
|
|
176
|
+
});
|
|
177
|
+
ijklGrp.name = ijklGrp.name + ' (' + ijklGrp.children.length + ')';
|
|
178
|
+
identitiesChildren.children.push(ijklGrp);
|
|
179
|
+
}
|
|
180
|
+
if (mnopGrp.children.length > 0) {
|
|
181
|
+
mnopGrp.children.sort(function (a, b) {
|
|
182
|
+
return a.name.localeCompare(b.name);
|
|
183
|
+
});
|
|
184
|
+
mnopGrp.name = mnopGrp.name + ' (' + mnopGrp.children.length + ')';
|
|
185
|
+
identitiesChildren.children.push(mnopGrp);
|
|
186
|
+
}
|
|
187
|
+
if (qrstGrp.children.length > 0) {
|
|
188
|
+
qrstGrp.children.sort(function (a, b) {
|
|
189
|
+
return a.name.localeCompare(b.name);
|
|
190
|
+
});
|
|
191
|
+
qrstGrp.name = qrstGrp.name + ' (' + qrstGrp.children.length + ')';
|
|
192
|
+
identitiesChildren.children.push(qrstGrp);
|
|
193
|
+
}
|
|
194
|
+
if (uvwxGrp.children.length > 0) {
|
|
195
|
+
uvwxGrp.children.sort(function (a, b) {
|
|
196
|
+
return a.name.localeCompare(b.name);
|
|
197
|
+
});
|
|
198
|
+
uvwxGrp.name = uvwxGrp.name + ' (' + uvwxGrp.children.length + ')';
|
|
199
|
+
identitiesChildren.children.push(uvwxGrp);
|
|
200
|
+
}
|
|
201
|
+
if (yzGrp.children.length > 0) {
|
|
202
|
+
yzGrp.children.sort(function (a, b) {
|
|
203
|
+
return a.name.localeCompare(b.name);
|
|
204
|
+
});
|
|
205
|
+
yzGrp.name = yzGrp.name + ' (' + yzGrp.children.length + ')';
|
|
206
|
+
identitiesChildren.children.push(yzGrp);
|
|
207
|
+
}
|
|
208
|
+
if (specialCharGrp.children.length > 0) {
|
|
209
|
+
specialCharGrp.name = specialCharGrp.name + ' (' + specialCharGrp.children.length + ')';
|
|
210
|
+
identitiesChildren.children.push(specialCharGrp);
|
|
211
|
+
}
|
|
212
|
+
if (oneTo9Grp.children.length > 0 && oneTo9Grp.children.length <= 100) {
|
|
213
|
+
oneTo9Grp.children.sort(function (a, b) {
|
|
214
|
+
return a.name.localeCompare(b.name);
|
|
215
|
+
});
|
|
216
|
+
oneTo9Grp.name = oneTo9Grp.name + ' (' + oneTo9Grp.children.length + ')';
|
|
217
|
+
identitiesChildren.children.push(oneTo9Grp);
|
|
218
|
+
}
|
|
219
|
+
else if (oneTo9Grp.children.length > 100) {
|
|
220
|
+
oneTo9Grp.children.sort(function (a, b) {
|
|
221
|
+
return a.name.localeCompare(b.name);
|
|
222
|
+
});
|
|
223
|
+
for (let i = 0; i < oneTo9Grp.children.length; i++) {
|
|
224
|
+
const lastElement = i + 80 < oneTo9Grp.children.length ? i + 80 : oneTo9Grp.children.length - 1;
|
|
225
|
+
const nameS = 'Identities [' +
|
|
226
|
+
oneTo9Grp.children[i].name.substring(0, 4) +
|
|
227
|
+
'-' +
|
|
228
|
+
oneTo9Grp.children[lastElement].name.substring(0, 4) +
|
|
229
|
+
']';
|
|
230
|
+
const chld = new Group(createId(), nameS, 'Identity name starts with ' +
|
|
231
|
+
oneTo9Grp.children[i].name.substring(0, 4) +
|
|
232
|
+
' To ' +
|
|
233
|
+
oneTo9Grp.children[lastElement].name.substring(0, 4));
|
|
234
|
+
for (let j = i; j < lastElement; j++) {
|
|
235
|
+
chld.children.push(oneTo9Grp.children[j]);
|
|
236
|
+
}
|
|
237
|
+
chld.name = chld.name + ' (' + chld.children.length + ')';
|
|
238
|
+
identitiesChildren.children.push(chld);
|
|
239
|
+
i = i + 80;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return identitiesChildren;
|
|
243
|
+
}
|
|
244
|
+
function processServicePoliciesForTree(servicePolicyChildren, edgerouters, identities, servicePolicies, services, edgeRouterPolicies, nx, ny) {
|
|
245
|
+
const bindGrp = new Group(createId(), 'BindPolicies', 'Bind Service Policy');
|
|
246
|
+
const dialGrp = new Group(createId(), 'DialPolicies', 'Dial Service Policy');
|
|
247
|
+
servicePolicies.forEach((sp) => {
|
|
248
|
+
const spolicy = new ServicePolicy();
|
|
249
|
+
spolicy.id = createId();
|
|
250
|
+
spolicy.uuid = sp.id;
|
|
251
|
+
spolicy.name = sp.name;
|
|
252
|
+
spolicy.type = 'ServicePolicy';
|
|
253
|
+
spolicy.rootNode = 'Yes';
|
|
254
|
+
if (sp.type === 'Bind') {
|
|
255
|
+
bindGrp.children.push(spolicy);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
dialGrp.children.push(spolicy);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
bindGrp.name = bindGrp.name + '(' + bindGrp.children.length + ')';
|
|
262
|
+
servicePolicyChildren.children.push(bindGrp);
|
|
263
|
+
dialGrp.name = dialGrp.name + '(' + dialGrp.children.length + ')';
|
|
264
|
+
servicePolicyChildren.children.push(dialGrp);
|
|
265
|
+
servicePolicyChildren.name = servicePolicyChildren.name + ' (' + (bindGrp.children.length + dialGrp.children.length) + ')';
|
|
266
|
+
return servicePolicyChildren;
|
|
267
|
+
}
|
|
268
|
+
function serviceGrouping(servicesChildren, servicestree) {
|
|
269
|
+
const protocolRDPGrp = new Group(createId(), 'Services [protocol-RDP]', 'Services created for RDP protocol');
|
|
270
|
+
const protocolHTTPSGrp = new Group(createId(), 'Services [protocol-HTTPS]', 'Service created for HTTPS protocol');
|
|
271
|
+
const protocolHTTPGrp = new Group(createId(), 'Services [protocol-HTTP]', 'Service created for HTTP protocol');
|
|
272
|
+
const protocolFTPGrp = new Group(createId(), 'Services [protocol-FTP]', 'Service created for FTP protocol');
|
|
273
|
+
const abcdGrp = new Group(createId(), 'Services [A-D]', 'Service name starts with A to D');
|
|
274
|
+
const efghGrp = new Group(createId(), 'Services [E-H]', 'Service name starts with E to H');
|
|
275
|
+
const ijklGrp = new Group(createId(), 'Services [I-L]', 'Service name starts with I to L');
|
|
276
|
+
const mnopGrp = new Group(createId(), 'Services [M-P]', 'Service name starts with M to P');
|
|
277
|
+
const qrstGrp = new Group(createId(), 'Services [Q-T]', 'Service name starts with Q to T');
|
|
278
|
+
const uvwxGrp = new Group(createId(), 'Services [U-X]', 'Service name starts with U to X');
|
|
279
|
+
const yzGrp = new Group(createId(), 'Services [Y-Z]', 'Service name starts with Y and Z');
|
|
280
|
+
const oneTo9Grp = new Group(createId(), 'Services [1-9]', 'Service name starts with 0 to 9');
|
|
281
|
+
const specialCharGrp = new Group(createId(), 'Services [others]', 'Service name starts with special characters');
|
|
282
|
+
for (let i = 0; i < servicestree.length; i++) {
|
|
283
|
+
const serviceobj = servicestree[i];
|
|
284
|
+
const cha = serviceobj.name.charAt(0).toLowerCase();
|
|
285
|
+
if (serviceobj.protocol === 'rdp') {
|
|
286
|
+
protocolRDPGrp.children.push(serviceobj);
|
|
287
|
+
}
|
|
288
|
+
else if (serviceobj.protocol === 'https') {
|
|
289
|
+
protocolHTTPSGrp.children.push(serviceobj);
|
|
290
|
+
}
|
|
291
|
+
else if (serviceobj.protocol === 'http') {
|
|
292
|
+
protocolHTTPGrp.children.push(serviceobj);
|
|
293
|
+
}
|
|
294
|
+
else if (serviceobj.protocol === 'ftp') {
|
|
295
|
+
protocolFTPGrp.children.push(serviceobj);
|
|
296
|
+
}
|
|
297
|
+
else if (cha === 'a' || cha === 'b' || cha === 'c' || cha === 'd') {
|
|
298
|
+
abcdGrp.children.push(serviceobj);
|
|
299
|
+
}
|
|
300
|
+
else if (cha === 'e' || cha === 'f' || cha === 'g' || cha === 'h') {
|
|
301
|
+
efghGrp.children.push(serviceobj);
|
|
302
|
+
}
|
|
303
|
+
else if (cha === 'i' || cha === 'j' || cha === 'k' || cha === 'l') {
|
|
304
|
+
ijklGrp.children.push(serviceobj);
|
|
305
|
+
}
|
|
306
|
+
else if (cha === 'm' || cha === 'n' || cha === 'o' || cha === 'p') {
|
|
307
|
+
mnopGrp.children.push(serviceobj);
|
|
308
|
+
}
|
|
309
|
+
else if (cha === 'q' || cha === 'r' || cha === 's' || cha === 't') {
|
|
310
|
+
qrstGrp.children.push(serviceobj);
|
|
311
|
+
}
|
|
312
|
+
else if (cha === 'u' || cha === 'v' || cha === 'w' || cha === 'x') {
|
|
313
|
+
uvwxGrp.children.push(serviceobj);
|
|
314
|
+
}
|
|
315
|
+
else if (cha === 'y' || cha === 'z') {
|
|
316
|
+
yzGrp.children.push(serviceobj);
|
|
317
|
+
}
|
|
318
|
+
else if (cha === '0' ||
|
|
319
|
+
cha === '1' ||
|
|
320
|
+
cha === '2' ||
|
|
321
|
+
cha === '3' ||
|
|
322
|
+
cha === '4' ||
|
|
323
|
+
cha === '5' ||
|
|
324
|
+
cha === '6' ||
|
|
325
|
+
cha === '7' ||
|
|
326
|
+
cha === '8' ||
|
|
327
|
+
cha === '9') {
|
|
328
|
+
oneTo9Grp.children.push(serviceobj);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
specialCharGrp.children.push(serviceobj);
|
|
332
|
+
}
|
|
333
|
+
} // end main for loop
|
|
334
|
+
if (protocolRDPGrp.children.length > 0) {
|
|
335
|
+
protocolRDPGrp.children.sort(function (a, b) {
|
|
336
|
+
return a.name.localeCompare(b.name);
|
|
337
|
+
});
|
|
338
|
+
protocolRDPGrp.name = protocolRDPGrp.name + '(' + protocolRDPGrp.children.length + ')';
|
|
339
|
+
servicesChildren.children.push(protocolRDPGrp);
|
|
340
|
+
}
|
|
341
|
+
if (specialCharGrp.children.length > 0) {
|
|
342
|
+
specialCharGrp.name = specialCharGrp.name + '(' + specialCharGrp.children.length + ')';
|
|
343
|
+
servicesChildren.children.push(specialCharGrp);
|
|
344
|
+
}
|
|
345
|
+
if (protocolHTTPSGrp.children.length > 0) {
|
|
346
|
+
protocolHTTPSGrp.children.sort(function (a, b) {
|
|
347
|
+
return a.name.localeCompare(b.name);
|
|
348
|
+
});
|
|
349
|
+
protocolHTTPSGrp.name = protocolHTTPSGrp.name + '(' + protocolHTTPSGrp.children.length + ')';
|
|
350
|
+
servicesChildren.children.push(protocolHTTPSGrp);
|
|
351
|
+
}
|
|
352
|
+
if (protocolHTTPGrp.children.length > 0) {
|
|
353
|
+
protocolHTTPGrp.children.sort(function (a, b) {
|
|
354
|
+
return a.name.localeCompare(b.name);
|
|
355
|
+
});
|
|
356
|
+
protocolHTTPGrp.name = protocolHTTPGrp.name + '(' + protocolHTTPGrp.children.length + ')';
|
|
357
|
+
servicesChildren.children.push(protocolHTTPGrp);
|
|
358
|
+
}
|
|
359
|
+
if (protocolFTPGrp.children.length > 0) {
|
|
360
|
+
protocolFTPGrp.children.sort(function (a, b) {
|
|
361
|
+
return a.name.localeCompare(b.name);
|
|
362
|
+
});
|
|
363
|
+
protocolFTPGrp.name = protocolFTPGrp.name + '(' + protocolFTPGrp.children.length + ')';
|
|
364
|
+
servicesChildren.children.push(protocolFTPGrp);
|
|
365
|
+
}
|
|
366
|
+
if (abcdGrp.children.length > 0) {
|
|
367
|
+
abcdGrp.children.sort(function (a, b) {
|
|
368
|
+
return a.name.localeCompare(b.name);
|
|
369
|
+
});
|
|
370
|
+
abcdGrp.name = abcdGrp.name + '(' + abcdGrp.children.length + ')';
|
|
371
|
+
servicesChildren.children.push(abcdGrp);
|
|
372
|
+
}
|
|
373
|
+
if (efghGrp.children.length > 0) {
|
|
374
|
+
efghGrp.children.sort(function (a, b) {
|
|
375
|
+
return a.name.localeCompare(b.name);
|
|
376
|
+
});
|
|
377
|
+
efghGrp.name = efghGrp.name + '(' + efghGrp.children.length + ')';
|
|
378
|
+
servicesChildren.children.push(efghGrp);
|
|
379
|
+
}
|
|
380
|
+
if (ijklGrp.children.length > 0) {
|
|
381
|
+
ijklGrp.children.sort(function (a, b) {
|
|
382
|
+
return a.name.localeCompare(b.name);
|
|
383
|
+
});
|
|
384
|
+
ijklGrp.name = ijklGrp.name + '(' + ijklGrp.children.length + ')';
|
|
385
|
+
servicesChildren.children.push(ijklGrp);
|
|
386
|
+
}
|
|
387
|
+
if (mnopGrp.children.length > 0) {
|
|
388
|
+
mnopGrp.children.sort(function (a, b) {
|
|
389
|
+
return a.name.localeCompare(b.name);
|
|
390
|
+
});
|
|
391
|
+
mnopGrp.name = mnopGrp.name + '(' + mnopGrp.children.length + ')';
|
|
392
|
+
servicesChildren.children.push(mnopGrp);
|
|
393
|
+
}
|
|
394
|
+
if (qrstGrp.children.length > 0) {
|
|
395
|
+
qrstGrp.children.sort(function (a, b) {
|
|
396
|
+
return a.name.localeCompare(b.name);
|
|
397
|
+
});
|
|
398
|
+
qrstGrp.name = qrstGrp.name + '(' + qrstGrp.children.length + ')';
|
|
399
|
+
servicesChildren.children.push(qrstGrp);
|
|
400
|
+
}
|
|
401
|
+
if (uvwxGrp.children.length > 0) {
|
|
402
|
+
uvwxGrp.children.sort(function (a, b) {
|
|
403
|
+
return a.name.localeCompare(b.name);
|
|
404
|
+
});
|
|
405
|
+
uvwxGrp.name = uvwxGrp.name + '(' + uvwxGrp.children.length + ')';
|
|
406
|
+
servicesChildren.children.push(uvwxGrp);
|
|
407
|
+
}
|
|
408
|
+
if (yzGrp.children.length > 0) {
|
|
409
|
+
yzGrp.children.sort(function (a, b) {
|
|
410
|
+
return a.name.localeCompare(b.name);
|
|
411
|
+
});
|
|
412
|
+
yzGrp.name = yzGrp.name + '(' + yzGrp.children.length + ')';
|
|
413
|
+
servicesChildren.children.push(yzGrp);
|
|
414
|
+
}
|
|
415
|
+
if (oneTo9Grp.children.length > 0) {
|
|
416
|
+
oneTo9Grp.children.sort(function (a, b) {
|
|
417
|
+
return a.name.localeCompare(b.name);
|
|
418
|
+
});
|
|
419
|
+
oneTo9Grp.name = oneTo9Grp.name + '(' + oneTo9Grp.children.length + ')';
|
|
420
|
+
servicesChildren.children.push(oneTo9Grp);
|
|
421
|
+
}
|
|
422
|
+
servicesChildren.name = servicesChildren.name + '(' + servicestree.length + ')';
|
|
423
|
+
return servicesChildren;
|
|
424
|
+
}
|
|
425
|
+
function processServicesForTree(servicesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
|
|
426
|
+
const servicestree = [];
|
|
427
|
+
for (let i = nx; i < ny; i++) {
|
|
428
|
+
const serviceobj = new Service();
|
|
429
|
+
serviceobj.id = createId();
|
|
430
|
+
serviceobj.name = services[i].name;
|
|
431
|
+
serviceobj.uuid = services[i].id;
|
|
432
|
+
serviceobj.type = 'Service';
|
|
433
|
+
serviceobj.rootNode = 'Yes';
|
|
434
|
+
const attributeswithName = [];
|
|
435
|
+
attributeswithName.push('@' + services[i].name);
|
|
436
|
+
services[i] && services[i].roleAttributes && services[i].roleAttributes.find((srattr) => {
|
|
437
|
+
attributeswithName.push(srattr);
|
|
438
|
+
});
|
|
439
|
+
let isItRDPProtocolAttr = false;
|
|
440
|
+
let isItHTTPProtocolAttr = false;
|
|
441
|
+
let isItHTTPSProtocolAttr = false;
|
|
442
|
+
let isItFTPProtocolAttr = false;
|
|
443
|
+
for (let k = 0; k < attributeswithName.length; k++) {
|
|
444
|
+
const attrOb = new Attribute();
|
|
445
|
+
attrOb.id = createId();
|
|
446
|
+
attrOb.name = attributeswithName[k];
|
|
447
|
+
attrOb.type = 'Service Attribute';
|
|
448
|
+
const attName = attributeswithName[k].toLowerCase();
|
|
449
|
+
if (isItRDPProtocolAttr === false && attName.includes('rdp')) {
|
|
450
|
+
serviceobj.protocol = 'rdp';
|
|
451
|
+
isItRDPProtocolAttr = true;
|
|
452
|
+
}
|
|
453
|
+
if (isItHTTPSProtocolAttr === false && attName.includes('https')) {
|
|
454
|
+
serviceobj.protocol = 'https';
|
|
455
|
+
isItHTTPSProtocolAttr = true;
|
|
456
|
+
}
|
|
457
|
+
if (isItHTTPSProtocolAttr === false && isItHTTPProtocolAttr === false && attName.includes('http')) {
|
|
458
|
+
serviceobj.protocol = 'http';
|
|
459
|
+
isItHTTPProtocolAttr = true;
|
|
460
|
+
}
|
|
461
|
+
if (isItFTPProtocolAttr === false && attName.includes('ftp')) {
|
|
462
|
+
serviceobj.protocol = 'ftp';
|
|
463
|
+
isItFTPProtocolAttr = true;
|
|
464
|
+
}
|
|
465
|
+
} // end inner for loop
|
|
466
|
+
servicestree.push(serviceobj);
|
|
467
|
+
} // end for loop
|
|
468
|
+
return serviceGrouping(servicesChildren, servicestree);
|
|
469
|
+
} // end of processServicesForTree
|
|
470
|
+
function processEdgeRouterPoliciesForTree(edgeRouterPoliciesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
|
|
471
|
+
for (let i = nx; i < ny; i++) {
|
|
472
|
+
const erpolicy = new ERPolicy();
|
|
473
|
+
erpolicy.id = createId();
|
|
474
|
+
erpolicy.uuid = edgeRouterPolicies[i].id;
|
|
475
|
+
erpolicy.name = edgeRouterPolicies[i].name;
|
|
476
|
+
erpolicy.type = 'Router Policy';
|
|
477
|
+
erpolicy.rootNode = 'Yes';
|
|
478
|
+
edgeRouterPoliciesChildren.children.push(erpolicy);
|
|
479
|
+
} // end of main for loop
|
|
480
|
+
return edgeRouterPoliciesChildren;
|
|
481
|
+
} // end
|
|
482
|
+
function processServiceEdgeRouterPoliciesForTree(serviceEdgeRouterPoliciesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, serviceEdgeRouterPolicies, nx, ny) {
|
|
483
|
+
for (let i = nx; i < ny; i++) {
|
|
484
|
+
const serviceerpolicy = new ServiceERPolicy();
|
|
485
|
+
serviceerpolicy.id = createId();
|
|
486
|
+
serviceerpolicy.uuid = serviceEdgeRouterPolicies[i].id;
|
|
487
|
+
serviceerpolicy.name = serviceEdgeRouterPolicies[i].name;
|
|
488
|
+
serviceerpolicy.type = 'Service Router Policy';
|
|
489
|
+
serviceerpolicy.rootNode = 'Yes';
|
|
490
|
+
serviceEdgeRouterPoliciesChildren.children.push(serviceerpolicy);
|
|
491
|
+
} // end of main for loop
|
|
492
|
+
return serviceEdgeRouterPoliciesChildren;
|
|
493
|
+
} // end
|
|
494
|
+
function processEdgeroutersForTree(edgerouterChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, nx, ny) {
|
|
495
|
+
for (let i = nx; i < ny; i++) {
|
|
496
|
+
const erOb = new ERouter();
|
|
497
|
+
erOb.id = createId();
|
|
498
|
+
const er = edgerouters[i];
|
|
499
|
+
if (er) {
|
|
500
|
+
erOb.uuid = er.id;
|
|
501
|
+
erOb.name = er.name;
|
|
502
|
+
erOb.verified = er.isVerified ? 'Yes' : 'No';
|
|
503
|
+
//erOb.version = er.productVersion;
|
|
504
|
+
erOb.online = er.isOnline ? 'Yes' : 'No';
|
|
505
|
+
erOb.disabled = er.disabled ? 'Yes' : 'No';
|
|
506
|
+
erOb.type = 'Edge Router';
|
|
507
|
+
erOb.rootNode = 'Yes';
|
|
508
|
+
if (er.hostId !== null) {
|
|
509
|
+
// erOb.provider = findProviderNameForHostId(er.hostId);
|
|
510
|
+
}
|
|
511
|
+
else if (er.status === 'ERROR') {
|
|
512
|
+
erOb.provider = 'N/A';
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
erOb.provider = 'Private DC';
|
|
516
|
+
}
|
|
517
|
+
edgerouterChildren.children.push(erOb);
|
|
518
|
+
}
|
|
519
|
+
} // end main for loop
|
|
520
|
+
return edgerouterChildren;
|
|
521
|
+
}
|
|
522
|
+
// createId() generates node Id 1,2,3,4,5 for the following five nodes. this id is used to search capability.
|
|
523
|
+
let appwansChildren = new Children();
|
|
524
|
+
appwansChildren.id = createId();
|
|
525
|
+
appwansChildren.name = 'Service Policies';
|
|
526
|
+
let servicesChildren = new Children();
|
|
527
|
+
servicesChildren.id = createId();
|
|
528
|
+
servicesChildren.name = 'Services';
|
|
529
|
+
let endpointsChildren = new Children();
|
|
530
|
+
endpointsChildren.id = createId();
|
|
531
|
+
endpointsChildren.name = 'Identities';
|
|
532
|
+
let edgerouterChildren = new Children();
|
|
533
|
+
edgerouterChildren.id = createId();
|
|
534
|
+
edgerouterChildren.name = 'Edge Routers';
|
|
535
|
+
let edgeRouterPoliciesChildren = new Children();
|
|
536
|
+
edgeRouterPoliciesChildren.id = createId();
|
|
537
|
+
edgeRouterPoliciesChildren.name = 'Edge Router Policies';
|
|
538
|
+
let serviceEdgeRouterPolicesChildren = new Children();
|
|
539
|
+
serviceEdgeRouterPolicesChildren.id = createId();
|
|
540
|
+
serviceEdgeRouterPolicesChildren.name = 'Service Edge Router Policies';
|
|
541
|
+
servicesChildren = processServicesForTree(servicesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, services.length);
|
|
542
|
+
edgerouterChildren = processEdgeroutersForTree(edgerouterChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, edgerouters.length);
|
|
543
|
+
if (edgerouterChildren) {
|
|
544
|
+
edgerouterChildren.name = edgerouterChildren.name + ' (' + edgerouterChildren.children.length + ')';
|
|
545
|
+
}
|
|
546
|
+
appwansChildren = processServicePoliciesForTree(appwansChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, appwans.length);
|
|
547
|
+
edgeRouterPoliciesChildren = processEdgeRouterPoliciesForTree(edgeRouterPoliciesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, edgeRouterPolicies.length);
|
|
548
|
+
if (edgeRouterPoliciesChildren) {
|
|
549
|
+
edgeRouterPoliciesChildren.name =
|
|
550
|
+
'Edge Router Policies (' + edgeRouterPoliciesChildren.children.length + ')';
|
|
551
|
+
}
|
|
552
|
+
endpointsChildren = processIdentitiesForTree(endpointsChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, 0, endpoints.length);
|
|
553
|
+
//serviceEdgeRouterPolicies
|
|
554
|
+
serviceEdgeRouterPolicesChildren = processServiceEdgeRouterPoliciesForTree(serviceEdgeRouterPolicesChildren, edgerouters, endpoints, appwans, services, edgeRouterPolicies, serviceEdgeRouterPolicies, 0, serviceEdgeRouterPolicies.length);
|
|
555
|
+
if (edgeRouterPoliciesChildren) {
|
|
556
|
+
serviceEdgeRouterPolicesChildren.name =
|
|
557
|
+
'Service Edge Router Policies (' + serviceEdgeRouterPolicesChildren.children.length + ')';
|
|
558
|
+
}
|
|
559
|
+
rootJson.children.push(appwansChildren);
|
|
560
|
+
rootJson.children.push(servicesChildren);
|
|
561
|
+
rootJson.children.push(endpointsChildren);
|
|
562
|
+
rootJson.children.push(edgerouterChildren);
|
|
563
|
+
rootJson.children.push(edgeRouterPoliciesChildren);
|
|
564
|
+
rootJson.children.push(serviceEdgeRouterPolicesChildren);
|
|
565
|
+
rootJson.lastId = uniqId;
|
|
566
|
+
return rootJson;
|
|
567
|
+
}
|
|
568
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerHelper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
569
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerHelper, providedIn: 'root' }); }
|
|
570
|
+
}
|
|
571
|
+
export { NetworkVisualizerHelper };
|
|
572
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NetworkVisualizerHelper, decorators: [{
|
|
573
|
+
type: Injectable,
|
|
574
|
+
args: [{
|
|
575
|
+
providedIn: 'root',
|
|
576
|
+
}]
|
|
577
|
+
}] });
|
|
578
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay12aXN1YWxpemVyLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy92aXN1YWxpemVyL25ldHdvcmstdmlzdWFsaXplci9uZXR3b3JrLXZpc3VhbGl6ZXIuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDLE1BQU0sT0FBTyxRQUFRO0lBa0JqQjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxPQUFPO0lBa0JoQjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxLQUFLO0lBT2QsWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFTdEI7UUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxH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R0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ25DO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO29CQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDakM7cUJBQU0sSUFDSCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRyxFQUNiO29CQUNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEs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RyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtvQkFDakUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3JDO3FCQUFNLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO29CQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDbkM7cUJBQU0sSUFDSCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRztvQkFDWCxHQUFHLEtBQUssR0FBRyxFQUNiO29CQUNFLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FB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LE1BQU0sR0FBRyxHQUFHLENBQUM7U0FDakc7UUFFRCxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25ELFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFekIsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzsrR0F2cUJRLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRnBCLE1BQU07O1NBRVQsdUJBQXVCOzRGQUF2Qix1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIElkZW50aXR5IHtcbiAgICBpZDtcbiAgICB1dWlkO1xuICAgIG5hbWU7XG4gICAgc3RhdHVzO1xuICAgIHR5cGU7XG4gICAgcm9vdE5vZGU7XG4gICAgc2VydmVyRWdyZXNzUHJvdG9jb2w7XG4gICAgc2VydmVyRWdyZXNzSG9zdDtcbiAgICBzZXJ2ZXJFZ3Jlc3NQb3J0O1xuICAgIHBvc3R1cmVDaGVja3M7XG4gICAgZXZlbnRzO1xuICAgIG9zO1xuICAgIHV0aWxpemF0aW9uO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuICAgIG9ubGluZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VydmljZSB7XG4gICAgaWQ7XG4gICAgdXVpZDtcbiAgICBuYW1lO1xuICAgIGludGVyY2VwdF9ob3N0O1xuICAgIGludGVyY2VwdF9wb3J0O1xuICAgIGVuY3J5cHRlZDtcbiAgICByb290Tm9kZTtcbiAgICBzZXJ2ZXJFZ3Jlc3NIb3N0O1xuICAgIHNlcnZlckVncmVzc1BvcnQ7XG4gICAgc3RhdHVzO1xuICAgIHByb3RvY29sO1xuICAgIHR5cGU7XG4gICAgY2hpbGRyZW47XG4gICAgYXR0cmlidXRlcztcbiAgICB1dGlsaXphdGlvbjtcbiAgICBjb250ZXh0TWVudTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR3JvdXAge1xuICAgIGlkO1xuICAgIG5hbWU7XG4gICAgdHlwZTtcbiAgICBncm91cDtcbiAgICBjaGlsZHJlbjtcblxuICAgIGNvbnN0cnVjdG9yKGlkdiwgcywgZykge1xuICAgICAgICB0aGlzLmlkID0gaWR2O1xuICAgICAgICB0aGlzLm5hbWUgPSBzO1xuICAgICAgICB0aGlzLmdyb3VwID0gZztcbiAgICAgICAgdGhpcy50eXBlID0gJ0dyb3VwJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcnZpY2VQb2xpY3kge1xuICAgIGlkO1xuICAgIHV1aWQ7XG4gICAgbmFtZTtcbiAgICB0eXBlO1xuICAgIHJvb3ROb2RlO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUgPSAnWWVzJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGUge1xuICAgIGlkO1xuICAgIG5hbWU7XG4gICAgdHlwZTtcbiAgICBjaGlsZHJlbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRVJQb2xpY3kge1xuICAgIGlkO1xuICAgIHV1aWQ7XG4gICAgbmFtZTtcbiAgICBzdGF0dXM7XG4gICAgc2l6ZTtcbiAgICB0eXBlO1xuICAgIHJvb3ROb2RlO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUgPSAnWWVzJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlRVJQb2xpY3kge1xuICAgIGlkO1xuICAgIHV1aWQ7XG4gICAgbmFtZTtcbiAgICBzdGF0dXM7XG4gICAgc2l6ZTtcbiAgICB0eXBlO1xuICAgIHJvb3ROb2RlO1xuICAgIGNoaWxkcmVuO1xuICAgIGNvbnRleHRNZW51O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSAnTm8nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUgPSAnWWVzJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFUm91dGVyIHtcbiAgICBpZDtcbiAgICB1dWlkO1xuICAgIG5hbWU7XG4gICAgdmVyaWZpZWQ7XG4gICAgc2l6ZTtcbiAgICB0eXBlO1xuICAgIHByb3ZpZGVyO1xuICAgIHJvb3ROb2RlO1xuICAgIHNlcnZlckVncmVzc1Byb3RvY29sO1xuICAgIHNlcnZlckVncmVzc0hvc3Q7XG4gICAgc2VydmVyRWdyZXNzUG9ydDtcbiAgICBjaGlsZHJlbjtcbiAgICB1dGlsaXphdGlvbjtcbiAgICBjb250ZXh0TWVudTtcbiAgICBvbmxpbmU7XG4gICAgZGlzYWJsZWQ7XG4gICAgdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0gJ05vJztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hpbGRyZW4ge1xuICAgIGlkO1xuICAgIG5hbWU7XG4gICAgc3RhdHVzO1xuICAgIHNpemU7XG4gICAgdHlwZTtcbiAgICBjaGlsZHJlbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnR5cGUgPSAnQ2hpbGRyZW4nO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOZXR3b3JrVmlzdWFsaXplckhlbHBlciB7XG5cbiAgICBwdWJsaWMgZ2V0UmVzb3VyY2VUcmVlT2JqKFxuICAgICAgICBuZXR3b3JrTmFtZSxcbiAgICAgICAgbmV0d29ya1N0YXR1cyxcbiAgICAgICAgc2VydmljZXMsXG4gICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgYXBwd2FucyxcbiAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgLy8gbmV0d29ya1Byb2R1Y3RWZXJzaW9uLFxuICAgICAgICB1bmlxSWQsXG4gICAgICAgIGxvZ2dlclxuICAgICkge1xuICAgICAgICBmdW5jdGlvbiBjcmVhdGVJZCgpIHtcbiAgICAgICAgICAgICsrdW5pcUlkO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXFJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsYXNzIFJvb3RKc29uIHtcbiAgICAgICAgICAgIGlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgICAgIG5hbWU7XG4gICAgICAgICAgICBsYXN0SWQgPSAwO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGNvbnRleHRNZW51ID0gJ1llcyc7XG4gICAgICAgICAgICB0eXBlID0gJ05ldHdvcmsnO1xuICAgICAgICAgICAvLyB2ZXJzaW9uID0gbmV0d29ya1Byb2R1Y3RWZXJzaW9uO1xuICAgICAgICAgICAgc3RhdHVzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9vdEpzb24gPSBuZXcgUm9vdEpzb24oKTtcbiAgICAgICAgcm9vdEpzb24ubmFtZSA9ICdOZXR3b3JrJztcbiAgICAgICAgcm9vdEpzb24uc3RhdHVzID0gJ1Byb3Zpc2lvbmVkJztcblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSWRlbnRpdGllc0ZvclRyZWUoXG4gICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIG54LFxuICAgICAgICAgICAgbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4ubmFtZSA9IGlkZW50aXRpZXNDaGlsZHJlbi5uYW1lICsgJyAoJyArIG55ICsgJyknO1xuICAgICAgICAgICAgY29uc3QgdW5yZWdpc3RlcmVkR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAgICAgJ0lkZW50aXRpZXNbVW5yZWdpc3RlcmVkXScsXG4gICAgICAgICAgICAgICAgJ0lkZW50aXRpZXMgdGhhdCBhcmUgbm90IHJlZ2lzdGVyZWQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgYWJjZEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbQS1EXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIEEgdG8gRCcpO1xuICAgICAgICAgICAgY29uc3QgZWZnaEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbRS1IXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIEUgdG8gSCcpO1xuICAgICAgICAgICAgY29uc3QgaWprbEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbSS1MXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIEkgdG8gTCcpO1xuICAgICAgICAgICAgY29uc3QgbW5vcEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbTS1QXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIE0gdG8gUCcpO1xuICAgICAgICAgICAgY29uc3QgcXJzdEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbUS1UXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIFEgdG8gVCcpO1xuICAgICAgICAgICAgY29uc3QgdXZ3eEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnSWRlbnRpdGllcyBbVS1YXScsICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIFUgdG8gWCcpO1xuICAgICAgICAgICAgY29uc3QgeXpHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ0lkZW50aXRpZXMgW1ktWl0nLCAnSWRlbnRpdHkgbmFtZSBzdGFydHMgd2l0aCBZIGFuZCBaJyk7XG4gICAgICAgICAgICBjb25zdCBvbmVUbzlHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ0lkZW50aXRpZXMgWzEtOV0nLCAnSWRlbnRpdHkgbmFtZSBzdGFydHMgd2l0aCAwIHRvIDknKTtcbiAgICAgICAgICAgIGNvbnN0IHNwZWNpYWxDaGFyR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAgICAgJ0lkZW50aXRpZXMgW290aGVyc10nLFxuICAgICAgICAgICAgICAgICdJZGVudGl0eSBuYW1lIHN0YXJ0cyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycydcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSBueDsgaiA8IG55OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IG5ldyBJZGVudGl0eSgpO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnJvb3ROb2RlID0gJ1llcyc7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQuaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnV1aWQgPSBlbmRwb2ludHNbal0uaWQ7XG4gICAgICAgICAgICAgICAgZW5kcG9pbnQubmFtZSA9IGVuZHBvaW50c1tqXS5uYW1lO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50Lm9ubGluZSA9IGVuZHBvaW50c1tqXS5oYXNBcGlTZXNzaW9uID09PSB0cnVlID8gJ1llcycgOiAnTm8nO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnR5cGUgPSAnSWRlbnRpdHknO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50LnN0YXR1cyA9IGVuZHBvaW50c1tqXS5vc1JlbGVhc2UgIT09IG51bGwgPyAnUmVnaXN0ZXJlZCcgOiAnTm90IFJlZ2lzdGVyZWQnO1xuICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludHNbal0ub3NSZWxlYXNlID09PSBudWxsICYmIGVuZHBvaW50c1tqXS50eXBlICYmIGVuZHBvaW50c1tqXS50eXBlLmluY2x1ZGVzKCdicm93emVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuc3RhdHVzID0gJ1JlZ2lzdGVyZWQnO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludC50eXBlID0gJ0Jyb3d6ZXIgRW5kcG9pbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbmRwb2ludC5vcyA9IGVuZHBvaW50c1tqXS5vcztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYSA9IGVuZHBvaW50Lm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50LnN0YXR1cyA9PT0gJ05vdCBSZWdpc3RlcmVkJykge1xuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgICAgICBhYmNkR3JwLmNoaWxkcmVuLnB1c2goZW5kcG9pbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAnZScgfHwgY2hhID09PSAnZicgfHwgY2hhID09PSAnZycgfHwgY2hhID09PSAnaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZWZnaEdycC5jaGlsZHJlbi5wdXNoKGVuZHBvaW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ2knIHx8IGNoYSA9PT0gJ2onIHx8IGNoYSA9PT0gJ2snIHx8IGNoYSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlqa2xHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICBtbm9wR3JwLmNoaWxkcmVuLnB1c2goZW5kcG9pbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhID09PSAncScgfHwgY2hhID09PSAncicgfHwgY2hhID09PSAncycgfHwgY2hhID09PSAndCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcXJzdEdycC5jaGlsZHJlbi5wdXNoKGVuZHBvaW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYSA9PT0gJ3UnIHx8IGNoYSA9PT0gJ3YnIHx8IGNoYSA9PT0gJ3cnIHx8IGNoYSA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgICAgIHV2d3hHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5wdXNoKGVuZHBvaW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICcwJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICcxJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICcyJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICczJyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc0JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc1JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc2JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc3JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc4JyB8fFxuICAgICAgICAgICAgICAgICAgICBjaGEgPT09ICc5J1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3BlY2lhbENoYXJHcnAuY2hpbGRyZW4ucHVzaChlbmRwb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBlbmQgb2YgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgICAgICBpZiAodW5yZWdpc3RlcmVkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRHcnAubmFtZSA9IHVucmVnaXN0ZXJlZEdycC5uYW1lICsgJygnICsgdW5yZWdpc3RlcmVkR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaCh1bnJlZ2lzdGVyZWRHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFiY2RHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFiY2RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhYmNkR3JwLm5hbWUgPSBhYmNkR3JwLm5hbWUgKyAnICgnICsgYWJjZEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goYWJjZEdycCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlZmdoR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWZnaEdycC5uYW1lID0gZWZnaEdycC5uYW1lICsgJyAoJyArIGVmZ2hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGVmZ2hHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlqa2xHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpamtsR3JwLm5hbWUgPSBpamtsR3JwLm5hbWUgKyAnICgnICsgaWprbEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goaWprbEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW5vcEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbW5vcEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1ub3BHcnAubmFtZSA9IG1ub3BHcnAubmFtZSArICcgKCcgKyBtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBpZGVudGl0aWVzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChtbm9wR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChxcnN0R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcXJzdEdycC5uYW1lID0gcXJzdEdycC5uYW1lICsgJyAoJyArIHFyc3RHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHFyc3RHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHV2d3hHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB1dnd4R3JwLm5hbWUgPSB1dnd4R3JwLm5hbWUgKyAnICgnICsgdXZ3eEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2godXZ3eEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeXpHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHl6R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgeXpHcnAubmFtZSA9IHl6R3JwLm5hbWUgKyAnICgnICsgeXpHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHl6R3JwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNwZWNpYWxDaGFyR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsQ2hhckdycC5uYW1lID0gc3BlY2lhbENoYXJHcnAubmFtZSArICcgKCcgKyBzcGVjaWFsQ2hhckdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goc3BlY2lhbENoYXJHcnApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgb25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA8PSAxMDApIHtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvbmVUbzlHcnAubmFtZSA9IG9uZVRvOUdycC5uYW1lICsgJyAoJyArIG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgaWRlbnRpdGllc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gob25lVG85R3JwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gaSArIDgwIDwgb25lVG85R3JwLmNoaWxkcmVuLmxlbmd0aCA/IGkgKyA4MCA6IG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lUyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAnSWRlbnRpdGllcyBbJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVUbzlHcnAuY2hpbGRyZW5baV0ubmFtZS5zdWJzdHJpbmcoMCwgNCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbltsYXN0RWxlbWVudF0ubmFtZS5zdWJzdHJpbmcoMCwgNCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ10nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGxkID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0lkZW50aXR5IG5hbWUgc3RhcnRzIHdpdGggJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lVG85R3JwLmNoaWxkcmVuW2ldLm5hbWUuc3Vic3RyaW5nKDAsIDQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIFRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbltsYXN0RWxlbWVudF0ubmFtZS5zdWJzdHJpbmcoMCwgNClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBsYXN0RWxlbWVudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGxkLmNoaWxkcmVuLnB1c2gob25lVG85R3JwLmNoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGxkLm5hbWUgPSBjaGxkLm5hbWUgKyAnICgnICsgY2hsZC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXRpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGNobGQpO1xuICAgICAgICAgICAgICAgICAgICBpID0gaSArIDgwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGlkZW50aXRpZXNDaGlsZHJlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NTZXJ2aWNlUG9saWNpZXNGb3JUcmVlKFxuICAgICAgICAgICAgc2VydmljZVBvbGljeUNoaWxkcmVuLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICBpZGVudGl0aWVzLFxuICAgICAgICAgICAgc2VydmljZVBvbGljaWVzLFxuICAgICAgICAgICAgc2VydmljZXMsXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICBueCxcbiAgICAgICAgICAgIG55XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGJpbmRHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ0JpbmRQb2xpY2llcycsICdCaW5kIFNlcnZpY2UgUG9saWN5Jyk7XG4gICAgICAgICAgY29uc3QgZGlhbEdycCA9IG5ldyBHcm91cChjcmVhdGVJZCgpLCAnRGlhbFBvbGljaWVzJywgJ0RpYWwgU2VydmljZSBQb2xpY3knKTtcblxuICAgICAgICAgIHNlcnZpY2VQb2xpY2llcy5mb3JFYWNoKCAoc3ApID0+IHtcblxuICAgICAgICAgICAgY29uc3Qgc3BvbGljeSA9IG5ldyBTZXJ2aWNlUG9saWN5KCk7XG4gICAgICAgICAgICAgICAgc3BvbGljeS5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgc3BvbGljeS51dWlkID0gc3AuaWQ7XG4gICAgICAgICAgICAgICAgc3BvbGljeS5uYW1lID0gc3AubmFtZTtcbiAgICAgICAgICAgICAgICBzcG9saWN5LnR5cGUgPSAnU2VydmljZVBvbGljeSc7XG4gICAgICAgICAgICAgICAgc3BvbGljeS5yb290Tm9kZSA9ICdZZXMnO1xuICAgICAgICAgICAgICAgIGlmKHNwLnR5cGU9PT0nQmluZCcpIHtcbiAgICAgICAgICAgICAgICAgIGJpbmRHcnAuY2hpbGRyZW4ucHVzaChzcG9saWN5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGlhbEdycC5jaGlsZHJlbi5wdXNoKHNwb2xpY3kpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gKTtcblxuICAgICAgICAgIGJpbmRHcnAubmFtZSA9IGJpbmRHcnAubmFtZSArICcoJysgYmluZEdycC5jaGlsZHJlbi5sZW5ndGggKycpJztcbiAgICAgICAgICBzZXJ2aWNlUG9saWN5Q2hpbGRyZW4uY2hpbGRyZW4ucHVzaChiaW5kR3JwKTtcbiAgICAgICAgICBkaWFsR3JwLm5hbWUgPSBkaWFsR3JwLm5hbWUgKyAnKCcrIGRpYWxHcnAuY2hpbGRyZW4ubGVuZ3RoICsnKSc7XG4gICAgICAgICAgc2VydmljZVBvbGljeUNoaWxkcmVuLmNoaWxkcmVuLnB1c2goZGlhbEdycCk7XG4gICAgICAgICAgICBzZXJ2aWNlUG9saWN5Q2hpbGRyZW4ubmFtZSA9IHNlcnZpY2VQb2xpY3lDaGlsZHJlbi5uYW1lICsgJyAoJyArIChiaW5kR3JwLmNoaWxkcmVuLmxlbmd0aCArIGRpYWxHcnAuY2hpbGRyZW4ubGVuZ3RoKSArICcpJztcbiAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUG9saWN5Q2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzZXJ2aWNlR3JvdXBpbmcoc2VydmljZXNDaGlsZHJlbiwgc2VydmljZXN0cmVlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFJEUEdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgICAgICBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtUkRQXScsXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2VzIGNyZWF0ZWQgZm9yIFJEUCBwcm90b2NvbCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbEhUVFBTR3JwID0gbmV3IEdyb3VwKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2VzIFtwcm90b2NvbC1IVFRQU10nLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFBTIHByb3RvY29sJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sSFRUUEdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgICAgICBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlcyBbcHJvdG9jb2wtSFRUUF0nLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlIGNyZWF0ZWQgZm9yIEhUVFAgcHJvdG9jb2wnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2xGVFBHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtwcm90b2NvbC1GVFBdJywgJ1NlcnZpY2UgY3JlYXRlZCBmb3IgRlRQIHByb3RvY29sJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFiY2RHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtBLURdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBBIHRvIEQnKTtcbiAgICAgICAgICAgIGNvbnN0IGVmZ2hHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtFLUhdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBFIHRvIEgnKTtcbiAgICAgICAgICAgIGNvbnN0IGlqa2xHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtJLUxdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBJIHRvIEwnKTtcbiAgICAgICAgICAgIGNvbnN0IG1ub3BHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtNLVBdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBNIHRvIFAnKTtcbiAgICAgICAgICAgIGNvbnN0IHFyc3RHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtRLVRdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBRIHRvIFQnKTtcbiAgICAgICAgICAgIGNvbnN0IHV2d3hHcnAgPSBuZXcgR3JvdXAoY3JlYXRlSWQoKSwgJ1NlcnZpY2VzIFtVLVhdJywgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBVIHRvIFgnKTtcbiAgICAgICAgICAgIGNvbnN0IHl6R3JwID0gbmV3IEdyb3VwKGNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbWS1aXScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggWSBhbmQgWicpO1xuICAgICAgICAgICAgY29uc3Qgb25lVG85R3JwID0gbmV3IEdyb3VwKGNyZWF0ZUlkKCksICdTZXJ2aWNlcyBbMS05XScsICdTZXJ2aWNlIG5hbWUgc3RhcnRzIHdpdGggMCB0byA5Jyk7XG4gICAgICAgICAgICBjb25zdCBzcGVjaWFsQ2hhckdycCA9IG5ldyBHcm91cChcbiAgICAgICAgICAgICAgICBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgICAgICdTZXJ2aWNlcyBbb3RoZXJzXScsXG4gICAgICAgICAgICAgICAgJ1NlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcnZpY2VzdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VvYmogPSBzZXJ2aWNlc3RyZWVbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhID0gc2VydmljZW9iai5uYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdyZHAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlb2JqLnByb3RvY29sID09PSAnaHR0cHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sSFRUUFNHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdodHRwJykge1xuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBHcnAuY2hpbGRyZW4ucHVzaChzZXJ2aWNlb2JqKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VvYmoucHJvdG9jb2wgPT09ICdmdHAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdhJyB8fCBjaGEgPT09ICdiJyB8fCBjaGEgPT09ICdjJyB8fCBjaGEgPT09ICdkJykge1xuICAgICAgICAgICAgICAgICAgICBhYmNkR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdlJyB8fCBjaGEgPT09ICdmJyB8fCBjaGEgPT09ICdnJyB8fCBjaGEgPT09ICdoJykge1xuICAgICAgICAgICAgICAgICAgICBlZmdoR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdpJyB8fCBjaGEgPT09ICdqJyB8fCBjaGEgPT09ICdrJyB8fCBjaGEgPT09ICdsJykge1xuICAgICAgICAgICAgICAgICAgICBpamtsR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdtJyB8fCBjaGEgPT09ICduJyB8fCBjaGEgPT09ICdvJyB8fCBjaGEgPT09ICdwJykge1xuICAgICAgICAgICAgICAgICAgICBtbm9wR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICdxJyB8fCBjaGEgPT09ICdyJyB8fCBjaGEgPT09ICdzJyB8fCBjaGEgPT09ICd0Jykge1xuICAgICAgICAgICAgICAgICAgICBxcnN0R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd1JyB8fCBjaGEgPT09ICd2JyB8fCBjaGEgPT09ICd3JyB8fCBjaGEgPT09ICd4Jykge1xuICAgICAgICAgICAgICAgICAgICB1dnd4R3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGEgPT09ICd5JyB8fCBjaGEgPT09ICd6Jykge1xuICAgICAgICAgICAgICAgICAgICB5ekdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzAnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzEnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzInIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzMnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzQnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzYnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzcnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzgnIHx8XG4gICAgICAgICAgICAgICAgICAgIGNoYSA9PT0gJzknXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZVRvOUdycC5jaGlsZHJlbi5wdXNoKHNlcnZpY2VvYmopO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwZWNpYWxDaGFyR3JwLmNoaWxkcmVuLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBlbmQgbWFpbiBmb3IgbG9vcFxuXG4gICAgICAgICAgICBpZiAocHJvdG9jb2xSRFBHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHByb3RvY29sUkRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xSRFBHcnAubmFtZSA9IHByb3RvY29sUkRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbFJEUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sUkRQR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcGVjaWFsQ2hhckdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbENoYXJHcnAubmFtZSA9IHNwZWNpYWxDaGFyR3JwLm5hbWUgKyAnKCcgKyBzcGVjaWFsQ2hhckdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHNwZWNpYWxDaGFyR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbEhUVFBTR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQU0dycC5uYW1lID0gcHJvdG9jb2xIVFRQU0dycC5uYW1lICsgJygnICsgcHJvdG9jb2xIVFRQU0dycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUFNHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xIVFRQR3JwLm5hbWUgPSBwcm90b2NvbEhUVFBHcnAubmFtZSArICcoJyArIHByb3RvY29sSFRUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sSFRUUEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvdG9jb2xGVFBHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHByb3RvY29sRlRQR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xGVFBHcnAubmFtZSA9IHByb3RvY29sRlRQR3JwLm5hbWUgKyAnKCcgKyBwcm90b2NvbEZUUEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHByb3RvY29sRlRQR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhYmNkR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhYmNkR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWJjZEdycC5uYW1lID0gYWJjZEdycC5uYW1lICsgJygnICsgYWJjZEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGFiY2RHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVmZ2hHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGVmZ2hHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlZmdoR3JwLm5hbWUgPSBlZmdoR3JwLm5hbWUgKyAnKCcgKyBlZmdoR3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goZWZnaEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWprbEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWprbEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlqa2xHcnAubmFtZSA9IGlqa2xHcnAubmFtZSArICcoJyArIGlqa2xHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaChpamtsR3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtbm9wR3JwLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtbm9wR3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW5vcEdycC5uYW1lID0gbW5vcEdycC5uYW1lICsgJygnICsgbW5vcEdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG1ub3BHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHFyc3RHcnAuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHFyc3RHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBxcnN0R3JwLm5hbWUgPSBxcnN0R3JwLm5hbWUgKyAnKCcgKyBxcnN0R3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2gocXJzdEdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXZ3eEdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXZ3eEdycC5jaGlsZHJlbi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHV2d3hHcnAubmFtZSA9IHV2d3hHcnAubmFtZSArICcoJyArIHV2d3hHcnAuY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ucHVzaCh1dnd4R3JwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5ekdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgeXpHcnAuY2hpbGRyZW4uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB5ekdycC5uYW1lID0geXpHcnAubmFtZSArICcoJyArIHl6R3JwLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLmNoaWxkcmVuLnB1c2goeXpHcnApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgb25lVG85R3JwLmNoaWxkcmVuLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb25lVG85R3JwLm5hbWUgPSBvbmVUbzlHcnAubmFtZSArICcoJyArIG9uZVRvOUdycC5jaGlsZHJlbi5sZW5ndGggKyAnKSc7XG4gICAgICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKG9uZVRvOUdycCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuLm5hbWUgPSBzZXJ2aWNlc0NoaWxkcmVuLm5hbWUgKyAnKCcgKyBzZXJ2aWNlc3RyZWUubGVuZ3RoICsgJyknO1xuICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VzQ2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzU2VydmljZXNGb3JUcmVlKFxuICAgICAgICAgICAgc2VydmljZXNDaGlsZHJlbixcbiAgICAgICAgICAgIGVkZ2Vyb3V0ZXJzLFxuICAgICAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICAgICAgYXBwd2FucyxcbiAgICAgICAgICAgIHNlcnZpY2VzLFxuICAgICAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzLFxuICAgICAgICAgICAgbngsXG4gICAgICAgICAgICBueVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VzdHJlZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG54OyBpIDwgbnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VvYmogPSBuZXcgU2VydmljZSgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VvYmouaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoubmFtZSA9IHNlcnZpY2VzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgc2VydmljZW9iai51dWlkID0gc2VydmljZXNbaV0uaWQ7XG4gICAgICAgICAgICAgICAgc2VydmljZW9iai50eXBlID0gJ1NlcnZpY2UnO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoucm9vdE5vZGUgPSAnWWVzJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXN3aXRoTmFtZSA9IFtdO1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXN3aXRoTmFtZS5wdXNoKCdAJyArIHNlcnZpY2VzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VzW2ldICYmIHNlcnZpY2VzW2ldLnJvbGVBdHRyaWJ1dGVzICYmIHNlcnZpY2VzW2ldLnJvbGVBdHRyaWJ1dGVzLmZpbmQoKHNyYXR0cikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzd2l0aE5hbWUucHVzaChzcmF0dHIpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzSXRSRFBQcm90b2NvbEF0dHIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgaXNJdEhUVFBQcm90b2NvbEF0dHIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgaXNJdEhUVFBTUHJvdG9jb2xBdHRyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IGlzSXRGVFBQcm90b2NvbEF0dHIgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgYXR0cmlidXRlc3dpdGhOYW1lLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJPYiA9IG5ldyBBdHRyaWJ1dGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck9iLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck9iLm5hbWUgPSBhdHRyaWJ1dGVzd2l0aE5hbWVba107XG4gICAgICAgICAgICAgICAgICAgIGF0dHJPYi50eXBlID0gJ1NlcnZpY2UgQXR0cmlidXRlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0TmFtZSA9IGF0dHJpYnV0ZXN3aXRoTmFtZVtrXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJdFJEUFByb3RvY29sQXR0ciA9PT0gZmFsc2UgJiYgYXR0TmFtZS5pbmNsdWRlcygncmRwJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoucHJvdG9jb2wgPSAncmRwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSXRSRFBQcm90b2NvbEF0dHIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0l0SFRUUFNQcm90b2NvbEF0dHIgPT09IGZhbHNlICYmIGF0dE5hbWUuaW5jbHVkZXMoJ2h0dHBzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VvYmoucHJvdG9jb2wgPSAnaHR0cHMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNJdEhUVFBTUHJvdG9jb2xBdHRyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJdEhUVFBTUHJvdG9jb2xBdHRyID09PSBmYWxzZSAmJiBpc0l0SFRUUFByb3RvY29sQXR0ciA9PT0gZmFsc2UgJiYgYXR0TmFtZS5pbmNsdWRlcygnaHR0cCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlb2JqLnByb3RvY29sID0gJ2h0dHAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNJdEhUVFBQcm90b2NvbEF0dHIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0l0RlRQUHJvdG9jb2xBdHRyID09PSBmYWxzZSAmJiBhdHROYW1lLmluY2x1ZGVzKCdmdHAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZW9iai5wcm90b2NvbCA9ICdmdHAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNJdEZUUFByb3RvY29sQXR0ciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIGVuZCBpbm5lciBmb3IgbG9vcFxuXG4gICAgICAgICAgICAgICAgc2VydmljZXN0cmVlLnB1c2goc2VydmljZW9iaik7XG4gICAgICAgICAgICB9IC8vIGVuZCBmb3IgbG9vcFxuXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwaW5nKHNlcnZpY2VzQ2hpbGRyZW4sIHNlcnZpY2VzdHJlZSk7XG4gICAgICAgIH0gLy8gZW5kIG9mIHByb2Nlc3NTZXJ2aWNlc0ZvclRyZWVcblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzRWRnZVJvdXRlclBvbGljaWVzRm9yVHJlZShcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICBlbmRwb2ludHMsXG4gICAgICAgICAgICBhcHB3YW5zLFxuICAgICAgICAgICAgc2VydmljZXMsXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICBueCxcbiAgICAgICAgICAgIG55XG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG54OyBpIDwgbnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycG9saWN5ID0gbmV3IEVSUG9saWN5KCk7XG4gICAgICAgICAgICAgICAgZXJwb2xpY3kuaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIGVycG9saWN5LnV1aWQgPSBlZGdlUm91dGVyUG9saWNpZXNbaV0uaWQ7XG4gICAgICAgICAgICAgICAgZXJwb2xpY3kubmFtZSA9IGVkZ2VSb3V0ZXJQb2xpY2llc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGVycG9saWN5LnR5cGUgPSAnUm91dGVyIFBvbGljeSc7XG4gICAgICAgICAgICAgICAgZXJwb2xpY3kucm9vdE5vZGUgPSAnWWVzJztcbiAgICAgICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGVycG9saWN5KTtcbiAgICAgICAgICAgIH0gLy8gZW5kIG9mIG1haW4gZm9yIGxvb3BcbiAgICAgICAgICAgIHJldHVybiBlZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbjtcbiAgICAgICAgfSAvLyBlbmRcblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzU2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llc0ZvclRyZWUoXG4gICAgICAgICAgICBzZXJ2aWNlRWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICBueCxcbiAgICAgICAgICAgIG55XG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG54OyBpIDwgbnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VlcnBvbGljeSA9IG5ldyBTZXJ2aWNlRVJQb2xpY3koKTtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlZXJwb2xpY3kuaWQgPSBjcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VlcnBvbGljeS51dWlkID0gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llc1tpXS5pZDtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlZXJwb2xpY3kubmFtZSA9IHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlZXJwb2xpY3kudHlwZSA9ICdTZXJ2aWNlIFJvdXRlciBQb2xpY3knO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VlcnBvbGljeS5yb290Tm9kZSA9ICdZZXMnO1xuICAgICAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKHNlcnZpY2VlcnBvbGljeSk7XG4gICAgICAgICAgICB9IC8vIGVuZCBvZiBtYWluIGZvciBsb29wXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuO1xuICAgICAgICB9IC8vIGVuZFxuXG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NFZGdlcm91dGVyc0ZvclRyZWUoXG4gICAgICAgICAgICBlZGdlcm91dGVyQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIG54LFxuICAgICAgICAgICAgbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbng7IGkgPCBueTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJPYiA9IG5ldyBFUm91dGVyKCk7XG4gICAgICAgICAgICAgICAgZXJPYi5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXIgPSBlZGdlcm91dGVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJPYi51dWlkID0gZXIuaWQ7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IubmFtZSA9IGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IudmVyaWZpZWQgPSBlci5pc1ZlcmlmaWVkPyAnWWVzJzogJ05vJztcbiAgICAgICAgICAgICAgICAgICAgLy9lck9iLnZlcnNpb24gPSBlci5wcm9kdWN0VmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgZXJPYi5vbmxpbmUgPSBlci5pc09ubGluZT8gJ1llcyc6ICdObyc7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IuZGlzYWJsZWQgPSBlci5kaXNhYmxlZD8gJ1llcyc6ICdObyc7XG4gICAgICAgICAgICAgICAgICAgIGVyT2IudHlwZSA9ICdFZGdlIFJvdXRlcic7XG4gICAgICAgICAgICAgICAgICAgIGVyT2Iucm9vdE5vZGUgPSAnWWVzJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyLmhvc3RJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAvLyBlck9iLnByb3ZpZGVyID0gZmluZFByb3ZpZGVyTmFtZUZvckhvc3RJZChlci5ob3N0SWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyLnN0YXR1cyA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJPYi5wcm92aWRlciA9ICdOL0EnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJPYi5wcm92aWRlciA9ICdQcml2YXRlIERDJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVkZ2Vyb3V0ZXJDaGlsZHJlbi5jaGlsZHJlbi5wdXNoKGVyT2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gZW5kIG1haW4gZm9yIGxvb3BcbiAgICAgICAgICAgIHJldHVybiBlZGdlcm91dGVyQ2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGVJZCgpIGdlbmVyYXRlcyBub2RlIElkIDEsMiwzLDQsNSBmb3IgdGhlIGZvbGxvd2luZyBmaXZlIG5vZGVzLiB0aGlzIGlkIGlzIHVzZWQgdG8gc2VhcmNoIGNhcGFiaWxpdHkuXG4gICAgICAgIGxldCBhcHB3YW5zQ2hpbGRyZW4gPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgYXBwd2Fuc0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgYXBwd2Fuc0NoaWxkcmVuLm5hbWUgPSAnU2VydmljZSBQb2xpY2llcyc7XG5cbiAgICAgICAgbGV0IHNlcnZpY2VzQ2hpbGRyZW4gPSBuZXcgQ2hpbGRyZW4oKTtcbiAgICAgICAgc2VydmljZXNDaGlsZHJlbi5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4ubmFtZSA9ICdTZXJ2aWNlcyc7XG5cbiAgICAgICAgbGV0IGVuZHBvaW50c0NoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVuZHBvaW50c0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgZW5kcG9pbnRzQ2hpbGRyZW4ubmFtZSA9ICdJZGVudGl0aWVzJztcblxuICAgICAgICBsZXQgZWRnZXJvdXRlckNoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVkZ2Vyb3V0ZXJDaGlsZHJlbi5pZCA9IGNyZWF0ZUlkKCk7XG4gICAgICAgIGVkZ2Vyb3V0ZXJDaGlsZHJlbi5uYW1lID0gJ0VkZ2UgUm91dGVycyc7XG5cbiAgICAgICAgbGV0IGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4ubmFtZSA9ICdFZGdlIFJvdXRlciBQb2xpY2llcyc7XG5cbiAgICAgICAgbGV0IHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuID0gbmV3IENoaWxkcmVuKCk7XG4gICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuLmlkID0gY3JlYXRlSWQoKTtcbiAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2VzQ2hpbGRyZW4ubmFtZSA9ICdTZXJ2aWNlIEVkZ2UgUm91dGVyIFBvbGljaWVzJztcblxuICAgICAgICBzZXJ2aWNlc0NoaWxkcmVuID0gcHJvY2Vzc1NlcnZpY2VzRm9yVHJlZShcbiAgICAgICAgICAgIHNlcnZpY2VzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBzZXJ2aWNlcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBlZGdlcm91dGVyQ2hpbGRyZW4gPSBwcm9jZXNzRWRnZXJvdXRlcnNGb3JUcmVlKFxuICAgICAgICAgICAgZWRnZXJvdXRlckNoaWxkcmVuLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMsXG4gICAgICAgICAgICBlbmRwb2ludHMsXG4gICAgICAgICAgICBhcHB3YW5zLFxuICAgICAgICAgICAgc2VydmljZXMsXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWRnZXJvdXRlcnMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGVkZ2Vyb3V0ZXJDaGlsZHJlbikge1xuICAgICAgICAgICAgZWRnZXJvdXRlckNoaWxkcmVuLm5hbWUgPSBlZGdlcm91dGVyQ2hpbGRyZW4ubmFtZSArICcgKCcgKyBlZGdlcm91dGVyQ2hpbGRyZW4uY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwd2Fuc0NoaWxkcmVuID0gcHJvY2Vzc1NlcnZpY2VQb2xpY2llc0ZvclRyZWUoXG4gICAgICAgICAgICBhcHB3YW5zQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBhcHB3YW5zLmxlbmd0aFxuICAgICAgICApO1xuXG4gICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuID0gcHJvY2Vzc0VkZ2VSb3V0ZXJQb2xpY2llc0ZvclRyZWUoXG4gICAgICAgICAgICBlZGdlUm91dGVyUG9saWNpZXNDaGlsZHJlbixcbiAgICAgICAgICAgIGVkZ2Vyb3V0ZXJzLFxuICAgICAgICAgICAgZW5kcG9pbnRzLFxuICAgICAgICAgICAgYXBwd2FucyxcbiAgICAgICAgICAgIHNlcnZpY2VzLFxuICAgICAgICAgICAgZWRnZVJvdXRlclBvbGljaWVzLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLm5hbWUgPVxuICAgICAgICAgICAgICAgICdFZGdlIFJvdXRlciBQb2xpY2llcyAoJyArIGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuLmNoaWxkcmVuLmxlbmd0aCArICcpJztcbiAgICAgICAgfVxuXG4gICAgICAgIGVuZHBvaW50c0NoaWxkcmVuID0gcHJvY2Vzc0lkZW50aXRpZXNGb3JUcmVlKFxuICAgICAgICAgICAgZW5kcG9pbnRzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBlbmRwb2ludHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgLy9zZXJ2aWNlRWRnZVJvdXRlclBvbGljaWVzXG4gICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuID0gcHJvY2Vzc1NlcnZpY2VFZGdlUm91dGVyUG9saWNpZXNGb3JUcmVlKFxuICAgICAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2VzQ2hpbGRyZW4sXG4gICAgICAgICAgICBlZGdlcm91dGVycyxcbiAgICAgICAgICAgIGVuZHBvaW50cyxcbiAgICAgICAgICAgIGFwcHdhbnMsXG4gICAgICAgICAgICBzZXJ2aWNlcyxcbiAgICAgICAgICAgIGVkZ2VSb3V0ZXJQb2xpY2llcyxcbiAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNpZXMsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2llcy5sZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZWRnZVJvdXRlclBvbGljaWVzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHNlcnZpY2VFZGdlUm91dGVyUG9saWNlc0NoaWxkcmVuLm5hbWUgPVxuICAgICAgICAgICAgICAgICdTZXJ2aWNlIEVkZ2UgUm91dGVyIFBvbGljaWVzICgnICsgc2VydmljZUVkZ2VSb3V0ZXJQb2xpY2VzQ2hpbGRyZW4uY2hpbGRyZW4ubGVuZ3RoICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgcm9vdEpzb24uY2hpbGRyZW4ucHVzaChhcHB3YW5zQ2hpbGRyZW4pO1xuICAgICAgICByb290SnNvbi5jaGlsZHJlbi5wdXNoKHNlcnZpY2VzQ2hpbGRyZW4pO1xuICAgICAgICByb290SnNvbi5jaGlsZHJlbi5wdXNoKGVuZHBvaW50c0NoaWxkcmVuKTtcbiAgICAgICAgcm9vdEpzb24uY2hpbGRyZW4ucHVzaChlZGdlcm91dGVyQ2hpbGRyZW4pO1xuICAgICAgICByb290SnNvbi5jaGlsZHJlbi5wdXNoKGVkZ2VSb3V0ZXJQb2xpY2llc0NoaWxkcmVuKTtcbiAgICAgICAgcm9vdEpzb24uY2hpbGRyZW4ucHVzaChzZXJ2aWNlRWRnZVJvdXRlclBvbGljZXNDaGlsZHJlbik7XG4gICAgICAgIHJvb3RKc29uLmxhc3RJZCA9IHVuaXFJZDtcblxuICAgICAgICByZXR1cm4gcm9vdEpzb247XG4gICAgfVxuXG59XG4iXX0=
|