@blinkk/root-cms 1.3.20 → 1.3.22
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/dist/cli.js +72 -27
- package/dist/plugin.js +72 -27
- package/dist/ui/ui.css +2 -2
- package/dist/ui/ui.js +71 -71
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -24,16 +24,16 @@ async function generateTypes() {
|
|
|
24
24
|
}
|
|
25
25
|
var TEMPLATE = `/** Root.js CMS types. This file is autogenerated. */
|
|
26
26
|
|
|
27
|
-
export interface
|
|
27
|
+
export interface RootCMSFile {
|
|
28
28
|
src: string;
|
|
29
29
|
width?: number;
|
|
30
30
|
height?: number;
|
|
31
31
|
alt?: string;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export type
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
export type RootCMSImage = RootCMSFile;
|
|
35
|
+
|
|
36
|
+
export type RootCMSOneOf<T = any> = T;
|
|
37
37
|
|
|
38
38
|
export interface RootCMSRichTextBlock {
|
|
39
39
|
type: string;
|
|
@@ -81,13 +81,13 @@ async function generateSchemaDts(outputPath, schemas) {
|
|
|
81
81
|
const schema = schemas[fileId];
|
|
82
82
|
results.push(renderSchema(fileId, schema));
|
|
83
83
|
}
|
|
84
|
-
const output = results.join("\n\n").replaceAll("/** ", "/** ").replaceAll(" */", " */").replace(/\r\n|\r|\n/g, "\n");
|
|
84
|
+
const output = results.join("\n\n").replaceAll("/** ", "/** ").replaceAll(" */", " */").replace(/\r\n|\r|\n/g, "\n") + "\n";
|
|
85
85
|
await fs.writeFile(outputPath, output, "utf-8");
|
|
86
86
|
}
|
|
87
|
-
function fieldProperty(field) {
|
|
87
|
+
function fieldProperty(field, options) {
|
|
88
88
|
const prop = dom.create.property(
|
|
89
89
|
field.id,
|
|
90
|
-
fieldType(field),
|
|
90
|
+
fieldType(field, options),
|
|
91
91
|
dom.DeclarationFlags.Optional
|
|
92
92
|
);
|
|
93
93
|
const jsdoc = [];
|
|
@@ -106,9 +106,9 @@ function fieldProperty(field) {
|
|
|
106
106
|
}
|
|
107
107
|
return prop;
|
|
108
108
|
}
|
|
109
|
-
function fieldType(field) {
|
|
109
|
+
function fieldType(field, options) {
|
|
110
110
|
if (field.type === "array") {
|
|
111
|
-
return dom.type.array(fieldType(field.of));
|
|
111
|
+
return dom.type.array(fieldType(field.of, options));
|
|
112
112
|
}
|
|
113
113
|
if (field.type === "boolean") {
|
|
114
114
|
return dom.type.boolean;
|
|
@@ -119,19 +119,52 @@ function fieldType(field) {
|
|
|
119
119
|
if (field.type === "datetime") {
|
|
120
120
|
return dom.type.number;
|
|
121
121
|
}
|
|
122
|
+
if (field.type === "file") {
|
|
123
|
+
const fileType = dom.create.namedTypeReference("RootCMSFile");
|
|
124
|
+
return fileType;
|
|
125
|
+
}
|
|
122
126
|
if (field.type === "image") {
|
|
123
127
|
const imageType = dom.create.namedTypeReference("RootCMSImage");
|
|
124
128
|
return imageType;
|
|
125
129
|
}
|
|
126
|
-
if (field.type === "file") {
|
|
127
|
-
return dom.create.objectType([dom.create.property("src", dom.type.string)]);
|
|
128
|
-
}
|
|
129
130
|
if (field.type === "multiselect") {
|
|
130
131
|
return dom.type.array(dom.type.string);
|
|
131
132
|
}
|
|
132
133
|
if (field.type === "oneof") {
|
|
133
|
-
const
|
|
134
|
-
|
|
134
|
+
const oneOf = dom.create.namedTypeReference("RootCMSOneOf");
|
|
135
|
+
if (field.types && Array.isArray(field.types)) {
|
|
136
|
+
const unionTypes = [];
|
|
137
|
+
field.types.forEach((schema) => {
|
|
138
|
+
if (!schema.name) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const cleanName = alphanumeric(schema.name);
|
|
142
|
+
const oneOfTypeId = `${options.typeId}_${cleanName}`;
|
|
143
|
+
if (!options.oneOfTypes[oneOfTypeId]) {
|
|
144
|
+
const oneOfTypeInterface = dom.create.interface(
|
|
145
|
+
oneOfTypeId,
|
|
146
|
+
dom.DeclarationFlags.Export
|
|
147
|
+
);
|
|
148
|
+
oneOfTypeInterface.members.push(
|
|
149
|
+
dom.create.property(
|
|
150
|
+
"_type",
|
|
151
|
+
dom.type.stringLiteral(schema.name),
|
|
152
|
+
dom.DeclarationFlags.None
|
|
153
|
+
)
|
|
154
|
+
);
|
|
155
|
+
const oneOfTypeFields = schema.fields || [];
|
|
156
|
+
oneOfTypeFields.forEach((f) => {
|
|
157
|
+
oneOfTypeInterface.members.push(fieldProperty(f, options));
|
|
158
|
+
});
|
|
159
|
+
options.oneOfTypes[oneOfTypeId] = oneOfTypeInterface;
|
|
160
|
+
}
|
|
161
|
+
unionTypes.push(dom.create.namedTypeReference(oneOfTypeId));
|
|
162
|
+
});
|
|
163
|
+
if (unionTypes.length > 0) {
|
|
164
|
+
oneOf.typeArguments = [dom.create.union(unionTypes)];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return oneOf;
|
|
135
168
|
}
|
|
136
169
|
if (field.type === "reference") {
|
|
137
170
|
const referenceType = dom.create.namedTypeReference("RootCMSReference");
|
|
@@ -148,46 +181,58 @@ function fieldType(field) {
|
|
|
148
181
|
return dom.type.string;
|
|
149
182
|
}
|
|
150
183
|
if (field.type === "object") {
|
|
151
|
-
const subproperties = (field.fields || []).map(
|
|
184
|
+
const subproperties = (field.fields || []).map(
|
|
185
|
+
(f) => fieldProperty(f, options)
|
|
186
|
+
);
|
|
152
187
|
return dom.create.objectType(subproperties);
|
|
153
188
|
}
|
|
154
189
|
return dom.type.unknown;
|
|
155
190
|
}
|
|
156
191
|
function renderSchema(fileId, schema) {
|
|
157
192
|
const jsdoc = `Generated from \`${fileId}\`.`;
|
|
158
|
-
const
|
|
159
|
-
const
|
|
160
|
-
const
|
|
193
|
+
const typeId = alphanumeric(path.parse(fileId).name.split(".")[0]);
|
|
194
|
+
const oneOfTypes = {};
|
|
195
|
+
const fieldsInterface = `${typeId}Fields`;
|
|
196
|
+
const fieldsType = dom.create.interface(
|
|
161
197
|
fieldsInterface,
|
|
162
198
|
dom.DeclarationFlags.Export
|
|
163
199
|
);
|
|
164
|
-
|
|
200
|
+
fieldsType.jsDocComment = jsdoc;
|
|
165
201
|
for (const field of schema.fields) {
|
|
166
202
|
if (!field.id) {
|
|
167
203
|
continue;
|
|
168
204
|
}
|
|
169
|
-
|
|
205
|
+
fieldsType.members.push(fieldProperty(field, { typeId, oneOfTypes }));
|
|
170
206
|
}
|
|
171
|
-
const
|
|
207
|
+
const typesOutput = [];
|
|
208
|
+
Object.values(oneOfTypes).forEach((oneOfTypeDef) => {
|
|
209
|
+
oneOfTypeDef.jsDocComment = jsdoc;
|
|
210
|
+
typesOutput.push(
|
|
211
|
+
dom.emit(oneOfTypeDef, { singleLineJsDocComments: true }).trim()
|
|
212
|
+
);
|
|
213
|
+
});
|
|
214
|
+
typesOutput.push(
|
|
215
|
+
dom.emit(fieldsType, { singleLineJsDocComments: true }).trim()
|
|
216
|
+
);
|
|
172
217
|
if (fileId.startsWith("/collections/")) {
|
|
173
218
|
const baseType = dom.create.namedTypeReference("RootCMSDoc");
|
|
174
219
|
baseType.typeArguments.push(dom.create.namedTypeReference(fieldsInterface));
|
|
175
220
|
const docType = dom.create.alias(
|
|
176
|
-
`${
|
|
221
|
+
`${typeId}Doc`,
|
|
177
222
|
baseType,
|
|
178
223
|
dom.DeclarationFlags.Export
|
|
179
224
|
);
|
|
180
225
|
docType.jsDocComment = jsdoc;
|
|
181
226
|
const docTypeOutput = dom.emit(docType, { singleLineJsDocComments: true }).trim();
|
|
182
|
-
|
|
227
|
+
typesOutput.push(docTypeOutput);
|
|
183
228
|
}
|
|
184
|
-
return
|
|
229
|
+
return reformatOutput(typesOutput.join("\n\n"));
|
|
185
230
|
}
|
|
186
|
-
function
|
|
231
|
+
function reformatOutput(input) {
|
|
187
232
|
const lines = input.split("\n");
|
|
188
233
|
const results = [];
|
|
189
234
|
for (const line of lines) {
|
|
190
|
-
const convertedLine = line.replace(/ {4}/g, " ");
|
|
235
|
+
const convertedLine = line.replace(/ {4}/g, " ").replaceAll('"', "'");
|
|
191
236
|
results.push(convertedLine);
|
|
192
237
|
}
|
|
193
238
|
return results.join("\n");
|
|
@@ -342,4 +387,4 @@ export {
|
|
|
342
387
|
generateTypes,
|
|
343
388
|
initFirebase
|
|
344
389
|
};
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL2NsaS50cyIsICIuLi9jbGkvZ2VuZXJhdGUtdHlwZXMudHMiLCAiLi4vY2xpL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9zZWN1cml0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtDb21tYW5kfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtiZ0dyZWVuLCBibGFja30gZnJvbSAna2xldXIvY29sb3JzJztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi9nZW5lcmF0ZS10eXBlcy5qcyc7XG5pbXBvcnQge2luaXRGaXJlYmFzZX0gZnJvbSAnLi9pbml0LWZpcmViYXNlLmpzJztcblxuY2xhc3MgQ2xpUnVubmVyIHtcbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgcnVuKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKHRoaXMubmFtZSk7XG4gICAgcHJvZ3JhbS52ZXJzaW9uKHRoaXMudmVyc2lvbik7XG4gICAgcHJvZ3JhbS5vcHRpb24oJy1xLCAtLXF1aWV0JywgJ3F1aWV0Jyk7XG4gICAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoY21kKSA9PiB7XG4gICAgICBpZiAoIWNtZC5vcHRzKCkucXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFx1RDgzRVx1REQ1NSAke2JnR3JlZW4oYmxhY2soYCAke3RoaXMubmFtZX0gYCkpfSB2JHt0aGlzLnZlcnNpb259XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdpbml0LWZpcmViYXNlJylcbiAgICAgIC5hbGlhcygnaW5pdCcpXG4gICAgICAuZGVzY3JpcHRpb24oJ2luaXRzIHRoZSBmaXJlYmFzZSBwcm9qZWN0IHByb3BlciBzZWN1cml0eSBydWxlcycpXG4gICAgICAub3B0aW9uKCctLXByb2plY3QgPHByb2plY3Q+JywgJ2djcCBwcm9qZWN0IGlkJylcbiAgICAgIC5vcHRpb24oJy0tYWRtaW4gPGVtYWlsPicsICdhZGRzIGFuIGFkbWluIHRvIHRoZSBwcm9qZWN0JylcbiAgICAgIC5hY3Rpb24oaW5pdEZpcmViYXNlKTtcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZCgnZ2VuZXJhdGUtdHlwZXMnKVxuICAgICAgLmFsaWFzKCd0eXBlcycpXG4gICAgICAuZGVzY3JpcHRpb24oXG4gICAgICAgICdnZW5lcmF0ZXMgcm9vdC1jbXMuZC50cyBmcm9tICouc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0J1xuICAgICAgKVxuICAgICAgLmFjdGlvbihnZW5lcmF0ZVR5cGVzKTtcbiAgICBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMoYXJndik7XG4gIH1cbn1cblxuZXhwb3J0IHtDbGlSdW5uZXIsIGdlbmVyYXRlVHlwZXMsIGluaXRGaXJlYmFzZX07XG4iLCAiaW1wb3J0IHtwcm9taXNlcyBhcyBmc30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge2xvYWRSb290Q29uZmlnLCB2aXRlU3NyTG9hZE1vZHVsZX0gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJ2R0cy1kb20nO1xuXG5pbXBvcnQge0ZpZWxkLCBTY2hlbWF9IGZyb20gJy4uL2NvcmUvc2NoZW1hLmpzJztcblxudHlwZSBQcm9qZWN0TW9kdWxlID0gdHlwZW9mIGltcG9ydCgnLi4vY29yZS9wcm9qZWN0LmpzJyk7XG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXMoKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgY29uc3QgcHJvamVjdCA9IChhd2FpdCB2aXRlU3NyTG9hZE1vZHVsZShcbiAgICByb290Q29uZmlnLFxuICAgIG1vZHVsZVBhdGhcbiAgKSkgYXMgUHJvamVjdE1vZHVsZTtcbiAgY29uc3Qgc2NoZW1hcyA9IHByb2plY3QuZ2V0UHJvamVjdFNjaGVtYXMoKTtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAncm9vdC1jbXMuZC50cycpO1xuICBhd2FpdCBnZW5lcmF0ZVNjaGVtYUR0cyhvdXRwdXRQYXRoLCBzY2hlbWFzKTtcbiAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG59XG5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0ltYWdlIHtcbiAgc3JjOiBzdHJpbmc7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGFsdD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUm9vdENNU09uZU9mPFQgPSBhbnk+ID0gVCAmIHtcbiAgX3R5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmljaFRleHQge1xuICBibG9ja3M6IFJvb3RDTVNSaWNoVGV4dEJsb2NrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JlZmVyZW5jZSB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0RvYzxGaWVsZHMgZXh0ZW5kcyB7fT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICAvKiogU3lzdGVtLWxldmVsIG1ldGFkYXRhLiAqL1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIC8qKiBVc2VyLWVudGVyZWQgZmllbGQgdmFsdWVzIGZyb20gdGhlIENNUy4gKi9cbiAgZmllbGRzPzogRmllbGRzO1xufWA7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcm9vdC1jbXMuZC50cyBmaWxlIGZyb20gdGhlIC5zY2hlbWEudHMgZmlsZXMgaW4gdGhlIHByb2plY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYUR0cyhcbiAgb3V0cHV0UGF0aDogc3RyaW5nLFxuICBzY2hlbWFzOiBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+XG4pIHtcbiAgY29uc3QgcmVzdWx0cyA9IFtURU1QTEFURV07XG4gIGZvciAoY29uc3QgZmlsZUlkIGluIHNjaGVtYXMpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW2ZpbGVJZF07XG4gICAgcmVzdWx0cy5wdXNoKHJlbmRlclNjaGVtYShmaWxlSWQsIHNjaGVtYSkpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdHNcbiAgICAuam9pbignXFxuXFxuJylcbiAgICAucmVwbGFjZUFsbCgnLyoqICAnLCAnLyoqICcpXG4gICAgLnJlcGxhY2VBbGwoJyAgKi8nLCAnICovJylcbiAgICAucmVwbGFjZSgvXFxyXFxufFxccnxcXG4vZywgJ1xcbicpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0UGF0aCwgb3V0cHV0LCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gZmllbGRQcm9wZXJ0eShmaWVsZDogRmllbGQpOiBkb20uUHJvcGVydHlEZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHByb3AgPSBkb20uY3JlYXRlLnByb3BlcnR5KFxuICAgIGZpZWxkLmlkISxcbiAgICBmaWVsZFR5cGUoZmllbGQpLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLk9wdGlvbmFsXG4gICk7XG4gIGNvbnN0IGpzZG9jID0gW107XG4gIGlmIChmaWVsZC5sYWJlbCkge1xuICAgIGlmIChmaWVsZC5oZWxwKSB7XG4gICAgICBqc2RvYy5wdXNoKGAke2ZpZWxkLmxhYmVsfS4gJHtmaWVsZC5oZWxwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBqc2RvYy5wdXNoKGZpZWxkLmxhYmVsKTtcbiAgICB9XG4gIH1cbiAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIHtcbiAgICBqc2RvYy5wdXNoKCdAZGVwcmVjYXRlZCcpO1xuICB9XG4gIGlmIChqc2RvYy5sZW5ndGggPiAwKSB7XG4gICAgcHJvcC5qc0RvY0NvbW1lbnQgPSBqc2RvYy5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn1cblxuZnVuY3Rpb24gZmllbGRUeXBlKGZpZWxkOiBGaWVsZCk6IGRvbS5UeXBlIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZmllbGRUeXBlKGZpZWxkLm9mKSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb20udHlwZS5ib29sZWFuO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLm51bWJlcjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIGNvbnN0IGltYWdlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TSW1hZ2UnKTtcbiAgICByZXR1cm4gaW1hZ2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKFtkb20uY3JlYXRlLnByb3BlcnR5KCdzcmMnLCBkb20udHlwZS5zdHJpbmcpXSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZG9tLnR5cGUuc3RyaW5nKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29uZW9mJykge1xuICAgIGNvbnN0IG9uZW9mVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TT25lT2YnKTtcbiAgICByZXR1cm4gb25lb2ZUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmVmZXJlbmNlJykge1xuICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU1JlZmVyZW5jZScpO1xuICAgIHJldHVybiByZWZlcmVuY2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmljaHRleHQnKSB7XG4gICAgY29uc3QgcmljaHRleHRUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSaWNoVGV4dCcpO1xuICAgIHJldHVybiByaWNodGV4dFR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHN1YnByb3BlcnRpZXMgPSAoZmllbGQuZmllbGRzIHx8IFtdKS5tYXAoKGYpID0+IGZpZWxkUHJvcGVydHkoZikpO1xuICAgIHJldHVybiBkb20uY3JlYXRlLm9iamVjdFR5cGUoc3VicHJvcGVydGllcyk7XG4gIH1cbiAgcmV0dXJuIGRvbS50eXBlLnVua25vd247XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNjaGVtYShmaWxlSWQ6IHN0cmluZywgc2NoZW1hOiBTY2hlbWEpOiBzdHJpbmcge1xuICBjb25zdCBqc2RvYyA9IGBHZW5lcmF0ZWQgZnJvbSBcXGAke2ZpbGVJZH1cXGAuYDtcbiAgY29uc3QgaWQgPSBhbHBoYW51bWVyaWMocGF0aC5wYXJzZShmaWxlSWQpLm5hbWUuc3BsaXQoJy4nKVswXSk7XG4gIGNvbnN0IGZpZWxkc0ludGVyZmFjZSA9IGAke2lkfUZpZWxkc2A7XG4gIGNvbnN0IGZpZWxkcyA9IGRvbS5jcmVhdGUuaW50ZXJmYWNlKFxuICAgIGZpZWxkc0ludGVyZmFjZSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5FeHBvcnRcbiAgKTtcbiAgZmllbGRzLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYS5maWVsZHMpIHtcbiAgICBpZiAoIWZpZWxkLmlkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZmllbGRzLm1lbWJlcnMucHVzaChmaWVsZFByb3BlcnR5KGZpZWxkKSk7XG4gIH1cblxuICBjb25zdCBmaWVsZHNUeXBlT3V0cHV0ID0gZG9tXG4gICAgLmVtaXQoZmllbGRzLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KVxuICAgIC50cmltKCk7XG4gIGlmIChmaWxlSWQuc3RhcnRzV2l0aCgnL2NvbGxlY3Rpb25zLycpKSB7XG4gICAgY29uc3QgYmFzZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0RvYycpO1xuICAgIGJhc2VUeXBlLnR5cGVBcmd1bWVudHMucHVzaChkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZShmaWVsZHNJbnRlcmZhY2UpKTtcbiAgICBjb25zdCBkb2NUeXBlID0gZG9tLmNyZWF0ZS5hbGlhcyhcbiAgICAgIGAke2lkfURvY2AsXG4gICAgICBiYXNlVHlwZSxcbiAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICAgICk7XG4gICAgZG9jVHlwZS5qc0RvY0NvbW1lbnQgPSBqc2RvYztcblxuICAgIGNvbnN0IGRvY1R5cGVPdXRwdXQgPSBkb21cbiAgICAgIC5lbWl0KGRvY1R5cGUsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgICAudHJpbSgpO1xuICAgIHJldHVybiByZWluZGVudChmaWVsZHNUeXBlT3V0cHV0ICsgJ1xcblxcbicgKyBkb2NUeXBlT3V0cHV0KTtcbiAgfVxuICByZXR1cm4gcmVpbmRlbnQoZmllbGRzVHlwZU91dHB1dCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgNC1zcGFjZSBpbmRlbnRzIHRvIDIuXG4gKi9cbmZ1bmN0aW9uIHJlaW5kZW50KGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGlucHV0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgY29udmVydGVkTGluZSA9IGxpbmUucmVwbGFjZSgvIHs0fS9nLCAnICAnKTtcbiAgICByZXN1bHRzLnB1c2goY29udmVydGVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBub24tYWxwaGFudW1lcmljIGNoYXJzIGZyb20gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFscGhhbnVtZXJpYyhpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJyk7XG59XG4iLCAiaW1wb3J0IHtsb2FkUm9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0IHtGaXJlc3RvcmV9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge2dldENtc1BsdWdpbn0gZnJvbSAnLi4vY29yZS9jbGllbnQuanMnO1xuaW1wb3J0IHthcHBseVNlY3VyaXR5UnVsZXN9IGZyb20gJy4uL2NvcmUvc2VjdXJpdHkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRGaXJlYmFzZU9wdGlvbnMge1xuICAvKiogR0NQIHByb2plY3QgaWQuICovXG4gIHByb2plY3Q/OiBzdHJpbmc7XG4gIC8qKiBBZGRzIGFuIEFETUlOIHRvIHRoZSBzZWN1cml0eSBydWxlcy4gKi9cbiAgYWRtaW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RmlyZWJhc2Uob3B0aW9uczogSW5pdEZpcmViYXNlT3B0aW9ucykge1xuICBjb25zdCByb290RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGxvYWRSb290Q29uZmlnKHJvb3REaXIsIHtjb21tYW5kOiAncm9vdC1jbXMnfSk7XG4gIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IGNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgY29uc3QgZ2NwUHJvamVjdElkID1cbiAgICBvcHRpb25zLnByb2plY3QgfHwgY21zUGx1Z2luT3B0aW9ucy5maXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQ7XG5cbiAgaWYgKCFnY3BQcm9qZWN0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpcmViYXNlQ29uZmlnLnByb2plY3RJZCBub3Qgc2V0IGluIGNtcyBwbHVnaW4gb3B0aW9ucycpO1xuICB9XG5cbiAgY29uc29sZS5sb2coYGdjcCBwcm9qZWN0OiAke2djcFByb2plY3RJZH1gKTtcbiAgY29uc29sZS5sb2coJ1x1RDgzRFx1REM2RSB1cGRhdGluZyBzZWN1cml0eSBydWxlcy4uLicpO1xuICBhd2FpdCBhcHBseVNlY3VyaXR5UnVsZXMoZ2NwUHJvamVjdElkKTtcblxuICBpZiAob3B0aW9ucy5hZG1pbikge1xuICAgIGNvbnN0IGRiID0gY21zUGx1Z2luLmdldEZpcmVzdG9yZSgpO1xuICAgIGNvbnN0IHJvb3RQcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgICBhd2FpdCBhZGRBZG1pbihkYiwgcm9vdFByb2plY3RJZCwgb3B0aW9ucy5hZG1pbik7XG4gIH1cblxuICBjb25zb2xlLmxvZygnZG9uZSBpbml0aWFsaXppbmcgZmlyZWJhc2UgcHJvamVjdCEnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkQWRtaW4oZGI6IEZpcmVzdG9yZSwgcHJvamVjdElkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpIHtcbiAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RJZCl9YDtcbiAgY29uc3QgZG9jUmVmID0gZGIuZG9jKGRiUGF0aCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICBsZXQgZGF0YTtcbiAgaWYgKHNuYXBzaG90LmV4aXN0cykge1xuICAgIGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgfHwge307XG4gIH0gZWxzZSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG4gIGNvbnN0IHJvbGVzID0gZGF0YS5yb2xlcyA/PyB7fTtcbiAgcm9sZXNbZW1haWxdID0gJ0FETUlOJztcbiAgZGF0YS5yb2xlcyA9IHJvbGVzO1xuICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICBjb25zb2xlLmxvZyhgYWRkZWQgYWRtaW4gJHtlbWFpbH0gdG8gcHJvamVjdCAke3Byb2plY3RJZH1gKTtcbn1cbiIsICJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7UGx1Z2luLCBSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBGaXJlc3RvcmUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIFdyaXRlQmF0Y2gsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge0NNU1BsdWdpbn0gZnJvbSAnLi9wbHVnaW4uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERvYzxGaWVsZHMgPSBhbnk+IHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbiAgc3lzOiB7XG4gICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgbW9kaWZpZWRBdDogbnVtYmVyO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICBmaXJzdFB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIGZpcnN0UHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGluZ0xvY2tlZDoge1xuICAgICAgbG9ja2VkQXQ6IHN0cmluZztcbiAgICAgIGxvY2tlZEJ5OiBzdHJpbmc7XG4gICAgICByZWFzb246IHN0cmluZztcbiAgICAgIHVudGlsPzogVGltZXN0YW1wO1xuICAgIH07XG4gICAgbG9jYWxlcz86IHN0cmluZ1tdO1xuICB9O1xuICBmaWVsZHM6IEZpZWxkcztcbn1cblxuZXhwb3J0IHR5cGUgRG9jTW9kZSA9ICdkcmFmdCcgfCAncHVibGlzaGVkJztcblxuZXhwb3J0IHR5cGUgVXNlclJvbGUgPSAnQURNSU4nIHwgJ0VESVRPUicgfCAnVklFV0VSJztcblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9ICdHRVQnIHwgJ1BPU1QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHlwZTogJ2h0dHAnIHwgJ2dzaGVldCc7XG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogQ3VycmVudGx5IG9ubHkgdXNlZCBieSBnc2hlZXQuIGBhcnJheWAgcmV0dXJucyB0aGUgc2hlZXQgYXMgYW4gYXJyYXkgb2ZcbiAgICogYXJyYXlzLCBgbWFwYCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZiBvYmplY3RzLlxuICAgKi9cbiAgZGF0YUZvcm1hdD86ICdhcnJheScgfCAnbWFwJztcbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIEhUVFAgcmVxdWVzdHMuXG4gICAqL1xuICBodHRwT3B0aW9ucz86IHtcbiAgICBtZXRob2Q6IEh0dHBNZXRob2Q7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgYm9keT86IHN0cmluZztcbiAgfTtcbiAgY3JlYXRlZEF0OiBUaW1lc3RhbXA7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzeW5jZWRBdD86IFRpbWVzdGFtcDtcbiAgc3luY2VkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlRGF0YTxUID0gYW55PiB7XG4gIGRhdGFTb3VyY2U6IERhdGFTb3VyY2U7XG4gIGRhdGE6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIERhdGFTb3VyY2VNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVEcmFmdE9wdGlvbnMge1xuICAvKipcbiAgICogTG9jYWxlcyB0byBlbmFibGUuXG4gICAqL1xuICBsb2NhbGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVtYWlsIG9mIHVzZXIgbW9kaWZ5aW5nIHRoZSBkb2MuIElmIGJsYW5rLCBkZWZhdWx0cyB0byBgcm9vdC1jbXMtY2xpZW50YC5cbiAgICovXG4gIG1vZGlmaWVkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdERvY3NPcHRpb25zIHtcbiAgbW9kZTogRG9jTW9kZTtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgb3JkZXJCeURpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xuICAvKipcbiAgICogV2hldGhlciB0byBmZXRjaCB0aGUgXCJyYXdcIiB2ZXJzaW9uIG9mIHRoZSBkb2MgKGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiBgc2V0UmF3RG9jKClgKS5cbiAgICovXG4gIHJhdz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q291bnRPcHRpb25zIHtcbiAgbW9kZTogRG9jTW9kZTtcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIFtsb2NhbGU6IHN0cmluZ106IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25zTWFwIHtcbiAgW2hhc2g6IHN0cmluZ106IFRyYW5zbGF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsZVRyYW5zbGF0aW9ucyB7XG4gIFtzb3VyY2U6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkVHJhbnNsYXRpb25zT3B0aW9ucyB7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWxlYXNlIHtcbiAgaWQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRvY0lkcz86IHN0cmluZ1tdO1xuICBjcmVhdGVkQXQ/OiBUaW1lc3RhbXA7XG4gIGNyZWF0ZWRCeT86IHN0cmluZztcbiAgc2NoZWR1bGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHNjaGVkdWxlZEJ5Pzogc3RyaW5nO1xuICBwdWJsaXNoZWRBdD86IFRpbWVzdGFtcDtcbiAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uPFQgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24uXG4gICAqL1xuICBhY3Rpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1c2VyJ3MgZW1haWwgdGhhdCBwZXJmb3JtZWQgdGhlIGFjdGlvbiAob3IgXCJzeXN0ZW1cIikuXG4gICAqL1xuICBieT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3Rpb24gb2NjdXJyZWQuXG4gICAqL1xuICB0aW1lc3RhbXA6IFRpbWVzdGFtcDtcbiAgLyoqXG4gICAqIE1ldGFkYXRhIGZvciB0aGUgYWN0aW9uLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RBY3Rpb25zT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzcGVjaWZpYyBhY3Rpb24uIERlZmF1bHRzIHRvIGFsbCBhY3Rpb25zLlxuICAgKi9cbiAgYWN0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc3BlY2lmaWMgdXNlci4gRGVmYXVsdHMgdG8gYWxsIHVzZXJzLlxuICAgKi9cbiAgYnk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXggbnVtYmVyIG9mIGFjdGlvbnMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byAxMDAuXG4gICAqL1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RDTVNDbGllbnQge1xuICByZWFkb25seSByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICByZWFkb25seSBjbXNQbHVnaW46IENNU1BsdWdpbjtcbiAgcmVhZG9ubHkgcHJvamVjdElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkYjogRmlyZXN0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnO1xuICAgIHRoaXMuY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHRoaXMucm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gdGhpcy5jbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gICAgdGhpcy5wcm9qZWN0SWQgPSBjbXNQbHVnaW5PcHRpb25zLmlkIHx8ICdkZWZhdWx0JztcbiAgICB0aGlzLmFwcCA9IHRoaXMuY21zUGx1Z2luLmdldEZpcmViYXNlQXBwKCk7XG4gICAgdGhpcy5kYiA9IHRoaXMuY21zUGx1Z2luLmdldEZpcmVzdG9yZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBkb2MgZGF0YSBmcm9tIFJvb3QuanMgQ01TLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jPEZpZWxkcyA9IGFueT4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxEb2M8RmllbGRzPiB8IG51bGw+IHtcbiAgICBjb25zdCByYXdEYXRhID0gYXdhaXQgdGhpcy5nZXRSYXdEb2MoY29sbGVjdGlvbklkLCBzbHVnLCBvcHRpb25zKTtcbiAgICBpZiAocmF3RGF0YSkge1xuICAgICAgcmV0dXJuIHVubWFyc2hhbERhdGEocmF3RGF0YSkgYXMgRG9jPEZpZWxkcz47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyByYXcgZG9jIGRhdGEgYXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vd1xuICAgKiB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqL1xuICBhc3luYyBnZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEdldERvY09wdGlvbnNcbiAgKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIC8vIFNsdWdzIHdpdGggc2xhc2hlcyBhcmUgZW5jb2RlZCBhcyBgLS1gIGluIHRoZSBEQi5cbiAgICBzbHVnID0gc2x1Zy5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRyYWZ0IGRhdGEgdG8gYSBkb2MuXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgc2F2ZXMgZGF0YSB0byB0aGUgXCJmaWVsZHNcIiBhdHRyIG9mIHRoZSBkcmFmdCBkb2MuIElmIHlvdSBuZWVkIHRvXG4gICAqIG1vZGlmeSB0aGUgc3lzLWxldmVsIGF0dHJpYnV0ZXMgb2YgdGhlIGRvYywgdXNlIGBzZXRSYXdEb2MoKWAuXG4gICAqL1xuICBhc3luYyBzYXZlRHJhZnREYXRhKFxuICAgIGRvY0lkOiBzdHJpbmcsXG4gICAgZmllbGRzRGF0YTogYW55LFxuICAgIG9wdGlvbnM/OiBTYXZlRHJhZnRPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IHtjb2xsZWN0aW9uLCBzbHVnfSA9IHBhcnNlRG9jSWQoZG9jSWQpO1xuICAgIGNvbnN0IGRyYWZ0RG9jID1cbiAgICAgIChhd2FpdCB0aGlzLmdldFJhd0RvYyhjb2xsZWN0aW9uLCBzbHVnLCB7bW9kZTogJ2RyYWZ0J30pKSB8fCB7fTtcbiAgICBjb25zdCBkcmFmdFN5cyA9IGRyYWZ0RG9jLnN5cyB8fCB7fTtcbiAgICBjb25zdCBtb2RpZmllZEJ5ID0gb3B0aW9ucz8ubW9kaWZpZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcbiAgICBjb25zdCBmaWVsZHMgPSBtYXJzaGFsRGF0YShmaWVsZHNEYXRhIHx8IHt9KTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IGRvY0lkLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHNsdWcsXG4gICAgICBzeXM6IHtcbiAgICAgICAgLi4uZHJhZnRTeXMsXG4gICAgICAgIGNyZWF0ZWRBdDogZHJhZnRTeXMuY3JlYXRlZEF0ID8/IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgY3JlYXRlZEJ5OiBkcmFmdFN5cy5jcmVhdGVkQnkgPz8gbW9kaWZpZWRCeSxcbiAgICAgICAgbW9kaWZpZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBtb2RpZmllZEJ5LFxuICAgICAgICBsb2NhbGVzOiBvcHRpb25zPy5sb2NhbGVzID8/IGRyYWZ0U3lzLmxvY2FsZXMgPz8gWydlbiddLFxuICAgICAgfSxcbiAgICAgIGZpZWxkcyxcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMuc2V0UmF3RG9jKGNvbGxlY3Rpb24sIHNsdWcsIGRhdGEsIHttb2RlOiAnZHJhZnQnfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlZmVyIGBzYXZlRHJhZnREYXRhKCdQYWdlcy9mb28nLCBkYXRhKWAuIE9ubHkgdXNlIHRoaXMgaWYgeW91IGtub3cgd2hhdFxuICAgKiB5b3UncmUgZG9pbmcuXG4gICAqL1xuICBhc3luYyBzZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBvcHRpb25zOiBTZXREb2NPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgYXdhaXQgZG9jUmVmLnNldChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgbGlzdERvY3M8VD4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogTGlzdERvY3NPcHRpb25zXG4gICk6IFByb21pc2U8e2RvY3M6IFRbXX0+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KG9wdGlvbnMub3JkZXJCeSwgb3B0aW9ucy5vcmRlckJ5RGlyZWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICBjb25zdCBkb2NzOiBUW10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMucmF3KSB7XG4gICAgICAgIC8vIEZvciBjYWxsZXJzIHRoYXQgd2lzaCB0byBtb2RpZnkgdGhlIHJhdyBkb2MgdmlhIGBzZXRSYXdEb2MoKWAsXG4gICAgICAgIC8vIHJldHVybiB0aGUgdW5tb2RpZmllZCBkb2MgYXMgcmV0dXJuZWQgZnJvbSBmaXJlc3RvcmUuXG4gICAgICAgIGNvbnN0IHJhd0RvYyA9IHJlc3VsdC5kYXRhKCkgYXMgVDtcbiAgICAgICAgZG9jcy5wdXNoKHJhd0RvYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkb2MgPSB1bm1hcnNoYWxEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgICAgIGRvY3MucHVzaChkb2MpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7ZG9jc307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3MgaW4gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jc0NvdW50KGNvbGxlY3Rpb25JZDogc3RyaW5nLCBvcHRpb25zOiBHZXRDb3VudE9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLnF1ZXJ5KSB7XG4gICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnkuY291bnQoKS5nZXQoKTtcbiAgICBjb25zdCBjb3VudCA9IHJlc3VsdHMuZGF0YSgpLmNvdW50O1xuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBwdWJsaXNoZXMgYSBzZXQgb2YgZG9jcyBieSBpZC5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hEb2NzKFxuICAgIGRvY0lkczogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeTogc3RyaW5nOyBiYXRjaD86IFdyaXRlQmF0Y2h9XG4gICkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gb3B0aW9ucz8ucHVibGlzaGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG5cbiAgICAvLyBGZXRjaCB0aGUgY3VycmVudCBkcmFmdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICBjb25zdCBkb2NSZWZzID0gZG9jSWRzLm1hcCgoZG9jSWQpID0+IHtcbiAgICAgIGNvbnN0IFtjb2xsZWN0aW9uLCBzbHVnXSA9IGRvY0lkLnNwbGl0KCcvJyk7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIXNsdWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBkb2NSZWY7XG4gICAgfSk7XG4gICAgY29uc3QgZG9jU25hcHNob3RzID0gYXdhaXQgdGhpcy5kYi5nZXRBbGwoLi4uZG9jUmVmcyk7XG4gICAgY29uc3QgZG9jcyA9IGRvY1NuYXBzaG90c1xuICAgICAgLy8gUmV0cmlldmUgc25hcHNob3QgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgICAubWFwKChzbmFwc2hvdCkgPT4gc25hcHNob3QuZGF0YSgpIGFzIERvYylcbiAgICAgIC8vIFJlbW92ZSBkb2NzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gICAgICAuZmlsdGVyKChkKSA9PiAhIWQpO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBwdWJsaXNoJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHRoZXJlIGFyZSBubyBwdWJsaXNoaW5nIGxvY2tzIG9uIGFueSBkb2NzLlxuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGlmICh0aGlzLnRlc3RQdWJsaXNoaW5nTG9ja2VkKGRvYykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwdWJsaXNoaW5nIGlzIGxvY2tlZCBmb3IgZG9jOiAke2RvYy5pZH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSBvcHRpb25zPy5iYXRjaCB8fCB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIHN5cywgZmllbGRzfSA9IGRvYztcbiAgICAgIGNvbnN0IGRyYWZ0UmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3QgcHVibGlzaGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgICApO1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPVxuICAgICAgICBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpO1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9IHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IHB1Ymxpc2hlZEJ5O1xuXG4gICAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgICBmaWVsZHM6IGZpZWxkcyB8fCB7fSxcbiAgICAgICAgc3lzOiB7XG4gICAgICAgICAgLi4uc3lzLFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gUmVtb3ZlIHNjaGVkdWxlZCBkb2MsIGlmIGFueS5cbiAgICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICdzeXMucHVibGlzaGVkQnknOiBwdWJsaXNoZWRCeSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgICAgaWYgKGJhdGNoQ291bnQgPj0gNDAwKSB7XG4gICAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgICAgICBiYXRjaENvdW50ID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmF0Y2hDb3VudCA+IDApIHtcbiAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIHNjaGVkdWxlZCBkb2NzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZERvY3MoKSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5kYi5jb2xsZWN0aW9uR3JvdXAoJ1NjaGVkdWxlZCcpLmdldCgpO1xuICAgIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzXG4gICAgICAuZmlsdGVyKChkKSA9PiB7XG4gICAgICAgIC8vIEZpbHRlciBkb2NzIGJ5IHByb2plY3QuXG4gICAgICAgIGlmICghZC5yZWYucGF0aC5zdGFydHNXaXRoKHByb2plY3RDb2xsZWN0aW9uc1BhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbHRlciBkb2NzIHdoZXJlIHNjaGVkdWxlZEF0IGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAvLyBOT1RFKHN0ZXZlbmxlKTogdGhlIGZpbHRlcmluZyBpcyBkb25lIG1hbnVhbGx5IGluc3RlYWQgb2YgdXNpbmcgYSBxdWVyeVxuICAgICAgICAvLyB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuIGluZGV4IGluIGZpcmVzdG9yZS5cbiAgICAgICAgY29uc3QgZGF0YSA9IGQuZGF0YSgpIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2hlZHVsZWRBdDogVGltZXN0YW1wIHwgdW5kZWZpbmVkID0gZGF0YS5zeXM/LnNjaGVkdWxlZEF0O1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNjaGVkdWxlZEF0ICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzICYmIHNjaGVkdWxlZEF0LnRvTWlsbGlzKCkgPD0gbm93XG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZCkgPT4ge1xuICAgICAgICBjb25zdCBkYlBhdGggPSBkLnJlZi5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IGRiUGF0aC5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBzbHVnID0gc2VnbWVudHMuYXQoLTEpO1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gc2VnbWVudHMuYXQoLTMpO1xuICAgICAgICBjb25zdCBpZCA9IGAke2NvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGQuZGF0YSgpLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgc2x1ZyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnbm8gZG9jcyB0byBzY2hlZHVsZScpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1ZywgZGF0YX0gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHtzY2hlZHVsZWRBdCwgc2NoZWR1bGVkQnksIC4uLnN5c30gPSBkYXRhLnN5cyB8fCB7fTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID0gc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gc2NoZWR1bGVkQXQ7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gKHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnKTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBkYXRhLmZpZWxkcyB8fCB7fSxcbiAgICAgICAgc3lzOiB7XG4gICAgICAgICAgLi4uc3lzLFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQXQ6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRCeTogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgICBwdWJsaXNoZWRBdDogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgICBwdWJsaXNoZWRCeTogc2NoZWR1bGVkQnkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gUmVtb3ZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5Jzogc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCcsXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQwMCkge1xuICAgICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICAgICAgYmF0Y2hDb3VudCA9IDA7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXRjaENvdW50ID4gMCkge1xuICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgICByZXR1cm4gcHVibGlzaGVkRG9jcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgZG9jcyBpbiBzY2hlZHVsZWQgcmVsZWFzZXMuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoU2NoZWR1bGVkUmVsZWFzZXMoKSB7XG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1JlbGVhc2VzYDtcbiAgICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuICAgIGNvbnN0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGJcbiAgICAgIC5jb2xsZWN0aW9uKHJlbGVhc2VzUGF0aClcbiAgICAgIC53aGVyZSgnc2NoZWR1bGVkQXQnLCAnPD0nLCBUaW1lc3RhbXAuZnJvbU1pbGxpcyhub3cpKTtcbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG5cbiAgICBmb3IgKGNvbnN0IHNuYXBzaG90IG9mIHF1ZXJ5U25hcHNob3QuZG9jcykge1xuICAgICAgY29uc3QgcmVsZWFzZSA9IHNuYXBzaG90LmRhdGEoKSBhcyBSZWxlYXNlO1xuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRCeSA9IHJlbGVhc2Uuc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG4gICAgICBiYXRjaC51cGRhdGUoc25hcHNob3QucmVmLCB7XG4gICAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICAgICAgc2NoZWR1bGVkQXQ6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgIHNjaGVkdWxlZEJ5OiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLnB1Ymxpc2hEb2NzKHJlbGVhc2UuZG9jSWRzIHx8IFtdLCB7cHVibGlzaGVkQnksIGJhdGNofSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRvYyBpcyBjdXJyZW50bHkgXCJsb2NrZWRcIiBmb3IgcHVibGlzaGluZy5cbiAgICovXG4gIHRlc3RQdWJsaXNoaW5nTG9ja2VkKGRvYzogRG9jKSB7XG4gICAgaWYgKGRvYy5zeXM/LnB1Ymxpc2hpbmdMb2NrZWQpIHtcbiAgICAgIGlmIChkb2Muc3lzLnB1Ymxpc2hpbmdMb2NrZWQudW50aWwpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gVGltZXN0YW1wLm5vdygpLnRvTWlsbGlzKCk7XG4gICAgICAgIGNvbnN0IHVudGlsID0gZG9jLnN5cy5wdWJsaXNoaW5nTG9ja2VkLnVudGlsLnRvTWlsbGlzKCk7XG4gICAgICAgIHJldHVybiBub3cgPCB1bnRpbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIHNhdmVkIGluIHRoZSB0cmFuc2xhdGlvbnMgY29sbGVjdGlvbiwgb3B0aW9uYWxseVxuICAgKiBmaWx0ZXJlZCBieSB0YWcuXG4gICAqXG4gICAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBcIjxoYXNoPlwiOiB7XCJzb3VyY2VcIjogXCJIZWxsb1wiLCBcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnMoXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8VHJhbnNsYXRpb25zTWFwPiB7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zPy50YWdzKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCd0YWdzJywgJ2FycmF5LWNvbnRhaW5zLWFueScsIG9wdGlvbnMudGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwID0ge307XG4gICAgcXVlcnlTbmFwc2hvdC5mb3JFYWNoKChkb2MpID0+IHtcbiAgICAgIGNvbnN0IGhhc2ggPSBkb2MuaWQ7XG4gICAgICB0cmFuc2xhdGlvbnNNYXBbaGFzaF0gPSBkb2MuZGF0YSgpIGFzIFRyYW5zbGF0aW9uO1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNNYXA7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSBtYXAgb2YgdHJhbnNsYXRpb25zLCBlLmcuOlxuICAgKiBgYGBcbiAgICogYXdhaXQgY2xpZW50LnNhdmVUcmFuc2xhdGlvbnMoe1xuICAgKiAgIFwiSGVsbG9cIjoge1wiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzYXZlVHJhbnNsYXRpb25zKFxuICAgIHRyYW5zbGF0aW9uczoge1xuICAgICAgW3NvdXJjZTogc3RyaW5nXToge1tsb2NhbGU6IHN0cmluZ106IHN0cmluZ307XG4gICAgfSxcbiAgICB0YWdzPzogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBPYmplY3QuZW50cmllcyh0cmFuc2xhdGlvbnMpLmZvckVhY2goKFtzb3VyY2UsIHNvdXJjZVRyYW5zbGF0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldFRyYW5zbGF0aW9uS2V5KHNvdXJjZSk7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvblJlZiA9IHRoaXMuZGIuZG9jKGAke3RyYW5zbGF0aW9uc1BhdGh9LyR7aGFzaH1gKTtcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgICAgLi4uc291cmNlVHJhbnNsYXRpb25zLFxuICAgICAgICBzb3VyY2U6IHRoaXMubm9ybWFsaXplU3RyaW5nKHNvdXJjZSksXG4gICAgICB9O1xuICAgICAgaWYgKHRhZ3MpIHtcbiAgICAgICAgZGF0YS50YWdzID0gdGFncztcbiAgICAgIH1cbiAgICAgIGJhdGNoLnNldCh0cmFuc2xhdGlvblJlZiwgZGF0YSwge21lcmdlOiB0cnVlfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG4gICAgfSk7XG4gICAgaWYgKGJhdGNoQ291bnQgPiA1MDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXAgdG8gNTAwIHRyYW5zbGF0aW9ucyBjYW4gYmUgc2F2ZWQgYXQgYSB0aW1lLicpO1xuICAgIH1cbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBcImtleVwiIHVzZWQgZm9yIGEgdHJhbnNsYXRpb24gYXMgc3RvcmVkIGluIHRoZSBkYi4gVHJhbnNsYXRpb25zXG4gICAqIGFyZSBzdG9yZWQgdW5kZXIgYFByb2plY3RzLzxwcm9qZWN0IGlkPi9UcmFuc2xhdGlvbnMvPHNoYTEgaGFzaD5gLlxuICAgKi9cbiAgZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaGExID0gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaCgnc2hhMScpXG4gICAgICAudXBkYXRlKHRoaXMubm9ybWFsaXplU3RyaW5nKHNvdXJjZSkpXG4gICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICByZXR1cm4gc2hhMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgYSBzdHJpbmcgdGhhdCdzIHVzZWQgZm9yIHRyYW5zbGF0aW9ucy4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZzpcbiAgICogLSBSZW1vdmVzIGFueSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICogLSBSZW1vdmVzIHNwYWNlcyBhdCB0aGUgZW5kIG9mIGFueSBsaW5lXG4gICAqL1xuICBub3JtYWxpemVTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaW5lcyA9IFN0cmluZyhzdHIpXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW1FbmQoKSk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRyYW5zbGF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiSGVsbG9cIjogXCJCb25qb3VyXCIsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2FkVHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuICApOiBQcm9taXNlPExvY2FsZVRyYW5zbGF0aW9ucz4ge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc01hcCA9IGF3YWl0IHRoaXMubG9hZFRyYW5zbGF0aW9ucyhvcHRpb25zKTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25zRm9yTG9jYWxlKHRyYW5zbGF0aW9uc01hcCwgbG9jYWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGF0YSBzb3VyY2UgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqL1xuICBhc3luYyBnZXREYXRhU291cmNlKGRhdGFTb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpIGFzIERhdGFTb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNzIGEgZGF0YSBzb3VyY2UgdG8gZHJhZnQgc3RhdGUuXG4gICAqL1xuICBhc3luYyBzeW5jRGF0YVNvdXJjZShkYXRhU291cmNlSWQ6IHN0cmluZywgb3B0aW9ucz86IHtzeW5jZWRCeT86IHN0cmluZ30pIHtcbiAgICBjb25zdCBkYXRhU291cmNlID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlKGRhdGFTb3VyY2VJZCk7XG4gICAgaWYgKCFkYXRhU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRhdGEgc291cmNlIG5vdCBmb3VuZDogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2hEYXRhKGRhdGFTb3VyY2UpO1xuXG4gICAgY29uc3QgZGF0YVNvdXJjZURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfWBcbiAgICApO1xuICAgIGNvbnN0IGRhdGFEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vRGF0YS9kcmFmdGBcbiAgICApO1xuICAgIGNvbnN0IHN5bmNlZEJ5ID0gb3B0aW9ucz8uc3luY2VkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG5cbiAgICBjb25zdCB1cGRhdGVkRGF0YVNvdXJjZTogRGF0YVNvdXJjZSA9IHtcbiAgICAgIC4uLmRhdGFTb3VyY2UsXG4gICAgICBzeW5jZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgc3luY2VkQnk6IHN5bmNlZEJ5LFxuICAgIH07XG5cbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBiYXRjaC5zZXQoZGF0YURvY1JlZiwge1xuICAgICAgZGF0YVNvdXJjZTogdXBkYXRlZERhdGFTb3VyY2UsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH0pO1xuICAgIGJhdGNoLnVwZGF0ZShkYXRhU291cmNlRG9jUmVmLCB7XG4gICAgICBzeW5jZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgc3luY2VkQnk6IHN5bmNlZEJ5LFxuICAgIH0pO1xuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuXG4gICAgY29uc29sZS5sb2coYHN5bmNlZCBkYXRhIHNvdXJjZTogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgY29uc29sZS5sb2coYHN5bmNlZCBieTogJHtzeW5jZWRCeX1gKTtcbiAgfVxuXG4gIGFzeW5jIHB1Ymxpc2hEYXRhU291cmNlKFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7cHVibGlzaGVkQnk/OiBzdHJpbmd9XG4gICkge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkKTtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBzb3VyY2Ugbm90IGZvdW5kOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhU291cmNlRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZkRyYWZ0ID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L2RyYWZ0YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZlB1Ymxpc2hlZCA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9wdWJsaXNoZWRgXG4gICAgKTtcblxuICAgIGNvbnN0IGRhdGFSZXMgPSBhd2FpdCB0aGlzLmdldEZyb21EYXRhU291cmNlKGRhdGFTb3VyY2VJZCwge21vZGU6ICdkcmFmdCd9KTtcblxuICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gb3B0aW9ucz8ucHVibGlzaGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCc7XG5cbiAgICBjb25zdCB1cGRhdGVkRGF0YVNvdXJjZTogRGF0YVNvdXJjZSA9IHtcbiAgICAgIC4uLmRhdGFTb3VyY2UsXG4gICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgIH07XG5cbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBiYXRjaC5zZXQoZGF0YURvY1JlZlB1Ymxpc2hlZCwge1xuICAgICAgZGF0YVNvdXJjZTogdXBkYXRlZERhdGFTb3VyY2UsXG4gICAgICBkYXRhOiBkYXRhUmVzPy5kYXRhIHx8IG51bGwsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFEb2NSZWZEcmFmdCwge1xuICAgICAgZGF0YVNvdXJjZTogdXBkYXRlZERhdGFTb3VyY2UsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFTb3VyY2VEb2NSZWYsIHtcbiAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG5cbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkIGRhdGEgJHtkYXRhU291cmNlSWR9YCk7XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCBieTogJHtwdWJsaXNoZWRCeX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hEYXRhKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHtcbiAgICBpZiAoZGF0YVNvdXJjZS50eXBlID09PSAnaHR0cCcpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoSHR0cERhdGEoZGF0YVNvdXJjZSk7XG4gICAgfVxuICAgIC8vIFRPRE8oc3RldmVubGUpOiBpbXBsLlxuICAgIC8vIGlmIChkYXRhU291cmNlLnR5cGUgPT09ICdnc2hlZXQnKSB7XG4gICAgLy8gICByZXR1cm4gYXdhaXQgZmV0Y2hHc2hlZXREYXRhKGRhdGFTb3VyY2UpO1xuICAgIC8vIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgc291cmNlOiAke2RhdGFTb3VyY2UudHlwZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hIdHRwRGF0YShkYXRhU291cmNlOiBEYXRhU291cmNlKSB7XG4gICAgY29uc3QgdXJsID0gZGF0YVNvdXJjZS51cmwgfHwgJyc7XG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cmwgbm90IHN1cHBvcnRlZDogJHt1cmx9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/Lm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/LmhlYWRlcnMgfHwgW10sXG4gICAgICBib2R5OiBkYXRhU291cmNlLmh0dHBPcHRpb25zPy5ib2R5IHx8IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlcSBmYWlsZWQ6ICR7ZXJyfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gU3RyaW5nKHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpO1xuICAgIGlmIChjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzLmpzb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBkYXRhIGZyb20gYSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIGFzeW5jIGdldEZyb21EYXRhU291cmNlPFQgPSBhbnk+KFxuICAgIGRhdGFTb3VyY2VJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7bW9kZT86ICdkcmFmdCcgfCAncHVibGlzaGVkJ31cbiAgKTogUHJvbWlzZTxEYXRhU291cmNlRGF0YTxUPiB8IG51bGw+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucz8ubW9kZSB8fCAncHVibGlzaGVkJztcbiAgICBpZiAoIShtb2RlID09PSAnZHJhZnQnIHx8IG1vZGUgPT09ICdwdWJsaXNoZWQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG1vZGU6ICR7bW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhU291cmNlSWQgfHwgZGF0YVNvdXJjZUlkLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkYXRhIHNvdXJjZSBpZDogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9EYXRhLyR7bW9kZX1gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKSBhcyBEYXRhU291cmNlRGF0YTxUPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdXNlcidzIHJvbGUgZnJvbSB0aGUgcHJvamVjdCdzIEFDTC5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJSb2xlKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJSb2xlIHwgbnVsbD4ge1xuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH1gKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBjb25zdCBkYXRhID0gc25hcHNob3QuZGF0YSgpIHx8IHt9O1xuICAgIGNvbnN0IGFjbCA9IGRhdGEucm9sZXMgfHwge307XG5cbiAgICBpZiAoZW1haWwgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gYWNsW2VtYWlsXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB3aWxkY2FyZCBkb21haW5zLCBlLmcuIGAqQGV4YW1wbGUuY29tYC5cbiAgICBpZiAoIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgaW52YWxpZCBlbWFpbDogJHtlbWFpbH1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkb21haW4gPSBlbWFpbC5zcGxpdCgnQCcpLmF0KC0xKTtcbiAgICBpZiAoZG9tYWluICYmIGAqQCR7ZG9tYWlufWAgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gYWNsW2AqQCR7ZG9tYWlufWBdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB1c2VyIGV4aXN0cyBpbiB0aGUgQUNMIGxpc3QuXG4gICAqL1xuICBhc3luYyB1c2VyRXhpc3RzSW5BY2woZW1haWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9YCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgICBjb25zdCBhY2wgPSBkYXRhLnJvbGVzIHx8IHt9O1xuICAgIGlmIChlbWFpbCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdpbGRjYXJkIGRvbWFpbnMsIGUuZy4gYCpAZXhhbXBsZS5jb21gLlxuICAgIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpbnZhbGlkIGVtYWlsOiAke2VtYWlsfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb21haW4gPSBlbWFpbC5zcGxpdCgnQCcpLmF0KC0xKTtcbiAgICBpZiAoZG9tYWluICYmIGAqQCR7ZG9tYWlufWAgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgbG9nQWN0aW9uKGFjdGlvbjogc3RyaW5nLCBvcHRpb25zPzoge2J5Pzogc3RyaW5nOyBtZXRhZGF0YT86IGFueX0pIHtcbiAgICBpZiAoIWFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkOiBcImFjdGlvblwiJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgIHRpbWVzdGFtcDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgYnk6IG9wdGlvbnM/LmJ5IHx8ICdzeXN0ZW0nLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnM/Lm1ldGFkYXRhIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgY29sUmVmID0gdGhpcy5kYi5jb2xsZWN0aW9uKGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9BY3Rpb25Mb2dzYCk7XG4gICAgYXdhaXQgY29sUmVmLmFkZChkYXRhKTtcblxuICAgIGNvbnN0IG1ldGFTdHIgPSBvcHRpb25zPy5tZXRhZGF0YSA/IHN0cmluZ2lmeU9iaihvcHRpb25zLm1ldGFkYXRhKSA6ICcnO1xuICAgIGNvbnNvbGUubG9nKGBbJHtkYXRhLnRpbWVzdGFtcC50b01pbGxpcygpfV0gYWN0aW9uOiAke2FjdGlvbn0gJHttZXRhU3RyfWApO1xuXG4gICAgLy8gQ2FsbCB0aGUgYG9uQWN0aW9uKClgIGNhbGxiYWNrIGZyb20gY21zUGx1Z2luKCkuXG4gICAgY29uc3QgY21zUGx1Z2luQ29uZmlnID0gdGhpcy5jbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gICAgaWYgKGNtc1BsdWdpbkNvbmZpZy5vbkFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY21zUGx1Z2luQ29uZmlnLm9uQWN0aW9uKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGBkYXRhYCBpcyBhIHJpY2ggdGV4dCBkYXRhIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmljaFRleHREYXRhKGRhdGE6IGFueSkge1xuICAvLyBUaGUgUmljaFRleHRFZGl0b3IgdXNlcyBlZGl0b3JqcyB1bmRlciB0aGUgaG9vZCwgdGhlIGRhdGEgZm9ybWF0IGlzXG4gIC8vIHNvbWV0aGluZyBsaWtlOlxuICAvLyAge1xuICAvLyAgIFwidGltZVwiOiAxNzIxNzYxMjExNzIwLFxuICAvLyAgIFwidmVyc2lvblwiOiBcIjIuMjguMlwiLFxuICAvLyAgIFwiYmxvY2tzXCI6IFsuLi5dXG4gIC8vIH1cbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgaXNPYmplY3QoZGF0YSkgJiYgQXJyYXkuaXNBcnJheShkYXRhLmJsb2NrcykgJiYgZGF0YS50aW1lICYmIGRhdGEudmVyc2lvblxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWc6IFJvb3RDb25maWcpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IHJvb3RDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2lucy5maW5kKChwbHVnaW4pID0+IHBsdWdpbi5uYW1lID09PSAncm9vdC1jbXMnKTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJvb3QtY21zIHBsdWdpbiBjb25maWcgaW4gcm9vdC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gcGx1Z2luIGFzIENNU1BsdWdpbjtcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgYXJyYXkgb2Ygb2JqZWN0cyBpbnRvIFwiYXJyYXkgb2JqZWN0c1wiXG4gKiBmb3Igc3RvcmFnZSBpbiBmaXJlc3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJzaGFsRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICAvLyBBdm9pZCBjaGFuZ2luZyB0aGUgZm9ybWF0IG9mIHJpY2ggdGV4dCBkYXRhLlxuICBpZiAoaXNSaWNoVGV4dERhdGEoZGF0YSkpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWFyc2hhbERhdGEodmFsKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgaWYgKHZhbC5sZW5ndGggPiAwICYmIHZhbC5zb21lKChpdGVtKSA9PiBpc09iamVjdChpdGVtKSkpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB2YWwubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFyc2hhbERhdGEoaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0b0FycmF5T2JqZWN0KGl0ZW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgVGltZXN0YW1wIG9iamVjdHMgdG8gbWlsbGlzIGFuZCBhbnlcbiAqIF9hcnJheSBtYXBzIHRvIG5vcm1hbCBhcnJheXMuXG4gKlxuICogRS5nLjpcbiAqXG4gKiBub3JtYWxpemVEYXRhKHtcbiAqICAgc3lzOiB7bW9kaWZpZWRBdDogVGltZXN0YW1wKDEyMyl9LFxuICogICBmaWVsZHM6IHtcbiAqICAgICBfYXJyYXk6IFsnYXNkZiddLFxuICogICAgIGFzZGY6IHt0aXRsZTogJ2hlbGxvJ31cbiAqICAgfVxuICogfSlcbiAqIC8vID0+IHtzeXM6IHttb2RpZmllZEF0OiAxMjN9LCBmaWVsZHM6IHtmb286IFt7dGl0bGU6ICdoZWxsbyd9XX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmICh2YWwudG9NaWxsaXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWwudG9NaWxsaXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0Lmhhc093bih2YWwsICdfYXJyYXknKSAmJiBBcnJheS5pc0FycmF5KHZhbC5fYXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHZhbC5fYXJyYXkubWFwKChhcnJheUtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnVubWFyc2hhbERhdGEodmFsW2FycmF5S2V5XSB8fCB7fSksXG4gICAgICAgICAgICBfYXJyYXlLZXk6IGFycmF5S2V5LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRba2V5XSA9IGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdW5tYXJzaGFsRGF0YSh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5tYXJzaGFsRGF0YSgpYCBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoZGF0YTogYW55KTogYW55IHtcbiAgcmV0dXJuIHVubWFyc2hhbERhdGEoZGF0YSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIF9hcnJheTogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhbiBhcnJheSBpbnRvIGFuIGBBcnJheU9iamVjdGAsIGUuZy46XG4gKlxuICogYGBgXG4gKiBtYXJzaGFsQXJyYXkoWzEsIDIsIDNdKVxuICogLy8gPT4ge2E6IDEsIGI6IDIsIGM6IDMsIF9hcnJheTogWydhJywgJ2InLCAnYyddfVxuICogYGBgXG4gKlxuICogVGhpcyBkYXRhYmFzZSBzdG9yYWdlIG1ldGhvZCBtYWtlcyBpdCBlYXNpZXIgdG8gdXBkYXRlIGEgc2luZ2xlIGZpZWxkIGluIGFcbiAqIGRlZXBseSBuZXN0ZWQgYXJyYXkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheU9iamVjdChhcnI6IGFueVtdKTogQXJyYXlPYmplY3Qge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgY29uc3QgYXJyT2JqZWN0OiBBcnJheU9iamVjdCA9IHtfYXJyYXk6IFtdfTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgIGNvbnN0IGtleSA9IHJhbmRTdHJpbmcoNik7XG4gICAgYXJyT2JqZWN0W2tleV0gPSBpdGVtO1xuICAgIGFyck9iamVjdC5fYXJyYXkucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBhcnJPYmplY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBtYXJzaGFsQXJyYXkgPSB0b0FycmF5T2JqZWN0O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIGBBcnJheU9iamVjdGAgdG8gYSBub3JtYWwgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxBcnJheShhcnJPYmplY3Q6IEFycmF5T2JqZWN0KTogYW55W10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyT2JqZWN0Py5fYXJyYXkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGFyciA9IGFyck9iamVjdC5fYXJyYXkubWFwKChrOiBzdHJpbmcpID0+IGFyck9iamVjdFtrXSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJhbmRTdHJpbmcobGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgY2hhcnMgPVxuICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB0cmFuc2xhdGlvbnMgbWFwIGZyb20gYGxvYWRUcmFuc2xhdGlvbnMoKWAgdG8gYSBtYXAgb2Ygc291cmNlIHRvXG4gKiB0cmFuc2xhdGVkIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGxvY2FsZS5cbiAqXG4gKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gKiBgYGBcbiAqIHtcbiAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRpb25zRm9yTG9jYWxlKFxuICB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCxcbiAgbG9jYWxlOiBzdHJpbmdcbikge1xuICBjb25zdCBsb2NhbGVUcmFuc2xhdGlvbnM6IExvY2FsZVRyYW5zbGF0aW9ucyA9IHt9O1xuICBPYmplY3QudmFsdWVzKHRyYW5zbGF0aW9uc01hcCkuZm9yRWFjaCgoc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5nLnNvdXJjZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHN0cmluZ1tsb2NhbGVdIHx8IHN0cmluZy5lbiB8fCBzdHJpbmcuc291cmNlO1xuICAgIGxvY2FsZVRyYW5zbGF0aW9uc1tzb3VyY2VdID0gdHJhbnNsYXRpb247XG4gIH0pO1xuICByZXR1cm4gbG9jYWxlVHJhbnNsYXRpb25zO1xufVxuXG4vKiogQSBwcmV0dHkgcHJpbnRlciBmb3IgSmF2YVNjcmlwdCBvYmplY3RzLiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5T2JqKG9iajogYW55KSB7XG4gIGZ1bmN0aW9uIGZvcm1hdChvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGBcIiR7b2JqLnJlcGxhY2VBbGwoJ1wiJywgJ1xcXFxcIicpfVwiYDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKG9iaik7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBgWyR7b2JqLm1hcChmb3JtYXQpLmpvaW4oJywgJyl9XWA7XG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXM6IHN0cmluZ1tdID0gT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIGAke2tleX06ICR7Zm9ybWF0KHZhbHVlKX1gO1xuICAgIH0pO1xuICAgIHJldHVybiBgeyR7ZW50cmllcy5qb2luKCcsICcpfX1gO1xuICB9XG4gIHJldHVybiBmb3JtYXQob2JqKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBkb2NJZCAoZS5nLiBgUGFnZXMvZm9vYCkgYW5kIHJldHVybnMgdGhlIGBjb2xsZWN0aW9uYCBhbmQgYHNsdWdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEb2NJZChkb2NJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHNlcEluZGV4ID0gZG9jSWQuaW5kZXhPZignLycpO1xuICBpZiAoc2VwSW5kZXggPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkb2MgaWQ6ICR7ZG9jSWR9YCk7XG4gIH1cbiAgY29uc3QgY29sbGVjdGlvbiA9IGRvY0lkLnNsaWNlKDAsIHNlcEluZGV4KTtcbiAgY29uc3Qgc2x1ZyA9IGRvY0lkLnNsaWNlKHNlcEluZGV4ICsgMSkucmVwbGFjZUFsbCgnLycsICctLScpO1xuICBpZiAoIWNvbGxlY3Rpb24gfHwgIXNsdWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZG9jIGlkOiAke2RvY0lkfWApO1xuICB9XG4gIHJldHVybiB7Y29sbGVjdGlvbiwgc2x1Z307XG59XG4iLCAiaW1wb3J0IHtpbml0aWFsaXplQXBwfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtnZXRTZWN1cml0eVJ1bGVzfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9zZWN1cml0eS1ydWxlcyc7XG5cbmV4cG9ydCBjb25zdCBGSVJFU1RPUkVfUlVMRVMgPSBgcnVsZXNfdmVyc2lvbiA9ICcyJztcbnNlcnZpY2UgY2xvdWQuZmlyZXN0b3JlIHtcbiAgbWF0Y2ggL2RhdGFiYXNlcy97ZGF0YWJhc2V9L2RvY3VtZW50cyB7XG4gICAgbWF0Y2ggL3tkb2N1bWVudD0qKn0ge1xuICAgICAgYWxsb3cgcmVhZCwgd3JpdGU6IGlmIGZhbHNlO1xuICAgIH1cblxuICAgIG1hdGNoIC9Qcm9qZWN0cy97cHJvamVjdH0ge1xuICAgICAgYWxsb3cgd3JpdGU6XG4gICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VySXNBZG1pbigpO1xuICAgICAgYWxsb3cgcmVhZDpcbiAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJDYW5SZWFkKCk7XG5cbiAgICAgIG1hdGNoIC97Y29sbGVjdGlvbn0ve2RvY3VtZW50PSoqfSB7XG4gICAgICAgIGFsbG93IHdyaXRlOlxuICAgICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VyQ2FuV3JpdGUoKTtcbiAgICAgICAgYWxsb3cgcmVhZDpcbiAgICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlckNhblJlYWQoKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNTaWduZWRJbigpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3QuYXV0aCAhPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBnZXRSb2xlcygpIHtcbiAgICAgICAgcmV0dXJuIGdldCgvZGF0YWJhc2VzLyQoZGF0YWJhc2UpL2RvY3VtZW50cy9Qcm9qZWN0cy8kKHByb2plY3QpKS5kYXRhLnJvbGVzO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB1c2VyQ2FuUmVhZCgpIHtcbiAgICAgICAgbGV0IHJvbGVzID0gZ2V0Um9sZXMoKTtcbiAgICAgICAgbGV0IGVtYWlsID0gcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsO1xuICAgICAgICBsZXQgZG9tYWluID0gJypAJyArIGVtYWlsLnNwbGl0KCdAJylbMV07XG4gICAgICAgIHJldHVybiAocm9sZXNbZW1haWxdIGluIFsnQURNSU4nLCAnRURJVE9SJywgJ1ZJRVdFUiddKSB8fCAocm9sZXNbZG9tYWluXSBpbiBbJ0FETUlOJywgJ0VESVRPUicsICdWSUVXRVInXSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVzZXJDYW5Xcml0ZSgpIHtcbiAgICAgICAgbGV0IHJvbGVzID0gZ2V0Um9sZXMoKTtcbiAgICAgICAgbGV0IGVtYWlsID0gcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsO1xuICAgICAgICBsZXQgZG9tYWluID0gJypAJyArIGVtYWlsLnNwbGl0KCdAJylbMV07XG4gICAgICAgIHJldHVybiAocm9sZXNbZW1haWxdIGluIFsnQURNSU4nLCAnRURJVE9SJ10pIHx8IChyb2xlc1tkb21haW5dIGluIFsnQURNSU4nLCAnRURJVE9SJ10pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB1c2VySXNBZG1pbigpIHtcbiAgICAgICAgbGV0IHJvbGVzID0gZ2V0Um9sZXMoKTtcbiAgICAgICAgbGV0IGVtYWlsID0gcmVxdWVzdC5hdXRoLnRva2VuLmVtYWlsO1xuICAgICAgICBsZXQgZG9tYWluID0gJypAJyArIGVtYWlsLnNwbGl0KCdAJylbMV07XG4gICAgICAgIHJldHVybiAocm9sZXNbZW1haWxdID09ICdBRE1JTicpIHx8IChyb2xlc1tkb21haW5dID09ICdBRE1JTicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuYDtcblxuLyoqXG4gKiBBZGRzIHRoZSByb290LWNtcyBzZWN1cml0eSBydWxlcyB0byBhIEZpcmViYXNlIHByb2plY3QuXG4gKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcndyaXRlIGFueSBleGlzdGluZyBydWxlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5U2VjdXJpdHlSdWxlcyhwcm9qZWN0SWQ6IHN0cmluZykge1xuICAvLyBUT0RPKHN0ZXZlbmxlKTogY2hlY2sgaWYgYW4gYXBwIGV4aXN0cyBmaXJzdCBiZWZvcmUgaW5pdGlhbGl6aW5nLlxuICBjb25zdCBhcHAgPSBpbml0aWFsaXplQXBwKHtwcm9qZWN0SWR9KTtcbiAgY29uc3Qgc2VjdXJpdHlSdWxlcyA9IGdldFNlY3VyaXR5UnVsZXMoYXBwKTtcbiAgYXdhaXQgc2VjdXJpdHlSdWxlcy5yZWxlYXNlRmlyZXN0b3JlUnVsZXNldEZyb21Tb3VyY2UoRklSRVNUT1JFX1JVTEVTKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLGVBQWM7QUFDdEIsU0FBUSxTQUFTLGFBQVk7OztBQ0Q3QixTQUFRLFlBQVksVUFBUztBQUM3QixPQUFPLFVBQVU7QUFDakIsU0FBUSxxQkFBb0I7QUFDNUIsU0FBUSxnQkFBZ0IseUJBQXdCO0FBQ2hELFlBQVksU0FBUztBQUtyQixJQUFNLFlBQVksS0FBSyxRQUFRLGNBQWMsWUFBWSxHQUFHLENBQUM7QUFFN0QsZUFBc0IsZ0JBQWdCO0FBQ3BDLFFBQU0sVUFBVSxRQUFRLElBQUk7QUFDNUIsUUFBTSxhQUFhLE1BQU0sZUFBZSxTQUFTLEVBQUMsU0FBUyxXQUFVLENBQUM7QUFDdEUsUUFBTSxhQUFhLEtBQUssUUFBUSxXQUFXLGNBQWM7QUFDekQsUUFBTSxVQUFXLE1BQU07QUFBQSxJQUNyQjtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTSxVQUFVLFFBQVEsa0JBQWtCO0FBQzFDLFFBQU0sYUFBYSxLQUFLLFFBQVEsU0FB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
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2xpL2NsaS50cyIsICIuLi9jbGkvZ2VuZXJhdGUtdHlwZXMudHMiLCAiLi4vY2xpL2luaXQtZmlyZWJhc2UudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS9zZWN1cml0eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtDb21tYW5kfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHtiZ0dyZWVuLCBibGFja30gZnJvbSAna2xldXIvY29sb3JzJztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi9nZW5lcmF0ZS10eXBlcy5qcyc7XG5pbXBvcnQge2luaXRGaXJlYmFzZX0gZnJvbSAnLi9pbml0LWZpcmViYXNlLmpzJztcblxuY2xhc3MgQ2xpUnVubmVyIHtcbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgcnVuKGFyZ3Y6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKHRoaXMubmFtZSk7XG4gICAgcHJvZ3JhbS52ZXJzaW9uKHRoaXMudmVyc2lvbik7XG4gICAgcHJvZ3JhbS5vcHRpb24oJy1xLCAtLXF1aWV0JywgJ3F1aWV0Jyk7XG4gICAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoY21kKSA9PiB7XG4gICAgICBpZiAoIWNtZC5vcHRzKCkucXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFx1RDgzRVx1REQ1NSAke2JnR3JlZW4oYmxhY2soYCAke3RoaXMubmFtZX0gYCkpfSB2JHt0aGlzLnZlcnNpb259XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2dyYW1cbiAgICAgIC5jb21tYW5kKCdpbml0LWZpcmViYXNlJylcbiAgICAgIC5hbGlhcygnaW5pdCcpXG4gICAgICAuZGVzY3JpcHRpb24oJ2luaXRzIHRoZSBmaXJlYmFzZSBwcm9qZWN0IHByb3BlciBzZWN1cml0eSBydWxlcycpXG4gICAgICAub3B0aW9uKCctLXByb2plY3QgPHByb2plY3Q+JywgJ2djcCBwcm9qZWN0IGlkJylcbiAgICAgIC5vcHRpb24oJy0tYWRtaW4gPGVtYWlsPicsICdhZGRzIGFuIGFkbWluIHRvIHRoZSBwcm9qZWN0JylcbiAgICAgIC5hY3Rpb24oaW5pdEZpcmViYXNlKTtcbiAgICBwcm9ncmFtXG4gICAgICAuY29tbWFuZCgnZ2VuZXJhdGUtdHlwZXMnKVxuICAgICAgLmFsaWFzKCd0eXBlcycpXG4gICAgICAuZGVzY3JpcHRpb24oXG4gICAgICAgICdnZW5lcmF0ZXMgcm9vdC1jbXMuZC50cyBmcm9tICouc2NoZW1hLnRzIGZpbGVzIGluIHRoZSBwcm9qZWN0J1xuICAgICAgKVxuICAgICAgLmFjdGlvbihnZW5lcmF0ZVR5cGVzKTtcbiAgICBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMoYXJndik7XG4gIH1cbn1cblxuZXhwb3J0IHtDbGlSdW5uZXIsIGdlbmVyYXRlVHlwZXMsIGluaXRGaXJlYmFzZX07XG4iLCAiaW1wb3J0IHtwcm9taXNlcyBhcyBmc30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge2xvYWRSb290Q29uZmlnLCB2aXRlU3NyTG9hZE1vZHVsZX0gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJ2R0cy1kb20nO1xuXG5pbXBvcnQge0ZpZWxkLCBTY2hlbWF9IGZyb20gJy4uL2NvcmUvc2NoZW1hLmpzJztcblxudHlwZSBQcm9qZWN0TW9kdWxlID0gdHlwZW9mIGltcG9ydCgnLi4vY29yZS9wcm9qZWN0LmpzJyk7XG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXMoKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgY29uc3QgcHJvamVjdCA9IChhd2FpdCB2aXRlU3NyTG9hZE1vZHVsZShcbiAgICByb290Q29uZmlnLFxuICAgIG1vZHVsZVBhdGhcbiAgKSkgYXMgUHJvamVjdE1vZHVsZTtcbiAgY29uc3Qgc2NoZW1hcyA9IHByb2plY3QuZ2V0UHJvamVjdFNjaGVtYXMoKTtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAncm9vdC1jbXMuZC50cycpO1xuICBhd2FpdCBnZW5lcmF0ZVNjaGVtYUR0cyhvdXRwdXRQYXRoLCBzY2hlbWFzKTtcbiAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG59XG5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0ZpbGUge1xuICBzcmM6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgYWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSb290Q01TSW1hZ2UgPSBSb290Q01TRmlsZTtcblxuZXhwb3J0IHR5cGUgUm9vdENNU09uZU9mPFQgPSBhbnk+ID0gVDtcblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmljaFRleHRCbG9jayB7XG4gIHR5cGU6IHN0cmluZztcbiAgZGF0YTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSaWNoVGV4dCB7XG4gIGJsb2NrczogUm9vdENNU1JpY2hUZXh0QmxvY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmVmZXJlbmNlIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TRG9jPEZpZWxkcyBleHRlbmRzIHt9PiB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIC8qKiBTeXN0ZW0tbGV2ZWwgbWV0YWRhdGEuICovXG4gIHN5czoge1xuICAgIGNyZWF0ZWRBdDogbnVtYmVyO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIG1vZGlmaWVkQXQ6IG51bWJlcjtcbiAgICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBmaXJzdFB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIHB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIGxvY2FsZXM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqIFVzZXItZW50ZXJlZCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgQ01TLiAqL1xuICBmaWVsZHM/OiBGaWVsZHM7XG59YDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByb290LWNtcy5kLnRzIGZpbGUgZnJvbSB0aGUgLnNjaGVtYS50cyBmaWxlcyBpbiB0aGUgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hRHRzKFxuICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gIHNjaGVtYXM6IFJlY29yZDxzdHJpbmcsIFNjaGVtYT5cbikge1xuICBjb25zdCByZXN1bHRzID0gW1RFTVBMQVRFXTtcbiAgZm9yIChjb25zdCBmaWxlSWQgaW4gc2NoZW1hcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbZmlsZUlkXTtcbiAgICByZXN1bHRzLnB1c2gocmVuZGVyU2NoZW1hKGZpbGVJZCwgc2NoZW1hKSk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0ID1cbiAgICByZXN1bHRzXG4gICAgICAuam9pbignXFxuXFxuJylcbiAgICAgIC5yZXBsYWNlQWxsKCcvKiogICcsICcvKiogJylcbiAgICAgIC5yZXBsYWNlQWxsKCcgICovJywgJyAqLycpXG4gICAgICAucmVwbGFjZSgvXFxyXFxufFxccnxcXG4vZywgJ1xcbicpICsgJ1xcbic7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRQYXRoLCBvdXRwdXQsICd1dGYtOCcpO1xufVxuXG5pbnRlcmZhY2UgRmllbGRQcm9wZXJ0eU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBmaWxlIGJlaW5nIHBhcnNlZCwgZS5nLiBmb3IgXCJQYWdlcy5zY2hlbWEudHNcIiB0aGlzIHdvdWxkIGJlXG4gICAqIFwiUGFnZXNcIi5cbiAgICovXG4gIHR5cGVJZDogc3RyaW5nO1xuICAvKipcbiAgICogQSBjb2xsZWN0aW9uIG9mIHRoZSBvbmVPZiB0eXBlcyB1c2VkIGJ5IHRoZSBmaWVsZC5cbiAgICovXG4gIG9uZU9mVHlwZXM6IFJlY29yZDxzdHJpbmcsIGRvbS5JbnRlcmZhY2VEZWNsYXJhdGlvbj47XG59XG5cbmZ1bmN0aW9uIGZpZWxkUHJvcGVydHkoXG4gIGZpZWxkOiBGaWVsZCxcbiAgb3B0aW9uczogRmllbGRQcm9wZXJ0eU9wdGlvbnNcbik6IGRvbS5Qcm9wZXJ0eURlY2xhcmF0aW9uIHtcbiAgY29uc3QgcHJvcCA9IGRvbS5jcmVhdGUucHJvcGVydHkoXG4gICAgZmllbGQuaWQhLFxuICAgIGZpZWxkVHlwZShmaWVsZCwgb3B0aW9ucyksXG4gICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgKTtcbiAgY29uc3QganNkb2MgPSBbXTtcbiAgaWYgKGZpZWxkLmxhYmVsKSB7XG4gICAgaWYgKGZpZWxkLmhlbHApIHtcbiAgICAgIGpzZG9jLnB1c2goYCR7ZmllbGQubGFiZWx9LiAke2ZpZWxkLmhlbHB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGpzZG9jLnB1c2goZmllbGQubGFiZWwpO1xuICAgIH1cbiAgfVxuICBpZiAoZmllbGQuZGVwcmVjYXRlZCkge1xuICAgIGpzZG9jLnB1c2goJ0BkZXByZWNhdGVkJyk7XG4gIH1cbiAgaWYgKGpzZG9jLmxlbmd0aCA+IDApIHtcbiAgICBwcm9wLmpzRG9jQ29tbWVudCA9IGpzZG9jLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBwcm9wO1xufVxuXG5mdW5jdGlvbiBmaWVsZFR5cGUoZmllbGQ6IEZpZWxkLCBvcHRpb25zOiBGaWVsZFByb3BlcnR5T3B0aW9ucyk6IGRvbS5UeXBlIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZmllbGRUeXBlKGZpZWxkLm9mLCBvcHRpb25zKSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb20udHlwZS5ib29sZWFuO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLm51bWJlcjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgY29uc3QgZmlsZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0ZpbGUnKTtcbiAgICByZXR1cm4gZmlsZVR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICBjb25zdCBpbWFnZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0ltYWdlJyk7XG4gICAgcmV0dXJuIGltYWdlVHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5hcnJheShkb20udHlwZS5zdHJpbmcpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb25lb2YnKSB7XG4gICAgY29uc3Qgb25lT2YgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU09uZU9mJyk7XG4gICAgaWYgKGZpZWxkLnR5cGVzICYmIEFycmF5LmlzQXJyYXkoZmllbGQudHlwZXMpKSB7XG4gICAgICBjb25zdCB1bmlvblR5cGVzOiBkb20uTmFtZWRUeXBlUmVmZXJlbmNlW10gPSBbXTtcbiAgICAgIGZpZWxkLnR5cGVzLmZvckVhY2goKHNjaGVtYTogU2NoZW1hKSA9PiB7XG4gICAgICAgIC8vIFRoZSBcIm5hbWVcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAgICAgICAgaWYgKCFzY2hlbWEubmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsZWFuTmFtZSA9IGFscGhhbnVtZXJpYyhzY2hlbWEubmFtZSk7XG4gICAgICAgIGNvbnN0IG9uZU9mVHlwZUlkID0gYCR7b3B0aW9ucy50eXBlSWR9XyR7Y2xlYW5OYW1lfWA7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBvbmVPZiB0eXBlIHRvIHRoZSAuZC50cyBmaWxlIGFzIGB7RmlsZUlkfV97VHlwZU5hbWV9YC5cbiAgICAgICAgaWYgKCFvcHRpb25zLm9uZU9mVHlwZXNbb25lT2ZUeXBlSWRdKSB7XG4gICAgICAgICAgY29uc3Qgb25lT2ZUeXBlSW50ZXJmYWNlID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgICAgICAgICBvbmVPZlR5cGVJZCxcbiAgICAgICAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICAgICAgICAgICk7XG4gICAgICAgICAgb25lT2ZUeXBlSW50ZXJmYWNlLm1lbWJlcnMucHVzaChcbiAgICAgICAgICAgIGRvbS5jcmVhdGUucHJvcGVydHkoXG4gICAgICAgICAgICAgICdfdHlwZScsXG4gICAgICAgICAgICAgIGRvbS50eXBlLnN0cmluZ0xpdGVyYWwoc2NoZW1hLm5hbWUpLFxuICAgICAgICAgICAgICBkb20uRGVjbGFyYXRpb25GbGFncy5Ob25lXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBvbmVPZlR5cGVGaWVsZHMgPSBzY2hlbWEuZmllbGRzIHx8IFtdO1xuICAgICAgICAgIG9uZU9mVHlwZUZpZWxkcy5mb3JFYWNoKChmOiBGaWVsZCkgPT4ge1xuICAgICAgICAgICAgb25lT2ZUeXBlSW50ZXJmYWNlLm1lbWJlcnMucHVzaChmaWVsZFByb3BlcnR5KGYsIG9wdGlvbnMpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvcHRpb25zLm9uZU9mVHlwZXNbb25lT2ZUeXBlSWRdID0gb25lT2ZUeXBlSW50ZXJmYWNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pb25UeXBlcy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKG9uZU9mVHlwZUlkKSk7XG4gICAgICB9KTtcbiAgICAgIGlmICh1bmlvblR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb25lT2YudHlwZUFyZ3VtZW50cyA9IFtkb20uY3JlYXRlLnVuaW9uKHVuaW9uVHlwZXMpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9uZU9mO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmVmZXJlbmNlJykge1xuICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU1JlZmVyZW5jZScpO1xuICAgIHJldHVybiByZWZlcmVuY2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmljaHRleHQnKSB7XG4gICAgY29uc3QgcmljaHRleHRUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSaWNoVGV4dCcpO1xuICAgIHJldHVybiByaWNodGV4dFR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHN1YnByb3BlcnRpZXMgPSAoZmllbGQuZmllbGRzIHx8IFtdKS5tYXAoKGYpID0+XG4gICAgICBmaWVsZFByb3BlcnR5KGYsIG9wdGlvbnMpXG4gICAgKTtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKHN1YnByb3BlcnRpZXMpO1xuICB9XG4gIHJldHVybiBkb20udHlwZS51bmtub3duO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTY2hlbWEoZmlsZUlkOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QganNkb2MgPSBgR2VuZXJhdGVkIGZyb20gXFxgJHtmaWxlSWR9XFxgLmA7XG4gIGNvbnN0IHR5cGVJZCA9IGFscGhhbnVtZXJpYyhwYXRoLnBhcnNlKGZpbGVJZCkubmFtZS5zcGxpdCgnLicpWzBdKTtcblxuICAvLyBDcmVhdGUgYSBzZXQgZm9yIGNvbGxlY3Rpbmcgb25lT2YgdHlwZXMgdXNlZCBpbiB0aGUgZmlsZS5cbiAgY29uc3Qgb25lT2ZUeXBlczogUmVjb3JkPHN0cmluZywgZG9tLkludGVyZmFjZURlY2xhcmF0aW9uPiA9IHt9O1xuXG4gIC8vIEZvciBgRm9vLnNjaGVtYS50c2AsIG91dHB1dCBhIHR5cGUgY2FsbGVkIGBGb29GaWVsZHNgLlxuICBjb25zdCBmaWVsZHNJbnRlcmZhY2UgPSBgJHt0eXBlSWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzVHlwZSA9IGRvbS5jcmVhdGUuaW50ZXJmYWNlKFxuICAgIGZpZWxkc0ludGVyZmFjZSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5FeHBvcnRcbiAgKTtcbiAgZmllbGRzVHlwZS5qc0RvY0NvbW1lbnQgPSBqc2RvYztcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBzY2hlbWEuZmllbGRzKSB7XG4gICAgaWYgKCFmaWVsZC5pZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZpZWxkc1R5cGUubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQsIHt0eXBlSWQsIG9uZU9mVHlwZXN9KSk7XG4gIH1cblxuICBjb25zdCB0eXBlc091dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAvLyBPdXRwdXQgYWxsIG9uZU9mIHR5cGVzIHVzZWQgYnkgdGhlIGZpbGUuXG4gIE9iamVjdC52YWx1ZXMob25lT2ZUeXBlcykuZm9yRWFjaCgob25lT2ZUeXBlRGVmKSA9PiB7XG4gICAgb25lT2ZUeXBlRGVmLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuICAgIHR5cGVzT3V0cHV0LnB1c2goXG4gICAgICBkb20uZW1pdChvbmVPZlR5cGVEZWYsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pLnRyaW0oKVxuICAgICk7XG4gIH0pO1xuXG4gIC8vIE91dHB1dCB0aGUgYEZvb0ZpZWxkc2AgdHlwZS5cbiAgdHlwZXNPdXRwdXQucHVzaChcbiAgICBkb20uZW1pdChmaWVsZHNUeXBlLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KS50cmltKClcbiAgKTtcblxuICAvLyBGb3IgYC9jb2xsZWN0aW9ucy9Gb28uc2NoZW1hLnRzYCBmaWxlcywgb3V0cHV0IGEgYEZvb0RvY2AgdHlwZS5cbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7dHlwZUlkfURvY2AsXG4gICAgICBiYXNlVHlwZSxcbiAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICAgICk7XG4gICAgZG9jVHlwZS5qc0RvY0NvbW1lbnQgPSBqc2RvYztcbiAgICBjb25zdCBkb2NUeXBlT3V0cHV0ID0gZG9tXG4gICAgICAuZW1pdChkb2NUeXBlLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KVxuICAgICAgLnRyaW0oKTtcbiAgICB0eXBlc091dHB1dC5wdXNoKGRvY1R5cGVPdXRwdXQpO1xuICB9XG4gIHJldHVybiByZWZvcm1hdE91dHB1dCh0eXBlc091dHB1dC5qb2luKCdcXG5cXG4nKSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgb3V0cHV0IHRvIEdvb2dsZSBzdHlsZSBjb252ZW50aW9ucywgZS5nLiAyLXNwYWNlIGluZGVudHMgYW5kXG4gKiBzaW5nbGUgcXVvdGUgc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gcmVmb3JtYXRPdXRwdXQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gaW5wdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRMaW5lID0gbGluZS5yZXBsYWNlKC8gezR9L2csICcgICcpLnJlcGxhY2VBbGwoJ1wiJywgXCInXCIpO1xuICAgIHJlc3VsdHMucHVzaChjb252ZXJ0ZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgZnJvbSBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYWxwaGFudW1lcmljKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKTtcbn1cbiIsICJpbXBvcnQge2xvYWRSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQge0ZpcmVzdG9yZX0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuLi9jb3JlL2NsaWVudC5qcyc7XG5pbXBvcnQge2FwcGx5U2VjdXJpdHlSdWxlc30gZnJvbSAnLi4vY29yZS9zZWN1cml0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdEZpcmViYXNlT3B0aW9ucyB7XG4gIC8qKiBHQ1AgcHJvamVjdCBpZC4gKi9cbiAgcHJvamVjdD86IHN0cmluZztcbiAgLyoqIEFkZHMgYW4gQURNSU4gdG8gdGhlIHNlY3VyaXR5IHJ1bGVzLiAqL1xuICBhZG1pbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRGaXJlYmFzZShvcHRpb25zOiBJbml0RmlyZWJhc2VPcHRpb25zKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICBjb25zdCBnY3BQcm9qZWN0SWQgPVxuICAgIG9wdGlvbnMucHJvamVjdCB8fCBjbXNQbHVnaW5PcHRpb25zLmZpcmViYXNlQ29uZmlnLnByb2plY3RJZDtcblxuICBpZiAoIWdjcFByb2plY3RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmlyZWJhc2VDb25maWcucHJvamVjdElkIG5vdCBzZXQgaW4gY21zIHBsdWdpbiBvcHRpb25zJyk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgZ2NwIHByb2plY3Q6ICR7Z2NwUHJvamVjdElkfWApO1xuICBjb25zb2xlLmxvZygnXHVEODNEXHVEQzZFIHVwZGF0aW5nIHNlY3VyaXR5IHJ1bGVzLi4uJyk7XG4gIGF3YWl0IGFwcGx5U2VjdXJpdHlSdWxlcyhnY3BQcm9qZWN0SWQpO1xuXG4gIGlmIChvcHRpb25zLmFkbWluKSB7XG4gICAgY29uc3QgZGIgPSBjbXNQbHVnaW4uZ2V0RmlyZXN0b3JlKCk7XG4gICAgY29uc3Qgcm9vdFByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIGF3YWl0IGFkZEFkbWluKGRiLCByb290UHJvamVjdElkLCBvcHRpb25zLmFkbWluKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdkb25lIGluaXRpYWxpemluZyBmaXJlYmFzZSBwcm9qZWN0IScpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhZGRBZG1pbihkYjogRmlyZXN0b3JlLCBwcm9qZWN0SWQ6IHN0cmluZywgZW1haWw6IHN0cmluZykge1xuICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdElkKX1gO1xuICBjb25zdCBkb2NSZWYgPSBkYi5kb2MoZGJQYXRoKTtcbiAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gIGxldCBkYXRhO1xuICBpZiAoc25hcHNob3QuZXhpc3RzKSB7XG4gICAgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhID0ge307XG4gIH1cbiAgY29uc3Qgcm9sZXMgPSBkYXRhLnJvbGVzID8/IHt9O1xuICByb2xlc1tlbWFpbF0gPSAnQURNSU4nO1xuICBkYXRhLnJvbGVzID0gcm9sZXM7XG4gIGF3YWl0IGRvY1JlZi5zZXQoZGF0YSk7XG4gIGNvbnNvbGUubG9nKGBhZGRlZCBhZG1pbiAke2VtYWlsfSB0byBwcm9qZWN0ICR7cHJvamVjdElkfWApO1xufVxuIiwgImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge0FwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7XG4gIEZpZWxkVmFsdWUsXG4gIEZpcmVzdG9yZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgV3JpdGVCYXRjaCxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jPEZpZWxkcyA9IGFueT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoaW5nTG9ja2VkOiB7XG4gICAgICBsb2NrZWRBdDogc3RyaW5nO1xuICAgICAgbG9ja2VkQnk6IHN0cmluZztcbiAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgdW50aWw/OiBUaW1lc3RhbXA7XG4gICAgfTtcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgdHlwZSBVc2VyUm9sZSA9ICdBRE1JTicgfCAnRURJVE9SJyB8ICdWSUVXRVInO1xuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gJ0dFVCcgfCAnUE9TVCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0eXBlOiAnaHR0cCcgfCAnZ3NoZWV0JztcbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IGdzaGVldC4gYGFycmF5YCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZlxuICAgKiBhcnJheXMsIGBtYXBgIHJldHVybnMgdGhlIHNoZWV0IGFzIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogJ2FycmF5JyB8ICdtYXAnO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICovXG4gIGh0dHBPcHRpb25zPzoge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZDtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBib2R5Pzogc3RyaW5nO1xuICB9O1xuICBjcmVhdGVkQXQ6IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHN5bmNlZEF0PzogVGltZXN0YW1wO1xuICBzeW5jZWRCeT86IHN0cmluZztcbiAgcHVibGlzaGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2VEYXRhPFQgPSBhbnk+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgZGF0YTogVDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZURyYWZ0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2NhbGVzIHRvIGVuYWJsZS5cbiAgICovXG4gIGxvY2FsZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW1haWwgb2YgdXNlciBtb2RpZnlpbmcgdGhlIGRvYy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIGByb290LWNtcy1jbGllbnRgLlxuICAgKi9cbiAgbW9kaWZpZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZldGNoIHRoZSBcInJhd1wiIHZlcnNpb24gb2YgdGhlIGRvYyAoZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAqIGBzZXRSYXdEb2MoKWApLlxuICAgKi9cbiAgcmF3PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb3VudE9wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZG9jSWRzPzogc3RyaW5nW107XG4gIGNyZWF0ZWRBdD86IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuICBzY2hlZHVsZWRBdD86IFRpbWVzdGFtcDtcbiAgc2NoZWR1bGVkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb248VCA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICovXG4gIGFjdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVzZXIncyBlbWFpbCB0aGF0IHBlcmZvcm1lZCB0aGUgYWN0aW9uIChvciBcInN5c3RlbVwiKS5cbiAgICovXG4gIGJ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGFjdGlvbiBvY2N1cnJlZC5cbiAgICovXG4gIHRpbWVzdGFtcDogVGltZXN0YW1wO1xuICAvKipcbiAgICogTWV0YWRhdGEgZm9yIHRoZSBhY3Rpb24uXG4gICAqL1xuICBtZXRhZGF0YT86IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEFjdGlvbnNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNwZWNpZmljIGFjdGlvbi4gRGVmYXVsdHMgdG8gYWxsIGFjdGlvbnMuXG4gICAqL1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzcGVjaWZpYyB1c2VyLiBEZWZhdWx0cyB0byBhbGwgdXNlcnMuXG4gICAqL1xuICBieT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1heCBudW1iZXIgb2YgYWN0aW9ucyB0byByZXR1cm4uIERlZmF1bHRzIHRvIDEwMC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUm9vdENNU0NsaWVudCB7XG4gIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHJlYWRvbmx5IGNtc1BsdWdpbjogQ01TUGx1Z2luO1xuICByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRiOiBGaXJlc3RvcmU7XG5cbiAgY29uc3RydWN0b3Iocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWc7XG4gICAgdGhpcy5jbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4odGhpcy5yb290Q29uZmlnKTtcblxuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICB0aGlzLnByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuYXBwID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgICB0aGlzLmRiID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZXN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGRvYyBkYXRhIGZyb20gUm9vdC5qcyBDTVMuXG4gICAqL1xuICBhc3luYyBnZXREb2M8RmllbGRzID0gYW55PihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPERvYzxGaWVsZHM+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJhd0RhdGEgPSBhd2FpdCB0aGlzLmdldFJhd0RvYyhjb2xsZWN0aW9uSWQsIHNsdWcsIG9wdGlvbnMpO1xuICAgIGlmIChyYXdEYXRhKSB7XG4gICAgICByZXR1cm4gdW5tYXJzaGFsRGF0YShyYXdEYXRhKSBhcyBEb2M8RmllbGRzPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHJhdyBkb2MgZGF0YSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBPbmx5IHVzZSB0aGlzIGlmIHlvdSBrbm93XG4gICAqIHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICovXG4gIGFzeW5jIGdldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICAgIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgZHJhZnQgZGF0YSB0byBhIGRvYy5cbiAgICpcbiAgICogTm90ZTogdGhpcyBzYXZlcyBkYXRhIHRvIHRoZSBcImZpZWxkc1wiIGF0dHIgb2YgdGhlIGRyYWZ0IGRvYy4gSWYgeW91IG5lZWQgdG9cbiAgICogbW9kaWZ5IHRoZSBzeXMtbGV2ZWwgYXR0cmlidXRlcyBvZiB0aGUgZG9jLCB1c2UgYHNldFJhd0RvYygpYC5cbiAgICovXG4gIGFzeW5jIHNhdmVEcmFmdERhdGEoXG4gICAgZG9jSWQ6IHN0cmluZyxcbiAgICBmaWVsZHNEYXRhOiBhbnksXG4gICAgb3B0aW9ucz86IFNhdmVEcmFmdE9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3Qge2NvbGxlY3Rpb24sIHNsdWd9ID0gcGFyc2VEb2NJZChkb2NJZCk7XG4gICAgY29uc3QgZHJhZnREb2MgPVxuICAgICAgKGF3YWl0IHRoaXMuZ2V0UmF3RG9jKGNvbGxlY3Rpb24sIHNsdWcsIHttb2RlOiAnZHJhZnQnfSkpIHx8IHt9O1xuICAgIGNvbnN0IGRyYWZ0U3lzID0gZHJhZnREb2Muc3lzIHx8IHt9O1xuICAgIGNvbnN0IG1vZGlmaWVkQnkgPSBvcHRpb25zPy5tb2RpZmllZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuICAgIGNvbnN0IGZpZWxkcyA9IG1hcnNoYWxEYXRhKGZpZWxkc0RhdGEgfHwge30pO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpZDogZG9jSWQsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgc2x1ZyxcbiAgICAgIHN5czoge1xuICAgICAgICAuLi5kcmFmdFN5cyxcbiAgICAgICAgY3JlYXRlZEF0OiBkcmFmdFN5cy5jcmVhdGVkQXQgPz8gVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBjcmVhdGVkQnk6IGRyYWZ0U3lzLmNyZWF0ZWRCeSA/PyBtb2RpZmllZEJ5LFxuICAgICAgICBtb2RpZmllZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICAgIG1vZGlmaWVkQnksXG4gICAgICAgIGxvY2FsZXM6IG9wdGlvbnM/LmxvY2FsZXMgPz8gZHJhZnRTeXMubG9jYWxlcyA/PyBbJ2VuJ10sXG4gICAgICB9LFxuICAgICAgZmllbGRzLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy5zZXRSYXdEb2MoY29sbGVjdGlvbiwgc2x1ZywgZGF0YSwge21vZGU6ICdkcmFmdCd9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmZXIgYHNhdmVEcmFmdERhdGEoJ1BhZ2VzL2ZvbycsIGRhdGEpYC4gT25seSB1c2UgdGhpcyBpZiB5b3Uga25vdyB3aGF0XG4gICAqIHlvdSdyZSBkb2luZy5cbiAgICovXG4gIGFzeW5jIHNldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIG9wdGlvbnM6IFNldERvY09wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBsaXN0RG9jczxUPihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbiAgKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5yYXcpIHtcbiAgICAgICAgLy8gRm9yIGNhbGxlcnMgdGhhdCB3aXNoIHRvIG1vZGlmeSB0aGUgcmF3IGRvYyB2aWEgYHNldFJhd0RvYygpYCxcbiAgICAgICAgLy8gcmV0dXJuIHRoZSB1bm1vZGlmaWVkIGRvYyBhcyByZXR1cm5lZCBmcm9tIGZpcmVzdG9yZS5cbiAgICAgICAgY29uc3QgcmF3RG9jID0gcmVzdWx0LmRhdGEoKSBhcyBUO1xuICAgICAgICBkb2NzLnB1c2gocmF3RG9jKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRvYyA9IHVubWFyc2hhbERhdGEocmVzdWx0LmRhdGEoKSkgYXMgVDtcbiAgICAgICAgZG9jcy5wdXNoKGRvYyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtkb2NzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBnZXREb2NzQ291bnQoY29sbGVjdGlvbklkOiBzdHJpbmcsIG9wdGlvbnM6IEdldENvdW50T3B0aW9ucykge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5jb3VudCgpLmdldCgpO1xuICAgIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHB1Ymxpc2hlcyBhIHNldCBvZiBkb2NzIGJ5IGlkLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaERvY3MoXG4gICAgZG9jSWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzoge3B1Ymxpc2hlZEJ5OiBzdHJpbmc7IGJhdGNoPzogV3JpdGVCYXRjaH1cbiAgKSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIC8vIEZldGNoIHRoZSBjdXJyZW50IGRyYWZ0IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgIGNvbnN0IGRvY1JlZnMgPSBkb2NJZHMubWFwKChkb2NJZCkgPT4ge1xuICAgICAgY29uc3QgW2NvbGxlY3Rpb24sIHNsdWddID0gZG9jSWQuc3BsaXQoJy8nKTtcbiAgICAgIGlmICghY29sbGVjdGlvbiB8fCAhc2x1Zykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZG9jIGlkOiAke2RvY0lkfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY1JlZjtcbiAgICB9KTtcbiAgICBjb25zdCBkb2NTbmFwc2hvdHMgPSBhd2FpdCB0aGlzLmRiLmdldEFsbCguLi5kb2NSZWZzKTtcbiAgICBjb25zdCBkb2NzID0gZG9jU25hcHNob3RzXG4gICAgICAvLyBSZXRyaWV2ZSBzbmFwc2hvdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICAgIC5tYXAoKHNuYXBzaG90KSA9PiBzbmFwc2hvdC5kYXRhKCkgYXMgRG9jKVxuICAgICAgLy8gUmVtb3ZlIGRvY3MgdGhhdCBkb24ndCBleGlzdC5cbiAgICAgIC5maWx0ZXIoKGQpID0+ICEhZCk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHB1Ymxpc2gnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhlcmUgYXJlIG5vIHB1Ymxpc2hpbmcgbG9ja3Mgb24gYW55IGRvY3MuXG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgaWYgKHRoaXMudGVzdFB1Ymxpc2hpbmdMb2NrZWQoZG9jKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHB1Ymxpc2hpbmcgaXMgbG9ja2VkIGZvciBkb2M6ICR7ZG9jLmlkfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IG9wdGlvbnM/LmJhdGNoIHx8IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1Zywgc3lzLCBmaWVsZHN9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCk7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID0gc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gcHVibGlzaGVkQnk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgc2NoZWR1bGVkIGRvYywgaWYgYW55LlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHB1Ymxpc2hlZEJ5LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXRjaENvdW50ID4gMCkge1xuICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgICByZXR1cm4gcHVibGlzaGVkRG9jcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoU2NoZWR1bGVkRG9jcygpIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gICAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAgIC5maWx0ZXIoKGQpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIGRvY3MgYnkgcHJvamVjdC5cbiAgICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgIC8vIE5PVEUoc3RldmVubGUpOiB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyBhIHF1ZXJ5XG4gICAgICAgIC8vIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW4gaW5kZXggaW4gZmlyZXN0b3JlLlxuICAgICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZEF0OiBUaW1lc3RhbXAgfCB1bmRlZmluZWQgPSBkYXRhLnN5cz8uc2NoZWR1bGVkQXQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGRiUGF0aCA9IGQucmVmLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzZWdtZW50cy5hdCgtMyk7XG4gICAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogZC5kYXRhKCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICBzbHVnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHNjaGVkdWxlJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBkYXRhfSA9IGRvYztcbiAgICAgIGNvbnN0IGRyYWZ0UmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3QgcHVibGlzaGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPSBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBzY2hlZHVsZWRBdDtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPVxuICAgICAgICBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCcpO1xuXG4gICAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JyxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgICAgaWYgKGJhdGNoQ291bnQgPj0gNDAwKSB7XG4gICAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgICAgICBiYXRjaENvdW50ID0gMDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBkb2NzIGluIHNjaGVkdWxlZCByZWxlYXNlcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWRSZWxlYXNlcygpIHtcbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vUmVsZWFzZXNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYlxuICAgICAgLmNvbGxlY3Rpb24ocmVsZWFzZXNQYXRoKVxuICAgICAgLndoZXJlKCdzY2hlZHVsZWRBdCcsICc8PScsIFRpbWVzdGFtcC5mcm9tTWlsbGlzKG5vdykpO1xuICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcblxuICAgIGZvciAoY29uc3Qgc25hcHNob3Qgb2YgcXVlcnlTbmFwc2hvdC5kb2NzKSB7XG4gICAgICBjb25zdCByZWxlYXNlID0gc25hcHNob3QuZGF0YSgpIGFzIFJlbGVhc2U7XG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gcmVsZWFzZS5zY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcbiAgICAgIGJhdGNoLnVwZGF0ZShzbmFwc2hvdC5yZWYsIHtcbiAgICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICBzY2hlZHVsZWRBdDogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgc2NoZWR1bGVkQnk6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaERvY3MocmVsZWFzZS5kb2NJZHMgfHwgW10sIHtwdWJsaXNoZWRCeSwgYmF0Y2h9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZG9jIGlzIGN1cnJlbnRseSBcImxvY2tlZFwiIGZvciBwdWJsaXNoaW5nLlxuICAgKi9cbiAgdGVzdFB1Ymxpc2hpbmdMb2NrZWQoZG9jOiBEb2MpIHtcbiAgICBpZiAoZG9jLnN5cz8ucHVibGlzaGluZ0xvY2tlZCkge1xuICAgICAgaWYgKGRvYy5zeXMucHVibGlzaGluZ0xvY2tlZC51bnRpbCkge1xuICAgICAgICBjb25zdCBub3cgPSBUaW1lc3RhbXAubm93KCkudG9NaWxsaXMoKTtcbiAgICAgICAgY29uc3QgdW50aWwgPSBkb2Muc3lzLnB1Ymxpc2hpbmdMb2NrZWQudW50aWwudG9NaWxsaXMoKTtcbiAgICAgICAgcmV0dXJuIG5vdyA8IHVudGlsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgc2F2ZWQgaW4gdGhlIHRyYW5zbGF0aW9ucyBjb2xsZWN0aW9uLCBvcHRpb25hbGx5XG4gICAqIGZpbHRlcmVkIGJ5IHRhZy5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiPGhhc2g+XCI6IHtcInNvdXJjZVwiOiBcIkhlbGxvXCIsIFwiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9ucyhcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG1hcCBvZiB0cmFuc2xhdGlvbnMsIGUuZy46XG4gICAqIGBgYFxuICAgKiBhd2FpdCBjbGllbnQuc2F2ZVRyYW5zbGF0aW9ucyh7XG4gICAqICAgXCJIZWxsb1wiOiB7XCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNhdmVUcmFuc2xhdGlvbnMoXG4gICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICBbc291cmNlOiBzdHJpbmddOiB7W2xvY2FsZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB9LFxuICAgIHRhZ3M/OiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgoW3NvdXJjZSwgc291cmNlVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUmVmID0gdGhpcy5kYi5kb2MoYCR7dHJhbnNsYXRpb25zUGF0aH0vJHtoYXNofWApO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAuLi5zb3VyY2VUcmFuc2xhdGlvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSxcbiAgICAgIH07XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBkYXRhLnRhZ3MgPSB0YWdzO1xuICAgICAgfVxuICAgICAgYmF0Y2guc2V0KHRyYW5zbGF0aW9uUmVmLCBkYXRhLCB7bWVyZ2U6IHRydWV9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcbiAgICB9KTtcbiAgICBpZiAoYmF0Y2hDb3VudCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cCB0byA1MDAgdHJhbnNsYXRpb25zIGNhbiBiZSBzYXZlZCBhdCBhIHRpbWUuJyk7XG4gICAgfVxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwia2V5XCIgdXNlZCBmb3IgYSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIGRiLiBUcmFuc2xhdGlvbnNcbiAgICogYXJlIHN0b3JlZCB1bmRlciBgUHJvamVjdHMvPHByb2plY3QgaWQ+L1RyYW5zbGF0aW9ucy88c2hhMSBoYXNoPmAuXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbktleShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYTEgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAgIC51cGRhdGUodGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiBzaGExO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhIHN0cmluZyB0aGF0J3MgdXNlZCBmb3IgdHJhbnNsYXRpb25zLiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIFJlbW92ZXMgYW55IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgKiAtIFJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYW55IGxpbmVcbiAgICovXG4gIG5vcm1hbGl6ZVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVzID0gU3RyaW5nKHN0cilcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbUVuZCgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3luY3MgYSBkYXRhIHNvdXJjZSB0byBkcmFmdCBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhU291cmNlKGRhdGFTb3VyY2VJZDogc3RyaW5nLCBvcHRpb25zPzoge3N5bmNlZEJ5Pzogc3RyaW5nfSkge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkKTtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBzb3VyY2Ugbm90IGZvdW5kOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaERhdGEoZGF0YVNvdXJjZSk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9EYXRhL2RyYWZ0YFxuICAgICk7XG4gICAgY29uc3Qgc3luY2VkQnkgPSBvcHRpb25zPy5zeW5jZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFTb3VyY2VEb2NSZWYsIHtcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG5cbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGRhdGEgc291cmNlOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGJ5OiAke3N5bmNlZEJ5fWApO1xuICB9XG5cbiAgYXN5bmMgcHVibGlzaERhdGFTb3VyY2UoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeT86IHN0cmluZ31cbiAgKSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmRHJhZnQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmUHVibGlzaGVkID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L3B1Ymxpc2hlZGBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVJlcyA9IGF3YWl0IHRoaXMuZ2V0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZUlkLCB7bW9kZTogJ2RyYWZ0J30pO1xuXG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmUHVibGlzaGVkLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGFSZXM/LmRhdGEgfHwgbnVsbCxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YURvY1JlZkRyYWZ0LCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgZGF0YSAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkIGJ5OiAke3B1Ymxpc2hlZEJ5fWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGlmIChkYXRhU291cmNlLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hIdHRwRGF0YShkYXRhU291cmNlKTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGltcGwuXG4gICAgLy8gaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2dzaGVldCcpIHtcbiAgICAvLyAgIHJldHVybiBhd2FpdCBmZXRjaEdzaGVldERhdGEoZGF0YVNvdXJjZSk7XG4gICAgLy8gfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZS50eXBlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHtcbiAgICBjb25zdCB1cmwgPSBkYXRhU291cmNlLnVybCB8fCAnJztcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBub3Qgc3VwcG9ydGVkOiAke3VybH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8ubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgaGVhZGVyczogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uaGVhZGVycyB8fCBbXSxcbiAgICAgIGJvZHk6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/LmJvZHkgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxIGZhaWxlZDogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFR5cGUgPSBTdHJpbmcocmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSk7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGRhdGEgZnJvbSBhIGRhdGEgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RnJvbURhdGFTb3VyY2U8VCA9IGFueT4oXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHttb2RlPzogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnfVxuICApOiBQcm9taXNlPERhdGFTb3VyY2VEYXRhPFQ+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlIHx8ICdwdWJsaXNoZWQnO1xuICAgIGlmICghKG1vZGUgPT09ICdkcmFmdCcgfHwgbW9kZSA9PT0gJ3B1Ymxpc2hlZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbW9kZTogJHttb2RlfWApO1xuICAgIH1cbiAgICBpZiAoIWRhdGFTb3VyY2VJZCB8fCBkYXRhU291cmNlSWQuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgc291cmNlIGlkOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvJHttb2RlfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpIGFzIERhdGFTb3VyY2VEYXRhPFQ+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyJ3Mgcm9sZSBmcm9tIHRoZSBwcm9qZWN0J3MgQUNMLlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlclJvbGUoZW1haWw6IHN0cmluZyk6IFByb21pc2U8VXNlclJvbGUgfCBudWxsPiB7XG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfWApO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGNvbnN0IGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgfHwge307XG4gICAgY29uc3QgYWNsID0gZGF0YS5yb2xlcyB8fCB7fTtcblxuICAgIGlmIChlbWFpbCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiBhY2xbZW1haWxdO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdpbGRjYXJkIGRvbWFpbnMsIGUuZy4gYCpAZXhhbXBsZS5jb21gLlxuICAgIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpbnZhbGlkIGVtYWlsOiAke2VtYWlsfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLnNwbGl0KCdAJykuYXQoLTEpO1xuICAgIGlmIChkb21haW4gJiYgYCpAJHtkb21haW59YCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiBhY2xbYCpAJHtkb21haW59YF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHVzZXIgZXhpc3RzIGluIHRoZSBBQ0wgbGlzdC5cbiAgICovXG4gIGFzeW5jIHVzZXJFeGlzdHNJbkFjbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH1gKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBjb25zdCBkYXRhID0gc25hcHNob3QuZGF0YSgpIHx8IHt9O1xuICAgIGNvbnN0IGFjbCA9IGRhdGEucm9sZXMgfHwge307XG4gICAgaWYgKGVtYWlsIGluIGFjbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2lsZGNhcmQgZG9tYWlucywgZS5nLiBgKkBleGFtcGxlLmNvbWAuXG4gICAgaWYgKCFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGludmFsaWQgZW1haWw6ICR7ZW1haWx9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLnNwbGl0KCdAJykuYXQoLTEpO1xuICAgIGlmIChkb21haW4gJiYgYCpAJHtkb21haW59YCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBsb2dBY3Rpb24oYWN0aW9uOiBzdHJpbmcsIG9wdGlvbnM/OiB7Ynk/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSkge1xuICAgIGlmICghYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQ6IFwiYWN0aW9uXCInKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBUaW1lc3RhbXAubm93KCksXG4gICAgICBieTogb3B0aW9ucz8uYnkgfHwgJ3N5c3RlbScsXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucz8ubWV0YWRhdGEgfHwge30sXG4gICAgfTtcbiAgICBjb25zdCBjb2xSZWYgPSB0aGlzLmRiLmNvbGxlY3Rpb24oYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0FjdGlvbkxvZ3NgKTtcbiAgICBhd2FpdCBjb2xSZWYuYWRkKGRhdGEpO1xuXG4gICAgY29uc3QgbWV0YVN0ciA9IG9wdGlvbnM/Lm1ldGFkYXRhID8gc3RyaW5naWZ5T2JqKG9wdGlvbnMubWV0YWRhdGEpIDogJyc7XG4gICAgY29uc29sZS5sb2coYFske2RhdGEudGltZXN0YW1wLnRvTWlsbGlzKCl9XSBhY3Rpb246ICR7YWN0aW9ufSAke21ldGFTdHJ9YCk7XG5cbiAgICAvLyBDYWxsIHRoZSBgb25BY3Rpb24oKWAgY2FsbGJhY2sgZnJvbSBjbXNQbHVnaW4oKS5cbiAgICBjb25zdCBjbXNQbHVnaW5Db25maWcgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICBpZiAoY21zUGx1Z2luQ29uZmlnLm9uQWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjbXNQbHVnaW5Db25maWcub25BY3Rpb24oZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYGRhdGFgIGlzIGEgcmljaCB0ZXh0IGRhdGEgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSaWNoVGV4dERhdGEoZGF0YTogYW55KSB7XG4gIC8vIFRoZSBSaWNoVGV4dEVkaXRvciB1c2VzIGVkaXRvcmpzIHVuZGVyIHRoZSBob29kLCB0aGUgZGF0YSBmb3JtYXQgaXNcbiAgLy8gc29tZXRoaW5nIGxpa2U6XG4gIC8vICB7XG4gIC8vICAgXCJ0aW1lXCI6IDE3MjE3NjEyMTE3MjAsXG4gIC8vICAgXCJ2ZXJzaW9uXCI6IFwiMi4yOC4yXCIsXG4gIC8vICAgXCJibG9ja3NcIjogWy4uLl1cbiAgLy8gfVxuICByZXR1cm4gQm9vbGVhbihcbiAgICBpc09iamVjdChkYXRhKSAmJiBBcnJheS5pc0FycmF5KGRhdGEuYmxvY2tzKSAmJiBkYXRhLnRpbWUgJiYgZGF0YS52ZXJzaW9uXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbXNQbHVnaW4ocm9vdENvbmZpZzogUm9vdENvbmZpZyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gcm9vdENvbmZpZy5wbHVnaW5zIHx8IFtdO1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQoKHBsdWdpbikgPT4gcGx1Z2luLm5hbWUgPT09ICdyb290LWNtcycpO1xuICBpZiAoIXBsdWdpbikge1xuICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgcm9vdC1jbXMgcGx1Z2luIGNvbmZpZyBpbiByb290LmNvbmZpZy50cycpO1xuICB9XG4gIHJldHVybiBwbHVnaW4gYXMgQ01TUGx1Z2luO1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBhcnJheSBvZiBvYmplY3RzIGludG8gXCJhcnJheSBvYmplY3RzXCJcbiAqIGZvciBzdG9yYWdlIGluIGZpcmVzdG9yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcnNoYWxEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIC8vIEF2b2lkIGNoYW5naW5nIHRoZSBmb3JtYXQgb2YgcmljaCB0ZXh0IGRhdGEuXG4gIGlmIChpc1JpY2hUZXh0RGF0YShkYXRhKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBtYXJzaGFsRGF0YSh2YWwpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBpZiAodmFsLmxlbmd0aCA+IDAgJiYgdmFsLnNvbWUoKGl0ZW0pID0+IGlzT2JqZWN0KGl0ZW0pKSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHZhbC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXJzaGFsRGF0YShpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRba2V5XSA9IHRvQXJyYXlPYmplY3QoaXRlbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFdhbGtzIHRoZSBkYXRhIHRyZWUgYW5kIGNvbnZlcnRzIGFueSBUaW1lc3RhbXAgb2JqZWN0cyB0byBtaWxsaXMgYW5kIGFueVxuICogX2FycmF5IG1hcHMgdG8gbm9ybWFsIGFycmF5cy5cbiAqXG4gKiBFLmcuOlxuICpcbiAqIG5vcm1hbGl6ZURhdGEoe1xuICogICBzeXM6IHttb2RpZmllZEF0OiBUaW1lc3RhbXAoMTIzKX0sXG4gKiAgIGZpZWxkczoge1xuICogICAgIF9hcnJheTogWydhc2RmJ10sXG4gKiAgICAgYXNkZjoge3RpdGxlOiAnaGVsbG8nfVxuICogICB9XG4gKiB9KVxuICogLy8gPT4ge3N5czoge21vZGlmaWVkQXQ6IDEyM30sIGZpZWxkczoge2ZvbzogW3t0aXRsZTogJ2hlbGxvJ31dfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbERhdGEoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGNvbnN0IHZhbCA9IGRhdGFba2V5XTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAgaWYgKHZhbC50b01pbGxpcykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbC50b01pbGxpcygpO1xuICAgICAgfSBlbHNlIGlmIChPYmplY3QuaGFzT3duKHZhbCwgJ19hcnJheScpICYmIEFycmF5LmlzQXJyYXkodmFsLl9hcnJheSkpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdmFsLl9hcnJheS5tYXAoKGFycmF5S2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udW5tYXJzaGFsRGF0YSh2YWxbYXJyYXlLZXldIHx8IHt9KSxcbiAgICAgICAgICAgIF9hcnJheUtleTogYXJyYXlLZXksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gYXJyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB1bm1hcnNoYWxEYXRhKHZhbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGB1bm1hcnNoYWxEYXRhKClgIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICByZXR1cm4gdW5tYXJzaGFsRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnJheU9iamVjdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgX2FycmF5OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGFycmF5IGludG8gYW4gYEFycmF5T2JqZWN0YCwgZS5nLjpcbiAqXG4gKiBgYGBcbiAqIG1hcnNoYWxBcnJheShbMSwgMiwgM10pXG4gKiAvLyA9PiB7YTogMSwgYjogMiwgYzogMywgX2FycmF5OiBbJ2EnLCAnYicsICdjJ119XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRhdGFiYXNlIHN0b3JhZ2UgbWV0aG9kIG1ha2VzIGl0IGVhc2llciB0byB1cGRhdGUgYSBzaW5nbGUgZmllbGQgaW4gYVxuICogZGVlcGx5IG5lc3RlZCBhcnJheSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5T2JqZWN0KGFycjogYW55W10pOiBBcnJheU9iamVjdCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuICBjb25zdCBhcnJPYmplY3Q6IEFycmF5T2JqZWN0ID0ge19hcnJheTogW119O1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZFN0cmluZyg2KTtcbiAgICBhcnJPYmplY3Rba2V5XSA9IGl0ZW07XG4gICAgYXJyT2JqZWN0Ll9hcnJheS5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGFyck9iamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IG1hcnNoYWxBcnJheSA9IHRvQXJyYXlPYmplY3Q7XG5cbi8qKlxuICogQ29udmVydHMgYW4gYEFycmF5T2JqZWN0YCB0byBhIG5vcm1hbCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbEFycmF5KGFyck9iamVjdDogQXJyYXlPYmplY3QpOiBhbnlbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJPYmplY3Q/Ll9hcnJheSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgYXJyID0gYXJyT2JqZWN0Ll9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gYXJyT2JqZWN0W2tdKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmFuZFN0cmluZyhsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjaGFycyA9XG4gICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHJhbmQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpO1xuICAgIHJlc3VsdC5wdXNoKGNoYXJzLmNoYXJBdChyYW5kKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHRyYW5zbGF0aW9ucyBtYXAgZnJvbSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBhIG1hcCBvZiBzb3VyY2UgdG9cbiAqIHRyYW5zbGF0ZWQgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwLFxuICBsb2NhbGU6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGxvY2FsZVRyYW5zbGF0aW9uczogTG9jYWxlVHJhbnNsYXRpb25zID0ge307XG4gIE9iamVjdC52YWx1ZXModHJhbnNsYXRpb25zTWFwKS5mb3JFYWNoKChzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmcuc291cmNlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RyaW5nW2xvY2FsZV0gfHwgc3RyaW5nLmVuIHx8IHN0cmluZy5zb3VyY2U7XG4gICAgbG9jYWxlVHJhbnNsYXRpb25zW3NvdXJjZV0gPSB0cmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiBsb2NhbGVUcmFuc2xhdGlvbnM7XG59XG5cbi8qKiBBIHByZXR0eSBwcmludGVyIGZvciBKYXZhU2NyaXB0IG9iamVjdHMuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmoob2JqOiBhbnkpIHtcbiAgZnVuY3Rpb24gZm9ybWF0KG9iajogYW55KTogc3RyaW5nIHtcbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYFwiJHtvYmoucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJyl9XCJgO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcob2JqKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIGBbJHtvYmoubWFwKGZvcm1hdCkuam9pbignLCAnKX1dYDtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogc3RyaW5nW10gPSBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7a2V5fTogJHtmb3JtYXQodmFsdWUpfWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGB7JHtlbnRyaWVzLmpvaW4oJywgJyl9fWA7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChvYmopO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGRvY0lkIChlLmcuIGBQYWdlcy9mb29gKSBhbmQgcmV0dXJucyB0aGUgYGNvbGxlY3Rpb25gIGFuZCBgc2x1Z2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURvY0lkKGRvY0lkOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2VwSW5kZXggPSBkb2NJZC5pbmRleE9mKCcvJyk7XG4gIGlmIChzZXBJbmRleCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRvYyBpZDogJHtkb2NJZH1gKTtcbiAgfVxuICBjb25zdCBjb2xsZWN0aW9uID0gZG9jSWQuc2xpY2UoMCwgc2VwSW5kZXgpO1xuICBjb25zdCBzbHVnID0gZG9jSWQuc2xpY2Uoc2VwSW5kZXggKyAxKS5yZXBsYWNlQWxsKCcvJywgJy0tJyk7XG4gIGlmICghY29sbGVjdGlvbiB8fCAhc2x1Zykge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkb2MgaWQ6ICR7ZG9jSWR9YCk7XG4gIH1cbiAgcmV0dXJuIHtjb2xsZWN0aW9uLCBzbHVnfTtcbn1cbiIsICJpbXBvcnQge2luaXRpYWxpemVBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge2dldFNlY3VyaXR5UnVsZXN9IGZyb20gJ2ZpcmViYXNlLWFkbWluL3NlY3VyaXR5LXJ1bGVzJztcblxuZXhwb3J0IGNvbnN0IEZJUkVTVE9SRV9SVUxFUyA9IGBydWxlc192ZXJzaW9uID0gJzInO1xuc2VydmljZSBjbG91ZC5maXJlc3RvcmUge1xuICBtYXRjaCAvZGF0YWJhc2VzL3tkYXRhYmFzZX0vZG9jdW1lbnRzIHtcbiAgICBtYXRjaCAve2RvY3VtZW50PSoqfSB7XG4gICAgICBhbGxvdyByZWFkLCB3cml0ZTogaWYgZmFsc2U7XG4gICAgfVxuXG4gICAgbWF0Y2ggL1Byb2plY3RzL3twcm9qZWN0fSB7XG4gICAgICBhbGxvdyB3cml0ZTpcbiAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJJc0FkbWluKCk7XG4gICAgICBhbGxvdyByZWFkOlxuICAgICAgICBpZiBpc1NpZ25lZEluKCkgJiYgdXNlckNhblJlYWQoKTtcblxuICAgICAgbWF0Y2ggL3tjb2xsZWN0aW9ufS97ZG9jdW1lbnQ9Kip9IHtcbiAgICAgICAgYWxsb3cgd3JpdGU6XG4gICAgICAgICAgaWYgaXNTaWduZWRJbigpICYmIHVzZXJDYW5Xcml0ZSgpO1xuICAgICAgICBhbGxvdyByZWFkOlxuICAgICAgICAgIGlmIGlzU2lnbmVkSW4oKSAmJiB1c2VyQ2FuUmVhZCgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc1NpZ25lZEluKCkge1xuICAgICAgICByZXR1cm4gcmVxdWVzdC5hdXRoICE9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGdldFJvbGVzKCkge1xuICAgICAgICByZXR1cm4gZ2V0KC9kYXRhYmFzZXMvJChkYXRhYmFzZSkvZG9jdW1lbnRzL1Byb2plY3RzLyQocHJvamVjdCkpLmRhdGEucm9sZXM7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVzZXJDYW5SZWFkKCkge1xuICAgICAgICBsZXQgcm9sZXMgPSBnZXRSb2xlcygpO1xuICAgICAgICBsZXQgZW1haWwgPSByZXF1ZXN0LmF1dGgudG9rZW4uZW1haWw7XG4gICAgICAgIGxldCBkb21haW4gPSAnKkAnICsgZW1haWwuc3BsaXQoJ0AnKVsxXTtcbiAgICAgICAgcmV0dXJuIChyb2xlc1tlbWFpbF0gaW4gWydBRE1JTicsICdFRElUT1InLCAnVklFV0VSJ10pIHx8IChyb2xlc1tkb21haW5dIGluIFsnQURNSU4nLCAnRURJVE9SJywgJ1ZJRVdFUiddKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdXNlckNhbldyaXRlKCkge1xuICAgICAgICBsZXQgcm9sZXMgPSBnZXRSb2xlcygpO1xuICAgICAgICBsZXQgZW1haWwgPSByZXF1ZXN0LmF1dGgudG9rZW4uZW1haWw7XG4gICAgICAgIGxldCBkb21haW4gPSAnKkAnICsgZW1haWwuc3BsaXQoJ0AnKVsxXTtcbiAgICAgICAgcmV0dXJuIChyb2xlc1tlbWFpbF0gaW4gWydBRE1JTicsICdFRElUT1InXSkgfHwgKHJvbGVzW2RvbWFpbl0gaW4gWydBRE1JTicsICdFRElUT1InXSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVzZXJJc0FkbWluKCkge1xuICAgICAgICBsZXQgcm9sZXMgPSBnZXRSb2xlcygpO1xuICAgICAgICBsZXQgZW1haWwgPSByZXF1ZXN0LmF1dGgudG9rZW4uZW1haWw7XG4gICAgICAgIGxldCBkb21haW4gPSAnKkAnICsgZW1haWwuc3BsaXQoJ0AnKVsxXTtcbiAgICAgICAgcmV0dXJuIChyb2xlc1tlbWFpbF0gPT0gJ0FETUlOJykgfHwgKHJvbGVzW2RvbWFpbl0gPT0gJ0FETUlOJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5gO1xuXG4vKipcbiAqIEFkZHMgdGhlIHJvb3QtY21zIHNlY3VyaXR5IHJ1bGVzIHRvIGEgRmlyZWJhc2UgcHJvamVjdC5cbiAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJ1bGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTZWN1cml0eVJ1bGVzKHByb2plY3RJZDogc3RyaW5nKSB7XG4gIC8vIFRPRE8oc3RldmVubGUpOiBjaGVjayBpZiBhbiBhcHAgZXhpc3RzIGZpcnN0IGJlZm9yZSBpbml0aWFsaXppbmcuXG4gIGNvbnN0IGFwcCA9IGluaXRpYWxpemVBcHAoe3Byb2plY3RJZH0pO1xuICBjb25zdCBzZWN1cml0eVJ1bGVzID0gZ2V0U2VjdXJpdHlSdWxlcyhhcHApO1xuICBhd2FpdCBzZWN1cml0eVJ1bGVzLnJlbGVhc2VGaXJlc3RvcmVSdWxlc2V0RnJvbVNvdXJjZShGSVJFU1RPUkVfUlVMRVMpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsZUFBYztBQUN0QixTQUFRLFNBQVMsYUFBWTs7O0FDRDdCLFNBQVEsWUFBWSxVQUFTO0FBQzdCLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLGdCQUFnQix5QkFBd0I7QUFDaEQsWUFBWSxTQUFTO0FBS3JCLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQUU3RCxlQUFzQixnQkFBZ0I7QUFDcEMsUUFBTSxVQUFVLFFBQVEsSUFBSTtBQUM1QixRQUFNLGFBQWEsTUFBTSxlQUFlLFNBQVMsRUFBQyxTQUFTLFdBQVUsQ0FBQztBQUN0RSxRQUFNLGFBQWEsS0FBSyxRQUFRLFdBQVcsY0FBYztBQUN6RCxRQUFNLFVBQVcsTUFBTTtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLFVBQVUsUUFBUSxrQkFBa0I7QUFDMUMsUUFBTSxhQUFhLEtBQUssUUFBUSxTQUFTLGVBQWU7QUFDeEQsUUFBTSxrQkFBa0IsWUFBWSxPQUFPO0FBQzNDLFVBQVEsSUFBSSxzQkFBc0I7QUFDcEM7QUFFQSxJQUFNLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlEakIsZUFBc0Isa0JBQ3BCLFlBQ0EsU0FDQTtBQUNBLFFBQU0sVUFBVSxDQUFDLFFBQVE7QUFDekIsYUFBVyxVQUFVLFNBQVM7QUFDNUIsVUFBTSxTQUFTLFFBQVEsTUFBTTtBQUM3QixZQUFRLEtBQUssYUFBYSxRQUFRLE1BQU0sQ0FBQztBQUFBLEVBQzNDO0FBQ0EsUUFBTSxTQUNKLFFBQ0csS0FBSyxNQUFNLEVBQ1gsV0FBVyxTQUFTLE1BQU0sRUFDMUIsV0FBVyxRQUFRLEtBQUssRUFDeEIsUUFBUSxlQUFlLElBQUksSUFBSTtBQUNwQyxRQUFNLEdBQUcsVUFBVSxZQUFZLFFBQVEsT0FBTztBQUNoRDtBQWNBLFNBQVMsY0FDUCxPQUNBLFNBQ3lCO0FBQ3pCLFFBQU0sT0FBVyxXQUFPO0FBQUEsSUFDdEIsTUFBTTtBQUFBLElBQ04sVUFBVSxPQUFPLE9BQU87QUFBQSxJQUNwQixxQkFBaUI7QUFBQSxFQUN2QjtBQUNBLFFBQU0sUUFBUSxDQUFDO0FBQ2YsTUFBSSxNQUFNLE9BQU87QUFDZixRQUFJLE1BQU0sTUFBTTtBQUNkLFlBQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxLQUFLLE1BQU0sSUFBSSxFQUFFO0FBQUEsSUFDNUMsT0FBTztBQUNMLFlBQU0sS0FBSyxNQUFNLEtBQUs7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLE1BQU0sWUFBWTtBQUNwQixVQUFNLEtBQUssYUFBYTtBQUFBLEVBQzFCO0FBQ0EsTUFBSSxNQUFNLFNBQVMsR0FBRztBQUNwQixTQUFLLGVBQWUsTUFBTSxLQUFLLElBQUk7QUFBQSxFQUNyQztBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsVUFBVSxPQUFjLFNBQXlDO0FBQ3hFLE1BQUksTUFBTSxTQUFTLFNBQVM7QUFDMUIsV0FBVyxTQUFLLE1BQU0sVUFBVSxNQUFNLElBQUksT0FBTyxDQUFDO0FBQUEsRUFDcEQ7QUFDQSxNQUFJLE1BQU0sU0FBUyxXQUFXO0FBQzVCLFdBQVcsU0FBSztBQUFBLEVBQ2xCO0FBQ0EsTUFBSSxNQUFNLFNBQVMsUUFBUTtBQUN6QixXQUFXLFNBQUs7QUFBQSxFQUNsQjtBQUNBLE1BQUksTUFBTSxTQUFTLFlBQVk7QUFDN0IsV0FBVyxTQUFLO0FBQUEsRUFDbEI7QUFDQSxNQUFJLE1BQU0sU0FBUyxRQUFRO0FBQ3pCLFVBQU0sV0FBZSxXQUFPLG1CQUFtQixhQUFhO0FBQzVELFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxNQUFNLFNBQVMsU0FBUztBQUMxQixVQUFNLFlBQWdCLFdBQU8sbUJBQW1CLGNBQWM7QUFDOUQsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLE1BQU0sU0FBUyxlQUFlO0FBQ2hDLFdBQVcsU0FBSyxNQUFVLFNBQUssTUFBTTtBQUFBLEVBQ3ZDO0FBQ0EsTUFBSSxNQUFNLFNBQVMsU0FBUztBQUMxQixVQUFNLFFBQVksV0FBTyxtQkFBbUIsY0FBYztBQUMxRCxRQUFJLE1BQU0sU0FBUyxNQUFNLFFBQVEsTUFBTSxLQUFLLEdBQUc7QUFDN0MsWUFBTSxhQUF1QyxDQUFDO0FBQzlDLFlBQU0sTUFBTSxRQUFRLENBQUMsV0FBbUI7QUFFdEMsWUFBSSxDQUFDLE9BQU8sTUFBTTtBQUNoQjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLFlBQVksYUFBYSxPQUFPLElBQUk7QUFDMUMsY0FBTSxjQUFjLEdBQUcsUUFBUSxNQUFNLElBQUksU0FBUztBQUdsRCxZQUFJLENBQUMsUUFBUSxXQUFXLFdBQVcsR0FBRztBQUNwQyxnQkFBTSxxQkFBeUIsV0FBTztBQUFBLFlBQ3BDO0FBQUEsWUFDSSxxQkFBaUI7QUFBQSxVQUN2QjtBQUNBLDZCQUFtQixRQUFRO0FBQUEsWUFDckIsV0FBTztBQUFBLGNBQ1Q7QUFBQSxjQUNJLFNBQUssY0FBYyxPQUFPLElBQUk7QUFBQSxjQUM5QixxQkFBaUI7QUFBQSxZQUN2QjtBQUFBLFVBQ0Y7QUFDQSxnQkFBTSxrQkFBa0IsT0FBTyxVQUFVLENBQUM7QUFDMUMsMEJBQWdCLFFBQVEsQ0FBQyxNQUFhO0FBQ3BDLCtCQUFtQixRQUFRLEtBQUssY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUFBLFVBQzNELENBQUM7QUFDRCxrQkFBUSxXQUFXLFdBQVcsSUFBSTtBQUFBLFFBQ3BDO0FBRUEsbUJBQVcsS0FBUyxXQUFPLG1CQUFtQixXQUFXLENBQUM7QUFBQSxNQUM1RCxDQUFDO0FBQ0QsVUFBSSxXQUFXLFNBQVMsR0FBRztBQUN6QixjQUFNLGdCQUFnQixDQUFLLFdBQU8sTUFBTSxVQUFVLENBQUM7QUFBQSxNQUNyRDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksTUFBTSxTQUFTLGFBQWE7QUFDOUIsVUFBTSxnQkFBb0IsV0FBTyxtQkFBbUIsa0JBQWtCO0FBQ3RFLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxNQUFNLFNBQVMsWUFBWTtBQUM3QixVQUFNLGVBQW1CLFdBQU8sbUJBQW1CLGlCQUFpQjtBQUNwRSxXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksTUFBTSxTQUFTLFVBQVU7QUFDM0IsV0FBVyxTQUFLO0FBQUEsRUFDbEI7QUFDQSxNQUFJLE1BQU0sU0FBUyxVQUFVO0FBQzNCLFdBQVcsU0FBSztBQUFBLEVBQ2xCO0FBQ0EsTUFBSSxNQUFNLFNBQVMsVUFBVTtBQUMzQixVQUFNLGlCQUFpQixNQUFNLFVBQVUsQ0FBQyxHQUFHO0FBQUEsTUFBSSxDQUFDLE1BQzlDLGNBQWMsR0FBRyxPQUFPO0FBQUEsSUFDMUI7QUFDQSxXQUFXLFdBQU8sV0FBVyxhQUFhO0FBQUEsRUFDNUM7QUFDQSxTQUFXLFNBQUs7QUFDbEI7QUFFQSxTQUFTLGFBQWEsUUFBZ0IsUUFBd0I7QUFDNUQsUUFBTSxRQUFRLG9CQUFvQixNQUFNO0FBQ3hDLFFBQU0sU0FBUyxhQUFhLEtBQUssTUFBTSxNQUFNLEVBQUUsS0FBSyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFHakUsUUFBTSxhQUF1RCxDQUFDO0FBRzlELFFBQU0sa0JBQWtCLEdBQUcsTUFBTTtBQUNqQyxRQUFNLGFBQWlCLFdBQU87QUFBQSxJQUM1QjtBQUFBLElBQ0kscUJBQWlCO0FBQUEsRUFDdkI7QUFDQSxhQUFXLGVBQWU7QUFDMUIsYUFBVyxTQUFTLE9BQU8sUUFBUTtBQUNqQyxRQUFJLENBQUMsTUFBTSxJQUFJO0FBQ2I7QUFBQSxJQUNGO0FBQ0EsZUFBVyxRQUFRLEtBQUssY0FBYyxPQUFPLEVBQUMsUUFBUSxXQUFVLENBQUMsQ0FBQztBQUFBLEVBQ3BFO0FBRUEsUUFBTSxjQUF3QixDQUFDO0FBRy9CLFNBQU8sT0FBTyxVQUFVLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtBQUNsRCxpQkFBYSxlQUFlO0FBQzVCLGdCQUFZO0FBQUEsTUFDTixTQUFLLGNBQWMsRUFBQyx5QkFBeUIsS0FBSSxDQUFDLEVBQUUsS0FBSztBQUFBLElBQy9EO0FBQUEsRUFDRixDQUFDO0FBR0QsY0FBWTtBQUFBLElBQ04sU0FBSyxZQUFZLEVBQUMseUJBQXlCLEtBQUksQ0FBQyxFQUFFLEtBQUs7QUFBQSxFQUM3RDtBQUdBLE1BQUksT0FBTyxXQUFXLGVBQWUsR0FBRztBQUN0QyxVQUFNLFdBQWUsV0FBTyxtQkFBbUIsWUFBWTtBQUMzRCxhQUFTLGNBQWMsS0FBUyxXQUFPLG1CQUFtQixlQUFlLENBQUM7QUFDMUUsVUFBTSxVQUFjLFdBQU87QUFBQSxNQUN6QixHQUFHLE1BQU07QUFBQSxNQUNUO0FBQUEsTUFDSSxxQkFBaUI7QUFBQSxJQUN2QjtBQUNBLFlBQVEsZUFBZTtBQUN2QixVQUFNLGdCQUNILFNBQUssU0FBUyxFQUFDLHlCQUF5QixLQUFJLENBQUMsRUFDN0MsS0FBSztBQUNSLGdCQUFZLEtBQUssYUFBYTtBQUFBLEVBQ2hDO0FBQ0EsU0FBTyxlQUFlLFlBQVksS0FBSyxNQUFNLENBQUM7QUFDaEQ7QUFNQSxTQUFTLGVBQWUsT0FBdUI7QUFDN0MsUUFBTSxRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQzlCLFFBQU0sVUFBb0IsQ0FBQztBQUMzQixhQUFXLFFBQVEsT0FBTztBQUN4QixVQUFNLGdCQUFnQixLQUFLLFFBQVEsU0FBUyxJQUFJLEVBQUUsV0FBVyxLQUFLLEdBQUc7QUFDckUsWUFBUSxLQUFLLGFBQWE7QUFBQSxFQUM1QjtBQUNBLFNBQU8sUUFBUSxLQUFLLElBQUk7QUFDMUI7QUFLQSxTQUFTLGFBQWEsT0FBdUI7QUFDM0MsU0FBTyxNQUFNLFFBQVEsaUJBQWlCLEVBQUU7QUFDMUM7OztBQzNTQSxTQUFRLGtCQUFBQSx1QkFBcUI7OztBQ0E3QixPQUFPLFlBQVk7QUFHbkI7QUFBQSxFQUNFO0FBQUEsRUFHQTtBQUFBLE9BRUs7QUFpOEJBLFNBQVMsYUFBYSxZQUFtQztBQUM5RCxRQUFNLFVBQW9CLFdBQVcsV0FBVyxDQUFDO0FBQ2pELFFBQU0sU0FBUyxRQUFRLEtBQUssQ0FBQ0MsWUFBV0EsUUFBTyxTQUFTLFVBQVU7QUFDbEUsTUFBSSxDQUFDLFFBQVE7QUFDWCxVQUFNLElBQUksTUFBTSx5REFBeUQ7QUFBQSxFQUMzRTtBQUNBLFNBQU87QUFDVDs7O0FDajlCQSxTQUFRLHFCQUFvQjtBQUM1QixTQUFRLHdCQUF1QjtBQUV4QixJQUFNLGtCQUFrQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlEL0IsZUFBc0IsbUJBQW1CLFdBQW1CO0FBRTFELFFBQU0sTUFBTSxjQUFjLEVBQUMsVUFBUyxDQUFDO0FBQ3JDLFFBQU0sZ0JBQWdCLGlCQUFpQixHQUFHO0FBQzFDLFFBQU0sY0FBYyxrQ0FBa0MsZUFBZTtBQUN2RTs7O0FGckRBLGVBQXNCLGFBQWEsU0FBOEI7QUFDL0QsUUFBTSxVQUFVLFFBQVEsSUFBSTtBQUM1QixRQUFNLGFBQWEsTUFBTUMsZ0JBQWUsU0FBUyxFQUFDLFNBQVMsV0FBVSxDQUFDO0FBQ3RFLFFBQU0sWUFBWSxhQUFhLFVBQVU7QUFDekMsUUFBTSxtQkFBbUIsVUFBVSxVQUFVO0FBQzdDLFFBQU0sZUFDSixRQUFRLFdBQVcsaUJBQWlCLGVBQWU7QUFFckQsTUFBSSxDQUFDLGNBQWM7QUFDakIsVUFBTSxJQUFJLE1BQU0sd0RBQXdEO0FBQUEsRUFDMUU7QUFFQSxVQUFRLElBQUksZ0JBQWdCLFlBQVksRUFBRTtBQUMxQyxVQUFRLElBQUksc0NBQStCO0FBQzNDLFFBQU0sbUJBQW1CLFlBQVk7QUFFckMsTUFBSSxRQUFRLE9BQU87QUFDakIsVUFBTSxLQUFLLFVBQVUsYUFBYTtBQUNsQyxVQUFNLGdCQUFnQixpQkFBaUIsTUFBTTtBQUM3QyxVQUFNLFNBQVMsSUFBSSxlQUFlLFFBQVEsS0FBSztBQUFBLEVBQ2pEO0FBRUEsVUFBUSxJQUFJLHFDQUFxQztBQUNuRDtBQUVBLGVBQWUsU0FBUyxJQUFlLFdBQW1CLE9BQWU7QUFDdkUsUUFBTSxTQUFTLFlBQVksbUJBQW1CLFNBQVMsQ0FBQztBQUN4RCxRQUFNLFNBQVMsR0FBRyxJQUFJLE1BQU07QUFDNUIsUUFBTSxXQUFXLE1BQU0sT0FBTyxJQUFJO0FBQ2xDLE1BQUk7QUFDSixNQUFJLFNBQVMsUUFBUTtBQUNuQixXQUFPLFNBQVMsS0FBSyxLQUFLLENBQUM7QUFBQSxFQUM3QixPQUFPO0FBQ0wsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNBLFFBQU0sUUFBUSxLQUFLLFNBQVMsQ0FBQztBQUM3QixRQUFNLEtBQUssSUFBSTtBQUNmLE9BQUssUUFBUTtBQUNiLFFBQU0sT0FBTyxJQUFJLElBQUk7QUFDckIsVUFBUSxJQUFJLGVBQWUsS0FBSyxlQUFlLFNBQVMsRUFBRTtBQUM1RDs7O0FGL0NBLElBQU0sWUFBTixNQUFnQjtBQUFBLEVBSWQsWUFBWSxNQUFjLFNBQWlCO0FBQ3pDLFNBQUssT0FBTztBQUNaLFNBQUssVUFBVTtBQUFBLEVBQ2pCO0FBQUEsRUFFQSxNQUFNLElBQUksTUFBZ0I7QUFDeEIsVUFBTSxVQUFVLElBQUksUUFBUSxLQUFLLElBQUk7QUFDckMsWUFBUSxRQUFRLEtBQUssT0FBTztBQUM1QixZQUFRLE9BQU8sZUFBZSxPQUFPO0FBQ3JDLFlBQVEsS0FBSyxhQUFhLENBQUMsUUFBUTtBQUNqQyxVQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsT0FBTztBQUNyQixnQkFBUTtBQUFBLFVBQ04sYUFBTSxRQUFRLE1BQU0sSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLE9BQU87QUFBQTtBQUFBLFFBQ3pEO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNELFlBQ0csUUFBUSxlQUFlLEVBQ3ZCLE1BQU0sTUFBTSxFQUNaLFlBQVksa0RBQWtELEVBQzlELE9BQU8sdUJBQXVCLGdCQUFnQixFQUM5QyxPQUFPLG1CQUFtQiw4QkFBOEIsRUFDeEQsT0FBTyxZQUFZO0FBQ3RCLFlBQ0csUUFBUSxnQkFBZ0IsRUFDeEIsTUFBTSxPQUFPLEVBQ2I7QUFBQSxNQUNDO0FBQUEsSUFDRixFQUNDLE9BQU8sYUFBYTtBQUN2QixVQUFNLFFBQVEsV0FBVyxJQUFJO0FBQUEsRUFDL0I7QUFDRjsiLAogICJuYW1lcyI6IFsibG9hZFJvb3RDb25maWciLCAicGx1Z2luIiwgImxvYWRSb290Q29uZmlnIl0KfQo=
|