velocious 1.0.457 → 1.0.459

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.
Files changed (41) hide show
  1. package/README.md +2 -0
  2. package/build/configuration-types.js +18 -2
  3. package/build/current.js +3 -3
  4. package/build/database/migration/index.js +2 -0
  5. package/build/database/record/index.js +1 -1
  6. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +76 -9
  7. package/build/frontend-models/base.js +37 -15
  8. package/build/frontend-models/resource-definition.js +105 -14
  9. package/build/src/configuration-types.d.ts +53 -6
  10. package/build/src/configuration-types.d.ts.map +1 -1
  11. package/build/src/configuration-types.js +17 -3
  12. package/build/src/current.d.ts +6 -6
  13. package/build/src/current.d.ts.map +1 -1
  14. package/build/src/current.js +4 -4
  15. package/build/src/database/migration/index.d.ts +8 -0
  16. package/build/src/database/migration/index.d.ts.map +1 -1
  17. package/build/src/database/migration/index.js +3 -1
  18. package/build/src/database/record/index.d.ts +2 -2
  19. package/build/src/database/record/index.d.ts.map +1 -1
  20. package/build/src/database/record/index.js +2 -2
  21. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +35 -0
  22. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  23. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +68 -10
  24. package/build/src/frontend-models/base.d.ts +73 -51
  25. package/build/src/frontend-models/base.d.ts.map +1 -1
  26. package/build/src/frontend-models/base.js +38 -16
  27. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  28. package/build/src/frontend-models/resource-definition.js +92 -15
  29. package/build/src/testing/test-runner.d.ts +5 -0
  30. package/build/src/testing/test-runner.d.ts.map +1 -1
  31. package/build/src/testing/test-runner.js +2 -1
  32. package/build/testing/test-runner.js +1 -0
  33. package/package.json +1 -1
  34. package/src/configuration-types.js +18 -2
  35. package/src/current.js +3 -3
  36. package/src/database/migration/index.js +2 -0
  37. package/src/database/record/index.js +1 -1
  38. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +76 -9
  39. package/src/frontend-models/base.js +37 -15
  40. package/src/frontend-models/resource-definition.js +105 -14
  41. package/src/testing/test-runner.js +1 -0
@@ -242,6 +242,7 @@ export default class DbGenerateFrontendModels extends BaseCommand {
242
242
  };
243
243
  const collectionCommands = modelConfig.collectionCommands;
244
244
  const memberCommands = modelConfig.memberCommands;
245
+ const commandMetadata = modelConfig.commandMetadata || {};
245
246
  const builtInCollectionCommandsAreDefault = builtInCollectionCommands.create === "create" && builtInCollectionCommands.index === "index";
246
247
  const builtInMemberCommandsAreDefault = builtInMemberCommands.attach === "attach"
247
248
  && builtInMemberCommands.destroy === "destroy"
@@ -403,34 +404,36 @@ export default class DbGenerateFrontendModels extends BaseCommand {
403
404
  fileContent += ` set${camelizedAttributeUpper}(newValue) { return /** @type {${setterAttributeType}} */ (this.setAttribute(${JSON.stringify(attribute.name)}, newValue)) }\n`;
404
405
  }
405
406
  for (const methodName of Object.keys(collectionCommands)) {
407
+ const signature = this.customCommandMethodSignature({ commandMetadata, methodName });
406
408
  fileContent += "\n";
407
409
  fileContent += " /**\n";
408
410
  fileContent += ` * Runs ${methodName}.\n`;
409
- fileContent += " * @param {...FrontendModelAttributeValue} commandArguments - Custom command arguments.\n";
410
- fileContent += " * @returns {Promise<Record<string, FrontendModelAttributeValue>>} - Command response.\n";
411
+ fileContent += signature.paramDocs;
412
+ fileContent += ` * @returns {Promise<${signature.returnType}>} - Command response.\n`;
411
413
  fileContent += " */\n";
412
- fileContent += ` static async ${methodName}(...commandArguments) {\n`;
414
+ fileContent += ` static async ${methodName}(${signature.parameters}) {\n`;
413
415
  fileContent += " return await this.executeCustomCommand({\n";
414
416
  fileContent += ` commandName: ${JSON.stringify(collectionCommands[methodName])},\n`;
415
417
  fileContent += ` commandType: ${JSON.stringify(collectionCommands[methodName])},\n`;
416
- fileContent += ` payload: ${className}.normalizeCustomCommandPayloadArguments(commandArguments),\n`;
418
+ fileContent += ` payload: ${className}.normalizeCustomCommandPayloadArguments(${signature.payloadArguments}),\n`;
417
419
  fileContent += " resourcePath: this.resourcePath()\n";
418
420
  fileContent += " })\n";
419
421
  fileContent += " }\n";
420
422
  }
421
423
  for (const methodName of Object.keys(memberCommands)) {
424
+ const signature = this.customCommandMethodSignature({ commandMetadata, methodName });
422
425
  fileContent += "\n";
423
426
  fileContent += " /**\n";
424
427
  fileContent += ` * Runs ${methodName}.\n`;
425
- fileContent += " * @param {...FrontendModelAttributeValue} commandArguments - Custom command arguments.\n";
426
- fileContent += " * @returns {Promise<Record<string, FrontendModelAttributeValue>>} - Command response.\n";
428
+ fileContent += signature.paramDocs;
429
+ fileContent += ` * @returns {Promise<${signature.returnType}>} - Command response.\n`;
427
430
  fileContent += " */\n";
428
- fileContent += ` async ${methodName}(...commandArguments) {\n`;
431
+ fileContent += ` async ${methodName}(${signature.parameters}) {\n`;
429
432
  fileContent += ` return await ${className}.executeCustomCommand({\n`;
430
433
  fileContent += ` commandName: ${JSON.stringify(memberCommands[methodName])},\n`;
431
434
  fileContent += ` commandType: ${JSON.stringify(memberCommands[methodName])},\n`;
432
435
  fileContent += " memberId: this.primaryKeyValue(),\n";
433
- fileContent += ` payload: ${className}.normalizeCustomCommandPayloadArguments(commandArguments),\n`;
436
+ fileContent += ` payload: ${className}.normalizeCustomCommandPayloadArguments(${signature.payloadArguments}),\n`;
434
437
  fileContent += ` resourcePath: ${className}.resourcePath()\n`;
435
438
  fileContent += " })\n";
436
439
  fileContent += " }\n";
@@ -1174,7 +1177,62 @@ export default class DbGenerateFrontendModels extends BaseCommand {
1174
1177
  methodName: attributeName,
1175
1178
  sourceClassName: ownerClassName
1176
1179
  });
1177
- return jsDocType ? { jsDocType } : null;
1180
+ // Frontend attributes hold the serialized (resolved) value, so an async
1181
+ // backend accessor typed `Promise<number>` must surface as `number` — the
1182
+ // same unwrapping the resource-method inference path applies.
1183
+ return jsDocType
1184
+ ? { jsDocType: this.frontendResolvableAttributeJsDocType(this.unwrappedPromiseJsDocType({ jsDocType })) }
1185
+ : null;
1186
+ }
1187
+ /**
1188
+ * A backend accessor's `@returns` can reference types that exist only on the
1189
+ * backend (e.g. a model-local `@typedef AgentRunPlanningArtifact`). The frontend
1190
+ * model can't resolve those, so fall back to `any` rather than emitting an
1191
+ * undefined type name. Types built only from primitives and known generic
1192
+ * builtins pass through unchanged.
1193
+ * @param {string} jsDocType - Resolved (Promise-unwrapped) attribute type.
1194
+ * @returns {string} - A frontend-resolvable attribute type.
1195
+ */
1196
+ frontendResolvableAttributeJsDocType(jsDocType) {
1197
+ const safeTypeIdentifiers = new Set([
1198
+ "Array", "Date", "Exclude", "Extract", "FrontendModelAttributeValue", "FrontendModelTransportValue",
1199
+ "Map", "NonNullable", "Omit", "Partial", "Pick", "Promise", "Readonly", "ReadonlyArray", "Record",
1200
+ "Required", "ReturnType", "Set"
1201
+ ]);
1202
+ const referencedIdentifiers = jsDocType.match(/[A-Z][A-Za-z0-9_$]*/g) || [];
1203
+ if (referencedIdentifiers.some((identifier) => !safeTypeIdentifiers.has(identifier))) {
1204
+ return "any";
1205
+ }
1206
+ return jsDocType;
1207
+ }
1208
+ /**
1209
+ * Builds the JSDoc param block, parameter list, payload-argument expression, and
1210
+ * return type for a custom command method. With declared `args` each becomes a
1211
+ * named, typed parameter mapped positionally into the command payload; without
1212
+ * them the method stays variadic.
1213
+ * @param {object} args - Arguments.
1214
+ * @param {Record<string, {args: Array<{name: string, type: string}>, returnType: string | null}>} args.commandMetadata - Per-command metadata.
1215
+ * @param {string} args.methodName - Command method name.
1216
+ * @returns {{paramDocs: string, parameters: string, payloadArguments: string, returnType: string}} - Generation pieces.
1217
+ */
1218
+ customCommandMethodSignature({ commandMetadata, methodName }) {
1219
+ const metadata = commandMetadata[methodName] || { args: [], returnType: null };
1220
+ const returnType = metadata.returnType || "Record<string, ?>";
1221
+ if (metadata.args.length > 0) {
1222
+ const parameterNames = metadata.args.map((arg) => arg.name);
1223
+ return {
1224
+ paramDocs: metadata.args.map((arg) => ` * @param {${arg.type}} ${arg.name} - Command argument.\n`).join(""),
1225
+ parameters: parameterNames.join(", "),
1226
+ payloadArguments: `[${parameterNames.join(", ")}]`,
1227
+ returnType
1228
+ };
1229
+ }
1230
+ return {
1231
+ paramDocs: " * @param {...FrontendModelAttributeValue} commandArguments - Custom command arguments.\n",
1232
+ parameters: "...commandArguments",
1233
+ payloadArguments: "commandArguments",
1234
+ returnType
1235
+ };
1178
1236
  }
