UNPKG

parse-my-command

Version:

Parse argv with Commander.js without executing the command

213 lines (208 loc) 21.8 kB
var __create = Object.create; var __getProtoOf = Object.getPrototypeOf; var __defProp = Object.defineProperty; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __hasOwnProp = Object.prototype.hasOwnProperty; function __accessProp(key) { return this[key]; } var __toESMCache_node; var __toESMCache_esm; var __toESM = (mod, isNodeMode, target) => { var canCache = mod != null && typeof mod === "object"; if (canCache) { var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap; var cached = cache.get(mod); if (cached) return cached; } target = mod != null ? __create(__getProtoOf(mod)) : {}; const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target; for (let key of __getOwnPropNames(mod)) if (!__hasOwnProp.call(to, key)) __defProp(to, key, { get: __accessProp.bind(mod, key), enumerable: true }); if (canCache) cache.set(mod, to); return to; }; var __toCommonJS = (from) => { var entry = (__moduleCache ??= new WeakMap).get(from), desc; if (entry) return entry; entry = __defProp({}, "__esModule", { value: true }); if (from && typeof from === "object" || typeof from === "function") { for (var key of __getOwnPropNames(from)) if (!__hasOwnProp.call(entry, key)) __defProp(entry, key, { get: __accessProp.bind(from, key), enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } __moduleCache.set(from, entry); return entry; }; var __moduleCache; var __returnValue = (v) => v; function __exportSetter(name, newValue) { this[name] = __returnValue.bind(null, newValue); } var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true, configurable: true, set: __exportSetter.bind(all, name) }); }; // src/index.ts var exports_src = {}; __export(exports_src, { partialParse: () => partialParse, findMissingOptions: () => findMissingOptions }); module.exports = __toCommonJS(exports_src); var import_camelcase = __toESM(require("camelcase")); var import_commander = require("commander"); // src/noop.ts var noop = () => {}; // src/index.ts var commandSettingKeys = [ "_allowExcessArguments", "_allowUnknownOption", "_combineFlagAndOptionalValue", "_defaultCommandName", "_enablePositionalOptions", "_passThroughOptions" ]; var getOrThrow = (map, key) => { const value = map.get(key); if (value === undefined) { throw new Error("Expected map value to be present"); } return value; }; var findMissingOptions = (command, providedOptionsByCommand) => { const missingOptionsByCommand = new Map; let currentCommand = command; while (currentCommand) { const missingOptions = new Set; const providedOptions = providedOptionsByCommand.get(currentCommand); for (const option of currentCommand.options) { const optionName = option.negate ? option.long?.replace(/^--no-/, "") : option.long ?? option.short; if (!optionName) { continue; } const key = import_camelcase.default(optionName); if (providedOptions?.[key] !== undefined) { continue; } missingOptions.add(key); } missingOptionsByCommand.set(currentCommand, missingOptions); currentCommand = currentCommand.parent; } return missingOptionsByCommand; }; var copyCommandSettings = (source, target) => { const sourcePrivateState = source; const targetPrivateState = target; for (const key of commandSettingKeys) { targetPrivateState[key] = sourcePrivateState[key]; } target.name(source.name()); target.aliases(source.aliases()); for (const argument of source.registeredArguments) { target.addArgument(argument); } const version = source.version(); if (version) { target.version(version, source.options.find((option) => option.attributeName() === sourcePrivateState._versionOptionName)?.flags); } }; var disableCommandOutput = (command) => { command.configureOutput({ writeOut: noop, writeErr: noop, outputError: noop }); }; var cloneOption = (option) => { const newOption = new import_commander.Option(option.flags, option.description); newOption.makeOptionMandatory(false); newOption.default(option.defaultValue, option.defaultValueDescription); newOption.preset(option.presetArg); newOption.env(option.envVar); if (option.parseArg) { newOption.argParser(option.parseArg); } if (option.argChoices) { newOption.choices(option.argChoices); } newOption.conflicts(option.conflictsWith); newOption.implied = option.implied; return newOption; }; var partialParse = (command, argv, options) => { const providedOptions = new Map; const providedOptionsSources = new Map; const commandsMap = new Map; let matchedCommand; const setProvidedOptionSource = (command2, optionKey, source) => { if (!source) { return; } const sourcesMap = providedOptionsSources.get(command2) ?? new Map; sourcesMap.set(optionKey, source); providedOptionsSources.set(command2, sourcesMap); }; const createParserCommand = (parserCommand2, command2) => { commandsMap.set(parserCommand2, command2); copyCommandSettings(command2, parserCommand2); disableCommandOutput(parserCommand2); parserCommand2.exitOverride(); for (const option of command2.options) { if (parserCommand2.options.some((parserCommandOption) => parserCommandOption.flags === option.flags)) { continue; } parserCommand2.addOption(cloneOption(option)); } parserCommand2.hook("preSubcommand", (thisCommand, actionCommand) => { for (const cmd of [thisCommand, actionCommand]) { const originalCommand = getOrThrow(commandsMap, cmd); providedOptions.set(originalCommand, cmd.opts()); for (const optionKey of Object.keys(cmd.opts())) { setProvidedOptionSource(originalCommand, optionKey, cmd.getOptionValueSource(optionKey)); } } }); parserCommand2.action(() => { const originalCommand = getOrThrow(commandsMap, parserCommand2); providedOptions.set(originalCommand, parserCommand2.opts()); for (const optionKey of Object.keys(parserCommand2.opts())) { setProvidedOptionSource(originalCommand, optionKey, parserCommand2.getOptionValueSource(optionKey)); } matchedCommand = command2; }); for (const subcommand of command2.commands) { const parserSubcommand = parserCommand2.command(subcommand.name()); createParserCommand(parserSubcommand, subcommand); } return parserCommand2; }; const parserCommand = createParserCommand(new import_commander.Command, command); parserCommand.parse(argv, options); const missingOptions = matchedCommand ? findMissingOptions(matchedCommand, providedOptions) : new Map; return { matchedCommand, missingOptions, providedOptions, providedOptionsSources }; }; //# debugId=F0B7EB039167465764756E2164756E21 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9ub29wLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCBjYW1lbENhc2UgZnJvbSBcImNhbWVsY2FzZVwiO1xuaW1wb3J0IHtcbiAgQ29tbWFuZCxcbiAgT3B0aW9uLFxuICB0eXBlIE9wdGlvblZhbHVlU291cmNlLFxuICB0eXBlIE9wdGlvblZhbHVlcyxcbiAgdHlwZSBQYXJzZU9wdGlvbnMsXG59IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IG5vb3AgfSBmcm9tIFwiLi9ub29wLmpzXCI7XG5cbmNvbnN0IGNvbW1hbmRTZXR0aW5nS2V5cyA9IFtcbiAgXCJfYWxsb3dFeGNlc3NBcmd1bWVudHNcIixcbiAgXCJfYWxsb3dVbmtub3duT3B0aW9uXCIsXG4gIFwiX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZVwiLFxuICBcIl9kZWZhdWx0Q29tbWFuZE5hbWVcIixcbiAgXCJfZW5hYmxlUG9zaXRpb25hbE9wdGlvbnNcIixcbiAgXCJfcGFzc1Rocm91Z2hPcHRpb25zXCIsXG5dIGFzIGNvbnN0O1xuXG50eXBlIENvbW1hbmRTZXR0aW5nS2V5ID0gKHR5cGVvZiBjb21tYW5kU2V0dGluZ0tleXMpW251bWJlcl07XG50eXBlIENvbW1hbmRQcml2YXRlU3RhdGUgPSBDb21tYW5kICZcbiAgUmVjb3JkPENvbW1hbmRTZXR0aW5nS2V5LCB1bmtub3duPiAmIHtcbiAgICBfdmVyc2lvbk9wdGlvbk5hbWU/OiBzdHJpbmc7XG4gIH07XG5cbmNvbnN0IGdldE9yVGhyb3cgPSA8S2V5LCBWYWx1ZT4obWFwOiBNYXA8S2V5LCBWYWx1ZT4sIGtleTogS2V5KTogVmFsdWUgPT4ge1xuICBjb25zdCB2YWx1ZSA9IG1hcC5nZXQoa2V5KTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtYXAgdmFsdWUgdG8gYmUgcHJlc2VudFwiKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTWlzc2luZ09wdGlvbnMgPSAoXG4gIGNvbW1hbmQ6IENvbW1hbmQsXG4gIHByb3ZpZGVkT3B0aW9uc0J5Q29tbWFuZDogTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz4sXG4pID0+IHtcbiAgY29uc3QgbWlzc2luZ09wdGlvbnNCeUNvbW1hbmQgPSBuZXcgTWFwPENvbW1hbmQsIFNldDxzdHJpbmc+PigpO1xuXG4gIGxldCBjdXJyZW50Q29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZCB8IG51bGwgPSBjb21tYW5kO1xuXG4gIHdoaWxlIChjdXJyZW50Q29tbWFuZCkge1xuICAgIGNvbnN0IG1pc3NpbmdPcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcHJvdmlkZWRPcHRpb25zID0gcHJvdmlkZWRPcHRpb25zQnlDb21tYW5kLmdldChjdXJyZW50Q29tbWFuZCk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgY3VycmVudENvbW1hbmQub3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0aW9uTmFtZSA9IG9wdGlvbi5uZWdhdGVcbiAgICAgICAgPyBvcHRpb24ubG9uZz8ucmVwbGFjZSgvXi0tbm8tLywgXCJcIilcbiAgICAgICAgOiAob3B0aW9uLmxvbmcgPz8gb3B0aW9uLnNob3J0KTtcbiAgICAgIGlmICghb3B0aW9uTmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gY2FtZWxDYXNlKG9wdGlvbk5hbWUpO1xuXG4gICAgICBpZiAocHJvdmlkZWRPcHRpb25zPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBtaXNzaW5nT3B0aW9ucy5hZGQoa2V5KTtcbiAgICB9XG5cbiAgICBtaXNzaW5nT3B0aW9uc0J5Q29tbWFuZC5zZXQoY3VycmVudENvbW1hbmQsIG1pc3NpbmdPcHRpb25zKTtcbiAgICBjdXJyZW50Q29tbWFuZCA9IGN1cnJlbnRDb21tYW5kLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBtaXNzaW5nT3B0aW9uc0J5Q29tbWFuZDtcbn07XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxQYXJzZVJlc3VsdCA9IHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHdob3NlIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkXG4gICAqL1xuICBtYXRjaGVkQ29tbWFuZDogQ29tbWFuZCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEEgbWFwIG9mIGNvbW1hbmRzIHRvIGEgc2V0IG9mIG1pc3Npbmcgb3B0aW9ucyBmb3IgdGhhdCBjb21tYW5kXG4gICAqL1xuICBtaXNzaW5nT3B0aW9uczogTWFwPENvbW1hbmQsIFNldDxzdHJpbmc+PjtcbiAgLyoqXG4gICAqIEEgbWFwIG9mIGNvbW1hbmRzIHRvIHRoZSBvcHRpb25zIHByb3ZpZGVkIGZvciB0aGF0IGNvbW1hbmRcbiAgICovXG4gIHByb3ZpZGVkT3B0aW9uczogTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz47XG4gIC8qKlxuICAgKiBBIG1hcCBvZiBjb21tYW5kcyB0byBhIG1hcCBvZiBvcHRpb24ga2V5cyB0byB0aGUgc291cmNlIG9mIHRoZSBvcHRpb24gdmFsdWVcbiAgICovXG4gIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXM6IE1hcDxcbiAgICBDb21tYW5kLFxuICAgIE1hcDxzdHJpbmcsIE9wdGlvblZhbHVlU291cmNlIHwgdW5kZWZpbmVkPlxuICA+O1xufTtcblxuY29uc3QgY29weUNvbW1hbmRTZXR0aW5ncyA9IChzb3VyY2U6IENvbW1hbmQsIHRhcmdldDogQ29tbWFuZCkgPT4ge1xuICBjb25zdCBzb3VyY2VQcml2YXRlU3RhdGUgPSBzb3VyY2UgYXMgQ29tbWFuZFByaXZhdGVTdGF0ZTtcbiAgY29uc3QgdGFyZ2V0UHJpdmF0ZVN0YXRlID0gdGFyZ2V0IGFzIENvbW1hbmRQcml2YXRlU3RhdGU7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY29tbWFuZFNldHRpbmdLZXlzKSB7XG4gICAgdGFyZ2V0UHJpdmF0ZVN0YXRlW2tleV0gPSBzb3VyY2VQcml2YXRlU3RhdGVba2V5XTtcbiAgfVxuXG4gIHRhcmdldC5uYW1lKHNvdXJjZS5uYW1lKCkpO1xuICB0YXJnZXQuYWxpYXNlcyhzb3VyY2UuYWxpYXNlcygpKTtcbiAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBzb3VyY2UucmVnaXN0ZXJlZEFyZ3VtZW50cykge1xuICAgIHRhcmdldC5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gc291cmNlLnZlcnNpb24oKTtcbiAgaWYgKHZlcnNpb24pIHtcbiAgICB0YXJnZXQudmVyc2lvbihcbiAgICAgIHZlcnNpb24sXG4gICAgICBzb3VyY2Uub3B0aW9ucy5maW5kKFxuICAgICAgICAob3B0aW9uKSA9PlxuICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkgPT09IHNvdXJjZVByaXZhdGVTdGF0ZS5fdmVyc2lvbk9wdGlvbk5hbWUsXG4gICAgICApPy5mbGFncyxcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBkaXNhYmxlQ29tbWFuZE91dHB1dCA9IChjb21tYW5kOiBDb21tYW5kKSA9PiB7XG4gIGNvbW1hbmQuY29uZmlndXJlT3V0cHV0KHtcbiAgICB3cml0ZU91dDogbm9vcCxcbiAgICB3cml0ZUVycjogbm9vcCxcbiAgICBvdXRwdXRFcnJvcjogbm9vcCxcbiAgfSk7XG59O1xuXG5jb25zdCBjbG9uZU9wdGlvbiA9IChvcHRpb246IE9wdGlvbikgPT4ge1xuICBjb25zdCBuZXdPcHRpb24gPSBuZXcgT3B0aW9uKG9wdGlvbi5mbGFncywgb3B0aW9uLmRlc2NyaXB0aW9uKTtcbiAgbmV3T3B0aW9uLm1ha2VPcHRpb25NYW5kYXRvcnkoZmFsc2UpO1xuICBuZXdPcHRpb24uZGVmYXVsdChvcHRpb24uZGVmYXVsdFZhbHVlLCBvcHRpb24uZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24pO1xuXG4gIG5ld09wdGlvbi5wcmVzZXQoKG9wdGlvbiBhcyBPcHRpb24gJiB7IHByZXNldEFyZzogdW5rbm93biB9KS5wcmVzZXRBcmcpO1xuICBuZXdPcHRpb24uZW52KChvcHRpb24gYXMgT3B0aW9uICYgeyBlbnZWYXI6IHN0cmluZyB9KS5lbnZWYXIpO1xuICBpZiAob3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgbmV3T3B0aW9uLmFyZ1BhcnNlcihvcHRpb24ucGFyc2VBcmcpO1xuICB9XG5cbiAgaWYgKG9wdGlvbi5hcmdDaG9pY2VzKSB7XG4gICAgbmV3T3B0aW9uLmNob2ljZXMob3B0aW9uLmFyZ0Nob2ljZXMpO1xuICB9XG5cbiAgbmV3T3B0aW9uLmNvbmZsaWN0cyhcbiAgICAob3B0aW9uIGFzIE9wdGlvbiAmIHsgY29uZmxpY3RzV2l0aDogc3RyaW5nW10gfSkuY29uZmxpY3RzV2l0aCxcbiAgKTtcblxuICAobmV3T3B0aW9uIGFzIE9wdGlvbiAmIHsgaW1wbGllZDogdW5rbm93biB9KS5pbXBsaWVkID0gKFxuICAgIG9wdGlvbiBhcyBPcHRpb24gJiB7IGltcGxpZWQ6IHVua25vd24gfVxuICApLmltcGxpZWQ7XG5cbiAgcmV0dXJuIG5ld09wdGlvbjtcbn07XG5cbi8qKlxuICogUGFydGlhbGx5IHBhcnNlIGFyZ3YgZm9yIGEgY29tbWFuZCB3aXRob3V0IGV4ZWN1dGluZyB0aGUgYWN0aW9uLiBAc2VlIHtAbGluayBDb21tYW5kLnBhcnNlfVxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXRjaGVkIGNvbW1hbmQsIHRoZSBwcm92aWRlZCBvcHRpb25zLCBhbmQgdGhlIG1pc3Npbmcgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnRpYWxQYXJzZSA9IChcbiAgY29tbWFuZDogQ29tbWFuZCxcbiAgYXJndjogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBQYXJzZU9wdGlvbnMsXG4pOiBQYXJ0aWFsUGFyc2VSZXN1bHQgPT4ge1xuICBjb25zdCBwcm92aWRlZE9wdGlvbnMgPSBuZXcgTWFwPENvbW1hbmQsIE9wdGlvblZhbHVlcz4oKTtcbiAgY29uc3QgcHJvdmlkZWRPcHRpb25zU291cmNlcyA9IG5ldyBNYXA8XG4gICAgQ29tbWFuZCxcbiAgICBNYXA8c3RyaW5nLCBPcHRpb25WYWx1ZVNvdXJjZSB8IHVuZGVmaW5lZD5cbiAgPigpO1xuICBjb25zdCBjb21tYW5kc01hcCA9IG5ldyBNYXA8Q29tbWFuZCwgQ29tbWFuZD4oKTtcbiAgbGV0IG1hdGNoZWRDb21tYW5kOiBDb21tYW5kIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNldFByb3ZpZGVkT3B0aW9uU291cmNlID0gKFxuICAgIGNvbW1hbmQ6IENvbW1hbmQsXG4gICAgb3B0aW9uS2V5OiBzdHJpbmcsXG4gICAgc291cmNlOiBPcHRpb25WYWx1ZVNvdXJjZSB8IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VzTWFwID1cbiAgICAgIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXMuZ2V0KGNvbW1hbmQpID8/XG4gICAgICBuZXcgTWFwPHN0cmluZywgT3B0aW9uVmFsdWVTb3VyY2U+KCk7XG4gICAgc291cmNlc01hcC5zZXQob3B0aW9uS2V5LCBzb3VyY2UpO1xuICAgIHByb3ZpZGVkT3B0aW9uc1NvdXJjZXMuc2V0KGNvbW1hbmQsIHNvdXJjZXNNYXApO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZVBhcnNlckNvbW1hbmQgPSAocGFyc2VyQ29tbWFuZDogQ29tbWFuZCwgY29tbWFuZDogQ29tbWFuZCkgPT4ge1xuICAgIGNvbW1hbmRzTWFwLnNldChwYXJzZXJDb21tYW5kLCBjb21tYW5kKTtcblxuICAgIGNvcHlDb21tYW5kU2V0dGluZ3MoY29tbWFuZCwgcGFyc2VyQ29tbWFuZCk7XG4gICAgZGlzYWJsZUNvbW1hbmRPdXRwdXQocGFyc2VyQ29tbWFuZCk7XG4gICAgcGFyc2VyQ29tbWFuZC5leGl0T3ZlcnJpZGUoKTtcblxuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGNvbW1hbmQub3B0aW9ucykge1xuICAgICAgLy8gU2tpcCBhZGRpbmcgdGhlIG9wdGlvbiBpZiBpdCdzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgaWYgKFxuICAgICAgICBwYXJzZXJDb21tYW5kLm9wdGlvbnMuc29tZShcbiAgICAgICAgICAocGFyc2VyQ29tbWFuZE9wdGlvbikgPT4gcGFyc2VyQ29tbWFuZE9wdGlvbi5mbGFncyA9PT0gb3B0aW9uLmZsYWdzLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlckNvbW1hbmQuYWRkT3B0aW9uKGNsb25lT3B0aW9uKG9wdGlvbikpO1xuICAgIH1cblxuICAgIHBhcnNlckNvbW1hbmQuaG9vayhcInByZVN1YmNvbW1hbmRcIiwgKHRoaXNDb21tYW5kLCBhY3Rpb25Db21tYW5kKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNtZCBvZiBbdGhpc0NvbW1hbmQsIGFjdGlvbkNvbW1hbmRdKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29tbWFuZCA9IGdldE9yVGhyb3coY29tbWFuZHNNYXAsIGNtZCk7XG4gICAgICAgIHByb3ZpZGVkT3B0aW9ucy5zZXQob3JpZ2luYWxDb21tYW5kLCBjbWQub3B0cygpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbktleSBvZiBPYmplY3Qua2V5cyhjbWQub3B0cygpKSkge1xuICAgICAgICAgIHNldFByb3ZpZGVkT3B0aW9uU291cmNlKFxuICAgICAgICAgICAgb3JpZ2luYWxDb21tYW5kLFxuICAgICAgICAgICAgb3B0aW9uS2V5LFxuICAgICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGFyc2VyQ29tbWFuZC5hY3Rpb24oKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxDb21tYW5kID0gZ2V0T3JUaHJvdyhjb21tYW5kc01hcCwgcGFyc2VyQ29tbWFuZCk7XG4gICAgICBwcm92aWRlZE9wdGlvbnMuc2V0KG9yaWdpbmFsQ29tbWFuZCwgcGFyc2VyQ29tbWFuZC5vcHRzKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbktleSBvZiBPYmplY3Qua2V5cyhwYXJzZXJDb21tYW5kLm9wdHMoKSkpIHtcbiAgICAgICAgc2V0UHJvdmlkZWRPcHRpb25Tb3VyY2UoXG4gICAgICAgICAgb3JpZ2luYWxDb21tYW5kLFxuICAgICAgICAgIG9wdGlvbktleSxcbiAgICAgICAgICBwYXJzZXJDb21tYW5kLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG1hdGNoZWRDb21tYW5kID0gY29tbWFuZDtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgc3ViY29tbWFuZCBvZiBjb21tYW5kLmNvbW1hbmRzIGFzIENvbW1hbmRbXSkge1xuICAgICAgY29uc3QgcGFyc2VyU3ViY29tbWFuZCA9IHBhcnNlckNvbW1hbmQuY29tbWFuZChzdWJjb21tYW5kLm5hbWUoKSk7XG4gICAgICBjcmVhdGVQYXJzZXJDb21tYW5kKHBhcnNlclN1YmNvbW1hbmQsIHN1YmNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZXJDb21tYW5kO1xuICB9O1xuXG4gIGNvbnN0IHBhcnNlckNvbW1hbmQgPSBjcmVhdGVQYXJzZXJDb21tYW5kKG5ldyBDb21tYW5kKCksIGNvbW1hbmQpO1xuICBwYXJzZXJDb21tYW5kLnBhcnNlKGFyZ3YsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IG1pc3NpbmdPcHRpb25zID0gbWF0Y2hlZENvbW1hbmRcbiAgICA/IGZpbmRNaXNzaW5nT3B0aW9ucyhtYXRjaGVkQ29tbWFuZCwgcHJvdmlkZWRPcHRpb25zKVxuICAgIDogbmV3IE1hcDxDb21tYW5kLCBTZXQ8c3RyaW5nPj4oKTtcblxuICByZXR1cm4ge1xuICAgIG1hdGNoZWRDb21tYW5kLFxuICAgIG1pc3NpbmdPcHRpb25zLFxuICAgIHByb3ZpZGVkT3B0aW9ucyxcbiAgICBwcm92aWRlZE9wdGlvbnNTb3VyY2VzLFxuICB9O1xufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFzQixJQUF0QjtBQU9PLElBTlA7OztBQ0RPLElBQU0sT0FBTyxNQUFNOzs7QURVMUIsSUFBTSxxQkFBcUI7QUFBQSxFQUN6QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFRQSxJQUFNLGFBQWEsQ0FBYSxLQUFzQixRQUFvQjtBQUFBLEVBQ3hFLE1BQU0sUUFBUSxJQUFJLElBQUksR0FBRztBQUFBLEVBQ3pCLElBQUksVUFBVSxXQUFXO0FBQUEsSUFDdkIsTUFBTSxJQUFJLE1BQU0sa0NBQWtDO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdGLElBQU0scUJBQXFCLENBQ2hDLFNBQ0EsNkJBQ0c7QUFBQSxFQUNILE1BQU0sMEJBQTBCLElBQUk7QUFBQSxFQUVwQyxJQUFJLGlCQUE2QztBQUFBLEVBRWpELE9BQU8sZ0JBQWdCO0FBQUEsSUFDckIsTUFBTSxpQkFBaUIsSUFBSTtBQUFBLElBQzNCLE1BQU0sa0JBQWtCLHlCQUF5QixJQUFJLGNBQWM7QUFBQSxJQUNuRSxXQUFXLFVBQVUsZUFBZSxTQUFTO0FBQUEsTUFDM0MsTUFBTSxhQUFhLE9BQU8sU0FDdEIsT0FBTyxNQUFNLFFBQVEsVUFBVSxFQUFFLElBQ2hDLE9BQU8sUUFBUSxPQUFPO0FBQUEsTUFDM0IsSUFBSSxDQUFDLFlBQVk7QUFBQSxRQUNmO0FBQUEsTUFDRjtBQUFBLE1B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