1179
1237
  /**
1180
1238
  * Runs unwrapped promise js doc type.
@@ -1631,4 +1689,4 @@ export default class DbGenerateFrontendModels extends BaseCommand {
1631
1689
  };
1632
1690
  }
1633
1691
  }
1634
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyw4QkFBOEIsRUFBRSxtREFBbUQsRUFBQyxNQUFNLHNEQUFzRCxDQUFBO0FBQ3hKLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBQyxNQUFNLHVEQUF1RCxDQUFBO0FBRWhLOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSDs7O0dBR0c7QUFFSCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELHlDQUF5QztJQUN6QywwQkFBMEIsR0FBRyxJQUFJLENBQUE7SUFFakMsMkNBQTJDO0lBQzNDLDZCQUE2QixHQUFHLElBQUksQ0FBQTtJQUVwQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRTFELE1BQU0sYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLE9BQU8sa0JBQWtCLENBQUMscUJBQXFCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkUsTUFBTSxrQkFBa0IsQ0FBQyxxQkFB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QU0sSUFBSSxLQUFLLENBQUMsVUFBVSxTQUFTLG1CQUFtQixnQkFBZ0IsMkJBQTJCLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtRQUN2SCxDQUFDO1FBRUQsSUFBSSxlQUFlLENBQUE7UUFFbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtZQUUzRCxlQUFlLEdBQUcsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLENBQUE7UUFDcEQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHVGQUF1RjtRQUN6RixDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFBO1lBRXhDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLFNBQVMsbUJBQW1CLGdCQUFnQiw2QkFBNkIsQ0FBQyxDQUFBO1lBQ3RHLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQ3BDLGdCQUFnQjtZQUNoQixlQUFlO1lBQ2YsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RSxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VJc0J1aWx0SW4sIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Zyb250ZW5kLW1vZGVscy9idWlsdC1pbi1yZXNvdXJjZXMuanNcIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb259IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5cbi8qKlxuICogQXR0cmlidXRlIG1ldGFkYXRhIHVzZWQgZm9yIGdlbmVyYXRlZCBmcm9udGVuZC1tb2RlbCBKU0RvYy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kQXR0cmlidXRlQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3R5cGVdIC0gQ29sdW1uIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtblR5cGVdIC0gQ29sdW1uIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NxbFR5cGVdIC0gU1FMIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFUeXBlXSAtIERhdGEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbanNEb2NUeXBlXSAtIEV4YWN0IEpTRG9jIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gQXR0cmlidXRlIG5hbWUgd2hlbiBjb25maWd1cmVkIGFzIGFuIGFycmF5IGVudHJ5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIG51bGwgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NlbGVjdGVkQnlEZWZhdWx0XSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IFtnZXRUeXBlXSAtIFJldHVybnMgY29sdW1uIHR5cGUuXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IFtnZXROdWxsXSAtIFJldHVybnMgd2hldGhlciBudWxsIGlzIGFsbG93ZWQuXG4gKi9cbi8qKlxuICogUGVybWl0IHNwZWMgcmV0dXJuZWQgYnkgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGR1cmluZyBnZW5lcmF0aW9uLlxuICogQHR5cGVkZWYge0FycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjPj59IEZyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjXG4gKi9cblxuLyoqIE5vZGUgQ0xJIGNvbW1hbmQgdGhhdCBnZW5lcmF0ZXMgZnJvbnRlbmQgbW9kZWwgY2xhc3NlcyBmcm9tIGJhY2tlbmQgcHJvamVjdCByZXNvdXJjZSBjb25maWcuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYkdlbmVyYXRlRnJvbnRlbmRNb2RlbHMgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPiB8IG51bGx9ICovXG4gIF9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gbnVsbFxuXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nW10+IHwgbnVsbH0gKi9cbiAgX3Jlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhlY3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBmaWxlcyBhcmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cygpXG5cbiAgICBhd2FpdCBjb25maWd1cmF0aW9uLmluaXRpYWxpemVNb2RlbHMoKVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnRIYW5kbGVyID0gY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKVxuXG4gICAgaWYgKHR5cGVvZiBlbnZpcm9ubWVudEhhbmRsZXIuYXV0b0Rpc2NvdmVyUmVzb3VyY2VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IGVudmlyb25tZW50SGFuZGxlci5hdXRvRGlzY292ZXJSZXNvdXJjZXMoY29uZmlndXJhdGlvbilcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmFja2VuZFByb2plY3RzKSB8fCBiYWNrZW5kUHJvamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBiYWNrZW5kIHByb2plY3RzIGNvbmZpZ3VyZWQuIENvbmZpZ3VyZSAnYmFja2VuZFByb2plY3RzJyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlyc3RcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnN1cmVkIGRpcmVjdG9yaWVzLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBlbnN1cmVkRGlyZWN0b3JpZXMgPSBuZXcgU2V0KClcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQgbW9kZWwgbmFtZXMgYnkgZGlyZWN0b3J5LlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59ICovXG4gICAgY29uc3QgZ2VuZXJhdGVkTW9kZWxOYW1lc0J5RGlyZWN0b3J5ID0gbmV3IE1hcCgpXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVkIGZpbGVzIGJ5IGRpcmVjdG9yeS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgQXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT4+fSAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZEZpbGVzQnlEaXJlY3RvcnkgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICAvLyBDYW5vbmljYWxpemUgdGhlIG91dHB1dCBkaXJlY3Rvcnkgc28gZXF1aXZhbGVudCBzcGVsbGluZ3MgKGEgdHJhaWxpbmdcbiAgICAgIC8vIHNsYXNoLCBgLmAvYC4uYCBzZWdtZW50cywgZHVwbGljYXRlIHNlcGFyYXRvcnMsIHJlbGF0aXZlIHZzIGFic29sdXRlKVxuICAgICAgLy8gcmVzb2x2ZSB0byBhIHNpbmdsZSBrZXkuIE90aGVyd2lzZSB0aGUgcGVyLWRpcmVjdG9yeSBtYXBzIGJlbG93IHRyZWF0XG4gICAgICAvLyB0aGVtIGFzIGRpZmZlcmVudCBkaXJlY3RvcmllcywgZHVwbGljYXRlIGNsYXNzIG5hbWVzIHNsaXAgcGFzdCBkZXRlY3Rpb24sXG4gICAgICAvLyBhbmQgdGhlIHNwbGl0IGJ1Y2tldHMgd3JpdGUgaW5jb21wbGV0ZSBpbmRleC5qcy9zZXR1cC5qcyBmb3IgZmlsZXMgdGhhdFxuICAgICAgLy8gYWN0dWFsbHkgbGFuZCBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgb24gZGlzay5cbiAgICAgIGNvbnN0IGZyb250ZW5kTW9kZWxzRGlyID0gcGF0aC5yZXNvbHZlKHRoaXMuZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnlGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkpXG4gICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoRm9yRnJvbnRlbmRNb2RlbHNEaXJlY3RvcnkoZnJvbnRlbmRNb2RlbHNEaXIpXG5cbiAgICAgIGlmICghZW5zdXJlZERpcmVjdG9yaWVzLmhhcyhmcm9udGVuZE1vZGVsc0RpcikpIHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZnJvbnRlbmRNb2RlbHNEaXIsIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgICAgICBlbnN1cmVkRGlyZWN0b3JpZXMuYWRkKGZyb250ZW5kTW9kZWxzRGlyKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZEZpbGVzQnlEaXJlY3RvcnkuaGFzKGZyb250ZW5kTW9kZWxzRGlyKSkge1xuICAgICAgICBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5LnNldChmcm9udGVuZE1vZGVsc0RpciwgW10pXG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdGVkTW9kZWxOYW1lc0J5RGlyZWN0b3J5Lmhhcyhmcm9udGVuZE1vZGVsc0RpcikpIHtcbiAgICAgICAgZ2VuZXJhdGVkTW9kZWxOYW1lc0J5RGlyZWN0b3J5LnNldChmcm9udGVuZE1vZGVsc0RpciwgbmV3IFNldCgpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRGaWxlcyA9IGdlbmVyYXRlZEZpbGVzQnlEaXJlY3RvcnkuZ2V0KGZyb250ZW5kTW9kZWxzRGlyKVxuICAgICAgY29uc3QgZ2VuZXJhdGVkTW9kZWxOYW1lcyA9IGdlbmVyYXRlZE1vZGVsTmFtZXNCeURpcmVjdG9yeS5nZXQoZnJvbnRlbmRNb2RlbHNEaXIpXG5cbiAgICAgIGlmICghZ2VuZXJhdGVkRmlsZXMpIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIGZpbGVzIGxpc3QgbWlzc2luZyBmb3IgJHtmcm9udGVuZE1vZGVsc0Rpcn1gKVxuICAgICAgaWYgKCFnZW5lcmF0ZWRNb2RlbE5hbWVzKSB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBtb2RlbCBuYW1lcyBzZXQgbWlzc2luZyBmb3IgJHtmcm9udGVuZE1vZGVsc0Rpcn1gKVxuICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5yZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzID0gdGhpcy5hdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyhyZXNvdXJjZXMpXG5cbiAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzc05hbWUgaW4gcmVzb3VyY2VzKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ29uZmlnID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlc1ttb2RlbENsYXNzTmFtZV0pXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUobW9kZWxDbGFzc05hbWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpKVxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGAke2luZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShjbGFzc05hbWUpKX0uanNgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7ZnJvbnRlbmRNb2RlbHNEaXJ9LyR7ZmlsZU5hbWV9YFxuXG4gICAgICAgIGlmICghbW9kZWxDb25maWcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgZGVmaW5pdGlvbiBmb3IgJyR7Y2xhc3NOYW1lfSdgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRSZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdKVxuICAgICAgICAvLyBBbiBhYnN0cmFjdCBiYXNlIHJlc291cmNlIChubyBzdGF0aWMgTW9kZWxDbGFzcyDigJQgZS5nLiBhbiBhcHAncyBzaGFyZWRcbiAgICAgICAgLy8gYEJhc2VSZXNvdXJjZWAgdGhhdCBvdGhlciByZXNvdXJjZXMgZXh0ZW5kKSBjYW4ndCBiYWNrIGEgZ2VuZXJhdGVkXG4gICAgICAgIC8vIGZyb250ZW5kIG1vZGVsLiBUcmVhdCBpdCBhcyByZXNvdXJjZS1sZXNzIHNvIHRoZSBnZW5lcmF0b3IgZmFsbHMgYmFja1xuICAgICAgICAvLyB0byBieS1uYW1lIG1vZGVsIGxvb2t1cCArIGVtcHR5IHdyaXRlIHBhcmFtcyBpbnN0ZWFkIG9mIHRocm93aW5nIHdoZW5cbiAgICAgICAgLy8gaXQgZWFnZXJseSBjYWxscyBgbW9kZWxDbGFzcygpYCAvIGBwZXJtaXR0ZWRQYXJhbXMoKWAgb24gaXQuXG4gICAgICAgIGNvbnN0IHJlc291cmNlQ2xhc3MgPSByZXNvbHZlZFJlc291cmNlQ2xhc3MgJiYgcmVzb2x2ZWRSZXNvdXJjZUNsYXNzLk1vZGVsQ2xhc3MgPyByZXNvbHZlZFJlc291cmNlQ2xhc3MgOiBudWxsXG5cbiAgICAgICAgdGhpcy52YWxpZGF0ZU1vZGVsQ29uZmlnKHthdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcywgY2xhc3NOYW1lLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG5cbiAgICAgICAgaWYgKGdlbmVyYXRlZE1vZGVsTmFtZXMuaGFzKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICBpZiAoZnJvbnRlbmRNb2RlbFJlc291cmNlSXNCdWlsdEluKHttb2RlbE5hbWU6IG1vZGVsQ2xhc3NOYW1lLCByZXNvdXJjZURlZmluaXRpb246IHJlc291cmNlc1ttb2RlbENsYXNzTmFtZV19KSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBmcm9udGVuZCBtb2RlbCBkZWZpbml0aW9uIGZvciAnJHtjbGFzc05hbWV9J2ApXG4gICAgICAgIH1cblxuICAgICAgICBnZW5lcmF0ZWRNb2RlbE5hbWVzLmFkZChjbGFzc05hbWUpXG5cbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmJ1aWxkTW9kZWxGaWxlQ29udGVudCh7XG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIGltcG9ydFBhdGgsXG4gICAgICAgICAgbW9kZWxDbGFzczogcmVzb3VyY2VDbGFzcyA/IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpIDogY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKVtjbGFzc05hbWVdLFxuICAgICAgICAgIG1vZGVsQ29uZmlnLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGZpbGVDb250ZW50KVxuICAgICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKHtjbGFzc05hbWUsIGZpbGVOYW1lfSlcblxuICAgICAgICBjb25zb2xlLmxvZyhgY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvJHtmaWxlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2Zyb250ZW5kTW9kZWxzRGlyLCBnZW5lcmF0ZWRGaWxlc10gb2YgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeSkge1xuICAgICAgY29uc3QgaW5kZXhDb250ZW50ID0gdGhpcy5idWlsZEluZGV4RmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmcm9udGVuZE1vZGVsc0Rpcn0vaW5kZXguanNgLCBpbmRleENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvaW5kZXguanNcIilcblxuICAgICAgY29uc3Qgc2V0dXBDb250ZW50ID0gdGhpcy5idWlsZFNldHVwRmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpXG5cbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmcm9udGVuZE1vZGVsc0Rpcn0vc2V0dXAuanNgLCBzZXR1cENvbnRlbnQpXG5cbiAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRlIHNyYy9mcm9udGVuZC1tb2RlbHMvc2V0dXAuanNcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB2YWxpZGF0ZSBtb2RlbCBjb25maWcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhcmdzLmF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzIC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzIGluIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGFiaWxpdGllcyA9IG1vZGVsQ29uZmlnLmFiaWxpdGllc1xuXG4gICAgaWYgKCFhYmlsaXRpZXMgfHwgdHlwZW9mIGFiaWxpdGllcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBpcyBtaXNzaW5nIHJlcXVpcmVkICdhYmlsaXRpZXMnIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZEFjdGlvbnMgPSBbXG4gICAgICB7YWN0aW9uOiBcImluZGV4XCIsIGFiaWxpdHlBY3Rpb246IGFiaWxpdGllcy5pbmRleH0sXG4gICAgICB7YWN0aW9uOiBcImZpbmRcIiwgYWJpbGl0eUFjdGlvbjogYWJpbGl0aWVzLmZpbmR9XG4gICAgXVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9uLCBhYmlsaXR5QWN0aW9ufSBvZiByZWFkQWN0aW9ucykge1xuICAgICAgaWYgKHR5cGVvZiBhYmlsaXR5QWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHlBY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgYWJpbGl0aWVzLiR7YWN0aW9ufSBjb25maWdgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2Ygbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGlmICghYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMuaGFzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfScgcmVmZXJlbmNlcyAnJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfScsIGJ1dCBubyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBleGlzdHMgZm9yIHRoYXQgdGFyZ2V0IGluIHRoaXMgYmFja2VuZCBwcm9qZWN0YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZXNvdXJjZXMgZm9yIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKi9cbiAgcmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbj59IHJlc291cmNlcyAtIFJlc291cmNlIGNvbmZpZ3VyYXRpb24ga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIEF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcy5cbiAgICovXG4gIGF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzKHJlc291cmNlcykge1xuICAgIC8qKlxuICAgICAqIENsYXNzIG5hbWVzLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY2xhc3NOYW1lcy5hZGQoaW5mbGVjdGlvbi5jYW1lbGl6ZShyZXNvdXJjZU1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbHMgZGlyZWN0b3J5IGZvciBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7e2Zyb250ZW5kTW9kZWxzT3V0cHV0UGF0aD86IHN0cmluZ319IGJhY2tlbmRQcm9qZWN0IC0gQmFja2VuZCBwcm9qZWN0IGNvbmZpZy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBYnNvbHV0ZSBmcm9udGVuZCBtb2RlbHMgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxzRGlyZWN0b3J5Rm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gYmFja2VuZFByb2plY3QuZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoIHx8IHRoaXMuZGlyZWN0b3J5KClcblxuICAgIHJldHVybiBgJHtvdXRwdXRQYXRofS9zcmMvZnJvbnRlbmQtbW9kZWxzYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW1wb3J0IHBhdGggZm9yIGZyb250ZW5kIG1vZGVscyBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9udGVuZE1vZGVsc0RpciAtIEZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2UgY2xhc3MgaW1wb3J0IHBhdGguXG4gICAqL1xuICBpbXBvcnRQYXRoRm9yRnJvbnRlbmRNb2RlbHNEaXJlY3RvcnkoZnJvbnRlbmRNb2RlbHNEaXIpIHtcbiAgICBjb25zdCBkZXZNb2RlID0gZnJvbnRlbmRNb2RlbHNEaXIuaW5jbHVkZXMoXCIvc3BlYy9kdW1teS9zcmMvZnJvbnRlbmQtbW9kZWxzXCIpXG5cbiAgICBpZiAoZGV2TW9kZSkge1xuICAgICAgcmV0dXJuIFwiLi4vLi4vLi4vLi4vc3JjL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCJcbiAgICB9XG5cbiAgICByZXR1cm4gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIG1vZGVsIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBNZXRob2QgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW1wb3J0UGF0aCAtIEJhc2UgY2xhc3MgaW1wb3J0IHBhdGguXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBHZW5lcmF0ZWQgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgYXN5bmMgYnVpbGRNb2RlbEZpbGVDb250ZW50KHtjbGFzc05hbWUsIGltcG9ydFBhdGgsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLmF0dHJpYnV0ZURlZmluaXRpb25zRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSB0aGlzLnJlbGF0aW9uc2hpcHNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgYXR0YWNobWVudHMgPSBtb2RlbENvbmZpZy5hdHRhY2htZW50cyAmJiB0eXBlb2YgbW9kZWxDb25maWcuYXR0YWNobWVudHMgPT09IFwib2JqZWN0XCJcbiAgICAgID8gbW9kZWxDb25maWcuYXR0YWNobWVudHNcbiAgICAgIDoge31cbiAgICBjb25zdCBhdHRyaWJ1dGVzVHlwZU5hbWUgPSBgJHtjbGFzc05hbWV9QXR0cmlidXRlc2BcbiAgICBjb25zdCBjcmVhdGVBdHRyaWJ1dGVzVHlwZU5hbWUgPSBgJHtjbGFzc05hbWV9Q3JlYXRlQXR0cmlidXRlc2BcbiAgICBjb25zdCB1cGRhdGVBdHRyaWJ1dGVzVHlwZU5hbWUgPSBgJHtjbGFzc05hbWV9VXBkYXRlQXR0cmlidXRlc2BcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IGF0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lKVxuICAgIGNvbnN0IHBlcm1pdHRlZENyZWF0ZVBhcmFtcyA9IHRoaXMucGVybWl0dGVkUGFyYW1zRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MgfHwgbnVsbCwgXCJjcmVhdGVcIilcbiAgICBjb25zdCBwZXJtaXR0ZWRVcGRhdGVQYXJhbXMgPSB0aGlzLnBlcm1pdHRlZFBhcmFtc0ZvckdlbmVyYXRvcihyZXNvdXJjZUNsYXNzIHx8IG51bGwsIFwidXBkYXRlXCIpXG4gICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlcyA9IHRoaXMubmVzdGVkV3JpdGVUeXBlc0Zvck1vZGVsKHtjbGFzc05hbWUsIHBlcm1pdHRlZFBhcmFtczogcGVybWl0dGVkQ3JlYXRlUGFyYW1zLmNvbmNhdChwZXJtaXR0ZWRVcGRhdGVQYXJhbXMpLCByZWxhdGlvbnNoaXBzfSlcbiAgICBjb25zdCB1c2VzVHJhbnNwb3J0VmFsdWUgPSBhdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLmpzRG9jVHlwZS5pbmNsdWRlcyhcIkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVwiKSlcbiAgICAgIHx8IG5lc3RlZFdyaXRlVHlwZXMuc29tZSgobmVzdGVkV3JpdGVUeXBlKSA9PiBuZXN0ZWRXcml0ZVR5cGUuYXR0cmlidXRlcy5zb21lKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS50eXBlLmluY2x1ZGVzKFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIpKSlcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzID0ge1xuICAgICAgY3JlYXRlOiBtb2RlbENvbmZpZy5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmNyZWF0ZSB8fCBcImNyZWF0ZVwiLFxuICAgICAgaW5kZXg6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggfHwgXCJpbmRleFwiXG4gICAgfVxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IHtcbiAgICAgIGF0dGFjaDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmF0dGFjaCB8fCBcImF0dGFjaFwiLFxuICAgICAgZGVzdHJveTogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRlc3Ryb3kgfHwgXCJkZXN0cm95XCIsXG4gICAgICBkb3dubG9hZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRvd25sb2FkIHx8IFwiZG93bmxvYWRcIixcbiAgICAgIGZpbmQ6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy5maW5kIHx8IFwiZmluZFwiLFxuICAgICAgdXBkYXRlOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMudXBkYXRlIHx8IFwidXBkYXRlXCIsXG4gICAgICB1cmw6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgfHwgXCJ1cmxcIlxuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0aW9uQ29tbWFuZHMgPSBtb2RlbENvbmZpZy5jb2xsZWN0aW9uQ29tbWFuZHNcbiAgICBjb25zdCBtZW1iZXJDb21tYW5kcyA9IG1vZGVsQ29uZmlnLm1lbWJlckNvbW1hbmRzXG4gICAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmNyZWF0ZSA9PT0gXCJjcmVhdGVcIiAmJiBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmluZGV4ID09PSBcImluZGV4XCJcbiAgICBjb25zdCBidWlsdEluTWVtYmVyQ29tbWFuZHNBcmVEZWZhdWx0ID0gYnVpbHRJbk1lbWJlckNvbW1hbmRzLmF0dGFjaCA9PT0gXCJhdHRhY2hcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRlc3Ryb3kgPT09IFwiZGVzdHJveVwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgPT09IFwiZG93bmxvYWRcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgPT09IFwiZmluZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMudXBkYXRlID09PSBcInVwZGF0ZVwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMudXJsID09PSBcInVybFwiXG5cbiAgICBsZXQgZmlsZUNvbnRlbnQgPSBcIlwiXG5cbiAgICBmaWxlQ29udGVudCArPSBgaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlIGZyb20gXCIke2ltcG9ydFBhdGh9XCJcXG5gXG5cbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWcuXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7aW1wb3J0KFwiJHtpbXBvcnRQYXRofVwiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ1xcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICogRmFsbGJhY2sgYXR0cmlidXRlIHZhbHVlIHR5cGUgZm9yIGdlbmVyYXRlZCBmaWVsZHMgd2l0aG91dCBuYXJyb3dlciBtZXRhZGF0YS5cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7aW1wb3J0KFwiJHtpbXBvcnRQYXRofVwiKS5Gcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWV9IEZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgaWYgKHVzZXNUcmFuc3BvcnRWYWx1ZSkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgKiBWYWx1ZSBzdXBwb3J0ZWQgYnkgZnJvbnRlbmQtbW9kZWwgdHJhbnNwb3J0IHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi5cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgKiAke2F0dHJpYnV0ZXNUeXBlTmFtZX0gdHlwZS5cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtvYmplY3R9ICR7YXR0cmlidXRlc1R5cGVOYW1lfVxcbmBcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBgICogQHByb3BlcnR5IHske2F0dHJpYnV0ZS5qc0RvY1R5cGV9fSAke2F0dHJpYnV0ZS5uYW1lfSAtIEF0dHJpYnV0ZSB2YWx1ZS5cXG5gXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBmb3IgKGNvbnN0IG5lc3RlZFdyaXRlVHlwZSBvZiBuZXN0ZWRXcml0ZVR5cGVzKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICogQXR0cmlidXRlcyBhY2NlcHRlZCBmb3IgbmVzdGVkICR7bmVzdGVkV3JpdGVUeXBlLnJlbGF0aW9uc2hpcE5hbWV9IHdyaXRlcy5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHtuZXN0ZWRXcml0ZVR5cGUudHlwZU5hbWV9XFxuYFxuICAgICAgZm9yIChjb25zdCBuZXN0ZWRBdHRyaWJ1dGUgb2YgbmVzdGVkV3JpdGVUeXBlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEBwcm9wZXJ0eSB7JHtuZXN0ZWRBdHRyaWJ1dGUudHlwZX19IFske25lc3RlZEF0dHJpYnV0ZS5uYW1lfV0gLSBOZXN0ZWQgJHtuZXN0ZWRBdHRyaWJ1dGUubmFtZX0gdmFsdWUuXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBhd2FpdCB0aGlzLndyaXRlQXR0cmlidXRlc1R5cGVkZWYoe2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgbW9kZWxDbGFzcywgbmVzdGVkV3JpdGVUeXBlcywgcGVybWl0dGVkUGFyYW1zOiBwZXJtaXR0ZWRDcmVhdGVQYXJhbXMsIHJlc291cmNlQ2xhc3MsIHR5cGVOYW1lOiBjcmVhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9KVxuICAgIGZpbGVDb250ZW50ICs9IGF3YWl0IHRoaXMud3JpdGVBdHRyaWJ1dGVzVHlwZWRlZih7YXR0cmlidXRlcywgYXR0cmlidXRlc1R5cGVOYW1lLCBtb2RlbENsYXNzLCBuZXN0ZWRXcml0ZVR5cGVzLCBwZXJtaXR0ZWRQYXJhbXM6IHBlcm1pdHRlZFVwZGF0ZVBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWU6IHVwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0pXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBGcm9udGVuZCBtb2RlbCBmb3IgJHtjbGFzc05hbWV9LlxcbmBcbiAgICBmaWxlQ29udGVudCArPSBgICogQGF1Z21lbnRzIHtGcm9udGVuZE1vZGVsQmFzZTwke2F0dHJpYnV0ZXNUeXBlTmFtZX0sICR7Y3JlYXRlQXR0cmlidXRlc1R5cGVOYW1lfSwgJHt1cGRhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9Pn1cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGBjbGFzcyAke2NsYXNzTmFtZX0gZXh0ZW5kcyBGcm9udGVuZE1vZGVsQmFzZSB7XFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gLSBSZXNvdXJjZSBjb25maWcuICovXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlc291cmNlQ29uZmlnKCkge1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIHtcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBtb2RlbE5hbWU6ICR7SlNPTi5zdHJpbmdpZnkoY2xhc3NOYW1lKX0sXFxuYFxuICAgIGlmIChPYmplY3Qua2V5cyhhdHRhY2htZW50cykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBhdHRhY2htZW50czoge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IFthdHRhY2htZW50TmFtZSwgYXR0YWNobWVudENvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoYXR0YWNobWVudHMpKSB7XG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRUeXBlID0gYXR0YWNobWVudENvbmZpZyAmJiB0eXBlb2YgYXR0YWNobWVudENvbmZpZyA9PT0gXCJvYmplY3RcIiAmJiBhdHRhY2htZW50Q29uZmlnLnR5cGUgPT09IFwiaGFzTWFueVwiXG4gICAgICAgICAgPyBcImhhc01hbnlcIlxuICAgICAgICAgIDogXCJoYXNPbmVcIlxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAgICR7YXR0YWNobWVudE5hbWV9OiB7dHlwZTogJHtKU09OLnN0cmluZ2lmeShhdHRhY2htZW50VHlwZSl9fSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIH0sXFxuXCJcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtcbiAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJhdHRyaWJ1dGVzXCIsXG4gICAgICB2YWx1ZXM6IGF0dHJpYnV0ZU5hbWVzXG4gICAgfSlcbiAgICBpZiAoIWJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNBcmVEZWZhdWx0KSB7XG4gICAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtcbiAgICAgICAgZmlsdGVyRGVmYXVsdFZhbHVlczoge2NyZWF0ZTogXCJjcmVhdGVcIiwgaW5kZXg6IFwiaW5kZXhcIn0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgICAgICAgdmFsdWVzOiBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoIWJ1aWx0SW5NZW1iZXJDb21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7XG4gICAgICAgICAgYXR0YWNoOiBcImF0dGFjaFwiLFxuICAgICAgICAgIGRlc3Ryb3k6IFwiZGVzdHJveVwiLFxuICAgICAgICAgIGRvd25sb2FkOiBcImRvd25sb2FkXCIsXG4gICAgICAgICAgZmluZDogXCJmaW5kXCIsXG4gICAgICAgICAgdXBkYXRlOiBcInVwZGF0ZVwiLFxuICAgICAgICAgIHVybDogXCJ1cmxcIlxuICAgICAgICB9LFxuICAgICAgICBpbmRlbnQ6IFwiICAgICAgXCIsXG4gICAgICAgIHByb3BlcnR5TmFtZTogXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIixcbiAgICAgICAgdmFsdWVzOiBidWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhjb2xsZWN0aW9uQ29tbWFuZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGNvbGxlY3Rpb25Db21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKG1lbWJlckNvbW1hbmRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZENvbW1hbmRzUHJvcGVydHkoe1xuICAgICAgICBpbmRlbnQ6IFwiICAgICAgXCIsXG4gICAgICAgIHByb3BlcnR5TmFtZTogXCJtZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IG1lbWJlckNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAobW9kZWxDbGFzcyAmJiBtb2RlbENsYXNzLnByaW1hcnlLZXkoKSAhPT0gXCJpZFwiKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcHJpbWFyeUtleTogJHtKU09OLnN0cmluZ2lmeShtb2RlbENsYXNzLnByaW1hcnlLZXkoKSl9LFxcbmBcbiAgICB9XG4gICAgY29uc3QgbmVzdGVkUmVsYXRpb25zaGlwTmFtZXMgPSB0aGlzLm5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MgfHwgbnVsbClcbiAgICBpZiAobmVzdGVkUmVsYXRpb25zaGlwTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBuZXN0ZWRBdHRyaWJ1dGVzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgICAgICAke3JlbGF0aW9uc2hpcE5hbWV9OiB7fSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIH0sXFxuXCJcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuXG4gICAgaWYgKHJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3R5cGU6IFxcXCJiZWxvbmdzVG9cXFwiIHwgXFxcImhhc09uZVxcXCIgfCBcXFwiaGFzTWFueVxcXCIsIGF1dG9sb2FkPzogYm9vbGVhbn0+fSAtIFJlbGF0aW9uc2hpcCBkZWZpbml0aW9ucy4gKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIHN0YXRpYyByZWxhdGlvbnNoaXBEZWZpbml0aW9ucygpIHtcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFtgdHlwZTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAudHlwZSl9YF1cblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwLmF1dG9sb2FkID09PSBmYWxzZSkgcGFydHMucHVzaChcImF1dG9sb2FkOiBmYWxzZVwiKVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfTogeyR7cGFydHMuam9pbihcIiwgXCIpfX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gUmVsYXRpb25zaGlwIG1vZGVsIGNsYXNzIG5hbWVzLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpIHtcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgICAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSl9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlLm5hbWUsIHRydWUpXG4gICAgICBjb25zdCBjYW1lbGl6ZWRBdHRyaWJ1dGVVcHBlciA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlLm5hbWUpXG4gICAgICBjb25zdCBhdHRyaWJ1dGVUeXBlID0gYCR7YXR0cmlidXRlc1R5cGVOYW1lfVske0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX1dYFxuICAgICAgY29uc3Qgc2V0dGVyQXR0cmlidXRlVHlwZSA9IGF3YWl0IHRoaXMuZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVR5cGUoe1xuICAgICAgICBhdHRyaWJ1dGUsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IGF0dHJpYnV0ZS5uYW1lLFxuICAgICAgICBhdHRyaWJ1dGVzVHlwZU5hbWUsXG4gICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgIH0pXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7JHthdHRyaWJ1dGVUeXBlfX0gLSBBdHRyaWJ1dGUgdmFsdWUuICovXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtjYW1lbGl6ZWRBdHRyaWJ1dGV9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHske2F0dHJpYnV0ZVR5cGV9fSAqLyAodGhpcy5yZWFkQXR0cmlidXRlKCR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfSkpIH1cXG5gXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlckF0dHJpYnV0ZVR5cGV9fSBuZXdWYWx1ZSAtIE5ldyBhdHRyaWJ1dGUgdmFsdWUuXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7c2V0dGVyQXR0cmlidXRlVHlwZX19IC0gQXNzaWduZWQgdmFsdWUuXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke2NhbWVsaXplZEF0dHJpYnV0ZVVwcGVyfShuZXdWYWx1ZSkgeyByZXR1cm4gLyoqIEB0eXBlIHske3NldHRlckF0dHJpYnV0ZVR5cGV9fSAqLyAodGhpcy5zZXRBdHRyaWJ1dGUoJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9LCBuZXdWYWx1ZSkpIH1cXG5gXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtZXRob2ROYW1lIG9mIE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUnVucyAke21ldGhvZE5hbWV9LlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcGFyYW0gey4uLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gY29tbWFuZEFyZ3VtZW50cyAtIEN1c3RvbSBjb21tYW5kIGFyZ3VtZW50cy5cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZT4+fSAtIENvbW1hbmQgcmVzcG9uc2UuXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc3RhdGljIGFzeW5jICR7bWV0aG9kTmFtZX0oLi4uY29tbWFuZEFyZ3VtZW50cykge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVDdXN0b21Db21tYW5kKHtcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb25Db21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBjb21tYW5kVHlwZTogJHtKU09OLnN0cmluZ2lmeShjb2xsZWN0aW9uQ29tbWFuZHNbbWV0aG9kTmFtZV0pfSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcGF5bG9hZDogJHtjbGFzc05hbWV9Lm5vcm1hbGl6ZUN1c3RvbUNvbW1hbmRQYXlsb2FkQXJndW1lbnRzKGNvbW1hbmRBcmd1bWVudHMpLFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgcmVzb3VyY2VQYXRoOiB0aGlzLnJlc291cmNlUGF0aCgpXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH0pXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJ1bnMgJHttZXRob2ROYW1lfS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHBhcmFtIHsuLi5Gcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWV9IGNvbW1hbmRBcmd1bWVudHMgLSBDdXN0b20gY29tbWFuZCBhcmd1bWVudHMuXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWU+Pn0gLSBDb21tYW5kIHJlc3BvbnNlLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIGFzeW5jICR7bWV0aG9kTmFtZX0oLi4uY29tbWFuZEFyZ3VtZW50cykge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIGF3YWl0ICR7Y2xhc3NOYW1lfS5leGVjdXRlQ3VzdG9tQ29tbWFuZCh7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBtZW1iZXJJZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKSxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHBheWxvYWQ6ICR7Y2xhc3NOYW1lfS5ub3JtYWxpemVDdXN0b21Db21tYW5kUGF5bG9hZEFyZ3VtZW50cyhjb21tYW5kQXJndW1lbnRzKSxcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcmVzb3VyY2VQYXRoOiAke2NsYXNzTmFtZX0ucmVzb3VyY2VQYXRoKClcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9KVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRJbXBvcnRQYXRoID0gYC4vJHtyZWxhdGlvbnNoaXAudGFyZ2V0RmlsZU5hbWV9LmpzYFxuICAgICAgY29uc3QgdGFyZ2V0SW5zdGFuY2VUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfWBcbiAgICAgIGNvbnN0IHRhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlID0gYGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfUNyZWF0ZUF0dHJpYnV0ZXNgXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAudHlwZSA9PSBcImhhc01hbnlcIikge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAtIFJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59IC0gUmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSgpIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgbG9hZGVkICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge0FycmF5PCR7dGFyZ2V0SW5zdGFuY2VUeXBlfT59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9TG9hZGVkKCkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWRlZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTwke3RhcmdldEluc3RhbmNlVHlwZX0+Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZCgpIH1cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9IHJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gLSBSZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGx9IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZGVkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBCdWlsZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9fSBbYXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIGZvciB0aGUgbmV3IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0YXJnZXRJbnN0YW5jZVR5cGV9fSAtIEJ1aWx0IHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYnVpbGQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KGF0dHJpYnV0ZXMgPSB7fSkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmJ1aWxkKGF0dHJpYnV0ZXMpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogTG9hZHMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyBsb2FkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfSgpIHsgcmV0dXJuIGF3YWl0IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zIG9yIGxvYWRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbD59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1PckxvYWQoKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkub3JMb2FkKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBTZXRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsfSBtb2RlbCAtIFJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0obW9kZWwpIHsgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLnNldExvYWRlZChtb2RlbCkgfVxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgRnJvbnRlbmRNb2RlbEJhc2UucmVnaXN0ZXJNb2RlbCgke2NsYXNzTmFtZX0pXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IHske2NsYXNzTmFtZX19XFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgJHtjbGFzc05hbWV9XFxuYFxuXG4gICAgcmV0dXJuIGZpbGVDb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBpbmRleCBmaWxlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT59IGdlbmVyYXRlZEZpbGVzIC0gR2VuZXJhdGVkIG1vZGVsIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEluZGV4IGZpbGUgY29udGVudCB0aGF0IGltcG9ydHMgYW5kIHJlLWV4cG9ydHMgYWxsIG1vZGVscy5cbiAgICovXG4gIGJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcykge1xuICAgIGxldCBjb250ZW50ID0gXCJcIlxuXG4gICAgZm9yIChjb25zdCB7Y2xhc3NOYW1lLCBmaWxlTmFtZX0gb2YgZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gYGV4cG9ydCB7ZGVmYXVsdCBhcyAke2NsYXNzTmFtZX19IGZyb20gXCIuLyR7ZmlsZU5hbWV9XCJcXG5gXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIHNldHVwIGZpbGUgY29udGVudC5cbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2V0dXAgZmlsZSBjb250ZW50IHdpdGggc2lkZS1lZmZlY3QgaW1wb3J0cyBmb3IgbW9kZWwgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgYnVpbGRTZXR1cEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIi8vIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBieSBWZWxvY2lvdXMuIERvIG5vdCBlZGl0IG1hbnVhbGx5LlxcblwiXG5cbiAgICBjb250ZW50ICs9IFwiLy8gUnVuIGB2ZWxvY2lvdXMgZzpmcm9udGVuZC1tb2RlbHNgIHRvIHJlZ2VuZXJhdGUuXFxuXCJcblxuICAgIGZvciAoY29uc3Qge2ZpbGVOYW1lfSBvZiBnZW5lcmF0ZWRGaWxlcykge1xuICAgICAgY29udGVudCArPSBgaW1wb3J0IFwiLi8ke2ZpbGVOYW1lfVwiXFxuYFxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3cml0ZSBhdHRyaWJ1dGVzIHR5cGVkZWYuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nfT59IGFyZ3MuYXR0cmlidXRlcyAtIEdlbmVyYXRlZCByZWFkIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZXNUeXBlTmFtZSAtIEdlbmVyYXRlZCByZWFkIGF0dHJpYnV0ZXMgdHlwZWRlZiBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtBcnJheTx7YXR0cmlidXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZ30+fSBhcmdzLm5lc3RlZFdyaXRlVHlwZXMgLSBOZXN0ZWQgd3JpdGUgdHlwZWRlZnMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IGFyZ3MucGVybWl0dGVkUGFyYW1zIC0gUmVzb3VyY2UgcGVybWl0dGVkIHBhcmFtcyBzcGVjLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnR5cGVOYW1lIC0gVHlwZWRlZiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEdlbmVyYXRlZCB0eXBlZGVmIHNvdXJjZS5cbiAgICovXG4gIGFzeW5jIHdyaXRlQXR0cmlidXRlc1R5cGVkZWYoe2F0dHJpYnV0ZXMsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgbW9kZWxDbGFzcywgbmVzdGVkV3JpdGVUeXBlcywgcGVybWl0dGVkUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZX0pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVMaW5lcyA9IFtdXG5cbiAgICBsZXQgb3V0cHV0ID0gXCIvKipcXG5cIlxuXG4gICAgY29uc3QgYXR0cmlidXRlc0J5TmFtZSA9IG5ldyBNYXAoYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gW2F0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGVdKSlcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzQnlLZXkgPSBuZXcgTWFwKG5lc3RlZFdyaXRlVHlwZXMubWFwKChuZXN0ZWRXcml0ZVR5cGUpID0+IFtgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX1BdHRyaWJ1dGVzYCwgbmVzdGVkV3JpdGVUeXBlXSkpXG4gICAgY29uc3QgZW1pdHRlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlcm1pdHRlZFBhcmFtcykge1xuICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lOiBlbnRyeSwgYXR0cmlidXRlc0J5TmFtZSwgbW9kZWxDbGFzc30pXG5cbiAgICAgICAgaWYgKGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcy5oYXMoYXR0cmlidXRlTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgZW1pdHRlZEF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBhd2FpdCB0aGlzLmZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZXNCeU5hbWUuZ2V0KGF0dHJpYnV0ZU5hbWUpLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgYXR0cmlidXRlc1R5cGVOYW1lLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhdHRyaWJ1dGVMaW5lcy5wdXNoKGAgKiBAcHJvcGVydHkgeyR7dHlwZX19IFske2F0dHJpYnV0ZU5hbWV9XSAtIFBlcm1pdHRlZCAke2F0dHJpYnV0ZU5hbWV9IHZhbHVlLlxcbmApXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5ICYmIHR5cGVvZiBlbnRyeSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGUgPSBuZXN0ZWRXcml0ZVR5cGVzQnlLZXkuZ2V0KGtleSlcbiAgICAgICAgICBjb25zdCB0eXBlID0gbmVzdGVkV3JpdGVUeXBlID8gYEFycmF5PCR7bmVzdGVkV3JpdGVUeXBlLnR5cGVOYW1lfT5gIDogXCJBcnJheTxvYmplY3Q+XCJcblxuICAgICAgICAgIGF0dHJpYnV0ZUxpbmVzLnB1c2goYCAqIEBwcm9wZXJ0eSB7JHt0eXBlfX0gWyR7a2V5fV0gLSBQZXJtaXR0ZWQgbmVzdGVkICR7a2V5fSB2YWx1ZXMuXFxuYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dCArPSBgICogQXR0cmlidXRlcyBhY2NlcHRlZCBieSAke3R5cGVOYW1lfS5cXG5gXG4gICAgaWYgKGF0dHJpYnV0ZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb3V0cHV0ICs9IGAgKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgbmV2ZXI+fSAke3R5cGVOYW1lfVxcbmBcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke3R5cGVOYW1lfVxcbmBcbiAgICAgIG91dHB1dCArPSBhdHRyaWJ1dGVMaW5lcy5qb2luKFwiXCIpXG4gICAgfVxuICAgIG91dHB1dCArPSBcIiAqL1xcblwiXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCB3cml0ZSBhdHRyaWJ1dGUgdHlwZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlOiB7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ30gfCB1bmRlZmluZWQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgYXR0cmlidXRlc1R5cGVOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSlNEb2MgdHlwZSBmb3IgdGhlIHBlcm1pdHRlZCB3cml0ZSBmaWVsZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVUeXBlKHthdHRyaWJ1dGUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZXNUeXBlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBjb25zdCBzZXR0ZXJQYXJhbWV0ZXJUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlU2V0dGVyUGFyYW1ldGVyVHlwZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pXG5cbiAgICBpZiAoc2V0dGVyUGFyYW1ldGVyVHlwZSkgcmV0dXJuIGAke3NldHRlclBhcmFtZXRlclR5cGV9IHwgbnVsbGBcblxuICAgIGlmICghYXR0cmlidXRlKSByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuXG4gICAgaWYgKGF0dHJpYnV0ZS5qc0RvY1R5cGUudHJpbSgpID09PSBcIm51bGxcIikgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcblxuICAgIHJldHVybiBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgd3JpdGUgYXR0cmlidXRlIHNldHRlciBwYXJhbWV0ZXIgdHlwZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZXNvdXJjZUNsYXNzOiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBTZXR0ZXIgdmFsdWUgcGFyYW1ldGVyIHR5cGUgd2hlbiBpdCBpcyB1c2VmdWwgZm9yIGdlbmVyYXRpb24uXG4gICAqL1xuICBhc3luYyBmcm9udGVuZFdyaXRlQXR0cmlidXRlU2V0dGVyUGFyYW1ldGVyVHlwZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3M/Lm5hbWUpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2ROYW1lID0gYHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKX1BdHRyaWJ1dGVgXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlKHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBwYXJhbWV0ZXJJbmRleDogMSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogcmVzb3VyY2VDbGFzcy5uYW1lXG4gICAgfSlcblxuICAgIGlmICghcGFyYW1ldGVyVHlwZSkgcmV0dXJuIG51bGxcbiAgICBpZiAodGhpcy5pc0Jyb2FkR2VuZXJhdGVkVHlwZShwYXJhbWV0ZXJUeXBlKSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBicm9hZCBnZW5lcmF0ZWQgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzRG9jVHlwZSAtIEpTRG9jIHR5cGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHR5cGUgaXMgdG9vIGJyb2FkIHRvIGltcHJvdmUgZ2VuZXJhdGVkIHdyaXRlIHR5cGluZy5cbiAgICovXG4gIGlzQnJvYWRHZW5lcmF0ZWRUeXBlKGpzRG9jVHlwZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0ganNEb2NUeXBlLnRyaW0oKVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUeXBlID09PSBcIj9cIlxuICAgICAgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwiYW55XCJcbiAgICAgIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcIm9iamVjdFwiXG4gICAgICB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJ1bmtub3duXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcm1pdHRlZCB3cml0ZSBhdHRyaWJ1dGUgdG8gdGhlIGdlbmVyYXRlZCBmcm9udGVuZCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt7YXR0cmlidXRlTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzQnlOYW1lOiBNYXA8c3RyaW5nLCB7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ30+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kIGF0dHJpYnV0ZSBuYW1lIHVzZWQgYnkgZ2VuZXJhdGVkIGFjY2Vzc29ycy5cbiAgICovXG4gIGZyb250ZW5kV3JpdGVBdHRyaWJ1dGVOYW1lKHthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVzQnlOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmIChhdHRyaWJ1dGVzQnlOYW1lLmhhcyhhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcblxuICAgIGlmIChtb2RlbENsYXNzKSB7XG4gICAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZU5hbWUgPSBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIGlmIChyZXNvbHZlZEF0dHJpYnV0ZU5hbWUgJiYgYXR0cmlidXRlc0J5TmFtZS5oYXMocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIHJlc29sdmVkQXR0cmlidXRlTmFtZVxuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRBdHRyaWJ1dGVOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lLCB0cnVlKS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgbWF0Y2hpbmdBdHRyaWJ1dGVOYW1lID0gQXJyYXkuZnJvbShhdHRyaWJ1dGVzQnlOYW1lLmtleXMoKSkuZmluZCgoY2FuZGlkYXRlTmFtZSkgPT4gY2FuZGlkYXRlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub3JtYWxpemVkQXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChtYXRjaGluZ0F0dHJpYnV0ZU5hbWUpIHJldHVybiBtYXRjaGluZ0F0dHJpYnV0ZU5hbWVcblxuICAgIC8vIFdyaXRlLW9ubHkgdmlydHVhbCBwYXJhbXMgYXJlIHZhbGlkIHBlcm1pdHRlZCBwYXJhbXMgZXZlbiB3aGVuIHRoZXkgaGF2ZSBubyByZWFkIGF0dHJpYnV0ZS5cbiAgICByZXR1cm4gYXR0cmlidXRlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmVzdGVkIHdyaXRlIHR5cGVzIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IGFyZ3MucGVybWl0dGVkUGFyYW1zIC0gQ29tYmluZWQgcGVybWl0dGVkIHBhcmFtcyBzcGVjcy5cbiAgICogQHBhcmFtIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gYXJncy5yZWxhdGlvbnNoaXBzIC0gR2VuZXJhdGVkIHJlbGF0aW9uc2hpcHMuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXR0cmlidXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdHlwZU5hbWU6IHN0cmluZ30+fSAtIE5lc3RlZCB3cml0ZSB0eXBlZGVmcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlVHlwZXNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBwZXJtaXR0ZWRQYXJhbXMsIHJlbGF0aW9uc2hpcHN9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwc0J5TmFtZSA9IG5ldyBNYXAocmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gW3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lLCByZWxhdGlvbnNoaXBdKSlcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlcm1pdHRlZFBhcmFtcykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkgY29udGludWVcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgIGlmICgha2V5LmVuZHNXaXRoKFwiQXR0cmlidXRlc1wiKSkgY29udGludWVcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZSA9IGtleS5zbGljZSgwLCAtXCJBdHRyaWJ1dGVzXCIubGVuZ3RoKVxuICAgICAgICBjb25zdCBuZXN0ZWRTcGVjID0gZW50cnlba2V5XVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzQnlOYW1lLmdldChyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgICBsZXQgdGFyZ2V0TW9kZWxDbGFzc1xuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3MocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRhcmdldE1vZGVsQ2xhc3MgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmVzdGVkV3JpdGVUeXBlc0J5TmFtZS5oYXMocmVsYXRpb25zaGlwTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgbmVzdGVkV3JpdGVUeXBlc0J5TmFtZS5zZXQocmVsYXRpb25zaGlwTmFtZSwge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMubmVzdGVkV3JpdGVBdHRyaWJ1dGVzRm9yU3BlYyh7bmVzdGVkU3BlYywgdGFyZ2V0TW9kZWxDbGFzc30pLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgICAgdHlwZU5hbWU6IGAke2NsYXNzTmFtZX0ke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwTmFtZSl9TmVzdGVkQXR0cmlidXRlc2BcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXN0ZWRXcml0ZVR5cGVzQnlOYW1lLnZhbHVlcygpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmVzdGVkIHdyaXRlIGF0dHJpYnV0ZXMgZm9yIHNwZWMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIG9iamVjdD4+IHwgb2JqZWN0IHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5uZXN0ZWRTcGVjIC0gTmVzdGVkIHBlcm1pdCBzcGVjLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy50YXJnZXRNb2RlbENsYXNzIC0gVGFyZ2V0IGJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgYXR0cmlidXRlcy5cbiAgICovXG4gIG5lc3RlZFdyaXRlQXR0cmlidXRlc0ZvclNwZWMoe25lc3RlZFNwZWMsIHRhcmdldE1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5lc3RlZFNwZWMpKSByZXR1cm4gW11cblxuICAgIHJldHVybiBuZXN0ZWRTcGVjLmZpbHRlcigoZW50cnkpID0+IHR5cGVvZiBlbnRyeSA9PSBcInN0cmluZ1wiKS5tYXAoKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlTmFtZSA9IHRhcmdldE1vZGVsQ2xhc3M/LnJlc29sdmVBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpIHx8IGF0dHJpYnV0ZU5hbWVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZTogcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lLFxuICAgICAgICB0eXBlOiBhdHRyaWJ1dGVDb25maWcgPyB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWd9KSA6IFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVybWl0dGVkIHBhcmFtcyBmb3IgZ2VuZXJhdG9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gcmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiY3JlYXRlXCIgfCBcInVwZGF0ZVwifSBhY3Rpb24gLSBXcml0ZSBhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsR2VuZXJhdG9yUGVybWl0U3BlY30gLSBQZXJtaXR0ZWQgcGFyYW1zIHNwZWMuXG4gICAqL1xuICBwZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcywgYWN0aW9uKSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gW11cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKClcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVzb3VyY2VDbGFzcyh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgIGxvY2Fsczoge30sXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7YXR0cmlidXRlczogW119KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHNwZWMgPSBpbnN0YW5jZS5wZXJtaXR0ZWRQYXJhbXMoe2FjdGlvbiwgYWJpbGl0eTogdW5kZWZpbmVkLCBsb2NhbHM6IHt9LCBwYXJhbXM6IHt9fSlcblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc3BlYykgPyBzcGVjIDogW11cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW52b2tlICR7cmVzb3VyY2VDbGFzcy5uYW1lfS5wZXJtaXR0ZWRQYXJhbXMoKSB3aGlsZSBnZW5lcmF0aW5nIGZyb250ZW5kIG1vZGVsIHdyaXRlIHR5cGVzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlcyBhIGJhY2tlbmQgcmVzb3VyY2UncyBgcGVybWl0dGVkUGFyYW1zKClgIGluc3RhbmNlIG1ldGhvZCBhdFxuICAgKiBnZW5lcmF0aW9uIHRpbWUgYW5kIGV4dHJhY3RzIHRoZSByZWxhdGlvbnNoaXAgbmFtZXMgdGhhdCBhY2NlcHRcbiAgICogbmVzdGVkIHdyaXRlcyAoYHtmb29BdHRyaWJ1dGVzOiBbLi4uXX1gIGVudHJpZXMpLiBUaGUgZ2VuZXJhdG9yXG4gICAqIGVtaXRzIHRob3NlIG5hbWVzIGludG8gdGhlIGZyb250ZW5kIG1vZGVsJ3MgYHJlc291cmNlQ29uZmlnKClgIHNvXG4gICAqIHRoZSBjbGllbnQgYHNhdmUoKWAgd2Fsa2VyIGtub3dzIHdoaWNoIHJlbGF0aW9uc2hpcHMgdG8gc2hpcC5cbiAgICpcbiAgICogQ29uc3RydWN0ZWQgd2l0aCBubyBjb250cm9sbGVyL2FiaWxpdHkgc28gcmVzb3VyY2Ugb3ZlcnJpZGVzIG11c3RcbiAgICogc3VwcG9ydCBiZWluZyBjYWxsZWQgd2l0aG91dCBhIHJlcXVlc3QgY29udGV4dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IHJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFJlbGF0aW9uc2hpcCBuYW1lcyB0aGF0IGFjY2VwdCBuZXN0ZWQgd3JpdGVzIChlbXB0eSB3aGVuIG5vbmUpLlxuICAgKi9cbiAgbmVzdGVkUmVsYXRpb25zaGlwTmFtZXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcykge1xuICAgIGlmICghcmVzb3VyY2VDbGFzcykgcmV0dXJuIFtdXG5cbiAgICBsZXQgc3BlY1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKVxuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyByZXNvdXJjZUNsYXNzKHtcbiAgICAgICAgYWJpbGl0eTogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0OiB7fSxcbiAgICAgICAgbG9jYWxzOiB7fSxcbiAgICAgICAgbW9kZWxDbGFzcyxcbiAgICAgICAgbW9kZWxOYW1lOiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpLFxuICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHthdHRyaWJ1dGVzOiBbXX0pXG4gICAgICB9KVxuICAgICAgc3BlYyA9IGluc3RhbmNlLnBlcm1pdHRlZFBhcmFtcygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGludm9rZSAke3Jlc291cmNlQ2xhc3MubmFtZX0ucGVybWl0dGVkUGFyYW1zKCkgd2hpbGUgZ2VuZXJhdGluZyBmcm9udGVuZCBtb2RlbHM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzcGVjKSkgcmV0dXJuIFtdXG5cbiAgICAvKipcbiAgICAgKiBSZWxhdGlvbnNoaXAgbmFtZXMuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWVzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc3BlYykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIGNvbnRpbnVlXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBpZiAoIWtleS5lbmRzV2l0aChcIkF0dHJpYnV0ZXNcIikpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IG5hbWUgPSBrZXkuc2xpY2UoMCwgLVwiQXR0cmlidXRlc1wiLmxlbmd0aClcbiAgICAgICAgaWYgKG5hbWUpIHJlbGF0aW9uc2hpcE5hbWVzLnB1c2gobmFtZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwTmFtZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBhcnJheSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnZhbHVlcyAtIFN0cmluZyB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG11bHRpbGluZSBhcnJheSBwcm9wZXJ0eS5cbiAgICovXG4gIGZvcm1hdHRlZEFycmF5UHJvcGVydHkoe2luZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgbGV0IG91dHB1dCA9IGAke2luZGVudH0ke3Byb3BlcnR5TmFtZX06IFtcXG5gXG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgb3V0cHV0ICs9IGAke2luZGVudH0gICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSxcXG5gXG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAke2luZGVudH1dLFxcbmBcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBjb21tYW5kcyBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MudmFsdWVzIC0gQ29tbWFuZCBrZXktdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuIEFsd2F5cyBlbWl0c1xuICAgKiAgIHRoZSBjYW1lbENhc2UgbWV0aG9kLW5hbWUgYXJyYXkgZm9ybSAoYG1lbWJlckNvbW1hbmRzOiBbXCJ1cGRhdGVBY2Nlc3NcIl1gKVxuICAgKiAgIHNvIHRoZSBnZW5lcmF0ZWQgY29uZmlnIG1hdGNoZXMgdGhlIGNhbm9uaWNhbFxuICAgKiAgIGBGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWcue2NvbGxlY3Rpb24sbWVtYmVyfUNvbW1hbmRzOiBzdHJpbmdbXWBcbiAgICogICBzaGFwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUgY29tbWFuZCBzbHVnIGZyb20gdGhlIGNhbWVsQ2FzZVxuICAgKiAgIG1ldGhvZCBuYW1lOyBjb25zdW1lcnMgbmV2ZXIgbmVlZCB0byB3cml0ZSBvdXRcbiAgICogICBge3VwZGF0ZUFjY2VzczogXCJ1cGRhdGUtYWNjZXNzXCJ9YCBieSBoYW5kLlxuICAgKi9cbiAgZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7aW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc30pIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzOiBPYmplY3Qua2V5cyh2YWx1ZXMpfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm1hdHRlZCBvYmplY3QgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnZhbHVlcyAtIE9iamVjdCBrZXktdmFsdWVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmZpbHRlckRlZmF1bHRWYWx1ZXNdIC0gRGVmYXVsdCB2YWx1ZXMgdG8gb21pdCBmcm9tIG91dHB1dC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgbXVsdGlsaW5lIG9iamVjdCBwcm9wZXJ0eS5cbiAgICovXG4gIGZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtmaWx0ZXJEZWZhdWx0VmFsdWVzLCBpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiB7XFxuYFxuXG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgb2YgT2JqZWN0LmtleXModmFsdWVzKSkge1xuICAgICAgaWYgKGZpbHRlckRlZmF1bHRWYWx1ZXMgJiYgZmlsdGVyRGVmYXVsdFZhbHVlc1tvYmplY3RLZXldID09PSB2YWx1ZXNbb2JqZWN0S2V5XSkgY29udGludWVcblxuICAgICAgb3V0cHV0ICs9IGAke2luZGVudH0gICR7b2JqZWN0S2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZXNbb2JqZWN0S2V5XSl9LFxcbmBcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gYCR7aW5kZW50fX0sXFxuYFxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXR0cmlidXRlIGRlZmluaXRpb25zIGZvciBtb2RlbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIEZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8e2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9Pj59IC0gQXR0cmlidXRlIGRlZmluaXRpb25zLlxuICAgKi9cbiAgYXN5bmMgYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBsZXQgYXR0cmlidXRlcyA9IG1vZGVsQ29uZmlnLmF0dHJpYnV0ZXNcblxuICAgIC8vIEF1dG8tZGVyaXZlIGF0dHJpYnV0ZXMgZnJvbSBtb2RlbCBjb2x1bW5zIHdoZW4gbm90IGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgIGlmICgoIWF0dHJpYnV0ZXMgfHwgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykgJiYgYXR0cmlidXRlcy5sZW5ndGggPT09IDApKSAmJiBtb2RlbENsYXNzKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gbW9kZWxDbGFzcy5nZXRDb2x1bW5zKClcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGluZmxlY3Rpb24uY2FtZWxpemUoY29sdW1uLmdldE5hbWUoKSwgdHJ1ZSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURlZmluaXRpb25zID0gW11cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9uIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9ICovXG4gICAgICAgIGxldCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gbnVsbFxuICAgICAgICBsZXQgYXR0cmlidXRlTmFtZVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlRGVmaW5pdGlvbiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZURlZmluaXRpb25cbiAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uICYmIHR5cGVvZiBhdHRyaWJ1dGVEZWZpbml0aW9uID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYXR0cmlidXRlRGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gKi8gKGF0dHJpYnV0ZURlZmluaXRpb24pXG4gICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9IFwic3RyaW5nXCIgfHwgYXR0cmlidXRlTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgYXJyYXkgZW50cmllcyB0byBiZSBzdHJpbmdzIG9yIG9iamVjdHMgd2l0aCBhIG5hbWUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGVEZWZpbml0aW9uKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gYXdhaXQgdGhpcy5yZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHtcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckdlbmVyYXRlZEF0dHJpYnV0ZSh7XG4gICAgICAgICAgYXR0cmlidXRlQ29uZmlnLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgbW9kZWxDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGF0dHJpYnV0ZURlZmluaXRpb25zLnB1c2goe1xuICAgICAgICAgIGpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnOiBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30pLFxuICAgICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zXG4gICAgfVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVzIHx8IHR5cGVvZiBhdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICdhdHRyaWJ1dGVzJyBhcyBhcnJheSBvciBvYmplY3QgYnV0IGdvdDogJHthdHRyaWJ1dGVzfWApXG4gICAgfVxuXG4gICAgY29uc3QgYXR0cmlidXRlRGVmaW5pdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVDb25maWcgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG4gICAgICBjb25zdCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnID0gYXR0cmlidXRlQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyAvKiogQHR5cGUge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnfSAqLyAoYXR0cmlidXRlQ29uZmlnKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRBdHRyaWJ1dGVDb25maWcgPSBhd2FpdCB0aGlzLnJlc29sdmVkRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcoe1xuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcsXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgIH0pXG4gICAgICBjb25zdCBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe1xuICAgICAgICBhdHRyaWJ1dGVDb25maWc6IG5vcm1hbGl6ZWRBdHRyaWJ1dGVDb25maWcsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIG1vZGVsQ2xhc3NcbiAgICAgIH0pXG5cbiAgICAgIGF0dHJpYnV0ZURlZmluaXRpb25zLnB1c2goe1xuICAgICAgICBqc0RvY1R5cGU6IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KSxcbiAgICAgICAgbmFtZTogYXR0cmlidXRlTmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlRGVmaW5pdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIGdlbmVyYXRlZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZUNvbmZpZzogRnJvbnRlbmRBdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnfSAtIEF0dHJpYnV0ZSBjb25maWcgdXNlZCBmb3IgZ2VuZXJhdGVkIEpTRG9jLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZywgYXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVJc01vZGVsUHJpbWFyeUtleSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pKSByZXR1cm4gYXR0cmlidXRlQ29uZmlnXG4gICAgaWYgKHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNOdWxsYWJpbGl0eShhdHRyaWJ1dGVDb25maWcpKSByZXR1cm4gYXR0cmlidXRlQ29uZmlnXG5cbiAgICByZXR1cm4gey4uLmF0dHJpYnV0ZUNvbmZpZywgbnVsbDogZmFsc2V9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHRoZSBtb2RlbCBwcmltYXJ5IGtleS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlSXNNb2RlbFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuXG4gICAgaWYgKHR5cGVvZiBwcmltYXJ5S2V5ICE9IFwic3RyaW5nXCIgfHwgcHJpbWFyeUtleS5sZW5ndGggPCAxKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gcHJpbWFyeUtleSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBtb2RlbENsYXNzLnJlc29sdmVBdHRyaWJ1dGVOYW1lKHByaW1hcnlLZXkpID09PSBhdHRyaWJ1dGVOYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmcm9tIGV4cGxpY2l0IG1ldGFkYXRhLCByZXNvdXJjZSBtZXRob2RzLCBtb2RlbCBjb2x1bW5zLCB0cmFuc2xhdGVkIGNvbHVtbnMsIG9yIG1vZGVsIGFjY2Vzc29yIEpTRG9jLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbH0gYXJncy5jb25maWd1cmVkQXR0cmlidXRlQ29uZmlnIC0gUmVzb3VyY2UtcHJvdmlkZWQgYXR0cmlidXRlIGNvbmZpZy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8RnJvbnRlbmRBdHRyaWJ1dGVDb25maWc+fSAtIFJlc29sdmVkIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcuXG4gICAqL1xuICBhc3luYyByZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHthdHRyaWJ1dGVOYW1lLCBjbGFzc05hbWUsIGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyA9IGF3YWl0IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JSZXNvdXJjZUF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRDb2x1bW5Db25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnXG4gICAgICA/IG51bGxcbiAgICAgIDogdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0Zvck1vZGVsQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZFRyYW5zbGF0ZWRDb25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnIHx8IGluZmVycmVkQ29sdW1uQ29uZmlnXG4gICAgICA/IG51bGxcbiAgICAgIDogdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclRyYW5zbGF0ZWRBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkTW9kZWxBY2Nlc3NvckNvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWcgfHwgaW5mZXJyZWRDb2x1bW5Db25maWcgfHwgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnXG4gICAgICA/IG51bGxcbiAgICAgIDogYXdhaXQgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0Zvck1vZGVsQWNjZXNzb3Ioe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyB8fCBpbmZlcnJlZENvbHVtbkNvbmZpZyB8fCBpbmZlcnJlZFRyYW5zbGF0ZWRDb25maWcgfHwgaW5mZXJyZWRNb2RlbEFjY2Vzc29yQ29uZmlnXG5cbiAgICBpZiAoY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyAmJiB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzVHlwZShjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIGluZmVycmVkQ29uZmlnXG4gICAgICAgID8gey4uLmluZmVycmVkQ29uZmlnLCAuLi5jb25maWd1cmVkQXR0cmlidXRlQ29uZmlnfVxuICAgICAgICA6IGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWdcbiAgICB9XG5cbiAgICBpZiAoaW5mZXJyZWRDb25maWcpIHtcbiAgICAgIHJldHVybiBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnXG4gICAgICAgID8gey4uLmluZmVycmVkQ29uZmlnLCAuLi5jb25maWd1cmVkQXR0cmlidXRlQ29uZmlnfVxuICAgICAgICA6IGluZmVycmVkQ29uZmlnXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW5mZXIgSlNEb2MgdHlwZSBmb3IgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlICcke2NsYXNzTmFtZX0jJHthdHRyaWJ1dGVOYW1lfScuIEFkZCBhIGJhY2tlbmQgbW9kZWwgY29sdW1uLCB0cmFuc2xhdGlvbiB0YWJsZSBjb2x1bW4sIGV4cGxpY2l0IHJlc291cmNlIG1ldGFkYXRhLCBvciBhIEByZXR1cm5zIEpTRG9jIHR5cGUgb24gJHtyZXNvdXJjZUNsYXNzPy5uYW1lIHx8IFwidGhlIHJlc291cmNlXCJ9LiR7YXR0cmlidXRlTmFtZX1BdHRyaWJ1dGUoKS5gKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBoYXMgdHlwZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbmZpZyBkZWNsYXJlcyBhIHR5cGUgc291cmNlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdIYXNUeXBlKGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpID09IFwic3RyaW5nXCJcbiAgICAgIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWc/LmpzRG9jVHlwZSA9PSBcInN0cmluZ1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGhhcyBudWxsYWJpbGl0eS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWcuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbmZpZyBkZWNsYXJlcyBudWxsYWJpbGl0eS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzTnVsbGFiaWxpdHkoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRyaWJ1dGVDb25maWcsIFwibnVsbFwiKSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiB0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldE51bGwgPT0gXCJmdW5jdGlvblwiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgdHlwZSBmb3IgZnJvbnRlbmQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MuYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSlNEb2MgdHlwZS5cbiAgICovXG4gIGpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWd9KSB7XG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZyAmJiB0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmpzRG9jVHlwZSA9PSBcInN0cmluZ1wiICYmIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGUubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGVcbiAgICB9XG5cbiAgICBjb25zdCBqc0RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlQmFzZVR5cGUoYXR0cmlidXRlQ29uZmlnKVxuXG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlQ2FuQmVOdWxsKGF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBqc0RvY1R5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7anNEb2NUeXBlfSB8IG51bGxgXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2MgdHlwZSBmb3IgZnJvbnRlbmQgYXR0cmlidXRlIGJhc2UgdHlwZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vbi1udWxsYWJsZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICh0eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJib29sZWFuXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJqc29uXCIgfHwgdHlwZSA9PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiBcIkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVwiXG4gICAgfSBlbHNlIGlmICh0eXBlICYmIFtcImJsb2JcIiwgXCJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwidGV4dFwiLCBcImxvbmd0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcInRpbnl0ZXh0XCIsIFwidXVpZFwiLCBcImNoYXJhY3RlciB2YXJ5aW5nXCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIlxuICAgIH0gZWxzZSBpZiAodHlwZSAmJiBbXCJiaXRcIiwgXCJiaWdpbnRcIiwgXCJkZWNpbWFsXCIsIFwiZG91YmxlXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcImZsb2F0XCIsIFwiaW50XCIsIFwiaW50ZWdlclwiLCBcIm51bWVyaWNcIiwgXCJyZWFsXCIsIFwic21hbGxpbnRcIiwgXCJ0aW55aW50XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXJcIlxuICAgIH0gZWxzZSBpZiAodHlwZSAmJiBbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJ0aW1lc3RhbXBcIiwgXCJ0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVcIiwgXCJ0aW1lc3RhbXB0elwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZVwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNhbiBiZSBudWxsLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBhbGxvd3MgbnVsbCB2YWx1ZXMuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsKCkgPT09IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLm51bGwgPT09IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSB0eXBlIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIE5vcm1hbGl6ZWQgY29sdW1uIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldFR5cGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGF0dHJpYnV0ZUNvbmZpZy5nZXRUeXBlKCkpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZVZhbHVlID0gYXR0cmlidXRlQ29uZmlnLnR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmNvbHVtblR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLnNxbFR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmRhdGFUeXBlXG5cbiAgICBpZiAodHlwZW9mIHR5cGVWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciByZXNvdXJjZSBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsPn0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gcmVzb3VyY2UgbWV0aG9kIEpTRG9jLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JSZXNvdXJjZUF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBtZXRob2ROYW1lID0gYCR7YXR0cmlidXRlTmFtZX1BdHRyaWJ1dGVgXG4gICAgY29uc3Qgb3duZXJDbGFzc05hbWUgPSB0aGlzLm1ldGhvZE93bmVyQ2xhc3NOYW1lKHttZXRob2ROYW1lLCB0YXJnZXRDbGFzczogcmVzb3VyY2VDbGFzc30pXG5cbiAgICBpZiAoIW93bmVyQ2xhc3NOYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QganNEb2NUeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGUoe1xuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogb3duZXJDbGFzc05hbWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZSA/IHtqc0RvY1R5cGU6IHRoaXMudW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSl9IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgdHJhbnNsYXRlZCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gRnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRyYW5zbGF0ZWQgYXR0cmlidXRlIGNvbHVtbnMuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvclRyYW5zbGF0ZWRBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gbnVsbFxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUlzVHJhbnNsYXRlZCh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgVHJhbnNsYXRpb25DbGFzcyA9IG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25DbGFzcygpXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgbGV0IGNvbHVtblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbiA9IFRyYW5zbGF0aW9uQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpKSByZXR1cm4gbnVsbFxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW4gPyB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yQ29sdW1uKHtjb2x1bW59KSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBpcyB0cmFuc2xhdGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgdHJhbnNsYXRlZC5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlSXNUcmFuc2xhdGVkKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmIChyZXNvdXJjZUNsYXNzKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGVkQXR0cmlidXRlcyA9IHJlc291cmNlQ2xhc3MudHJhbnNsYXRlZEF0dHJpYnV0ZXNcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNsYXRlZEF0dHJpYnV0ZXMpICYmIHRyYW5zbGF0ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IG1vZGVsQ2xhc3MuX3RyYW5zbGF0aW9uc1xuXG4gICAgcmV0dXJuIEJvb2xlYW4odHJhbnNsYXRpb25zICYmIHR5cGVvZiB0cmFuc2xhdGlvbnMgPT0gXCJvYmplY3RcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHJhbnNsYXRpb25zLCBhdHRyaWJ1dGVOYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIG1vZGVsIGFjY2Vzc29yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsPn0gLSBBdHRyaWJ1dGUgY29uZmlnIGluZmVycmVkIGZyb20gbW9kZWwgYWNjZXNzb3IgSlNEb2MuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0Zvck1vZGVsQWNjZXNzb3Ioe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgb3duZXJDbGFzc05hbWUgPSB0aGlzLm1ldGhvZE93bmVyQ2xhc3NOYW1lKHttZXRob2ROYW1lOiBhdHRyaWJ1dGVOYW1lLCB0YXJnZXRDbGFzczogbW9kZWxDbGFzc30pXG5cbiAgICBpZiAoIW93bmVyQ2xhc3NOYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QganNEb2NUeXBlID0gYXdhaXQgdGhpcy5yZXNvdXJjZU1ldGhvZFJldHVyblR5cGUoe1xuICAgICAgbWV0aG9kTmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHNvdXJjZUNsYXNzTmFtZTogb3duZXJDbGFzc05hbWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZSA/IHtqc0RvY1R5cGV9IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW53cmFwcGVkIHByb21pc2UganMgZG9jIHR5cGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qc0RvY1R5cGUgLSBKU0RvYyB0eXBlIHRvIG5vcm1hbGl6ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcmVzb2x2ZWQgdmFsdWUgdHlwZSBmb3Igc2VyaWFsaXplZCBmcm9udGVuZCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgdW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSkge1xuICAgIGNvbnN0IHByb21pc2VQcmVmaXggPSBcIlByb21pc2U8XCJcblxuICAgIGlmICghanNEb2NUeXBlLnN0YXJ0c1dpdGgocHJvbWlzZVByZWZpeCkpIHJldHVybiBqc0RvY1R5cGVcblxuICAgIGlmICghanNEb2NUeXBlLmVuZHNXaXRoKFwiPlwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBQcm9taXNlIEpTRG9jIHR5cGUgdG8gZW5kIHdpdGggJz4nOiAke2pzRG9jVHlwZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGpzRG9jVHlwZS5zbGljZShwcm9taXNlUHJlZml4Lmxlbmd0aCwgLTEpLnRyaW0oKVxuXG4gICAgaWYgKHJlc29sdmVkVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFByb21pc2UgSlNEb2MgdHlwZSB0byBjb250YWluIGEgcmVzb2x2ZWQgdHlwZTogJHtqc0RvY1R5cGV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtZXRob2Qgb3duZXIgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gYXJncy50YXJnZXRDbGFzcyAtIFRhcmdldCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gQ2xhc3MgbmFtZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QuXG4gICAqL1xuICBtZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZSwgdGFyZ2V0Q2xhc3N9KSB7XG4gICAgbGV0IHByb3RvdHlwZSA9IHRhcmdldENsYXNzLnByb3RvdHlwZVxuXG4gICAgd2hpbGUgKHByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIG1ldGhvZE5hbWUpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yPy52YWx1ZSAhPSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsXG5cbiAgICAgICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gcHJvdG90eXBlLmNvbnN0cnVjdG9yPy5uYW1lXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3Rvck5hbWUgPT0gXCJzdHJpbmdcIiAmJiBjb25zdHJ1Y3Rvck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc291cmNlQ2xhc3NOYW1lIC0gU291cmNlIGNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIEpTRG9jIHJldHVybiB0eXBlIHdoZW4gZG9jdW1lbnRlZC5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMoKVxuICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gXG5cbiAgICBpZiAoIXJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMuaGFzKHJldHVyblR5cGVLZXkpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMuZ2V0KHJldHVyblR5cGVLZXkpXG5cbiAgICBpZiAodHlwZW9mIHJldHVyblR5cGUgIT0gXCJzdHJpbmdcIiB8fCByZXR1cm5UeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IEpTRG9jIHJldHVybiB0eXBlIGZvciAke3JldHVyblR5cGVLZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlLlxuICAgKiBAcGFyYW0ge3ttZXRob2ROYW1lOiBzdHJpbmcsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNvdXJjZUNsYXNzTmFtZTogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gSlNEb2MgcGFyYW1ldGVyIHR5cGUgd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlKHttZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMoKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzS2V5ID0gYCR7c291cmNlQ2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YFxuXG4gICAgaWYgKCFyZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzLmhhcyhwYXJhbWV0ZXJUeXBlc0tleSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMuZ2V0KHBhcmFtZXRlclR5cGVzS2V5KVxuXG4gICAgaWYgKCFwYXJhbWV0ZXJUeXBlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU0RvYyBwYXJhbWV0ZXIgdHlwZXMgZm9yICR7cGFyYW1ldGVyVHlwZXNLZXl9YClcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVySW5kZXhdXG5cbiAgICBpZiAocGFyYW1ldGVyVHlwZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHBhcmFtZXRlclR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcGFyYW1ldGVyIHR5cGUgZm9yICR7cGFyYW1ldGVyVHlwZXNLZXl9IHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlclR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZz4+fSAtIFJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMga2V5ZWQgYnkgQ2xhc3NOYW1lLm1ldGhvZE5hbWUuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKCkge1xuICAgIGlmICh0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKSByZXR1cm4gdGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc1xuXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKClcbiAgICBjb25zdCByZXR1cm5UeXBlcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHNvdXJjZUZpbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGY4XCIpXG5cbiAgICAgIHRoaXMuYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VUZXh0fSlcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gcmV0dXJuVHlwZXNcblxuICAgIHJldHVybiByZXR1cm5UeXBlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZywgc3RyaW5nW10+Pn0gLSBSZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyIHR5cGVzIGtleWVkIGJ5IENsYXNzTmFtZS5tZXRob2ROYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcygpIHtcbiAgICBpZiAodGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcykgcmV0dXJuIHRoaXMuX3Jlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNcblxuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VGaWxlcygpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGUsIFwidXRmOFwiKVxuXG4gICAgICB0aGlzLmFkZFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNGcm9tU291cmNlKHtwYXJhbWV0ZXJUeXBlcywgc291cmNlVGV4dH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIEpTRG9jIHNvdXJjZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIEphdmFTY3JpcHQgc291cmNlIGZpbGVzIHRoYXQgY2FuIGRlZmluZSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgYW5kIG1vZGVsIGFjY2Vzc29ycy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKCkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gW11cblxuICAgIGZvciAoY29uc3Qgc291cmNlRGlyZWN0b3J5IG9mIHRoaXMuZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSkge1xuICAgICAgc291cmNlRmlsZXMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KHNvdXJjZURpcmVjdG9yeSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZUZpbGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBKU0RvYyBzb3VyY2UgZGlyZWN0b3JpZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTb3VyY2UgZGlyZWN0b3JpZXMgdG8gc2NhbiBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIEpTRG9jLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSB7XG4gICAgY29uc3Qgc291cmNlRGlyZWN0b3JpZXMgPSBuZXcgU2V0KFtwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnkoKSwgXCJzcmNcIildKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgICAgaWYgKHR5cGVvZiBiYWNrZW5kUHJvamVjdC5wYXRoID09IFwic3RyaW5nXCIgJiYgYmFja2VuZFByb2plY3QucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNvdXJjZURpcmVjdG9yaWVzLmFkZChwYXRoLmpvaW4oYmFja2VuZFByb2plY3QucGF0aCwgXCJzcmNcIikpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oc291cmNlRGlyZWN0b3JpZXMpXG4gIH1cblxuICAvKipcbiAgICogQWRkcyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzIGZyb20gc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnJldHVyblR5cGVzIC0gTXV0YWJsZSByZXR1cm4gdHlwZXMgbWFwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VUZXh0IC0gU291cmNlIHRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VUZXh0fSkge1xuICAgIGNvbnN0IGNsYXNzUmVnZXggPSAvY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccysoPzpleHRlbmRzXFxzK1tee10rKT9cXHsvZ1xuICAgIGxldCBjbGFzc01hdGNoXG5cbiAgICB3aGlsZSAoKGNsYXNzTWF0Y2ggPSBjbGFzc1JlZ2V4LmV4ZWMoc291cmNlVGV4dCkpKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc01hdGNoWzFdXG4gICAgICBjb25zdCBjbGFzc0JvZHlTdGFydCA9IGNsYXNzUmVnZXgubGFzdEluZGV4XG4gICAgICBjb25zdCBjbGFzc0JvZHlFbmQgPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiBjbGFzc0JvZHlTdGFydCAtIDEsIHNvdXJjZVRleHR9KVxuXG4gICAgICBpZiAoY2xhc3NCb2R5RW5kID09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIGJyYWNlIG1hdGNoZXIgY2FuJ3QgdG9rZW5pemUgZXZlcnkgY29uc3RydWN0IChlLmcuIGEgcmVnZXggbGl0ZXJhbFxuICAgICAgICAvLyB3aG9zZSBxdW90ZXMgbG9vayBsaWtlIHN0cmluZyBkZWxpbWl0ZXJzKSwgc28gaXQgY2FuIGZhaWwgdG8gbG9jYXRlIGFcbiAgICAgICAgLy8gY2xhc3MgYm9keS4gU2tpcCBtZXRhZGF0YSBleHRyYWN0aW9uIGZvciB0aGF0IGNsYXNzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGFib3J0aW5nIHRoZSB3aG9sZSBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uOyByZXNvdXJjZXMgdGhhdCBwYXJzZVxuICAgICAgICAvLyBjbGVhbmx5IHN0aWxsIGdldCB0aGVpciBKU0RvYy1kZXJpdmVkIHJldHVybi9wYXJhbSB0eXBlcy5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhc3NCb2R5ID0gc291cmNlVGV4dC5zbGljZShjbGFzc0JvZHlTdGFydCwgY2xhc3NCb2R5RW5kKVxuICAgICAgY29uc3QganNEb2NSZWdleCA9IC9cXC9cXCpcXCooW1xcc1xcU10qPylcXCpcXC8vZ1xuICAgICAgbGV0IGpzRG9jTWF0Y2hcblxuICAgICAgd2hpbGUgKChqc0RvY01hdGNoID0ganNEb2NSZWdleC5leGVjKGNsYXNzQm9keSkpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFmdGVySnNEb2MgPSBjbGFzc0JvZHkuc2xpY2UoanNEb2NSZWdleC5sYXN0SW5kZXgpXG4gICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gc291cmNlQWZ0ZXJKc0RvYy5tYXRjaCgvXlxccyooPzphc3luY1xccyspPyhbQS1aYS16XyRdW1xcdyRdKilcXHMqXFwoLylcblxuICAgICAgICBpZiAoIW1ldGhvZE1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXVxuXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGUgPSB0aGlzLmpzRG9jUmV0dXJuVHlwZShqc0RvY01hdGNoWzFdKVxuXG4gICAgICAgIGlmIChyZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIHJldHVyblR5cGUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcyBmcm9tIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7cGFyYW1ldGVyVHlwZXM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiwgc291cmNlVGV4dDogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzRnJvbVNvdXJjZSh7cGFyYW1ldGVyVHlwZXMsIHNvdXJjZVRleHR9KSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC9jbGFzc1xccysoW0EtWmEtel8kXVtcXHckXSopXFxzKyg/OmV4dGVuZHNcXHMrW157XSspP1xcey9nXG4gICAgbGV0IGNsYXNzTWF0Y2hcblxuICAgIHdoaWxlICgoY2xhc3NNYXRjaCA9IGNsYXNzUmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTWF0Y2hbMV1cbiAgICAgIGNvbnN0IGNsYXNzQm9keVN0YXJ0ID0gY2xhc3NSZWdleC5sYXN0SW5kZXhcbiAgICAgIGNvbnN0IGNsYXNzQm9keUVuZCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IGNsYXNzQm9keVN0YXJ0IC0gMSwgc291cmNlVGV4dH0pXG5cbiAgICAgIGlmIChjbGFzc0JvZHlFbmQgPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgYnJhY2UgbWF0Y2hlciBjYW4ndCB0b2tlbml6ZSBldmVyeSBjb25zdHJ1Y3QgKGUuZy4gYSByZWdleCBsaXRlcmFsXG4gICAgICAgIC8vIHdob3NlIHF1b3RlcyBsb29rIGxpa2Ugc3RyaW5nIGRlbGltaXRlcnMpLCBzbyBpdCBjYW4gZmFpbCB0byBsb2NhdGUgYVxuICAgICAgICAvLyBjbGFzcyBib2R5LiBTa2lwIG1ldGFkYXRhIGV4dHJhY3Rpb24gZm9yIHRoYXQgY2xhc3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWJvcnRpbmcgdGhlIHdob2xlIGZyb250ZW5kLW1vZGVsIGdlbmVyYXRpb247IHJlc291cmNlcyB0aGF0IHBhcnNlXG4gICAgICAgIC8vIGNsZWFubHkgc3RpbGwgZ2V0IHRoZWlyIEpTRG9jLWRlcml2ZWQgcmV0dXJuL3BhcmFtIHR5cGVzLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGFzc0JvZHkgPSBzb3VyY2VUZXh0LnNsaWNlKGNsYXNzQm9keVN0YXJ0LCBjbGFzc0JvZHlFbmQpXG4gICAgICBjb25zdCBqc0RvY1JlZ2V4ID0gL1xcL1xcKlxcKihbXFxzXFxTXSo/KVxcKlxcLy9nXG4gICAgICBsZXQganNEb2NNYXRjaFxuXG4gICAgICB3aGlsZSAoKGpzRG9jTWF0Y2ggPSBqc0RvY1JlZ2V4LmV4ZWMoY2xhc3NCb2R5KSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQWZ0ZXJKc0RvYyA9IGNsYXNzQm9keS5zbGljZShqc0RvY1JlZ2V4Lmxhc3RJbmRleClcbiAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSBzb3VyY2VBZnRlckpzRG9jLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKyk/KFtBLVphLXpfJF1bXFx3JF0qKVxccypcXCgvKVxuXG4gICAgICAgIGlmICghbWV0aG9kTWF0Y2gpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdXG4gICAgICAgIGNvbnN0IGpzRG9jUGFyYW1ldGVyVHlwZXMgPSB0aGlzLmpzRG9jUGFyYW1ldGVyVHlwZXMoanNEb2NNYXRjaFsxXSlcblxuICAgICAgICBpZiAoanNEb2NQYXJhbWV0ZXJUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIGpzRG9jUGFyYW1ldGVyVHlwZXMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUZXh0IC0gSlNEb2MgdGV4dCBpbnNpZGUgY29tbWVudCBtYXJrZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBKU0RvYyByZXR1cm4gdHlwZSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBqc0RvY1JldHVyblR5cGUoanNEb2NUZXh0KSB7XG4gICAgY29uc3QgcmV0dXJuc01hdGNoID0ganNEb2NUZXh0Lm1hdGNoKC9AcmV0dXJucz9cXHMqXFx7LylcblxuICAgIGlmICghcmV0dXJuc01hdGNoIHx8IHJldHVybnNNYXRjaC5pbmRleCA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHJldHVybnNNYXRjaC5pbmRleCArIHJldHVybnNNYXRjaFswXS5sZW5ndGggLSAxXG4gICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgaWYgKHR5cGVDbG9zZUluZGV4ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEpTRG9jIHJldHVybiB0eXBlIGZyb206ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IGpzRG9jVGV4dC5zbGljZSh0eXBlT3BlbkluZGV4ICsgMSwgdHlwZUNsb3NlSW5kZXgpLnRyaW0oKVxuXG4gICAgaWYgKHJldHVyblR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcmV0dXJuIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyBwYXJhbWV0ZXIgdHlwZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1RleHQgLSBKU0RvYyB0ZXh0IGluc2lkZSBjb21tZW50IG1hcmtlcnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBKU0RvYyBwYXJhbWV0ZXIgdHlwZXMgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gICAqL1xuICBqc0RvY1BhcmFtZXRlclR5cGVzKGpzRG9jVGV4dCkge1xuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gW11cbiAgICBjb25zdCBwYXJhbVJlZ2V4ID0gL0BwYXJhbVxccypcXHsvZ1xuICAgIGxldCBfcGFyYW1NYXRjaFxuXG4gICAgd2hpbGUgKChfcGFyYW1NYXRjaCA9IHBhcmFtUmVnZXguZXhlYyhqc0RvY1RleHQpKSkge1xuICAgICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHBhcmFtUmVnZXgubGFzdEluZGV4IC0gMVxuICAgICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgICBpZiAodHlwZUNsb3NlSW5kZXggPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSBmcm9tOiAke2pzRG9jVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJUeXBlID0ganNEb2NUZXh0LnNsaWNlKHR5cGVPcGVuSW5kZXggKyAxLCB0eXBlQ2xvc2VJbmRleCkudHJpbSgpXG5cbiAgICAgIGlmIChwYXJhbWV0ZXJUeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcGFyYW1ldGVyIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgICB9XG5cbiAgICAgIHBhcmFtZXRlclR5cGVzLnB1c2gocGFyYW1ldGVyVHlwZSlcbiAgICAgIHBhcmFtUmVnZXgubGFzdEluZGV4ID0gdHlwZUNsb3NlSW5kZXggKyAxXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqYXZhc2NyaXB0IGZpbGVzIGluIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gSmF2YVNjcmlwdCBzb3VyY2UgZmlsZSBwYXRocy5cbiAgICovXG4gIGFzeW5jIGphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGRpcmVjdG9yeSkge1xuICAgIGxldCBlbnRyaWVzXG5cbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7d2l0aEZpbGVUeXBlczogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gW11cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKVxuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBmaWxlUGF0aHMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGVudHJ5UGF0aCkpXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIC9cXC4obWpzfGpzfGpzeHx0cykkLy50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICAgIGZpbGVQYXRocy5wdXNoKGVudHJ5UGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZVBhdGhzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBtYXRjaGluZyBjbG9zaW5nIGJyYWNlIHdoaWxlIHJlc3BlY3RpbmcgSmF2YVNjcmlwdCBzdHJpbmdzIGFuZCBjb21tZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLm9wZW5JbmRleCAtIE9wZW5pbmcgYnJhY2UgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZVRleHQgLSBTb3VyY2UgdGV4dC5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gQ2xvc2luZyBicmFjZSBpbmRleCB3aGVuIGZvdW5kLlxuICAgKi9cbiAgbWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXgsIHNvdXJjZVRleHR9KSB7XG4gICAgaWYgKHNvdXJjZVRleHRbb3BlbkluZGV4XSAhPT0gXCJ7XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3BlbmluZyBicmFjZSBhdCBpbmRleCAke29wZW5JbmRleH1gKVxuICAgIH1cblxuICAgIGxldCBkZXB0aCA9IDBcbiAgICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZVxuICAgIGxldCBpbkxpbmVDb21tZW50ID0gZmFsc2VcbiAgICBsZXQgaW5TdHJpbmcgPSBcIlwiXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2VUZXh0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVRleHRbaW5kZXhdXG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVRleHRbaW5kZXggKyAxXVxuICAgICAgY29uc3QgcHJldmlvdXNDaGFyID0gc291cmNlVGV4dFtpbmRleCAtIDFdXG5cbiAgICAgIGlmIChpbkxpbmVDb21tZW50KSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIlxcblwiKSBpbkxpbmVDb21tZW50ID0gZmFsc2VcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKlwiICYmIG5leHRDaGFyID09PSBcIi9cIikge1xuICAgICAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IGluU3RyaW5nICYmIHByZXZpb3VzQ2hhciAhPT0gXCJcXFxcXCIpIGluU3RyaW5nID0gXCJcIlxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIi9cIiAmJiBuZXh0Q2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgaW5MaW5lQ29tbWVudCA9IHRydWVcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIvXCIgJiYgbmV4dENoYXIgPT09IFwiKlwiKSB7XG4gICAgICAgIGluQmxvY2tDb21tZW50ID0gdHJ1ZVxuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIlxcXCJcIiB8fCBjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSBcImBcIikge1xuICAgICAgICBpblN0cmluZyA9IGNoYXJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwie1wiKSB7XG4gICAgICAgIGRlcHRoKytcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCJ9XCIpIHtcbiAgICAgICAgZGVwdGgtLVxuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIG1vZGVsIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKCFyZXNvbHZlZEF0dHJpYnV0ZU5hbWUpIHJldHVybiBudWxsXG5cbiAgICBsZXQgY29sdW1uTmFtZVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVtyZXNvbHZlZEF0dHJpYnV0ZU5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGNvbHVtblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbiA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbiA/IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgY29sdW1uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29sdW1uIC0gRGF0YWJhc2UgY29sdW1uLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBkYXRhYmFzZSBjb2x1bW4uXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpXG5cbiAgICBpZiAodHlwZW9mIHR5cGUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IGNvbHVtbiB0eXBlIGZvciBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgaW5mZXJlbmNlLCBnb3Q6ICR7dHlwZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBudWxsOiBjb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGF0aW9uc2hpcHMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gLSBSZWxhdGlvbnNoaXBzLlxuICAgKi9cbiAgcmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkIHx8IHJlbGF0aW9uc2hpcHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBoYXMgaW52YWxpZCByZWxhdGlvbnNoaXBzIGNvbmZpZyDigJQgbXVzdCBiZSBhbiBhcnJheSBvZiByZWxhdGlvbnNoaXAgbmFtZXMsIGdvdCAke3R5cGVvZiByZWxhdGlvbnNoaXBzfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXBOYW1lKSA9PiB0aGlzLmluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9fSBJbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICovXG4gIGluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzID8gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKCkgOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKGNsYXNzTmFtZSlcblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRUeXBlKClcblxuICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAnJHtyZWxhdGlvbnNoaXBUeXBlfSdgKVxuICAgIH1cblxuICAgIGxldCB0YXJnZXRDbGFzc05hbWVcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICB0YXJnZXRDbGFzc05hbWUgPSB0YXJnZXRNb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTW9kZWwgY2xhc3Mgbm90IHJlZ2lzdGVyZWQgeWV0IOKAlCBmYWxsIGJhY2sgdG8gY2xhc3NOYW1lIGZyb20gcmVsYXRpb25zaGlwIGRlZmluaXRpb25cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgdGFyZ2V0Q2xhc3NOYW1lID0gcmVsYXRpb25zaGlwLmNsYXNzTmFtZVxuXG4gICAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9sb2FkOiByZWxhdGlvbnNoaXAuZ2V0QXV0b2xvYWQoKSxcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICB0YXJnZXRDbGFzc05hbWUsXG4gICAgICB0YXJnZXRGaWxlTmFtZTogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldENsYXNzTmFtZSkpLFxuICAgICAgdHlwZTogcmVsYXRpb25zaGlwVHlwZVxuICAgIH1cbiAgfVxufVxuIl19
1692
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyw4QkFBOEIsRUFBRSxtREFBbUQsRUFBQyxNQUFNLHNEQUFzRCxDQUFBO0FBQ3hKLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBQyxNQUFNLHVEQUF1RCxDQUFBO0FBRWhLOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSDs7O0dBR0c7QUFFSCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELHlDQUF5QztJQUN6QywwQkFBMEIsR0FBRyxJQUFJLENBQUE7SUFFakMsMkNBQTJDO0lBQzNDLDZCQUE2QixHQUFHLElBQUksQ0FBQTtJQUVwQzs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQzdDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBRTFELE1BQU0sYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQTtRQUVoRSxJQUFJLE9BQU8sa0JBQWtCLENBQUMscUJBQXFCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkUsTUFBTSxrQkFBa0IsQ0FBQyxxQkFB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QkFBMkIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZILENBQUM7UUFFRCxJQUFJLGVBQWUsQ0FBQTtRQUVuQixJQUFJLENBQUM7WUFDSCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1lBRTNELGVBQWUsR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsQ0FBQTtRQUNwRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsdUZBQXVGO1FBQ3pGLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsZUFBZSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUE7WUFFeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsU0FBUyxtQkFBbUIsZ0JBQWdCLDZCQUE2QixDQUFDLENBQUE7WUFDdEcsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUU7WUFDcEMsZ0JBQWdCO1lBQ2hCLGVBQWU7WUFDZixjQUFjLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVFLElBQUksRUFBRSxnQkFBZ0I7U0FDdkIsQ0FBQTtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZUlzQnVpbHRJbiwgZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0fSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZnJvbnRlbmQtbW9kZWxzL2J1aWx0LWluLXJlc291cmNlcy5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24sIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbn0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuLyoqXG4gKiBBdHRyaWJ1dGUgbWV0YWRhdGEgdXNlZCBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIEpTRG9jLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRBdHRyaWJ1dGVDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uVHlwZV0gLSBDb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3FsVHlwZV0gLSBTUUwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YVR5cGVdIC0gRGF0YSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtqc0RvY1R5cGVdIC0gRXhhY3QgSlNEb2MgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBBdHRyaWJ1dGUgbmFtZSB3aGVuIGNvbmZpZ3VyZWQgYXMgYW4gYXJyYXkgZW50cnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtudWxsXSAtIFdoZXRoZXIgbnVsbCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gW2dldFR5cGVdIC0gUmV0dXJucyBjb2x1bW4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gW2dldE51bGxdIC0gUmV0dXJucyB3aGV0aGVyIG51bGwgaXMgYWxsb3dlZC5cbiAqL1xuLyoqXG4gKiBQZXJtaXQgc3BlYyByZXR1cm5lZCBieSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgZHVyaW5nIGdlbmVyYXRpb24uXG4gKiBAdHlwZWRlZiB7QXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWM+Pn0gRnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWNcbiAqL1xuXG4vKiogTm9kZSBDTEkgY29tbWFuZCB0aGF0IGdlbmVyYXRlcyBmcm9udGVuZCBtb2RlbCBjbGFzc2VzIGZyb20gYmFja2VuZCBwcm9qZWN0IHJlc291cmNlIGNvbmZpZy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERiR2VuZXJhdGVGcm9udGVuZE1vZGVscyBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbH0gKi9cbiAgX3Jlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMgPSBudWxsXG5cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT4gfCBudWxsfSAqL1xuICBfcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IG51bGxcblxuICAvKipcbiAgICogUnVucyBleGVjdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGZpbGVzIGFyZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcblxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZU1vZGVscygpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBjb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpXG5cbiAgICBpZiAodHlwZW9mIGVudmlyb25tZW50SGFuZGxlci5hdXRvRGlzY292ZXJSZXNvdXJjZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgZW52aXJvbm1lbnRIYW5kbGVyLmF1dG9EaXNjb3ZlclJlc291cmNlcyhjb25maWd1cmF0aW9uKVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShiYWNrZW5kUHJvamVjdHMpIHx8IGJhY2tlbmRQcm9qZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJhY2tlbmQgcHJvamVjdHMgY29uZmlndXJlZC4gQ29uZmlndXJlICdiYWNrZW5kUHJvamVjdHMnIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaXJzdFwiKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuc3VyZWQgZGlyZWN0b3JpZXMuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGVuc3VyZWREaXJlY3RvcmllcyA9IG5ldyBTZXQoKVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlZCBtb2RlbCBuYW1lcyBieSBkaXJlY3RvcnkuXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gKi9cbiAgICBjb25zdCBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkgPSBuZXcgTWFwKClcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQgZmlsZXMgYnkgZGlyZWN0b3J5LlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pj59ICovXG4gICAgY29uc3QgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeSA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICAgIC8vIENhbm9uaWNhbGl6ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBzbyBlcXVpdmFsZW50IHNwZWxsaW5ncyAoYSB0cmFpbGluZ1xuICAgICAgLy8gc2xhc2gsIGAuYC9gLi5gIHNlZ21lbnRzLCBkdXBsaWNhdGUgc2VwYXJhdG9ycywgcmVsYXRpdmUgdnMgYWJzb2x1dGUpXG4gICAgICAvLyByZXNvbHZlIHRvIGEgc2luZ2xlIGtleS4gT3RoZXJ3aXNlIHRoZSBwZXItZGlyZWN0b3J5IG1hcHMgYmVsb3cgdHJlYXRcbiAgICAgIC8vIHRoZW0gYXMgZGlmZmVyZW50IGRpcmVjdG9yaWVzLCBkdXBsaWNhdGUgY2xhc3MgbmFtZXMgc2xpcCBwYXN0IGRldGVjdGlvbixcbiAgICAgIC8vIGFuZCB0aGUgc3BsaXQgYnVja2V0cyB3cml0ZSBpbmNvbXBsZXRlIGluZGV4LmpzL3NldHVwLmpzIGZvciBmaWxlcyB0aGF0XG4gICAgICAvLyBhY3R1YWxseSBsYW5kIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBvbiBkaXNrLlxuICAgICAgY29uc3QgZnJvbnRlbmRNb2RlbHNEaXIgPSBwYXRoLnJlc29sdmUodGhpcy5mcm9udGVuZE1vZGVsc0RpcmVjdG9yeUZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KSlcbiAgICAgIGNvbnN0IGltcG9ydFBhdGggPSB0aGlzLmltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0RpcilcblxuICAgICAgaWYgKCFlbnN1cmVkRGlyZWN0b3JpZXMuaGFzKGZyb250ZW5kTW9kZWxzRGlyKSkge1xuICAgICAgICBhd2FpdCBmcy5ta2Rpcihmcm9udGVuZE1vZGVsc0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgICAgIGVuc3VyZWREaXJlY3Rvcmllcy5hZGQoZnJvbnRlbmRNb2RlbHNEaXIpXG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGdlbmVyYXRlZEZpbGVzQnlEaXJlY3Rvcnkuc2V0KGZyb250ZW5kTW9kZWxzRGlyLCBbXSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3RvcnkuaGFzKGZyb250ZW5kTW9kZWxzRGlyKSkge1xuICAgICAgICBnZW5lcmF0ZWRNb2RlbE5hbWVzQnlEaXJlY3Rvcnkuc2V0KGZyb250ZW5kTW9kZWxzRGlyLCBuZXcgU2V0KCkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZEZpbGVzID0gZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5nZXQoZnJvbnRlbmRNb2RlbHNEaXIpXG4gICAgICBjb25zdCBnZW5lcmF0ZWRNb2RlbE5hbWVzID0gZ2VuZXJhdGVkTW9kZWxOYW1lc0J5RGlyZWN0b3J5LmdldChmcm9udGVuZE1vZGVsc0RpcilcblxuICAgICAgaWYgKCFnZW5lcmF0ZWRGaWxlcykgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgZmlsZXMgbGlzdCBtaXNzaW5nIGZvciAke2Zyb250ZW5kTW9kZWxzRGlyfWApXG4gICAgICBpZiAoIWdlbmVyYXRlZE1vZGVsTmFtZXMpIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIG1vZGVsIG5hbWVzIHNldCBtaXNzaW5nIGZvciAke2Zyb250ZW5kTW9kZWxzRGlyfWApXG4gICAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICAgICAgY29uc3QgYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMgPSB0aGlzLmF2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzKHJlc291cmNlcylcblxuICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDb25maWcgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXSlcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtb2RlbENsYXNzTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNsYXNzTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHtmcm9udGVuZE1vZGVsc0Rpcn0vJHtmaWxlTmFtZX1gXG5cbiAgICAgICAgaWYgKCFtb2RlbENvbmZpZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBkZWZpbml0aW9uIGZvciAnJHtjbGFzc05hbWV9J2ApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZFJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlc1ttb2RlbENsYXNzTmFtZV0pXG4gICAgICAgIC8vIEFuIGFic3RyYWN0IGJhc2UgcmVzb3VyY2UgKG5vIHN0YXRpYyBNb2RlbENsYXNzIOKAlCBlLmcuIGFuIGFwcCdzIHNoYXJlZFxuICAgICAgICAvLyBgQmFzZVJlc291cmNlYCB0aGF0IG90aGVyIHJlc291cmNlcyBleHRlbmQpIGNhbid0IGJhY2sgYSBnZW5lcmF0ZWRcbiAgICAgICAgLy8gZnJvbnRlbmQgbW9kZWwuIFRyZWF0IGl0IGFzIHJlc291cmNlLWxlc3Mgc28gdGhlIGdlbmVyYXRvciBmYWxscyBiYWNrXG4gICAgICAgIC8vIHRvIGJ5LW5hbWUgbW9kZWwgbG9va3VwICsgZW1wdHkgd3JpdGUgcGFyYW1zIGluc3RlYWQgb2YgdGhyb3dpbmcgd2hlblxuICAgICAgICAvLyBpdCBlYWdlcmx5IGNhbGxzIGBtb2RlbENsYXNzKClgIC8gYHBlcm1pdHRlZFBhcmFtcygpYCBvbiBpdC5cbiAgICAgICAgY29uc3QgcmVzb3VyY2VDbGFzcyA9IHJlc29sdmVkUmVzb3VyY2VDbGFzcyAmJiByZXNvbHZlZFJlc291cmNlQ2xhc3MuTW9kZWxDbGFzcyA/IHJlc29sdmVkUmVzb3VyY2VDbGFzcyA6IG51bGxcblxuICAgICAgICB0aGlzLnZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcblxuICAgICAgICBpZiAoZ2VuZXJhdGVkTW9kZWxOYW1lcy5oYXMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgIGlmIChmcm9udGVuZE1vZGVsUmVzb3VyY2VJc0J1aWx0SW4oe21vZGVsTmFtZTogbW9kZWxDbGFzc05hbWUsIHJlc291cmNlRGVmaW5pdGlvbjogcmVzb3VyY2VzW21vZGVsQ2xhc3NOYW1lXX0pKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGZyb250ZW5kIG1vZGVsIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1vZGVsTmFtZXMuYWRkKGNsYXNzTmFtZSlcblxuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHRoaXMuYnVpbGRNb2RlbEZpbGVDb250ZW50KHtcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgICBtb2RlbENsYXNzOiByZXNvdXJjZUNsYXNzID8gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKCkgOiBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpW2NsYXNzTmFtZV0sXG4gICAgICAgICAgbW9kZWxDb25maWcsXG4gICAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICAgIGdlbmVyYXRlZEZpbGVzLnB1c2goe2NsYXNzTmFtZSwgZmlsZU5hbWV9KVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy8ke2ZpbGVOYW1lfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZnJvbnRlbmRNb2RlbHNEaXIsIGdlbmVyYXRlZEZpbGVzXSBvZiBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5KSB7XG4gICAgICBjb25zdCBpbmRleENvbnRlbnQgPSB0aGlzLmJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcylcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2Zyb250ZW5kTW9kZWxzRGlyfS9pbmRleC5qc2AsIGluZGV4Q29udGVudClcblxuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy9pbmRleC5qc1wiKVxuXG4gICAgICBjb25zdCBzZXR1cENvbnRlbnQgPSB0aGlzLmJ1aWxkU2V0dXBGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcylcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2Zyb250ZW5kTW9kZWxzRGlyfS9zZXR1cC5qc2AsIHNldHVwQ29udGVudClcblxuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy9zZXR1cC5qc1wiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHZhbGlkYXRlIG1vZGVsIGNvbmZpZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7U2V0PHN0cmluZz59IGFyZ3MuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMgLSBBdmFpbGFibGUgZnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZXMgaW4gYmFja2VuZCBwcm9qZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gW2FyZ3MucmVzb3VyY2VDbGFzc10gLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgdmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgYWJpbGl0aWVzID0gbW9kZWxDb25maWcuYWJpbGl0aWVzXG5cbiAgICBpZiAoIWFiaWxpdGllcyB8fCB0eXBlb2YgYWJpbGl0aWVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgJ2FiaWxpdGllcycgY29uZmlnYClcbiAgICB9XG5cbiAgICBjb25zdCByZWFkQWN0aW9ucyA9IFtcbiAgICAgIHthY3Rpb246IFwiaW5kZXhcIiwgYWJpbGl0eUFjdGlvbjogYWJpbGl0aWVzLmluZGV4fSxcbiAgICAgIHthY3Rpb246IFwiZmluZFwiLCBhYmlsaXR5QWN0aW9uOiBhYmlsaXRpZXMuZmluZH1cbiAgICBdXG5cbiAgICBmb3IgKGNvbnN0IHthY3Rpb24sIGFiaWxpdHlBY3Rpb259IG9mIHJlYWRBY3Rpb25zKSB7XG4gICAgICBpZiAodHlwZW9mIGFiaWxpdHlBY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgYWJpbGl0eUFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgaXMgbWlzc2luZyByZXF1aXJlZCBhYmlsaXRpZXMuJHthY3Rpb259IGNvbmZpZ2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IG1vZGVsQ29uZmlnLnJlbGF0aW9uc2hpcHNcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMgPSB0aGlzLnJlbGF0aW9uc2hpcHNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiBub3JtYWxpemVkUmVsYXRpb25zaGlwcykge1xuICAgICAgaWYgKCFhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcy5oYXMocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9JyByZWZlcmVuY2VzICcke3JlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWV9JywgYnV0IG5vIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGV4aXN0cyBmb3IgdGhhdCB0YXJnZXQgaW4gdGhpcyBiYWNrZW5kIHByb2plY3RgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlcyBmb3IgYmFja2VuZCBwcm9qZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9ufSBiYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWcuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb24+fSAtIFJlc291cmNlIGRlZmluaXRpb25zIGtleWVkIGJ5IG1vZGVsIGNsYXNzIG5hbWUuXG4gICAqL1xuICByZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICAgIHJldHVybiBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhdmFpbGFibGUgZnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gcmVzb3VyY2VzIC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbiBrZXllZCBieSBtb2RlbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKi9cbiAgYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKSB7XG4gICAgLyoqXG4gICAgICogQ2xhc3MgbmFtZXMuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2VNb2RlbE5hbWUgaW4gcmVzb3VyY2VzKSB7XG4gICAgICBjbGFzc05hbWVzLmFkZChpbmZsZWN0aW9uLmNhbWVsaXplKHJlc291cmNlTW9kZWxOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzTmFtZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVscyBkaXJlY3RvcnkgZm9yIGJhY2tlbmQgcHJvamVjdC5cbiAgICogQHBhcmFtIHt7ZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoPzogc3RyaW5nfX0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFic29sdXRlIGZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnlGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVsc091dHB1dFBhdGggfHwgdGhpcy5kaXJlY3RvcnkoKVxuXG4gICAgcmV0dXJuIGAke291dHB1dFBhdGh9L3NyYy9mcm9udGVuZC1tb2RlbHNgXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbXBvcnQgcGF0aCBmb3IgZnJvbnRlbmQgbW9kZWxzIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZyb250ZW5kTW9kZWxzRGlyIC0gRnJvbnRlbmQgbW9kZWxzIG91dHB1dCBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZSBjbGFzcyBpbXBvcnQgcGF0aC5cbiAgICovXG4gIGltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0Rpcikge1xuICAgIGNvbnN0IGRldk1vZGUgPSBmcm9udGVuZE1vZGVsc0Rpci5pbmNsdWRlcyhcIi9zcGVjL2R1bW15L3NyYy9mcm9udGVuZC1tb2RlbHNcIilcblxuICAgIGlmIChkZXZNb2RlKSB7XG4gICAgICByZXR1cm4gXCIuLi8uLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICAgIH1cblxuICAgIHJldHVybiBcInZlbG9jaW91cy9idWlsZC9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYnVpbGQgbW9kZWwgZmlsZSBjb250ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE1ldGhvZCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbXBvcnRQYXRoIC0gQmFzZSBjbGFzcyBpbXBvcnQgcGF0aC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSBbYXJncy5yZXNvdXJjZUNsYXNzXSAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEdlbmVyYXRlZCBmaWxlIGNvbnRlbnQuXG4gICAqL1xuICBhc3luYyBidWlsZE1vZGVsRmlsZUNvbnRlbnQoe2NsYXNzTmFtZSwgaW1wb3J0UGF0aCwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHRoaXMuYXR0cmlidXRlRGVmaW5pdGlvbnNGb3JNb2RlbCh7Y2xhc3NOYW1lLCBtb2RlbENsYXNzLCBtb2RlbENvbmZpZywgcmVzb3VyY2VDbGFzc30pXG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IHRoaXMucmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzICYmIHR5cGVvZiBtb2RlbENvbmZpZy5hdHRhY2htZW50cyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBtb2RlbENvbmZpZy5hdHRhY2htZW50c1xuICAgICAgOiB7fVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1BdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1DcmVhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IHVwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZSA9IGAke2NsYXNzTmFtZX1VcGRhdGVBdHRyaWJ1dGVzYFxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgY29uc3QgcGVybWl0dGVkQ3JlYXRlUGFyYW1zID0gdGhpcy5wZXJtaXR0ZWRQYXJhbXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsLCBcImNyZWF0ZVwiKVxuICAgIGNvbnN0IHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyA9IHRoaXMucGVybWl0dGVkUGFyYW1zRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MgfHwgbnVsbCwgXCJ1cGRhdGVcIilcbiAgICBjb25zdCBuZXN0ZWRXcml0ZVR5cGVzID0gdGhpcy5uZXN0ZWRXcml0ZVR5cGVzRm9yTW9kZWwoe2NsYXNzTmFtZSwgcGVybWl0dGVkUGFyYW1zOiBwZXJtaXR0ZWRDcmVhdGVQYXJhbXMuY29uY2F0KHBlcm1pdHRlZFVwZGF0ZVBhcmFtcyksIHJlbGF0aW9uc2hpcHN9KVxuICAgIGNvbnN0IHVzZXNUcmFuc3BvcnRWYWx1ZSA9IGF0dHJpYnV0ZXMuc29tZSgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUuanNEb2NUeXBlLmluY2x1ZGVzKFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIpKVxuICAgICAgfHwgbmVzdGVkV3JpdGVUeXBlcy5zb21lKChuZXN0ZWRXcml0ZVR5cGUpID0+IG5lc3RlZFdyaXRlVHlwZS5hdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLnR5cGUuaW5jbHVkZXMoXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIikpKVxuICAgIGNvbnN0IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgPSB7XG4gICAgICBjcmVhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlIHx8IFwiY3JlYXRlXCIsXG4gICAgICBpbmRleDogbW9kZWxDb25maWcuYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcy5pbmRleCB8fCBcImluZGV4XCJcbiAgICB9XG4gICAgY29uc3QgYnVpbHRJbk1lbWJlckNvbW1hbmRzID0ge1xuICAgICAgYXR0YWNoOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoIHx8IFwiYXR0YWNoXCIsXG4gICAgICBkZXN0cm95OiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSB8fCBcImRlc3Ryb3lcIixcbiAgICAgIGRvd25sb2FkOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgfHwgXCJkb3dubG9hZFwiLFxuICAgICAgZmluZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgfHwgXCJmaW5kXCIsXG4gICAgICB1cGRhdGU6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgfHwgXCJ1cGRhdGVcIixcbiAgICAgIHVybDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLnVybCB8fCBcInVybFwiXG4gICAgfVxuICAgIGNvbnN0IGNvbGxlY3Rpb25Db21tYW5kcyA9IG1vZGVsQ29uZmlnLmNvbGxlY3Rpb25Db21tYW5kc1xuICAgIGNvbnN0IG1lbWJlckNvbW1hbmRzID0gbW9kZWxDb25maWcubWVtYmVyQ29tbWFuZHNcbiAgICBjb25zdCBjb21tYW5kTWV0YWRhdGEgPSBtb2RlbENvbmZpZy5jb21tYW5kTWV0YWRhdGEgfHwge31cbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzQXJlRGVmYXVsdCA9IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuY3JlYXRlID09PSBcImNyZWF0ZVwiICYmIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggPT09IFwiaW5kZXhcIlxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluTWVtYmVyQ29tbWFuZHMuYXR0YWNoID09PSBcImF0dGFjaFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZGVzdHJveSA9PT0gXCJkZXN0cm95XCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy5kb3dubG9hZCA9PT0gXCJkb3dubG9hZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZmluZCA9PT0gXCJmaW5kXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cGRhdGUgPT09IFwidXBkYXRlXCJcbiAgICAgICYmIGJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgPT09IFwidXJsXCJcblxuICAgIGxldCBmaWxlQ29udGVudCA9IFwiXCJcblxuICAgIGZpbGVDb250ZW50ICs9IGBpbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2UgZnJvbSBcIiR7aW1wb3J0UGF0aH1cIlxcbmBcblxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbmZpZy5cXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ30gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKiBGYWxsYmFjayBhdHRyaWJ1dGUgdmFsdWUgdHlwZSBmb3IgZ2VuZXJhdGVkIGZpZWxkcyB3aXRob3V0IG5hcnJvd2VyIG1ldGFkYXRhLlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEB0eXBlZGVmIHtpbXBvcnQoXCIke2ltcG9ydFBhdGh9XCIpLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IFwiICovXFxuXCJcbiAgICBpZiAodXNlc1RyYW5zcG9ydFZhbHVlKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqIFZhbHVlIHN1cHBvcnRlZCBieSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge2ltcG9ydChcIiR7aW1wb3J0UGF0aH1cIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqICR7YXR0cmlidXRlc1R5cGVOYW1lfSB0eXBlLlxcbmBcbiAgICBmaWxlQ29udGVudCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHthdHRyaWJ1dGVzVHlwZU5hbWV9XFxuYFxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAcHJvcGVydHkgeyR7YXR0cmlidXRlLmpzRG9jVHlwZX19ICR7YXR0cmlidXRlLm5hbWV9IC0gQXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICB9XG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgKi9cXG5cIlxuICAgIGZvciAoY29uc3QgbmVzdGVkV3JpdGVUeXBlIG9mIG5lc3RlZFdyaXRlVHlwZXMpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBBdHRyaWJ1dGVzIGFjY2VwdGVkIGZvciBuZXN0ZWQgJHtuZXN0ZWRXcml0ZVR5cGUucmVsYXRpb25zaGlwTmFtZX0gd3JpdGVzLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke25lc3RlZFdyaXRlVHlwZS50eXBlTmFtZX1cXG5gXG4gICAgICBmb3IgKGNvbnN0IG5lc3RlZEF0dHJpYnV0ZSBvZiBuZXN0ZWRXcml0ZVR5cGUuYXR0cmlidXRlcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICogQHByb3BlcnR5IHske25lc3RlZEF0dHJpYnV0ZS50eXBlfX0gWyR7bmVzdGVkQXR0cmlidXRlLm5hbWV9XSAtIE5lc3RlZCAke25lc3RlZEF0dHJpYnV0ZS5uYW1lfSB2YWx1ZS5cXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IGF3YWl0IHRoaXMud3JpdGVBdHRyaWJ1dGVzVHlwZWRlZih7YXR0cmlidXRlcywgYXR0cmlidXRlc1R5cGVOYW1lLCBtb2RlbENsYXNzLCBuZXN0ZWRXcml0ZVR5cGVzLCBwZXJtaXR0ZWRQYXJhbXM6IHBlcm1pdHRlZENyZWF0ZVBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWU6IGNyZWF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0pXG4gICAgZmlsZUNvbnRlbnQgKz0gYXdhaXQgdGhpcy53cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtczogcGVybWl0dGVkVXBkYXRlUGFyYW1zLCByZXNvdXJjZUNsYXNzLCB0eXBlTmFtZTogdXBkYXRlQXR0cmlidXRlc1R5cGVOYW1lfSlcbiAgICBmaWxlQ29udGVudCArPSBcIi8qKlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAqIEZyb250ZW5kIG1vZGVsIGZvciAke2NsYXNzTmFtZX0uXFxuYFxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAYXVnbWVudHMge0Zyb250ZW5kTW9kZWxCYXNlPCR7YXR0cmlidXRlc1R5cGVOYW1lfSwgJHtjcmVhdGVBdHRyaWJ1dGVzVHlwZU5hbWV9LCAke3VwZGF0ZUF0dHJpYnV0ZXNUeXBlTmFtZX0+fVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYGNsYXNzICR7Y2xhc3NOYW1lfSBleHRlbmRzIEZyb250ZW5kTW9kZWxCYXNlIHtcXG5gXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnfSAtIFJlc291cmNlIGNvbmZpZy4gKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIG1vZGVsTmFtZTogJHtKU09OLnN0cmluZ2lmeShjbGFzc05hbWUpfSxcXG5gXG4gICAgaWYgKE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIGF0dGFjaG1lbnRzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgW2F0dGFjaG1lbnROYW1lLCBhdHRhY2htZW50Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhdHRhY2htZW50cykpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Q29uZmlnICYmIHR5cGVvZiBhdHRhY2htZW50Q29uZmlnID09PSBcIm9iamVjdFwiICYmIGF0dGFjaG1lbnRDb25maWcudHlwZSA9PT0gXCJoYXNNYW55XCJcbiAgICAgICAgICA/IFwiaGFzTWFueVwiXG4gICAgICAgICAgOiBcImhhc09uZVwiXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHthdHRhY2htZW50TmFtZX06IHt0eXBlOiAke0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRUeXBlKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZEFycmF5UHJvcGVydHkoe1xuICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImF0dHJpYnV0ZXNcIixcbiAgICAgIHZhbHVlczogYXR0cmlidXRlTmFtZXNcbiAgICB9KVxuICAgIGlmICghYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7Y3JlYXRlOiBcImNyZWF0ZVwiLCBpbmRleDogXCJpbmRleFwifSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICghYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgdXJsOiBcInVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRDb21tYW5kc1Byb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogY29sbGVjdGlvbkNvbW1hbmRzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkQ29tbWFuZHNQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcIm1lbWJlckNvbW1hbmRzXCIsXG4gICAgICAgIHZhbHVlczogbWVtYmVyQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChtb2RlbENsYXNzICYmIG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpICE9PSBcImlkXCIpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBwcmltYXJ5S2V5OiAke0pTT04uc3RyaW5naWZ5KG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpKX0sXFxuYFxuICAgIH1cbiAgICBjb25zdCBuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcyA9IHRoaXMubmVzdGVkUmVsYXRpb25zaGlwTmFtZXNGb3JHZW5lcmF0b3IocmVzb3VyY2VDbGFzcyB8fCBudWxsKVxuICAgIGlmIChuZXN0ZWRSZWxhdGlvbnNoaXBOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAgICR7cmVsYXRpb25zaGlwTmFtZX06IHt9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dHlwZTogXFxcImJlbG9uZ3NUb1xcXCIgfCBcXFwiaGFzT25lXFxcIiB8IFxcXCJoYXNNYW55XFxcIiwgYXV0b2xvYWQ/OiBib29sZWFufT59IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb25zLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW2B0eXBlOiAke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC50eXBlKX1gXVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuYXV0b2xvYWQgPT09IGZhbHNlKSBwYXJ0cy5wdXNoKFwiYXV0b2xvYWQ6IGZhbHNlXCIpXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9OiB7JHtwYXJ0cy5qb2luKFwiLCBcIil9fSxcXG5gXG4gICAgICB9XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9XFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBSZWxhdGlvbnNoaXAgbW9kZWwgY2xhc3MgbmFtZXMuICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfTogJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lKX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgY2FtZWxpemVkQXR0cmlidXRlID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSwgdHJ1ZSlcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZVVwcGVyID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGUubmFtZSlcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVR5cGUgPSBgJHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV1gXG4gICAgICBjb25zdCBzZXR0ZXJBdHRyaWJ1dGVUeXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7XG4gICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlLm5hbWUsXG4gICAgICAgIGF0dHJpYnV0ZXNUeXBlTmFtZSxcbiAgICAgICAgcmVzb3VyY2VDbGFzc1xuICAgICAgfSlcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgLyoqIEByZXR1cm5zIHske2F0dHJpYnV0ZVR5cGV9fSAtIEF0dHJpYnV0ZSB2YWx1ZS4gKi9cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAke2NhbWVsaXplZEF0dHJpYnV0ZX0oKSB7IHJldHVybiAvKiogQHR5cGUgeyR7YXR0cmlidXRlVHlwZX19ICovICh0aGlzLnJlYWRBdHRyaWJ1dGUoJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9KSkgfVxcbmBcblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVyQXR0cmlidXRlVHlwZX19IG5ld1ZhbHVlIC0gTmV3IGF0dHJpYnV0ZSB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHtzZXR0ZXJBdHRyaWJ1dGVUeXBlfX0gLSBBc3NpZ25lZCB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQXR0cmlidXRlVXBwZXJ9KG5ld1ZhbHVlKSB7IHJldHVybiAvKiogQHR5cGUgeyR7c2V0dGVyQXR0cmlidXRlVHlwZX19ICovICh0aGlzLnNldEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0sIG5ld1ZhbHVlKSkgfVxcbmBcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMoY29sbGVjdGlvbkNvbW1hbmRzKSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5jdXN0b21Db21tYW5kTWV0aG9kU2lnbmF0dXJlKHtjb21tYW5kTWV0YWRhdGEsIG1ldGhvZE5hbWV9KVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJ1bnMgJHttZXRob2ROYW1lfS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBzaWduYXR1cmUucGFyYW1Eb2NzXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwke3NpZ25hdHVyZS5yZXR1cm5UeXBlfT59IC0gQ29tbWFuZCByZXNwb25zZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHN0YXRpYyBhc3luYyAke21ldGhvZE5hbWV9KCR7c2lnbmF0dXJlLnBhcmFtZXRlcnN9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgY29tbWFuZE5hbWU6ICR7SlNPTi5zdHJpbmdpZnkoY29sbGVjdGlvbkNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb25Db21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICBwYXlsb2FkOiAke2NsYXNzTmFtZX0ubm9ybWFsaXplQ3VzdG9tQ29tbWFuZFBheWxvYWRBcmd1bWVudHMoJHtzaWduYXR1cmUucGF5bG9hZEFyZ3VtZW50c30pLFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgcmVzb3VyY2VQYXRoOiB0aGlzLnJlc291cmNlUGF0aCgpXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH0pXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgT2JqZWN0LmtleXMobWVtYmVyQ29tbWFuZHMpKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmN1c3RvbUNvbW1hbmRNZXRob2RTaWduYXR1cmUoe2NvbW1hbmRNZXRhZGF0YSwgbWV0aG9kTmFtZX0pXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUnVucyAke21ldGhvZE5hbWV9LlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IHNpZ25hdHVyZS5wYXJhbURvY3NcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7c2lnbmF0dXJlLnJldHVyblR5cGV9Pn0gLSBDb21tYW5kIHJlc3BvbnNlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgJHttZXRob2ROYW1lfSgke3NpZ25hdHVyZS5wYXJhbWV0ZXJzfSkge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIGF3YWl0ICR7Y2xhc3NOYW1lfS5leGVjdXRlQ3VzdG9tQ29tbWFuZCh7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBtZW1iZXJJZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKSxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHBheWxvYWQ6ICR7Y2xhc3NOYW1lfS5ub3JtYWxpemVDdXN0b21Db21tYW5kUGF5bG9hZEFyZ3VtZW50cygke3NpZ25hdHVyZS5wYXlsb2FkQXJndW1lbnRzfSksXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHJlc291cmNlUGF0aDogJHtjbGFzc05hbWV9LnJlc291cmNlUGF0aCgpXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSlcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0SW1wb3J0UGF0aCA9IGAuLyR7cmVsYXRpb25zaGlwLnRhcmdldEZpbGVOYW1lfS5qc2BcbiAgICAgIGNvbnN0IHRhcmdldEluc3RhbmNlVHlwZSA9IGBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLiR7cmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZX1gXG4gICAgICBjb25zdCB0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZSA9IGBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLiR7cmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZX1DcmVhdGVBdHRyaWJ1dGVzYFxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLnR5cGUgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSByZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gLSBSZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZSgke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKX0pKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIFJldHVybnMgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0uXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcDwke2NsYXNzTmFtZX0sICR7dGFyZ2V0SW5zdGFuY2VUeXBlfSwgJHt0YXJnZXRDcmVhdGVBdHRyaWJ1dGVzVHlwZX0+fSAtIFJlbGF0aW9uc2hpcCBoZWxwZXIuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBSZXR1cm5zIGxvYWRlZCAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtBcnJheTwke3RhcmdldEluc3RhbmNlVHlwZX0+fSAtIExvYWRlZCByZWxhdGVkIG1vZGVscy5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfUxvYWRlZCgpIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5sb2FkZWQoKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIExvYWRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8JHt0YXJnZXRJbnN0YW5jZVR5cGV9Pj59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGFzeW5jIGxvYWQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KCkgeyByZXR1cm4gYXdhaXQgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWQoKSB9XFxuYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfSByZWxhdGlvbnNoaXAgaGVscGVyLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwPCR7Y2xhc3NOYW1lfSwgJHt0YXJnZXRJbnN0YW5jZVR5cGV9LCAke3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfT59IC0gUmVsYXRpb25zaGlwIGhlbHBlci5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkoaW1wb3J0UGF0aCl9KS5Gcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXA8JHtjbGFzc05hbWV9LCAke3RhcmdldEluc3RhbmNlVHlwZX0sICR7dGFyZ2V0Q3JlYXRlQXR0cmlidXRlc1R5cGV9Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske3RhcmdldEluc3RhbmNlVHlwZX0gfCBudWxsfSAtIExvYWRlZCByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9KCkgeyByZXR1cm4gdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLmxvYWRlZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQnVpbGRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3RhcmdldENyZWF0ZUF0dHJpYnV0ZXNUeXBlfX0gW2F0dHJpYnV0ZXNdIC0gQXR0cmlidXRlcyBmb3IgdGhlIG5ldyByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dGFyZ2V0SW5zdGFuY2VUeXBlfX0gLSBCdWlsdCByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGJ1aWxkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfShhdHRyaWJ1dGVzID0ge30pIHsgcmV0dXJuIHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5idWlsZChhdHRyaWJ1dGVzKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIExvYWRzICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9LlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbD59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWwuXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiBhd2FpdCB0aGlzLiR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9UmVsYXRpb25zaGlwKCkubG9hZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogUmV0dXJucyBvciBsb2FkcyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPCR7dGFyZ2V0SW5zdGFuY2VUeXBlfSB8IG51bGw+fSAtIExvYWRlZCByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGFzeW5jICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9T3JMb2FkKCkgeyByZXR1cm4gYXdhaXQgdGhpcy4ke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfVJlbGF0aW9uc2hpcCgpLm9yTG9hZCgpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogU2V0cyAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfS5cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHt0YXJnZXRJbnN0YW5jZVR5cGV9IHwgbnVsbH0gbW9kZWwgLSBSZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHt2b2lkfVxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KG1vZGVsKSB7IHRoaXMuJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX1SZWxhdGlvbnNoaXAoKS5zZXRMb2FkZWQobW9kZWwpIH1cXG5gXG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsZUNvbnRlbnQgKz0gXCJ9XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYEZyb250ZW5kTW9kZWxCYXNlLnJlZ2lzdGVyTW9kZWwoJHtjbGFzc05hbWV9KVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYGV4cG9ydCB7JHtjbGFzc05hbWV9fVxcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYGV4cG9ydCBkZWZhdWx0ICR7Y2xhc3NOYW1lfVxcbmBcblxuICAgIHJldHVybiBmaWxlQ29udGVudFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYnVpbGQgaW5kZXggZmlsZSBjb250ZW50LlxuICAgKiBAcGFyYW0ge0FycmF5PHtjbGFzc05hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZ30+fSBnZW5lcmF0ZWRGaWxlcyAtIEdlbmVyYXRlZCBtb2RlbCBmaWxlcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBJbmRleCBmaWxlIGNvbnRlbnQgdGhhdCBpbXBvcnRzIGFuZCByZS1leHBvcnRzIGFsbCBtb2RlbHMuXG4gICAqL1xuICBidWlsZEluZGV4RmlsZUNvbnRlbnQoZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICBsZXQgY29udGVudCA9IFwiXCJcblxuICAgIGZvciAoY29uc3Qge2NsYXNzTmFtZSwgZmlsZU5hbWV9IG9mIGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgICBjb250ZW50ICs9IGBleHBvcnQge2RlZmF1bHQgYXMgJHtjbGFzc05hbWV9fSBmcm9tIFwiLi8ke2ZpbGVOYW1lfVwiXFxuYFxuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50XG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBzZXR1cCBmaWxlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT59IGdlbmVyYXRlZEZpbGVzIC0gR2VuZXJhdGVkIG1vZGVsIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNldHVwIGZpbGUgY29udGVudCB3aXRoIHNpZGUtZWZmZWN0IGltcG9ydHMgZm9yIG1vZGVsIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGJ1aWxkU2V0dXBGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcykge1xuICAgIGxldCBjb250ZW50ID0gXCIvLyBUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgYnkgVmVsb2Npb3VzLiBEbyBub3QgZWRpdCBtYW51YWxseS5cXG5cIlxuXG4gICAgY29udGVudCArPSBcIi8vIFJ1biBgdmVsb2Npb3VzIGc6ZnJvbnRlbmQtbW9kZWxzYCB0byByZWdlbmVyYXRlLlxcblwiXG5cbiAgICBmb3IgKGNvbnN0IHtmaWxlTmFtZX0gb2YgZ2VuZXJhdGVkRmlsZXMpIHtcbiAgICAgIGNvbnRlbnQgKz0gYGltcG9ydCBcIi4vJHtmaWxlTmFtZX1cIlxcbmBcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd3JpdGUgYXR0cmlidXRlcyB0eXBlZGVmLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtBcnJheTx7anNEb2NUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ30+fSBhcmdzLmF0dHJpYnV0ZXMgLSBHZW5lcmF0ZWQgcmVhZCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVzVHlwZU5hbWUgLSBHZW5lcmF0ZWQgcmVhZCBhdHRyaWJ1dGVzIHR5cGVkZWYgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2F0dHJpYnV0ZXM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHR5cGVOYW1lOiBzdHJpbmd9Pn0gYXJncy5uZXN0ZWRXcml0ZVR5cGVzIC0gTmVzdGVkIHdyaXRlIHR5cGVkZWZzLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjfSBhcmdzLnBlcm1pdHRlZFBhcmFtcyAtIFJlc291cmNlIHBlcm1pdHRlZCBwYXJhbXMgc3BlYy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50eXBlTmFtZSAtIFR5cGVkZWYgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBHZW5lcmF0ZWQgdHlwZWRlZiBzb3VyY2UuXG4gICAqL1xuICBhc3luYyB3cml0ZUF0dHJpYnV0ZXNUeXBlZGVmKHthdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIG1vZGVsQ2xhc3MsIG5lc3RlZFdyaXRlVHlwZXMsIHBlcm1pdHRlZFBhcmFtcywgcmVzb3VyY2VDbGFzcywgdHlwZU5hbWV9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlTGluZXMgPSBbXVxuXG4gICAgbGV0IG91dHB1dCA9IFwiLyoqXFxuXCJcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXNCeU5hbWUgPSBuZXcgTWFwKGF0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IFthdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlXSkpXG4gICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlc0J5S2V5ID0gbmV3IE1hcChuZXN0ZWRXcml0ZVR5cGVzLm1hcCgobmVzdGVkV3JpdGVUeXBlKSA9PiBbYCR7bmVzdGVkV3JpdGVUeXBlLnJlbGF0aW9uc2hpcE5hbWV9QXR0cmlidXRlc2AsIG5lc3RlZFdyaXRlVHlwZV0pKVxuICAgIGNvbnN0IGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZXJtaXR0ZWRQYXJhbXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZW50cnkgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZTogZW50cnksIGF0dHJpYnV0ZXNCeU5hbWUsIG1vZGVsQ2xhc3N9KVxuXG4gICAgICAgIGlmIChlbWl0dGVkQXR0cmlidXRlTmFtZXMuaGFzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuXG4gICAgICAgIGVtaXR0ZWRBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlTmFtZSlcblxuICAgICAgICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5mcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7XG4gICAgICAgICAgYXR0cmlidXRlOiBhdHRyaWJ1dGVzQnlOYW1lLmdldChhdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIGF0dHJpYnV0ZXNUeXBlTmFtZSxcbiAgICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXR0cmlidXRlTGluZXMucHVzaChgICogQHByb3BlcnR5IHske3R5cGV9fSBbJHthdHRyaWJ1dGVOYW1lfV0gLSBQZXJtaXR0ZWQgJHthdHRyaWJ1dGVOYW1lfSB2YWx1ZS5cXG5gKVxuICAgICAgfSBlbHNlIGlmIChlbnRyeSAmJiB0eXBlb2YgZW50cnkgPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlID0gbmVzdGVkV3JpdGVUeXBlc0J5S2V5LmdldChrZXkpXG4gICAgICAgICAgY29uc3QgdHlwZSA9IG5lc3RlZFdyaXRlVHlwZSA/IGBBcnJheTwke25lc3RlZFdyaXRlVHlwZS50eXBlTmFtZX0+YCA6IFwiQXJyYXk8b2JqZWN0PlwiXG5cbiAgICAgICAgICBhdHRyaWJ1dGVMaW5lcy5wdXNoKGAgKiBAcHJvcGVydHkgeyR7dHlwZX19IFske2tleX1dIC0gUGVybWl0dGVkIG5lc3RlZCAke2tleX0gdmFsdWVzLlxcbmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gYCAqIEF0dHJpYnV0ZXMgYWNjZXB0ZWQgYnkgJHt0eXBlTmFtZX0uXFxuYFxuICAgIGlmIChhdHRyaWJ1dGVMaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIG91dHB1dCArPSBgICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIG5ldmVyPn0gJHt0eXBlTmFtZX1cXG5gXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCArPSBgICogQHR5cGVkZWYge29iamVjdH0gJHt0eXBlTmFtZX1cXG5gXG4gICAgICBvdXRwdXQgKz0gYXR0cmlidXRlTGluZXMuam9pbihcIlwiKVxuICAgIH1cbiAgICBvdXRwdXQgKz0gXCIgKi9cXG5cIlxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgd3JpdGUgYXR0cmlidXRlIHR5cGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZToge2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9IHwgdW5kZWZpbmVkLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXNUeXBlTmFtZTogc3RyaW5nLCByZXNvdXJjZUNsYXNzOiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEpTRG9jIHR5cGUgZm9yIHRoZSBwZXJtaXR0ZWQgd3JpdGUgZmllbGQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZFdyaXRlQXR0cmlidXRlVHlwZSh7YXR0cmlidXRlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVzVHlwZU5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgY29uc3Qgc2V0dGVyUGFyYW1ldGVyVHlwZSA9IGF3YWl0IHRoaXMuZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVNldHRlclBhcmFtZXRlclR5cGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KVxuXG4gICAgaWYgKHNldHRlclBhcmFtZXRlclR5cGUpIHJldHVybiBgJHtzZXR0ZXJQYXJhbWV0ZXJUeXBlfSB8IG51bGxgXG5cbiAgICBpZiAoIWF0dHJpYnV0ZSkgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcblxuICAgIGlmIChhdHRyaWJ1dGUuanNEb2NUeXBlLnRyaW0oKSA9PT0gXCJudWxsXCIpIHJldHVybiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG5cbiAgICByZXR1cm4gYCR7YXR0cmlidXRlc1R5cGVOYW1lfVske0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX1dIHwgbnVsbGBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIHdyaXRlIGF0dHJpYnV0ZSBzZXR0ZXIgcGFyYW1ldGVyIHR5cGUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gU2V0dGVyIHZhbHVlIHBhcmFtZXRlciB0eXBlIHdoZW4gaXQgaXMgdXNlZnVsIGZvciBnZW5lcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRXcml0ZUF0dHJpYnV0ZVNldHRlclBhcmFtZXRlclR5cGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzPy5uYW1lKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGBzZXQke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlTmFtZSl9QXR0cmlidXRlYFxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGUgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZSh7XG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgcGFyYW1ldGVySW5kZXg6IDEsXG4gICAgICBzb3VyY2VDbGFzc05hbWU6IHJlc291cmNlQ2xhc3MubmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXBhcmFtZXRlclR5cGUpIHJldHVybiBudWxsXG4gICAgaWYgKHRoaXMuaXNCcm9hZEdlbmVyYXRlZFR5cGUocGFyYW1ldGVyVHlwZSkpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgYnJvYWQgZ2VuZXJhdGVkIHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBKU0RvYyB0eXBlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB0eXBlIGlzIHRvbyBicm9hZCB0byBpbXByb3ZlIGdlbmVyYXRlZCB3cml0ZSB0eXBpbmcuXG4gICAqL1xuICBpc0Jyb2FkR2VuZXJhdGVkVHlwZShqc0RvY1R5cGUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IGpzRG9jVHlwZS50cmltKClcblxuICAgIHJldHVybiBub3JtYWxpemVkVHlwZSA9PT0gXCI/XCJcbiAgICAgIHx8IG5vcm1hbGl6ZWRUeXBlID09PSBcImFueVwiXG4gICAgICB8fCBub3JtYWxpemVkVHlwZSA9PT0gXCJvYmplY3RcIlxuICAgICAgfHwgbm9ybWFsaXplZFR5cGUgPT09IFwidW5rbm93blwiXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwZXJtaXR0ZWQgd3JpdGUgYXR0cmlidXRlIHRvIHRoZSBnZW5lcmF0ZWQgZnJvbnRlbmQgYXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7e2F0dHJpYnV0ZU5hbWU6IHN0cmluZywgYXR0cmlidXRlc0J5TmFtZTogTWFwPHN0cmluZywge2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGcm9udGVuZCBhdHRyaWJ1dGUgbmFtZSB1c2VkIGJ5IGdlbmVyYXRlZCBhY2Nlc3NvcnMuXG4gICAqL1xuICBmcm9udGVuZFdyaXRlQXR0cmlidXRlTmFtZSh7YXR0cmlidXRlTmFtZSwgYXR0cmlidXRlc0J5TmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoYXR0cmlidXRlc0J5TmFtZS5oYXMoYXR0cmlidXRlTmFtZSkpIHJldHVybiBhdHRyaWJ1dGVOYW1lXG5cbiAgICBpZiAobW9kZWxDbGFzcykge1xuICAgICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgICBpZiAocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lICYmIGF0dHJpYnV0ZXNCeU5hbWUuaGFzKHJlc29sdmVkQXR0cmlidXRlTmFtZSkpIHJldHVybiByZXNvbHZlZEF0dHJpYnV0ZU5hbWVcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlTmFtZSwgdHJ1ZSkudG9Mb3dlckNhc2UoKVxuICAgIGNvbnN0IG1hdGNoaW5nQXR0cmlidXRlTmFtZSA9IEFycmF5LmZyb20oYXR0cmlidXRlc0J5TmFtZS5rZXlzKCkpLmZpbmQoKGNhbmRpZGF0ZU5hbWUpID0+IGNhbmRpZGF0ZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9ybWFsaXplZEF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAobWF0Y2hpbmdBdHRyaWJ1dGVOYW1lKSByZXR1cm4gbWF0Y2hpbmdBdHRyaWJ1dGVOYW1lXG5cbiAgICAvLyBXcml0ZS1vbmx5IHZpcnR1YWwgcGFyYW1zIGFyZSB2YWxpZCBwZXJtaXR0ZWQgcGFyYW1zIGV2ZW4gd2hlbiB0aGV5IGhhdmUgbm8gcmVhZCBhdHRyaWJ1dGUuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5lc3RlZCB3cml0ZSB0eXBlcyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxHZW5lcmF0b3JQZXJtaXRTcGVjfSBhcmdzLnBlcm1pdHRlZFBhcmFtcyAtIENvbWJpbmVkIHBlcm1pdHRlZCBwYXJhbXMgc3BlY3MuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2F1dG9sb2FkOiBib29sZWFuLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHRhcmdldENsYXNzTmFtZTogc3RyaW5nLCB0YXJnZXRGaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifT59IGFyZ3MucmVsYXRpb25zaGlwcyAtIEdlbmVyYXRlZCByZWxhdGlvbnNoaXBzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e2F0dHJpYnV0ZXM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHR5cGVOYW1lOiBzdHJpbmd9Pn0gLSBOZXN0ZWQgd3JpdGUgdHlwZWRlZnMuXG4gICAqL1xuICBuZXN0ZWRXcml0ZVR5cGVzRm9yTW9kZWwoe2NsYXNzTmFtZSwgcGVybWl0dGVkUGFyYW1zLCByZWxhdGlvbnNoaXBzfSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNCeU5hbWUgPSBuZXcgTWFwKHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXApID0+IFtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwXSkpXG4gICAgY29uc3QgbmVzdGVkV3JpdGVUeXBlc0J5TmFtZSA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZXJtaXR0ZWRQYXJhbXMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIGNvbnRpbnVlXG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBpZiAoIWtleS5lbmRzV2l0aChcIkF0dHJpYnV0ZXNcIikpIGNvbnRpbnVlXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgPSBrZXkuc2xpY2UoMCwgLVwiQXR0cmlidXRlc1wiLmxlbmd0aClcbiAgICAgICAgY29uc3QgbmVzdGVkU3BlYyA9IGVudHJ5W2tleV1cbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwc0J5TmFtZS5nZXQocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgICAgbGV0IHRhcmdldE1vZGVsQ2xhc3NcblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhcmdldE1vZGVsQ2xhc3MgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB0YXJnZXRNb2RlbENsYXNzID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5lc3RlZFdyaXRlVHlwZXNCeU5hbWUuaGFzKHJlbGF0aW9uc2hpcE5hbWUpKSBjb250aW51ZVxuXG4gICAgICAgIG5lc3RlZFdyaXRlVHlwZXNCeU5hbWUuc2V0KHJlbGF0aW9uc2hpcE5hbWUsIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLm5lc3RlZFdyaXRlQXR0cmlidXRlc0ZvclNwZWMoe25lc3RlZFNwZWMsIHRhcmdldE1vZGVsQ2xhc3N9KSxcbiAgICAgICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICAgIHR5cGVOYW1lOiBgJHtjbGFzc05hbWV9JHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcE5hbWUpfU5lc3RlZEF0dHJpYnV0ZXNgXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmVzdGVkV3JpdGVUeXBlc0J5TmFtZS52YWx1ZXMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5lc3RlZCB3cml0ZSBhdHRyaWJ1dGVzIGZvciBzcGVjLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+PiB8IG9iamVjdCB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MubmVzdGVkU3BlYyAtIE5lc3RlZCBwZXJtaXQgc3BlYy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MudGFyZ2V0TW9kZWxDbGFzcyAtIFRhcmdldCBiYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IC0gTmVzdGVkIHdyaXRlIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBuZXN0ZWRXcml0ZUF0dHJpYnV0ZXNGb3JTcGVjKHtuZXN0ZWRTcGVjLCB0YXJnZXRNb2RlbENsYXNzfSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuZXN0ZWRTcGVjKSkgcmV0dXJuIFtdXG5cbiAgICByZXR1cm4gbmVzdGVkU3BlYy5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT0gXCJzdHJpbmdcIikubWFwKChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZU5hbWUgPSB0YXJnZXRNb2RlbENsYXNzPy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKSB8fCBhdHRyaWJ1dGVOYW1lXG4gICAgICBjb25zdCBhdHRyaWJ1dGVDb25maWcgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yTW9kZWxBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWU6IHJlc29sdmVkQXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzc30pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHJlc29sdmVkQXR0cmlidXRlTmFtZSxcbiAgICAgICAgdHlwZTogYXR0cmlidXRlQ29uZmlnID8gdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnfSkgOiBcIkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZVwiXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlcm1pdHRlZCBwYXJhbXMgZm9yIGdlbmVyYXRvci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IHJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHBhcmFtIHtcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIn0gYWN0aW9uIC0gV3JpdGUgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEdlbmVyYXRvclBlcm1pdFNwZWN9IC0gUGVybWl0dGVkIHBhcmFtcyBzcGVjLlxuICAgKi9cbiAgcGVybWl0dGVkUGFyYW1zRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MsIGFjdGlvbikge1xuICAgIGlmICghcmVzb3VyY2VDbGFzcykgcmV0dXJuIFtdXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpXG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHJlc291cmNlQ2xhc3Moe1xuICAgICAgICBhYmlsaXR5OiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRleHQ6IHt9LFxuICAgICAgICBsb2NhbHM6IHt9LFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICBtb2RlbE5hbWU6IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCksXG4gICAgICAgIHBhcmFtczoge30sXG4gICAgICAgIHJlc291cmNlQ29uZmlndXJhdGlvbjogLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoe2F0dHJpYnV0ZXM6IFtdfSlcbiAgICAgIH0pXG4gICAgICBjb25zdCBzcGVjID0gaW5zdGFuY2UucGVybWl0dGVkUGFyYW1zKHthY3Rpb24sIGFiaWxpdHk6IHVuZGVmaW5lZCwgbG9jYWxzOiB7fSwgcGFyYW1zOiB7fX0pXG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNwZWMpID8gc3BlYyA6IFtdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGludm9rZSAke3Jlc291cmNlQ2xhc3MubmFtZX0ucGVybWl0dGVkUGFyYW1zKCkgd2hpbGUgZ2VuZXJhdGluZyBmcm9udGVuZCBtb2RlbCB3cml0ZSB0eXBlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZXMgYSBiYWNrZW5kIHJlc291cmNlJ3MgYHBlcm1pdHRlZFBhcmFtcygpYCBpbnN0YW5jZSBtZXRob2QgYXRcbiAgICogZ2VuZXJhdGlvbiB0aW1lIGFuZCBleHRyYWN0cyB0aGUgcmVsYXRpb25zaGlwIG5hbWVzIHRoYXQgYWNjZXB0XG4gICAqIG5lc3RlZCB3cml0ZXMgKGB7Zm9vQXR0cmlidXRlczogWy4uLl19YCBlbnRyaWVzKS4gVGhlIGdlbmVyYXRvclxuICAgKiBlbWl0cyB0aG9zZSBuYW1lcyBpbnRvIHRoZSBmcm9udGVuZCBtb2RlbCdzIGByZXNvdXJjZUNvbmZpZygpYCBzb1xuICAgKiB0aGUgY2xpZW50IGBzYXZlKClgIHdhbGtlciBrbm93cyB3aGljaCByZWxhdGlvbnNoaXBzIHRvIHNoaXAuXG4gICAqXG4gICAqIENvbnN0cnVjdGVkIHdpdGggbm8gY29udHJvbGxlci9hYmlsaXR5IHNvIHJlc291cmNlIG92ZXJyaWRlcyBtdXN0XG4gICAqIHN1cHBvcnQgYmVpbmcgY2FsbGVkIHdpdGhvdXQgYSByZXF1ZXN0IGNvbnRleHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsfSByZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBSZWxhdGlvbnNoaXAgbmFtZXMgdGhhdCBhY2NlcHQgbmVzdGVkIHdyaXRlcyAoZW1wdHkgd2hlbiBub25lKS5cbiAgICovXG4gIG5lc3RlZFJlbGF0aW9uc2hpcE5hbWVzRm9yR2VuZXJhdG9yKHJlc291cmNlQ2xhc3MpIHtcbiAgICBpZiAoIXJlc291cmNlQ2xhc3MpIHJldHVybiBbXVxuXG4gICAgbGV0IHNwZWNcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKClcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgcmVzb3VyY2VDbGFzcyh7XG4gICAgICAgIGFiaWxpdHk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dDoge30sXG4gICAgICAgIGxvY2Fsczoge30sXG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSxcbiAgICAgICAgcGFyYW1zOiB7fSxcbiAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7YXR0cmlidXRlczogW119KVxuICAgICAgfSlcbiAgICAgIHNwZWMgPSBpbnN0YW5jZS5wZXJtaXR0ZWRQYXJhbXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbnZva2UgJHtyZXNvdXJjZUNsYXNzLm5hbWV9LnBlcm1pdHRlZFBhcmFtcygpIHdoaWxlIGdlbmVyYXRpbmcgZnJvbnRlbmQgbW9kZWxzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3BlYykpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogUmVsYXRpb25zaGlwIG5hbWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNwZWMpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgaWYgKCFrZXkuZW5kc1dpdGgoXCJBdHRyaWJ1dGVzXCIpKSBjb250aW51ZVxuICAgICAgICBjb25zdCBuYW1lID0ga2V5LnNsaWNlKDAsIC1cIkF0dHJpYnV0ZXNcIi5sZW5ndGgpXG4gICAgICAgIGlmIChuYW1lKSByZWxhdGlvbnNoaXBOYW1lcy5wdXNoKG5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcE5hbWVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgYXJyYXkgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy52YWx1ZXMgLSBTdHJpbmcgdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiBbXFxuYFxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9XSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgY29tbWFuZHMgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnZhbHVlcyAtIENvbW1hbmQga2V5LXZhbHVlcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBGb3JtYXR0ZWQgbXVsdGlsaW5lIGFycmF5IHByb3BlcnR5LiBBbHdheXMgZW1pdHNcbiAgICogICB0aGUgY2FtZWxDYXNlIG1ldGhvZC1uYW1lIGFycmF5IGZvcm0gKGBtZW1iZXJDb21tYW5kczogW1widXBkYXRlQWNjZXNzXCJdYClcbiAgICogICBzbyB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBtYXRjaGVzIHRoZSBjYW5vbmljYWxcbiAgICogICBgRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlnLntjb2xsZWN0aW9uLG1lbWJlcn1Db21tYW5kczogc3RyaW5nW11gXG4gICAqICAgc2hhcGUuIFRoZSBydW50aW1lIGRlcml2ZXMgdGhlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBjYW1lbENhc2VcbiAgICogICBtZXRob2QgbmFtZTsgY29uc3VtZXJzIG5ldmVyIG5lZWQgdG8gd3JpdGUgb3V0XG4gICAqICAgYHt1cGRhdGVBY2Nlc3M6IFwidXBkYXRlLWFjY2Vzc1wifWAgYnkgaGFuZC5cbiAgICovXG4gIGZvcm1hdHRlZENvbW1hbmRzUHJvcGVydHkoe2luZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkQXJyYXlQcm9wZXJ0eSh7aW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlczogT2JqZWN0LmtleXModmFsdWVzKX0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXR0ZWQgb2JqZWN0IHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEZvcm1hdHRpbmcgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaW5kZW50IC0gQmFzZSBpbmRlbnRhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJvcGVydHlOYW1lIC0gT2JqZWN0IHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gYXJncy52YWx1ZXMgLSBPYmplY3Qga2V5LXZhbHVlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbYXJncy5maWx0ZXJEZWZhdWx0VmFsdWVzXSAtIERlZmF1bHQgdmFsdWVzIHRvIG9taXQgZnJvbSBvdXRwdXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRm9ybWF0dGVkIG11bHRpbGluZSBvYmplY3QgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7ZmlsdGVyRGVmYXVsdFZhbHVlcywgaW5kZW50LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc30pIHtcbiAgICBsZXQgb3V0cHV0ID0gYCR7aW5kZW50fSR7cHJvcGVydHlOYW1lfToge1xcbmBcblxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlcykpIHtcbiAgICAgIGlmIChmaWx0ZXJEZWZhdWx0VmFsdWVzICYmIGZpbHRlckRlZmF1bHRWYWx1ZXNbb2JqZWN0S2V5XSA9PT0gdmFsdWVzW29iamVjdEtleV0pIGNvbnRpbnVlXG5cbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke29iamVjdEtleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWVzW29iamVjdEtleV0pfSxcXG5gXG4gICAgfVxuXG4gICAgb3V0cHV0ICs9IGAke2luZGVudH19LFxcbmBcblxuICAgIHJldHVybiBvdXRwdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jbGFzc05hbWUgLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHtqc0RvY1R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nfT4+fSAtIEF0dHJpYnV0ZSBkZWZpbml0aW9ucy5cbiAgICovXG4gIGFzeW5jIGF0dHJpYnV0ZURlZmluaXRpb25zRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDbGFzcywgbW9kZWxDb25maWcsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgbGV0IGF0dHJpYnV0ZXMgPSBtb2RlbENvbmZpZy5hdHRyaWJ1dGVzXG5cbiAgICAvLyBBdXRvLWRlcml2ZSBhdHRyaWJ1dGVzIGZyb20gbW9kZWwgY29sdW1ucyB3aGVuIG5vdCBleHBsaWNpdGx5IGRlZmluZWRcbiAgICBpZiAoKCFhdHRyaWJ1dGVzIHx8IChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpICYmIGF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSkgJiYgbW9kZWxDbGFzcykge1xuICAgICAgY29uc3QgY29sdW1ucyA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1ucygpXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbnMpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBpbmZsZWN0aW9uLmNhbWVsaXplKGNvbHVtbi5nZXROYW1lKCksIHRydWUpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVEZWZpbml0aW9ucyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGVmaW5pdGlvbiBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSAqL1xuICAgICAgICBsZXQgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IG51bGxcbiAgICAgICAgbGV0IGF0dHJpYnV0ZU5hbWVcblxuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZURlZmluaXRpb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVEZWZpbml0aW9uXG4gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlRGVmaW5pdGlvbiAmJiB0eXBlb2YgYXR0cmlidXRlRGVmaW5pdGlvbiA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGF0dHJpYnV0ZURlZmluaXRpb24pKSB7XG4gICAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IC8qKiBAdHlwZSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9ICovIChhdHRyaWJ1dGVEZWZpbml0aW9uKVxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPSBcInN0cmluZ1wiIHx8IGF0dHJpYnV0ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIGFycmF5IGVudHJpZXMgdG8gYmUgc3RyaW5ncyBvciBvYmplY3RzIHdpdGggYSBuYW1lLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlRGVmaW5pdGlvbil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyA9IGF3YWl0IHRoaXMucmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyA9IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JHZW5lcmF0ZWRBdHRyaWJ1dGUoe1xuICAgICAgICAgIGF0dHJpYnV0ZUNvbmZpZyxcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIG1vZGVsQ2xhc3NcbiAgICAgICAgfSlcblxuICAgICAgICBhdHRyaWJ1dGVEZWZpbml0aW9ucy5wdXNoKHtcbiAgICAgICAgICBqc0RvY1R5cGU6IHRoaXMuanNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZzogZnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9KSxcbiAgICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVEZWZpbml0aW9uc1xuICAgIH1cblxuICAgIGlmICghYXR0cmlidXRlcyB8fCB0eXBlb2YgYXR0cmlidXRlcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnYXR0cmlidXRlcycgYXMgYXJyYXkgb3Igb2JqZWN0IGJ1dCBnb3Q6ICR7YXR0cmlidXRlc31gKVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZURlZmluaXRpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlQ29uZmlnID0gYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICAgICAgY29uc3QgY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyA9IGF0dHJpYnV0ZUNvbmZpZyAmJiB0eXBlb2YgYXR0cmlidXRlQ29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gLyoqIEB0eXBlIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gKi8gKGF0dHJpYnV0ZUNvbmZpZylcbiAgICAgICAgOiBudWxsXG4gICAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlQ29uZmlnID0gYXdhaXQgdGhpcy5yZXNvbHZlZEZyb250ZW5kQXR0cmlidXRlQ29uZmlnKHtcbiAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICBtb2RlbENsYXNzLFxuICAgICAgICByZXNvdXJjZUNsYXNzXG4gICAgICB9KVxuICAgICAgY29uc3QgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yR2VuZXJhdGVkQXR0cmlidXRlKHtcbiAgICAgICAgYXR0cmlidXRlQ29uZmlnOiBub3JtYWxpemVkQXR0cmlidXRlQ29uZmlnLFxuICAgICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICBtb2RlbENsYXNzXG4gICAgICB9KVxuXG4gICAgICBhdHRyaWJ1dGVEZWZpbml0aW9ucy5wdXNoKHtcbiAgICAgICAganNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWc6IGZyb250ZW5kQXR0cmlidXRlQ29uZmlnfSksXG4gICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBnZW5lcmF0ZWQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVDb25maWc6IEZyb250ZW5kQXR0cmlidXRlQ29uZmlnLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ30gLSBBdHRyaWJ1dGUgY29uZmlnIHVzZWQgZm9yIGdlbmVyYXRlZCBKU0RvYy5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yR2VuZXJhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVDb25maWcsIGF0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlSXNNb2RlbFByaW1hcnlLZXkoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3N9KSkgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZ1xuICAgIGlmICh0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzTnVsbGFiaWxpdHkoYXR0cmlidXRlQ29uZmlnKSkgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZ1xuXG4gICAgcmV0dXJuIHsuLi5hdHRyaWJ1dGVDb25maWcsIG51bGw6IGZhbHNlfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGlzIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3thdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH19IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyB0aGUgbW9kZWwgcHJpbWFyeSBrZXkuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUlzTW9kZWxQcmltYXJ5S2V5KHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcblxuICAgIGlmICh0eXBlb2YgcHJpbWFyeUtleSAhPSBcInN0cmluZ1wiIHx8IHByaW1hcnlLZXkubGVuZ3RoIDwgMSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IHByaW1hcnlLZXkpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShwcmltYXJ5S2V5KSA9PT0gYXR0cmlidXRlTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZnJvbSBleHBsaWNpdCBtZXRhZGF0YSwgcmVzb3VyY2UgbWV0aG9kcywgbW9kZWwgY29sdW1ucywgdHJhbnNsYXRlZCBjb2x1bW5zLCBvciBtb2RlbCBhY2Nlc3NvciBKU0RvYy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gRnJvbnRlbmQgbW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IGFyZ3MuY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZyAtIFJlc291cmNlLXByb3ZpZGVkIGF0dHJpYnV0ZSBjb25maWcuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnPn0gLSBSZXNvbHZlZCBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZWRGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyh7YXR0cmlidXRlTmFtZSwgY2xhc3NOYW1lLCBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IGluZmVycmVkUmVzb3VyY2VDb25maWcgPSBhd2FpdCB0aGlzLmZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yUmVzb3VyY2VBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KVxuICAgIGNvbnN0IGluZmVycmVkQ29sdW1uQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgY29uc3QgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnID0gaW5mZXJyZWRSZXNvdXJjZUNvbmZpZyB8fCBpbmZlcnJlZENvbHVtbkNvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JUcmFuc2xhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZE1vZGVsQWNjZXNzb3JDb25maWcgPSBpbmZlcnJlZFJlc291cmNlQ29uZmlnIHx8IGluZmVycmVkQ29sdW1uQ29uZmlnIHx8IGluZmVycmVkVHJhbnNsYXRlZENvbmZpZ1xuICAgICAgPyBudWxsXG4gICAgICA6IGF3YWl0IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEFjY2Vzc29yKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSlcbiAgICBjb25zdCBpbmZlcnJlZENvbmZpZyA9IGluZmVycmVkUmVzb3VyY2VDb25maWcgfHwgaW5mZXJyZWRDb2x1bW5Db25maWcgfHwgaW5mZXJyZWRUcmFuc2xhdGVkQ29uZmlnIHx8IGluZmVycmVkTW9kZWxBY2Nlc3NvckNvbmZpZ1xuXG4gICAgaWYgKGNvbmZpZ3VyZWRBdHRyaWJ1dGVDb25maWcgJiYgdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc1R5cGUoY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBpbmZlcnJlZENvbmZpZ1xuICAgICAgICA/IHsuLi5pbmZlcnJlZENvbmZpZywgLi4uY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ31cbiAgICAgICAgOiBjb25maWd1cmVkQXR0cmlidXRlQ29uZmlnXG4gICAgfVxuXG4gICAgaWYgKGluZmVycmVkQ29uZmlnKSB7XG4gICAgICByZXR1cm4gY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ1xuICAgICAgICA/IHsuLi5pbmZlcnJlZENvbmZpZywgLi4uY29uZmlndXJlZEF0dHJpYnV0ZUNvbmZpZ31cbiAgICAgICAgOiBpbmZlcnJlZENvbmZpZ1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGluZmVyIEpTRG9jIHR5cGUgZm9yIGZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSAnJHtjbGFzc05hbWV9IyR7YXR0cmlidXRlTmFtZX0nLiBBZGQgYSBiYWNrZW5kIG1vZGVsIGNvbHVtbiwgdHJhbnNsYXRpb24gdGFibGUgY29sdW1uLCBleHBsaWNpdCByZXNvdXJjZSBtZXRhZGF0YSwgb3IgYSBAcmV0dXJucyBKU0RvYyB0eXBlIG9uICR7cmVzb3VyY2VDbGFzcz8ubmFtZSB8fCBcInRoZSByZXNvdXJjZVwifS4ke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlKCkuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgaGFzIHR5cGUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25maWcgZGVjbGFyZXMgYSB0eXBlIHNvdXJjZS5cbiAgICovXG4gIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnSGFzVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKSA9PSBcInN0cmluZ1wiXG4gICAgICB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnPy5qc0RvY1R5cGUgPT0gXCJzdHJpbmdcIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBoYXMgbnVsbGFiaWxpdHkuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb25maWcgZGVjbGFyZXMgbnVsbGFiaWxpdHkuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0hhc051bGxhYmlsaXR5KGF0dHJpYnV0ZUNvbmZpZykge1xuICAgIGlmICghYXR0cmlidXRlQ29uZmlnIHx8IHR5cGVvZiBhdHRyaWJ1dGVDb25maWcgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cmlidXRlQ29uZmlnLCBcIm51bGxcIikpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLmF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEpTRG9jIHR5cGUuXG4gICAqL1xuICBqc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnfSkge1xuICAgIGlmIChhdHRyaWJ1dGVDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5qc0RvY1R5cGUgPT0gXCJzdHJpbmdcIiAmJiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcuanNEb2NUeXBlXG4gICAgfVxuXG4gICAgY29uc3QganNEb2NUeXBlID0gdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZUJhc2VUeXBlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICghdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpKSB7XG4gICAgICByZXR1cm4ganNEb2NUeXBlXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2pzRG9jVHlwZX0gfCBudWxsYFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZm9yIGZyb250ZW5kIGF0dHJpYnV0ZSBiYXNlIHR5cGUuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkfSBhdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBOb24tbnVsbGFibGUgSlNEb2MgdHlwZS5cbiAgICovXG4gIGpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlQmFzZVR5cGUoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCJcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpXG5cbiAgICBpZiAodHlwZSA9PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwianNvblwiIHx8IHR5cGUgPT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcIlxuICAgIH0gZWxzZSBpZiAodHlwZSAmJiBbXCJibG9iXCIsIFwiY2hhclwiLCBcIm52YXJjaGFyXCIsIFwidmFyY2hhclwiLCBcInRleHRcIiwgXCJsb25ndGV4dFwiLCBcIm1lZGl1bXRleHRcIiwgXCJ0aW55dGV4dFwiLCBcInV1aWRcIiwgXCJjaGFyYWN0ZXIgdmFyeWluZ1wiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiYml0XCIsIFwiYmlnaW50XCIsIFwiZGVjaW1hbFwiLCBcImRvdWJsZVwiLCBcImRvdWJsZSBwcmVjaXNpb25cIiwgXCJmbG9hdFwiLCBcImludFwiLCBcImludGVnZXJcIiwgXCJudW1lcmljXCIsIFwicmVhbFwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCIsIFwidGltZXN0YW1wdHpcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIkRhdGVcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJGcm9udGVuZE1vZGVsQXR0cmlidXRlVmFsdWVcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjYW4gYmUgbnVsbC5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgYWxsb3dzIG51bGwgdmFsdWVzLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDYW5CZU51bGwoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVDb25maWcuZ2V0TnVsbCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVDb25maWcuZ2V0TnVsbCgpID09PSB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5udWxsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgdHlwZSB2YWx1ZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGwgfCB1bmRlZmluZWR9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBOb3JtYWxpemVkIGNvbHVtbiB0eXBlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVUeXBlVmFsdWUoYXR0cmlidXRlQ29uZmlnKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGVDb25maWcgfHwgdHlwZW9mIGF0dHJpYnV0ZUNvbmZpZyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXRUeXBlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIFN0cmluZyhhdHRyaWJ1dGVDb25maWcuZ2V0VHlwZSgpKVxuICAgIH1cblxuICAgIGNvbnN0IHR5cGVWYWx1ZSA9IGF0dHJpYnV0ZUNvbmZpZy50eXBlIHx8IGF0dHJpYnV0ZUNvbmZpZy5jb2x1bW5UeXBlIHx8IGF0dHJpYnV0ZUNvbmZpZy5zcWxUeXBlIHx8IGF0dHJpYnV0ZUNvbmZpZy5kYXRhVHlwZVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlVmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgcmVzb3VyY2UgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5yZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbD59IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHJlc291cmNlIG1ldGhvZCBKU0RvYy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQXR0cmlidXRlQ29uZmlnRm9yUmVzb3VyY2VBdHRyaWJ1dGUoe2F0dHJpYnV0ZU5hbWUsIHJlc291cmNlQ2xhc3N9KSB7XG4gICAgaWYgKCFyZXNvdXJjZUNsYXNzKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYFxuICAgIGNvbnN0IG93bmVyQ2xhc3NOYW1lID0gdGhpcy5tZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZSwgdGFyZ2V0Q2xhc3M6IHJlc291cmNlQ2xhc3N9KVxuXG4gICAgaWYgKCFvd25lckNsYXNzTmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlKHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBzb3VyY2VDbGFzc05hbWU6IG93bmVyQ2xhc3NOYW1lXG4gICAgfSlcblxuICAgIHJldHVybiBqc0RvY1R5cGUgPyB7anNEb2NUeXBlOiB0aGlzLnVud3JhcHBlZFByb21pc2VKc0RvY1R5cGUoe2pzRG9jVHlwZX0pfSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIHRyYW5zbGF0ZWQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0cmlidXRlTmFtZSAtIEZyb250ZW5kIG1vZGVsIGF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3MucmVzb3VyY2VDbGFzcyAtIFJlc291cmNlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWcgfCBudWxsfSAtIEF0dHJpYnV0ZSBjb25maWcgaW5mZXJyZWQgZnJvbSB0cmFuc2xhdGVkIGF0dHJpYnV0ZSBjb2x1bW5zLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JUcmFuc2xhdGVkQXR0cmlidXRlKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIG51bGxcbiAgICBpZiAoIXRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVJc1RyYW5zbGF0ZWQoe2F0dHJpYnV0ZU5hbWUsIG1vZGVsQ2xhc3MsIHJlc291cmNlQ2xhc3N9KSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IFRyYW5zbGF0aW9uQ2xhc3MgPSBtb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uQ2xhc3MoKVxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGxldCBjb2x1bW5cblxuICAgIHRyeSB7XG4gICAgICBjb2x1bW4gPSBUcmFuc2xhdGlvbkNsYXNzLmdldENvbHVtbnNIYXNoKClbY29sdW1uTmFtZV1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIikgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcInVzZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uXCIpKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1uID8gdGhpcy5mcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgaXMgdHJhbnNsYXRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZnJvbnRlbmQgYXR0cmlidXRlIGlzIHRyYW5zbGF0ZWQuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUlzVHJhbnNsYXRlZCh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzcywgcmVzb3VyY2VDbGFzc30pIHtcbiAgICBpZiAocmVzb3VyY2VDbGFzcykge1xuICAgICAgY29uc3QgdHJhbnNsYXRlZEF0dHJpYnV0ZXMgPSByZXNvdXJjZUNsYXNzLnRyYW5zbGF0ZWRBdHRyaWJ1dGVzXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyYW5zbGF0ZWRBdHRyaWJ1dGVzKSAmJiB0cmFuc2xhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBtb2RlbENsYXNzLl90cmFuc2xhdGlvbnNcblxuICAgIHJldHVybiBCb29sZWFuKHRyYW5zbGF0aW9ucyAmJiB0eXBlb2YgdHJhbnNsYXRpb25zID09IFwib2JqZWN0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRyYW5zbGF0aW9ucywgYXR0cmlidXRlTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRyaWJ1dGUgY29uZmlnIGZvciBtb2RlbCBhY2Nlc3Nvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEZyb250ZW5kQXR0cmlidXRlQ29uZmlnIHwgbnVsbD59IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIG1vZGVsIGFjY2Vzc29yIEpTRG9jLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEFjY2Vzc29yKHthdHRyaWJ1dGVOYW1lLCBtb2RlbENsYXNzfSkge1xuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IG93bmVyQ2xhc3NOYW1lID0gdGhpcy5tZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZTogYXR0cmlidXRlTmFtZSwgdGFyZ2V0Q2xhc3M6IG1vZGVsQ2xhc3N9KVxuXG4gICAgaWYgKCFvd25lckNsYXNzTmFtZSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGpzRG9jVHlwZSA9IGF3YWl0IHRoaXMucmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlKHtcbiAgICAgIG1ldGhvZE5hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICBzb3VyY2VDbGFzc05hbWU6IG93bmVyQ2xhc3NOYW1lXG4gICAgfSlcblxuICAgIC8vIEZyb250ZW5kIGF0dHJpYnV0ZXMgaG9sZCB0aGUgc2VyaWFsaXplZCAocmVzb2x2ZWQpIHZhbHVlLCBzbyBhbiBhc3luY1xuICAgIC8vIGJhY2tlbmQgYWNjZXNzb3IgdHlwZWQgYFByb21pc2U8bnVtYmVyPmAgbXVzdCBzdXJmYWNlIGFzIGBudW1iZXJgIOKAlCB0aGVcbiAgICAvLyBzYW1lIHVud3JhcHBpbmcgdGhlIHJlc291cmNlLW1ldGhvZCBpbmZlcmVuY2UgcGF0aCBhcHBsaWVzLlxuICAgIHJldHVybiBqc0RvY1R5cGVcbiAgICAgID8ge2pzRG9jVHlwZTogdGhpcy5mcm9udGVuZFJlc29sdmFibGVBdHRyaWJ1dGVKc0RvY1R5cGUodGhpcy51bndyYXBwZWRQcm9taXNlSnNEb2NUeXBlKHtqc0RvY1R5cGV9KSl9XG4gICAgICA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGJhY2tlbmQgYWNjZXNzb3IncyBgQHJldHVybnNgIGNhbiByZWZlcmVuY2UgdHlwZXMgdGhhdCBleGlzdCBvbmx5IG9uIHRoZVxuICAgKiBiYWNrZW5kIChlLmcuIGEgbW9kZWwtbG9jYWwgYEB0eXBlZGVmIEFnZW50UnVuUGxhbm5pbmdBcnRpZmFjdGApLiBUaGUgZnJvbnRlbmRcbiAgICogbW9kZWwgY2FuJ3QgcmVzb2x2ZSB0aG9zZSwgc28gZmFsbCBiYWNrIHRvIGBhbnlgIHJhdGhlciB0aGFuIGVtaXR0aW5nIGFuXG4gICAqIHVuZGVmaW5lZCB0eXBlIG5hbWUuIFR5cGVzIGJ1aWx0IG9ubHkgZnJvbSBwcmltaXRpdmVzIGFuZCBrbm93biBnZW5lcmljXG4gICAqIGJ1aWx0aW5zIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1R5cGUgLSBSZXNvbHZlZCAoUHJvbWlzZS11bndyYXBwZWQpIGF0dHJpYnV0ZSB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEEgZnJvbnRlbmQtcmVzb2x2YWJsZSBhdHRyaWJ1dGUgdHlwZS5cbiAgICovXG4gIGZyb250ZW5kUmVzb2x2YWJsZUF0dHJpYnV0ZUpzRG9jVHlwZShqc0RvY1R5cGUpIHtcbiAgICBjb25zdCBzYWZlVHlwZUlkZW50aWZpZXJzID0gbmV3IFNldChbXG4gICAgICBcIkFycmF5XCIsIFwiRGF0ZVwiLCBcIkV4Y2x1ZGVcIiwgXCJFeHRyYWN0XCIsIFwiRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZVZhbHVlXCIsIFwiRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXCIsXG4gICAgICBcIk1hcFwiLCBcIk5vbk51bGxhYmxlXCIsIFwiT21pdFwiLCBcIlBhcnRpYWxcIiwgXCJQaWNrXCIsIFwiUHJvbWlzZVwiLCBcIlJlYWRvbmx5XCIsIFwiUmVhZG9ubHlBcnJheVwiLCBcIlJlY29yZFwiLFxuICAgICAgXCJSZXF1aXJlZFwiLCBcIlJldHVyblR5cGVcIiwgXCJTZXRcIlxuICAgIF0pXG4gICAgY29uc3QgcmVmZXJlbmNlZElkZW50aWZpZXJzID0ganNEb2NUeXBlLm1hdGNoKC9bQS1aXVtBLVphLXowLTlfJF0qL2cpIHx8IFtdXG5cbiAgICBpZiAocmVmZXJlbmNlZElkZW50aWZpZXJzLnNvbWUoKGlkZW50aWZpZXIpID0+ICFzYWZlVHlwZUlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkpIHtcbiAgICAgIHJldHVybiBcImFueVwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGpzRG9jVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgSlNEb2MgcGFyYW0gYmxvY2ssIHBhcmFtZXRlciBsaXN0LCBwYXlsb2FkLWFyZ3VtZW50IGV4cHJlc3Npb24sIGFuZFxuICAgKiByZXR1cm4gdHlwZSBmb3IgYSBjdXN0b20gY29tbWFuZCBtZXRob2QuIFdpdGggZGVjbGFyZWQgYGFyZ3NgIGVhY2ggYmVjb21lcyBhXG4gICAqIG5hbWVkLCB0eXBlZCBwYXJhbWV0ZXIgbWFwcGVkIHBvc2l0aW9uYWxseSBpbnRvIHRoZSBjb21tYW5kIHBheWxvYWQ7IHdpdGhvdXRcbiAgICogdGhlbSB0aGUgbWV0aG9kIHN0YXlzIHZhcmlhZGljLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pn0gYXJncy5jb21tYW5kTWV0YWRhdGEgLSBQZXItY29tbWFuZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWV0aG9kTmFtZSAtIENvbW1hbmQgbWV0aG9kIG5hbWUuXG4gICAqIEByZXR1cm5zIHt7cGFyYW1Eb2NzOiBzdHJpbmcsIHBhcmFtZXRlcnM6IHN0cmluZywgcGF5bG9hZEFyZ3VtZW50czogc3RyaW5nLCByZXR1cm5UeXBlOiBzdHJpbmd9fSAtIEdlbmVyYXRpb24gcGllY2VzLlxuICAgKi9cbiAgY3VzdG9tQ29tbWFuZE1ldGhvZFNpZ25hdHVyZSh7Y29tbWFuZE1ldGFkYXRhLCBtZXRob2ROYW1lfSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gY29tbWFuZE1ldGFkYXRhW21ldGhvZE5hbWVdIHx8IHthcmdzOiBbXSwgcmV0dXJuVHlwZTogbnVsbH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gbWV0YWRhdGEucmV0dXJuVHlwZSB8fCBcIlJlY29yZDxzdHJpbmcsID8+XCJcblxuICAgIGlmIChtZXRhZGF0YS5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWVzID0gbWV0YWRhdGEuYXJncy5tYXAoKGFyZykgPT4gYXJnLm5hbWUpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmFtRG9jczogbWV0YWRhdGEuYXJncy5tYXAoKGFyZykgPT4gYCAgICogQHBhcmFtIHske2FyZy50eXBlfX0gJHthcmcubmFtZX0gLSBDb21tYW5kIGFyZ3VtZW50LlxcbmApLmpvaW4oXCJcIiksXG4gICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlck5hbWVzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgcGF5bG9hZEFyZ3VtZW50czogYFske3BhcmFtZXRlck5hbWVzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXJhbURvY3M6IFwiICAgKiBAcGFyYW0gey4uLkZyb250ZW5kTW9kZWxBdHRyaWJ1dGVWYWx1ZX0gY29tbWFuZEFyZ3VtZW50cyAtIEN1c3RvbSBjb21tYW5kIGFyZ3VtZW50cy5cXG5cIixcbiAgICAgIHBhcmFtZXRlcnM6IFwiLi4uY29tbWFuZEFyZ3VtZW50c1wiLFxuICAgICAgcGF5bG9hZEFyZ3VtZW50czogXCJjb21tYW5kQXJndW1lbnRzXCIsXG4gICAgICByZXR1cm5UeXBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdW53cmFwcGVkIHByb21pc2UganMgZG9jIHR5cGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qc0RvY1R5cGUgLSBKU0RvYyB0eXBlIHRvIG5vcm1hbGl6ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcmVzb2x2ZWQgdmFsdWUgdHlwZSBmb3Igc2VyaWFsaXplZCBmcm9udGVuZCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgdW53cmFwcGVkUHJvbWlzZUpzRG9jVHlwZSh7anNEb2NUeXBlfSkge1xuICAgIGNvbnN0IHByb21pc2VQcmVmaXggPSBcIlByb21pc2U8XCJcblxuICAgIGlmICghanNEb2NUeXBlLnN0YXJ0c1dpdGgocHJvbWlzZVByZWZpeCkpIHJldHVybiBqc0RvY1R5cGVcblxuICAgIGlmICghanNEb2NUeXBlLmVuZHNXaXRoKFwiPlwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBQcm9taXNlIEpTRG9jIHR5cGUgdG8gZW5kIHdpdGggJz4nOiAke2pzRG9jVHlwZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGpzRG9jVHlwZS5zbGljZShwcm9taXNlUHJlZml4Lmxlbmd0aCwgLTEpLnRyaW0oKVxuXG4gICAgaWYgKHJlc29sdmVkVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFByb21pc2UgSlNEb2MgdHlwZSB0byBjb250YWluIGEgcmVzb2x2ZWQgdHlwZTogJHtqc0RvY1R5cGV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtZXRob2Qgb3duZXIgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gYXJncy50YXJnZXRDbGFzcyAtIFRhcmdldCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gQ2xhc3MgbmFtZSB0aGF0IGRlY2xhcmVzIHRoZSBtZXRob2QuXG4gICAqL1xuICBtZXRob2RPd25lckNsYXNzTmFtZSh7bWV0aG9kTmFtZSwgdGFyZ2V0Q2xhc3N9KSB7XG4gICAgbGV0IHByb3RvdHlwZSA9IHRhcmdldENsYXNzLnByb3RvdHlwZVxuXG4gICAgd2hpbGUgKHByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIG1ldGhvZE5hbWUpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yPy52YWx1ZSAhPSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsXG5cbiAgICAgICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gcHJvdG90eXBlLmNvbnN0cnVjdG9yPy5uYW1lXG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3Rvck5hbWUgPT0gXCJzdHJpbmdcIiAmJiBjb25zdHJ1Y3Rvck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZVxuXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1ldGhvZE5hbWUgLSBNZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc291cmNlQ2xhc3NOYW1lIC0gU291cmNlIGNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIEpTRG9jIHJldHVybiB0eXBlIHdoZW4gZG9jdW1lbnRlZC5cbiAgICovXG4gIGFzeW5jIHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZSh7bWV0aG9kTmFtZSwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMoKVxuICAgIGNvbnN0IHJldHVyblR5cGVLZXkgPSBgJHtzb3VyY2VDbGFzc05hbWV9LiR7bWV0aG9kTmFtZX1gXG5cbiAgICBpZiAoIXJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMuaGFzKHJldHVyblR5cGVLZXkpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHJlc291cmNlTWV0aG9kUmV0dXJuVHlwZXMuZ2V0KHJldHVyblR5cGVLZXkpXG5cbiAgICBpZiAodHlwZW9mIHJldHVyblR5cGUgIT0gXCJzdHJpbmdcIiB8fCByZXR1cm5UeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IEpTRG9jIHJldHVybiB0eXBlIGZvciAke3JldHVyblR5cGVLZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlLlxuICAgKiBAcGFyYW0ge3ttZXRob2ROYW1lOiBzdHJpbmcsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNvdXJjZUNsYXNzTmFtZTogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gSlNEb2MgcGFyYW1ldGVyIHR5cGUgd2hlbiBkb2N1bWVudGVkLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlKHttZXRob2ROYW1lLCBwYXJhbWV0ZXJJbmRleCwgc291cmNlQ2xhc3NOYW1lfSkge1xuICAgIGNvbnN0IHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMgPSBhd2FpdCB0aGlzLnJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMoKVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzS2V5ID0gYCR7c291cmNlQ2xhc3NOYW1lfS4ke21ldGhvZE5hbWV9YFxuXG4gICAgaWYgKCFyZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzLmhhcyhwYXJhbWV0ZXJUeXBlc0tleSkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IHJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXMuZ2V0KHBhcmFtZXRlclR5cGVzS2V5KVxuXG4gICAgaWYgKCFwYXJhbWV0ZXJUeXBlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU0RvYyBwYXJhbWV0ZXIgdHlwZXMgZm9yICR7cGFyYW1ldGVyVHlwZXNLZXl9YClcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXNbcGFyYW1ldGVySW5kZXhdXG5cbiAgICBpZiAocGFyYW1ldGVyVHlwZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHBhcmFtZXRlclR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcGFyYW1ldGVyIHR5cGUgZm9yICR7cGFyYW1ldGVyVHlwZXNLZXl9IHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlclR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZz4+fSAtIFJlc291cmNlIG1ldGhvZCByZXR1cm4gdHlwZXMga2V5ZWQgYnkgQ2xhc3NOYW1lLm1ldGhvZE5hbWUuXG4gICAqL1xuICBhc3luYyByZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKCkge1xuICAgIGlmICh0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzKSByZXR1cm4gdGhpcy5fcmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc1xuXG4gICAgY29uc3Qgc291cmNlRmlsZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKClcbiAgICBjb25zdCByZXR1cm5UeXBlcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHNvdXJjZUZpbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoc291cmNlRmlsZSwgXCJ1dGY4XCIpXG5cbiAgICAgIHRoaXMuYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VUZXh0fSlcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvdXJjZU1ldGhvZFJldHVyblR5cGVzID0gcmV0dXJuVHlwZXNcblxuICAgIHJldHVybiByZXR1cm5UeXBlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZywgc3RyaW5nW10+Pn0gLSBSZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyIHR5cGVzIGtleWVkIGJ5IENsYXNzTmFtZS5tZXRob2ROYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcygpIHtcbiAgICBpZiAodGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcykgcmV0dXJuIHRoaXMuX3Jlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNcblxuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsSnNEb2NTb3VyY2VGaWxlcygpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgY29uc3Qgc291cmNlVGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGUsIFwidXRmOFwiKVxuXG4gICAgICB0aGlzLmFkZFJlc291cmNlTWV0aG9kUGFyYW1ldGVyVHlwZXNGcm9tU291cmNlKHtwYXJhbWV0ZXJUeXBlcywgc291cmNlVGV4dH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb3VyY2VNZXRob2RQYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyVHlwZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIEpTRG9jIHNvdXJjZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIEphdmFTY3JpcHQgc291cmNlIGZpbGVzIHRoYXQgY2FuIGRlZmluZSBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgYW5kIG1vZGVsIGFjY2Vzc29ycy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxKc0RvY1NvdXJjZUZpbGVzKCkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gW11cblxuICAgIGZvciAoY29uc3Qgc291cmNlRGlyZWN0b3J5IG9mIHRoaXMuZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSkge1xuICAgICAgc291cmNlRmlsZXMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KHNvdXJjZURpcmVjdG9yeSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZUZpbGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBKU0RvYyBzb3VyY2UgZGlyZWN0b3JpZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTb3VyY2UgZGlyZWN0b3JpZXMgdG8gc2NhbiBmb3IgZ2VuZXJhdGVkIGZyb250ZW5kLW1vZGVsIEpTRG9jLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbEpzRG9jU291cmNlRGlyZWN0b3JpZXMoKSB7XG4gICAgY29uc3Qgc291cmNlRGlyZWN0b3JpZXMgPSBuZXcgU2V0KFtwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnkoKSwgXCJzcmNcIildKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgICAgaWYgKHR5cGVvZiBiYWNrZW5kUHJvamVjdC5wYXRoID09IFwic3RyaW5nXCIgJiYgYmFja2VuZFByb2plY3QucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNvdXJjZURpcmVjdG9yaWVzLmFkZChwYXRoLmpvaW4oYmFja2VuZFByb2plY3QucGF0aCwgXCJzcmNcIikpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oc291cmNlRGlyZWN0b3JpZXMpXG4gIH1cblxuICAvKipcbiAgICogQWRkcyByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGVzIGZyb20gc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLnJldHVyblR5cGVzIC0gTXV0YWJsZSByZXR1cm4gdHlwZXMgbWFwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zb3VyY2VUZXh0IC0gU291cmNlIHRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkUmVzb3VyY2VNZXRob2RSZXR1cm5UeXBlc0Zyb21Tb3VyY2Uoe3JldHVyblR5cGVzLCBzb3VyY2VUZXh0fSkge1xuICAgIGNvbnN0IGNsYXNzUmVnZXggPSAvY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccysoPzpleHRlbmRzXFxzK1tee10rKT9cXHsvZ1xuICAgIGxldCBjbGFzc01hdGNoXG5cbiAgICB3aGlsZSAoKGNsYXNzTWF0Y2ggPSBjbGFzc1JlZ2V4LmV4ZWMoc291cmNlVGV4dCkpKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc01hdGNoWzFdXG4gICAgICBjb25zdCBjbGFzc0JvZHlTdGFydCA9IGNsYXNzUmVnZXgubGFzdEluZGV4XG4gICAgICBjb25zdCBjbGFzc0JvZHlFbmQgPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiBjbGFzc0JvZHlTdGFydCAtIDEsIHNvdXJjZVRleHR9KVxuXG4gICAgICBpZiAoY2xhc3NCb2R5RW5kID09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIGJyYWNlIG1hdGNoZXIgY2FuJ3QgdG9rZW5pemUgZXZlcnkgY29uc3RydWN0IChlLmcuIGEgcmVnZXggbGl0ZXJhbFxuICAgICAgICAvLyB3aG9zZSBxdW90ZXMgbG9vayBsaWtlIHN0cmluZyBkZWxpbWl0ZXJzKSwgc28gaXQgY2FuIGZhaWwgdG8gbG9jYXRlIGFcbiAgICAgICAgLy8gY2xhc3MgYm9keS4gU2tpcCBtZXRhZGF0YSBleHRyYWN0aW9uIGZvciB0aGF0IGNsYXNzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGFib3J0aW5nIHRoZSB3aG9sZSBmcm9udGVuZC1tb2RlbCBnZW5lcmF0aW9uOyByZXNvdXJjZXMgdGhhdCBwYXJzZVxuICAgICAgICAvLyBjbGVhbmx5IHN0aWxsIGdldCB0aGVpciBKU0RvYy1kZXJpdmVkIHJldHVybi9wYXJhbSB0eXBlcy5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2xhc3NCb2R5ID0gc291cmNlVGV4dC5zbGljZShjbGFzc0JvZHlTdGFydCwgY2xhc3NCb2R5RW5kKVxuICAgICAgY29uc3QganNEb2NSZWdleCA9IC9cXC9cXCpcXCooW1xcc1xcU10qPylcXCpcXC8vZ1xuICAgICAgbGV0IGpzRG9jTWF0Y2hcblxuICAgICAgd2hpbGUgKChqc0RvY01hdGNoID0ganNEb2NSZWdleC5leGVjKGNsYXNzQm9keSkpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFmdGVySnNEb2MgPSBjbGFzc0JvZHkuc2xpY2UoanNEb2NSZWdleC5sYXN0SW5kZXgpXG4gICAgICAgIGNvbnN0IG1ldGhvZE1hdGNoID0gc291cmNlQWZ0ZXJKc0RvYy5tYXRjaCgvXlxccyooPzphc3luY1xccyspPyhbQS1aYS16XyRdW1xcdyRdKilcXHMqXFwoLylcblxuICAgICAgICBpZiAoIW1ldGhvZE1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2RNYXRjaFsxXVxuXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGUgPSB0aGlzLmpzRG9jUmV0dXJuVHlwZShqc0RvY01hdGNoWzFdKVxuXG4gICAgICAgIGlmIChyZXR1cm5UeXBlKSB7XG4gICAgICAgICAgcmV0dXJuVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIHJldHVyblR5cGUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB0eXBlcyBmcm9tIHNvdXJjZS5cbiAgICogQHBhcmFtIHt7cGFyYW1ldGVyVHlwZXM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiwgc291cmNlVGV4dDogc3RyaW5nfX0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZGRSZXNvdXJjZU1ldGhvZFBhcmFtZXRlclR5cGVzRnJvbVNvdXJjZSh7cGFyYW1ldGVyVHlwZXMsIHNvdXJjZVRleHR9KSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC9jbGFzc1xccysoW0EtWmEtel8kXVtcXHckXSopXFxzKyg/OmV4dGVuZHNcXHMrW157XSspP1xcey9nXG4gICAgbGV0IGNsYXNzTWF0Y2hcblxuICAgIHdoaWxlICgoY2xhc3NNYXRjaCA9IGNsYXNzUmVnZXguZXhlYyhzb3VyY2VUZXh0KSkpIHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTWF0Y2hbMV1cbiAgICAgIGNvbnN0IGNsYXNzQm9keVN0YXJ0ID0gY2xhc3NSZWdleC5sYXN0SW5kZXhcbiAgICAgIGNvbnN0IGNsYXNzQm9keUVuZCA9IHRoaXMubWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXg6IGNsYXNzQm9keVN0YXJ0IC0gMSwgc291cmNlVGV4dH0pXG5cbiAgICAgIGlmIChjbGFzc0JvZHlFbmQgPT0gbnVsbCkge1xuICAgICAgICAvLyBUaGUgYnJhY2UgbWF0Y2hlciBjYW4ndCB0b2tlbml6ZSBldmVyeSBjb25zdHJ1Y3QgKGUuZy4gYSByZWdleCBsaXRlcmFsXG4gICAgICAgIC8vIHdob3NlIHF1b3RlcyBsb29rIGxpa2Ugc3RyaW5nIGRlbGltaXRlcnMpLCBzbyBpdCBjYW4gZmFpbCB0byBsb2NhdGUgYVxuICAgICAgICAvLyBjbGFzcyBib2R5LiBTa2lwIG1ldGFkYXRhIGV4dHJhY3Rpb24gZm9yIHRoYXQgY2xhc3MgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWJvcnRpbmcgdGhlIHdob2xlIGZyb250ZW5kLW1vZGVsIGdlbmVyYXRpb247IHJlc291cmNlcyB0aGF0IHBhcnNlXG4gICAgICAgIC8vIGNsZWFubHkgc3RpbGwgZ2V0IHRoZWlyIEpTRG9jLWRlcml2ZWQgcmV0dXJuL3BhcmFtIHR5cGVzLlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGFzc0JvZHkgPSBzb3VyY2VUZXh0LnNsaWNlKGNsYXNzQm9keVN0YXJ0LCBjbGFzc0JvZHlFbmQpXG4gICAgICBjb25zdCBqc0RvY1JlZ2V4ID0gL1xcL1xcKlxcKihbXFxzXFxTXSo/KVxcKlxcLy9nXG4gICAgICBsZXQganNEb2NNYXRjaFxuXG4gICAgICB3aGlsZSAoKGpzRG9jTWF0Y2ggPSBqc0RvY1JlZ2V4LmV4ZWMoY2xhc3NCb2R5KSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQWZ0ZXJKc0RvYyA9IGNsYXNzQm9keS5zbGljZShqc0RvY1JlZ2V4Lmxhc3RJbmRleClcbiAgICAgICAgY29uc3QgbWV0aG9kTWF0Y2ggPSBzb3VyY2VBZnRlckpzRG9jLm1hdGNoKC9eXFxzKig/OmFzeW5jXFxzKyk/KFtBLVphLXpfJF1bXFx3JF0qKVxccypcXCgvKVxuXG4gICAgICAgIGlmICghbWV0aG9kTWF0Y2gpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZE1hdGNoWzFdXG4gICAgICAgIGNvbnN0IGpzRG9jUGFyYW1ldGVyVHlwZXMgPSB0aGlzLmpzRG9jUGFyYW1ldGVyVHlwZXMoanNEb2NNYXRjaFsxXSlcblxuICAgICAgICBpZiAoanNEb2NQYXJhbWV0ZXJUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXMuc2V0KGAke2NsYXNzTmFtZX0uJHttZXRob2ROYW1lfWAsIGpzRG9jUGFyYW1ldGVyVHlwZXMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3NSZWdleC5sYXN0SW5kZXggPSBjbGFzc0JvZHlFbmQgKyAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHJldHVybiB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNEb2NUZXh0IC0gSlNEb2MgdGV4dCBpbnNpZGUgY29tbWVudCBtYXJrZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBKU0RvYyByZXR1cm4gdHlwZSB3aGVuIHByZXNlbnQuXG4gICAqL1xuICBqc0RvY1JldHVyblR5cGUoanNEb2NUZXh0KSB7XG4gICAgY29uc3QgcmV0dXJuc01hdGNoID0ganNEb2NUZXh0Lm1hdGNoKC9AcmV0dXJucz9cXHMqXFx7LylcblxuICAgIGlmICghcmV0dXJuc01hdGNoIHx8IHJldHVybnNNYXRjaC5pbmRleCA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHJldHVybnNNYXRjaC5pbmRleCArIHJldHVybnNNYXRjaFswXS5sZW5ndGggLSAxXG4gICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgaWYgKHR5cGVDbG9zZUluZGV4ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIEpTRG9jIHJldHVybiB0eXBlIGZyb206ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IGpzRG9jVGV4dC5zbGljZSh0eXBlT3BlbkluZGV4ICsgMSwgdHlwZUNsb3NlSW5kZXgpLnRyaW0oKVxuXG4gICAgaWYgKHJldHVyblR5cGUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcmV0dXJuIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyBwYXJhbWV0ZXIgdHlwZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc0RvY1RleHQgLSBKU0RvYyB0ZXh0IGluc2lkZSBjb21tZW50IG1hcmtlcnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBKU0RvYyBwYXJhbWV0ZXIgdHlwZXMgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gICAqL1xuICBqc0RvY1BhcmFtZXRlclR5cGVzKGpzRG9jVGV4dCkge1xuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gW11cbiAgICBjb25zdCBwYXJhbVJlZ2V4ID0gL0BwYXJhbVxccypcXHsvZ1xuICAgIGxldCBfcGFyYW1NYXRjaFxuXG4gICAgd2hpbGUgKChfcGFyYW1NYXRjaCA9IHBhcmFtUmVnZXguZXhlYyhqc0RvY1RleHQpKSkge1xuICAgICAgY29uc3QgdHlwZU9wZW5JbmRleCA9IHBhcmFtUmVnZXgubGFzdEluZGV4IC0gMVxuICAgICAgY29uc3QgdHlwZUNsb3NlSW5kZXggPSB0aGlzLm1hdGNoaW5nQnJhY2VJbmRleCh7b3BlbkluZGV4OiB0eXBlT3BlbkluZGV4LCBzb3VyY2VUZXh0OiBqc0RvY1RleHR9KVxuXG4gICAgICBpZiAodHlwZUNsb3NlSW5kZXggPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBKU0RvYyBwYXJhbWV0ZXIgdHlwZSBmcm9tOiAke2pzRG9jVGV4dH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJhbWV0ZXJUeXBlID0ganNEb2NUZXh0LnNsaWNlKHR5cGVPcGVuSW5kZXggKyAxLCB0eXBlQ2xvc2VJbmRleCkudHJpbSgpXG5cbiAgICAgIGlmIChwYXJhbWV0ZXJUeXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub24tZW1wdHkgSlNEb2MgcGFyYW1ldGVyIHR5cGUgaW46ICR7anNEb2NUZXh0fWApXG4gICAgICB9XG5cbiAgICAgIHBhcmFtZXRlclR5cGVzLnB1c2gocGFyYW1ldGVyVHlwZSlcbiAgICAgIHBhcmFtUmVnZXgubGFzdEluZGV4ID0gdHlwZUNsb3NlSW5kZXggKyAxXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqYXZhc2NyaXB0IGZpbGVzIGluIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gSmF2YVNjcmlwdCBzb3VyY2UgZmlsZSBwYXRocy5cbiAgICovXG4gIGFzeW5jIGphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGRpcmVjdG9yeSkge1xuICAgIGxldCBlbnRyaWVzXG5cbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7d2l0aEZpbGVUeXBlczogdHJ1ZX0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT0gXCJvYmplY3RcIiAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gW11cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKVxuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBmaWxlUGF0aHMucHVzaCguLi5hd2FpdCB0aGlzLmphdmFzY3JpcHRGaWxlc0luRGlyZWN0b3J5KGVudHJ5UGF0aCkpXG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIC9cXC4obWpzfGpzfGpzeHx0cykkLy50ZXN0KGVudHJ5Lm5hbWUpKSB7XG4gICAgICAgIGZpbGVQYXRocy5wdXNoKGVudHJ5UGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZVBhdGhzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBtYXRjaGluZyBjbG9zaW5nIGJyYWNlIHdoaWxlIHJlc3BlY3RpbmcgSmF2YVNjcmlwdCBzdHJpbmdzIGFuZCBjb21tZW50cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLm9wZW5JbmRleCAtIE9wZW5pbmcgYnJhY2UgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNvdXJjZVRleHQgLSBTb3VyY2UgdGV4dC5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IC0gQ2xvc2luZyBicmFjZSBpbmRleCB3aGVuIGZvdW5kLlxuICAgKi9cbiAgbWF0Y2hpbmdCcmFjZUluZGV4KHtvcGVuSW5kZXgsIHNvdXJjZVRleHR9KSB7XG4gICAgaWYgKHNvdXJjZVRleHRbb3BlbkluZGV4XSAhPT0gXCJ7XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3BlbmluZyBicmFjZSBhdCBpbmRleCAke29wZW5JbmRleH1gKVxuICAgIH1cblxuICAgIGxldCBkZXB0aCA9IDBcbiAgICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZVxuICAgIGxldCBpbkxpbmVDb21tZW50ID0gZmFsc2VcbiAgICBsZXQgaW5TdHJpbmcgPSBcIlwiXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2VUZXh0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVRleHRbaW5kZXhdXG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVRleHRbaW5kZXggKyAxXVxuICAgICAgY29uc3QgcHJldmlvdXNDaGFyID0gc291cmNlVGV4dFtpbmRleCAtIDFdXG5cbiAgICAgIGlmIChpbkxpbmVDb21tZW50KSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIlxcblwiKSBpbkxpbmVDb21tZW50ID0gZmFsc2VcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKlwiICYmIG5leHRDaGFyID09PSBcIi9cIikge1xuICAgICAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5TdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IGluU3RyaW5nICYmIHByZXZpb3VzQ2hhciAhPT0gXCJcXFxcXCIpIGluU3RyaW5nID0gXCJcIlxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIi9cIiAmJiBuZXh0Q2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgaW5MaW5lQ29tbWVudCA9IHRydWVcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIvXCIgJiYgbmV4dENoYXIgPT09IFwiKlwiKSB7XG4gICAgICAgIGluQmxvY2tDb21tZW50ID0gdHJ1ZVxuICAgICAgICBpbmRleCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIlxcXCJcIiB8fCBjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSBcImBcIikge1xuICAgICAgICBpblN0cmluZyA9IGNoYXJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwie1wiKSB7XG4gICAgICAgIGRlcHRoKytcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCJ9XCIpIHtcbiAgICAgICAgZGVwdGgtLVxuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGF0dHJpYnV0ZSBjb25maWcgZm9yIG1vZGVsIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZEF0dHJpYnV0ZUNvbmZpZyB8IG51bGx9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKCFyZXNvbHZlZEF0dHJpYnV0ZU5hbWUpIHJldHVybiBudWxsXG5cbiAgICBsZXQgY29sdW1uTmFtZVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVtyZXNvbHZlZEF0dHJpYnV0ZU5hbWVdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJ1c2VkIGJlZm9yZSBpbml0aWFsaXphdGlvblwiKSkgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGNvbHVtblxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbHVtbiA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwidXNlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIikpIHJldHVybiBudWxsXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbiA/IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JDb2x1bW4oe2NvbHVtbn0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0cmlidXRlIGNvbmZpZyBmb3IgY29sdW1uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29sdW1uIC0gRGF0YWJhc2UgY29sdW1uLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRBdHRyaWJ1dGVDb25maWd9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBkYXRhYmFzZSBjb2x1bW4uXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNvbmZpZ0ZvckNvbHVtbih7Y29sdW1ufSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpXG5cbiAgICBpZiAodHlwZW9mIHR5cGUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm9uLWVtcHR5IGNvbHVtbiB0eXBlIGZvciBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgaW5mZXJlbmNlLCBnb3Q6ICR7dHlwZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBudWxsOiBjb2x1bW4uZ2V0TnVsbCgpLFxuICAgICAgdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGF0aW9uc2hpcHMgZm9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtBcnJheTx7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gLSBSZWxhdGlvbnNoaXBzLlxuICAgKi9cbiAgcmVsYXRpb25zaGlwc0Zvck1vZGVsKHtjbGFzc05hbWUsIG1vZGVsQ29uZmlnLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkIHx8IHJlbGF0aW9uc2hpcHMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBoYXMgaW52YWxpZCByZWxhdGlvbnNoaXBzIGNvbmZpZyDigJQgbXVzdCBiZSBhbiBhcnJheSBvZiByZWxhdGlvbnNoaXAgbmFtZXMsIGdvdCAke3R5cGVvZiByZWxhdGlvbnNoaXBzfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXBOYW1lKSA9PiB0aGlzLmluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IFthcmdzLnJlc291cmNlQ2xhc3NdIC0gUmVzb3VyY2UgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt7YXV0b2xvYWQ6IGJvb2xlYW4sIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9fSBJbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICovXG4gIGluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCByZXNvdXJjZUNsYXNzfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXNvdXJjZUNsYXNzID8gcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzKCkgOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKGNsYXNzTmFtZSlcblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRUeXBlKClcblxuICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAnJHtyZWxhdGlvbnNoaXBUeXBlfSdgKVxuICAgIH1cblxuICAgIGxldCB0YXJnZXRDbGFzc05hbWVcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICB0YXJnZXRDbGFzc05hbWUgPSB0YXJnZXRNb2RlbENsYXNzPy5nZXRNb2RlbE5hbWUoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTW9kZWwgY2xhc3Mgbm90IHJlZ2lzdGVyZWQgeWV0IOKAlCBmYWxsIGJhY2sgdG8gY2xhc3NOYW1lIGZyb20gcmVsYXRpb25zaGlwIGRlZmluaXRpb25cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgdGFyZ2V0Q2xhc3NOYW1lID0gcmVsYXRpb25zaGlwLmNsYXNzTmFtZVxuXG4gICAgICBpZiAoIXRhcmdldENsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF1dG9sb2FkOiByZWxhdGlvbnNoaXAuZ2V0QXV0b2xvYWQoKSxcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICB0YXJnZXRDbGFzc05hbWUsXG4gICAgICB0YXJnZXRGaWxlTmFtZTogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldENsYXNzTmFtZSkpLFxuICAgICAgdHlwZTogcmVsYXRpb25zaGlwVHlwZVxuICAgIH1cbiAgfVxufVxuIl19