@naandalist/patch-package
Version:
Fix broken node modules with no fuss
148 lines (139 loc) • 21 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rebase = void 0;
const chalk_1 = __importDefault(require("chalk"));
const path_1 = require("path");
const applyPatches_1 = require("./applyPatches");
const hash_1 = require("./hash");
const patchFs_1 = require("./patchFs");
const stateFile_1 = require("./stateFile");
function rebase({ appPath, patchDir, packagePathSpecifier, targetPatch, }) {
const patchesDirectory = (0, path_1.join)(appPath, patchDir);
const groupedPatches = (0, patchFs_1.getGroupedPatches)(patchesDirectory);
if (groupedPatches.numPatchFiles === 0) {
console.log(chalk_1.default.blueBright("No patch files found"));
process.exit(1);
}
const packagePatches = groupedPatches.pathSpecifierToPatchFiles[packagePathSpecifier];
if (!packagePatches) {
console.log(chalk_1.default.blueBright("No patch files found for package"), packagePathSpecifier);
process.exit(1);
}
const state = (0, stateFile_1.getPatchApplicationState)(packagePatches[0]);
if (!state) {
console.log(chalk_1.default.blueBright("No patch state found"), "Did you forget to run", chalk_1.default.bold("patch-package"), "(without arguments) first?");
process.exit(1);
}
if (state.isRebasing) {
console.log(chalk_1.default.blueBright("Already rebasing"), "Make changes to the files in", chalk_1.default.bold(packagePatches[0].path), "and then run `patch-package", packagePathSpecifier, "--continue` to", packagePatches.length === state.patches.length
? "append a patch file"
: `update the ${packagePatches[packagePatches.length - 1].patchFilename} file`);
console.log(`💡 To remove a broken patch file, delete it and reinstall node_modules`);
process.exit(1);
}
if (state.patches.length !== packagePatches.length) {
console.log(chalk_1.default.blueBright("Some patches have not been applied."), "Reinstall node_modules and try again.");
}
// check hashes
(0, stateFile_1.verifyAppliedPatches)({ appPath, patchDir, state });
if (targetPatch === "0") {
// unapply all
unApplyPatches({
patches: packagePatches,
appPath,
patchDir,
});
(0, stateFile_1.savePatchApplicationState)({
packageDetails: packagePatches[0],
isRebasing: true,
patches: [],
});
console.log(`
Make any changes you need inside ${chalk_1.default.bold(packagePatches[0].path)}
When you are done, run
${chalk_1.default.bold(`patch-package ${packagePathSpecifier} --append 'MyChangeDescription'`)}
to insert a new patch file.
`);
return;
}
// find target patch
const target = packagePatches.find((p) => {
if (p.patchFilename === targetPatch) {
return true;
}
if ((0, path_1.resolve)(process.cwd(), targetPatch) ===
(0, path_1.join)(patchesDirectory, p.patchFilename)) {
return true;
}
if (targetPatch === p.sequenceName) {
return true;
}
const n = Number(targetPatch.replace(/^0+/g, ""));
if (!isNaN(n) && n === p.sequenceNumber) {
return true;
}
return false;
});
if (!target) {
console.log(chalk_1.default.red("Could not find target patch file"), chalk_1.default.bold(targetPatch));
console.log();
console.log("The list of available patch files is:");
packagePatches.forEach((p) => {
console.log(` - ${p.patchFilename}`);
});
process.exit(1);
}
const currentHash = (0, hash_1.hashFile)((0, path_1.join)(patchesDirectory, target.patchFilename));
const prevApplication = state.patches.find((p) => p.patchContentHash === currentHash);
if (!prevApplication) {
console.log(chalk_1.default.red("Could not find previous application of patch file"), chalk_1.default.bold(target.patchFilename));
console.log();
console.log("You should reinstall node_modules and try again.");
process.exit(1);
}
// ok, we are good to start undoing all the patches that were applied up to but not including the target patch
const targetIdx = state.patches.indexOf(prevApplication);
unApplyPatches({
patches: packagePatches.slice(targetIdx + 1),
appPath,
patchDir,
});
(0, stateFile_1.savePatchApplicationState)({
packageDetails: packagePatches[0],
isRebasing: true,
patches: packagePatches.slice(0, targetIdx + 1).map((p) => ({
patchFilename: p.patchFilename,
patchContentHash: (0, hash_1.hashFile)((0, path_1.join)(patchesDirectory, p.patchFilename)),
didApply: true,
})),
});
console.log(`
Make any changes you need inside ${chalk_1.default.bold(packagePatches[0].path)}
When you are done, do one of the following:
To update ${chalk_1.default.bold(packagePatches[targetIdx].patchFilename)} run
${chalk_1.default.bold(`patch-package ${packagePathSpecifier}`)}
To create a new patch file after ${chalk_1.default.bold(packagePatches[targetIdx].patchFilename)} run
${chalk_1.default.bold(`patch-package ${packagePathSpecifier} --append 'MyChangeDescription'`)}
`);
}
exports.rebase = rebase;
function unApplyPatches({ patches, appPath, patchDir, }) {
for (const patch of patches.slice().reverse()) {
if (!(0, applyPatches_1.applyPatch)({
patchFilePath: (0, path_1.join)(appPath, patchDir, patch.patchFilename),
reverse: true,
patchDetails: patch,
patchDir,
cwd: process.cwd(),
bestEffort: false,
})) {
console.log(chalk_1.default.red("Failed to un-apply patch file"), chalk_1.default.bold(patch.patchFilename), "Try completely reinstalling node_modules.");
process.exit(1);
}
console.log(chalk_1.default.cyan.bold("Un-applied"), patch.patchFilename);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmViYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBeUI7QUFDekIsK0JBQW9DO0FBQ3BDLGlEQUEyQztBQUMzQyxpQ0FBaUM7QUFFakMsdUNBQTZDO0FBQzdDLDJDQUlvQjtBQUVwQixTQUFnQixNQUFNLENBQUMsRUFDckIsT0FBTyxFQUNQLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsV0FBVyxHQU1aO0lBQ0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDaEQsTUFBTSxjQUFjLEdBQUcsSUFBQSwyQkFBaUIsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTFELElBQUksY0FBYyxDQUFDLGFBQWEsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQTtRQUNyRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxjQUFjLEdBQ2xCLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBQ2hFLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxlQUFLLENBQUMsVUFBVSxDQUFDLGtDQUFrQyxDQUFDLEVBQ3BELG9CQUFvQixDQUNyQixDQUFBO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsb0NBQXdCLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFekQsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLE9BQU8sQ0FBQyxHQUFHLENBQ1QsZUFBSyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUN4Qyx1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Q0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QyxJQUNFLENBQUMsSUFBQSx5QkFBVSxFQUFDO1lBQ1YsYUFBYSxFQUFFLElBQUEsV0FBSSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBVztZQUNyRSxPQUFPLEVBQUUsSUFBSTtZQUNiLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVE7WUFDUixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNsQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLEVBQ0Y7WUFDQSxPQUFPLENBQUMsR0FBRyxDQUNULGVBQUssQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsRUFDMUMsZUFBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQy9CLDJDQUEyQyxDQUM1QyxDQUFBO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUNoQjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0tBQ2hFO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIlxuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGFwcGx5UGF0Y2ggfSBmcm9tIFwiLi9hcHBseVBhdGNoZXNcIlxuaW1wb3J0IHsgaGFzaEZpbGUgfSBmcm9tIFwiLi9oYXNoXCJcbmltcG9ydCB7IFBhdGNoZWRQYWNrYWdlRGV0YWlscyB9IGZyb20gXCIuL1BhY2thZ2VEZXRhaWxzXCJcbmltcG9ydCB7IGdldEdyb3VwZWRQYXRjaGVzIH0gZnJvbSBcIi4vcGF0Y2hGc1wiXG5pbXBvcnQge1xuICBnZXRQYXRjaEFwcGxpY2F0aW9uU3RhdGUsXG4gIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUsXG4gIHZlcmlmeUFwcGxpZWRQYXRjaGVzLFxufSBmcm9tIFwiLi9zdGF0ZUZpbGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gcmViYXNlKHtcbiAgYXBwUGF0aCxcbiAgcGF0Y2hEaXIsXG4gIHBhY2thZ2VQYXRoU3BlY2lmaWVyLFxuICB0YXJnZXRQYXRjaCxcbn06IHtcbiAgYXBwUGF0aDogc3RyaW5nXG4gIHBhdGNoRGlyOiBzdHJpbmdcbiAgcGFja2FnZVBhdGhTcGVjaWZpZXI6IHN0cmluZ1xuICB0YXJnZXRQYXRjaDogc3RyaW5nXG59KTogdm9pZCB7XG4gIGNvbnN0IHBhdGNoZXNEaXJlY3RvcnkgPSBqb2luKGFwcFBhdGgsIHBhdGNoRGlyKVxuICBjb25zdCBncm91cGVkUGF0Y2hlcyA9IGdldEdyb3VwZWRQYXRjaGVzKHBhdGNoZXNEaXJlY3RvcnkpXG5cbiAgaWYgKGdyb3VwZWRQYXRjaGVzLm51bVBhdGNoRmlsZXMgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlQnJpZ2h0KFwiTm8gcGF0Y2ggZmlsZXMgZm91bmRcIikpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cblxuICBjb25zdCBwYWNrYWdlUGF0Y2hlcyA9XG4gICAgZ3JvdXBlZFBhdGNoZXMucGF0aFNwZWNpZmllclRvUGF0Y2hGaWxlc1twYWNrYWdlUGF0aFNwZWNpZmllcl1cbiAgaWYgKCFwYWNrYWdlUGF0Y2hlcykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuYmx1ZUJyaWdodChcIk5vIHBhdGNoIGZpbGVzIGZvdW5kIGZvciBwYWNrYWdlXCIpLFxuICAgICAgcGFja2FnZVBhdGhTcGVjaWZpZXIsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSBnZXRQYXRjaEFwcGxpY2F0aW9uU3RhdGUocGFja2FnZVBhdGNoZXNbMF0pXG5cbiAgaWYgKCFzdGF0ZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuYmx1ZUJyaWdodChcIk5vIHBhdGNoIHN0YXRlIGZvdW5kXCIpLFxuICAgICAgXCJEaWQgeW91IGZvcmdldCB0byBydW5cIixcbiAgICAgIGNoYWxrLmJvbGQoXCJwYXRjaC1wYWNrYWdlXCIpLFxuICAgICAgXCIod2l0aG91dCBhcmd1bWVudHMpIGZpcnN0P1wiLFxuICAgIClcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxuICBpZiAoc3RhdGUuaXNSZWJhc2luZykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuYmx1ZUJyaWdodChcIkFscmVhZHkgcmViYXNpbmdcIiksXG4gICAgICBcIk1ha2UgY2hhbmdlcyB0byB0aGUgZmlsZXMgaW5cIixcbiAgICAgIGNoYWxrLmJvbGQocGFja2FnZVBhdGNoZXNbMF0ucGF0aCksXG4gICAgICBcImFuZCB0aGVuIHJ1biBgcGF0Y2gtcGFja2FnZVwiLFxuICAgICAgcGFja2FnZVBhdGhTcGVjaWZpZXIsXG4gICAgICBcIi0tY29udGludWVgIHRvXCIsXG4gICAgICBwYWNrYWdlUGF0Y2hlcy5sZW5ndGggPT09IHN0YXRlLnBhdGNoZXMubGVuZ3RoXG4gICAgICAgID8gXCJhcHBlbmQgYSBwYXRjaCBmaWxlXCJcbiAgICAgICAgOiBgdXBkYXRlIHRoZSAke1xuICAgICAgICAgICAgcGFja2FnZVBhdGNoZXNbcGFja2FnZVBhdGNoZXMubGVuZ3RoIC0gMV0ucGF0Y2hGaWxlbmFtZVxuICAgICAgICAgIH0gZmlsZWAsXG4gICAgKVxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYPCfkqEgVG8gcmVtb3ZlIGEgYnJva2VuIHBhdGNoIGZpbGUsIGRlbGV0ZSBpdCBhbmQgcmVpbnN0YWxsIG5vZGVfbW9kdWxlc2AsXG4gICAgKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG4gIGlmIChzdGF0ZS5wYXRjaGVzLmxlbmd0aCAhPT0gcGFja2FnZVBhdGNoZXMubGVuZ3RoKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5ibHVlQnJpZ2h0KFwiU29tZSBwYXRjaGVzIGhhdmUgbm90IGJlZW4gYXBwbGllZC5cIiksXG4gICAgICBcIlJlaW5zdGFsbCBub2RlX21vZHVsZXMgYW5kIHRyeSBhZ2Fpbi5cIixcbiAgICApXG4gIH1cbiAgLy8gY2hlY2sgaGFzaGVzXG4gIHZlcmlmeUFwcGxpZWRQYXRjaGVzKHsgYXBwUGF0aCwgcGF0Y2hEaXIsIHN0YXRlIH0pXG5cbiAgaWYgKHRhcmdldFBhdGNoID09PSBcIjBcIikge1xuICAgIC8vIHVuYXBwbHkgYWxsXG4gICAgdW5BcHBseVBhdGNoZXMoe1xuICAgICAgcGF0Y2hlczogcGFja2FnZVBhdGNoZXMsXG4gICAgICBhcHBQYXRoLFxuICAgICAgcGF0Y2hEaXIsXG4gICAgfSlcbiAgICBzYXZlUGF0Y2hBcHBsaWNhdGlvblN0YXRlKHtcbiAgICAgIHBhY2thZ2VEZXRhaWxzOiBwYWNrYWdlUGF0Y2hlc1swXSxcbiAgICAgIGlzUmViYXNpbmc6IHRydWUsXG4gICAgICBwYXRjaGVzOiBbXSxcbiAgICB9KVxuICAgIGNvbnNvbGUubG9nKGBcbk1ha2UgYW55IGNoYW5nZXMgeW91IG5lZWQgaW5zaWRlICR7Y2hhbGsuYm9sZChwYWNrYWdlUGF0Y2hlc1swXS5wYXRoKX1cblxuV2hlbiB5b3UgYXJlIGRvbmUsIHJ1blxuXG4gICR7Y2hhbGsuYm9sZChcbiAgICBgcGF0Y2gtcGFja2FnZSAke3BhY2thZ2VQYXRoU3BlY2lmaWVyfSAtLWFwcGVuZCAnTXlDaGFuZ2VEZXNjcmlwdGlvbidgLFxuICApfVxuICBcbnRvIGluc2VydCBhIG5ldyBwYXRjaCBmaWxlLlxuYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGZpbmQgdGFyZ2V0IHBhdGNoXG4gIGNvbnN0IHRhcmdldCA9IHBhY2thZ2VQYXRjaGVzLmZpbmQoKHApID0+IHtcbiAgICBpZiAocC5wYXRjaEZpbGVuYW1lID09PSB0YXJnZXRQYXRjaCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCB0YXJnZXRQYXRjaCkgPT09XG4gICAgICBqb2luKHBhdGNoZXNEaXJlY3RvcnksIHAucGF0Y2hGaWxlbmFtZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRhcmdldFBhdGNoID09PSBwLnNlcXVlbmNlTmFtZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgbiA9IE51bWJlcih0YXJnZXRQYXRjaC5yZXBsYWNlKC9eMCsvZywgXCJcIikpXG4gICAgaWYgKCFpc05hTihuKSAmJiBuID09PSBwLnNlcXVlbmNlTnVtYmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSlcblxuICBpZiAoIXRhcmdldCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsucmVkKFwiQ291bGQgbm90IGZpbmQgdGFyZ2V0IHBhdGNoIGZpbGVcIiksXG4gICAgICBjaGFsay5ib2xkKHRhcmdldFBhdGNoKSxcbiAgICApXG4gICAgY29uc29sZS5sb2coKVxuICAgIGNvbnNvbGUubG9nKFwiVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhdGNoIGZpbGVzIGlzOlwiKVxuICAgIHBhY2thZ2VQYXRjaGVzLmZvckVhY2goKHApID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAgIC0gJHtwLnBhdGNoRmlsZW5hbWV9YClcbiAgICB9KVxuXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cbiAgY29uc3QgY3VycmVudEhhc2ggPSBoYXNoRmlsZShqb2luKHBhdGNoZXNEaXJlY3RvcnksIHRhcmdldC5wYXRjaEZpbGVuYW1lKSlcblxuICBjb25zdCBwcmV2QXBwbGljYXRpb24gPSBzdGF0ZS5wYXRjaGVzLmZpbmQoXG4gICAgKHApID0+IHAucGF0Y2hDb250ZW50SGFzaCA9PT0gY3VycmVudEhhc2gsXG4gIClcbiAgaWYgKCFwcmV2QXBwbGljYXRpb24pIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLnJlZChcIkNvdWxkIG5vdCBmaW5kIHByZXZpb3VzIGFwcGxpY2F0aW9uIG9mIHBhdGNoIGZpbGVcIiksXG4gICAgICBjaGFsay5ib2xkKHRhcmdldC5wYXRjaEZpbGVuYW1lKSxcbiAgICApXG4gICAgY29uc29sZS5sb2coKVxuICAgIGNvbnNvbGUubG9nKFwiWW91IHNob3VsZCByZWluc3RhbGwgbm9kZV9tb2R1bGVzIGFuZCB0cnkgYWdhaW4uXCIpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH1cblxuICAvLyBvaywgd2UgYXJlIGdvb2QgdG8gc3RhcnQgdW5kb2luZyBhbGwgdGhlIHBhdGNoZXMgdGhhdCB3ZXJlIGFwcGxpZWQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIHRhcmdldCBwYXRjaFxuICBjb25zdCB0YXJnZXRJZHggPSBzdGF0ZS5wYXRjaGVzLmluZGV4T2YocHJldkFwcGxpY2F0aW9uKVxuXG4gIHVuQXBwbHlQYXRjaGVzKHtcbiAgICBwYXRjaGVzOiBwYWNrYWdlUGF0Y2hlcy5zbGljZSh0YXJnZXRJZHggKyAxKSxcbiAgICBhcHBQYXRoLFxuICAgIHBhdGNoRGlyLFxuICB9KVxuICBzYXZlUGF0Y2hBcHBsaWNhdGlvblN0YXRlKHtcbiAgICBwYWNrYWdlRGV0YWlsczogcGFja2FnZVBhdGNoZXNbMF0sXG4gICAgaXNSZWJhc2luZzogdHJ1ZSxcbiAgICBwYXRjaGVzOiBwYWNrYWdlUGF0Y2hlcy5zbGljZSgwLCB0YXJnZXRJZHggKyAxKS5tYXAoKHApID0+ICh7XG4gICAgICBwYXRjaEZpbGVuYW1lOiBwLnBhdGNoRmlsZW5hbWUsXG4gICAgICBwYXRjaENvbnRlbnRIYXNoOiBoYXNoRmlsZShqb2luKHBhdGNoZXNEaXJlY3RvcnksIHAucGF0Y2hGaWxlbmFtZSkpLFxuICAgICAgZGlkQXBwbHk6IHRydWUsXG4gICAgfSkpLFxuICB9KVxuXG4gIGNvbnNvbGUubG9nKGBcbk1ha2UgYW55IGNoYW5nZXMgeW91IG5lZWQgaW5zaWRlICR7Y2hhbGsuYm9sZChwYWNrYWdlUGF0Y2hlc1swXS5wYXRoKX1cblxuV2hlbiB5b3UgYXJlIGRvbmUsIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXG4gIFRvIHVwZGF0ZSAke2NoYWxrLmJvbGQocGFja2FnZVBhdGNoZXNbdGFyZ2V0SWR4XS5wYXRjaEZpbGVuYW1lKX0gcnVuXG5cbiAgICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2UgJHtwYWNrYWdlUGF0aFNwZWNpZmllcn1gKX1cbiAgICBcbiAgVG8gY3JlYXRlIGEgbmV3IHBhdGNoIGZpbGUgYWZ0ZXIgJHtjaGFsay5ib2xkKFxuICAgIHBhY2thZ2VQYXRjaGVzW3RhcmdldElkeF0ucGF0Y2hGaWxlbmFtZSxcbiAgKX0gcnVuXG4gIFxuICAgICR7Y2hhbGsuYm9sZChcbiAgICAgIGBwYXRjaC1wYWNrYWdlICR7cGFja2FnZVBhdGhTcGVjaWZpZXJ9IC0tYXBwZW5kICdNeUNoYW5nZURlc2NyaXB0aW9uJ2AsXG4gICAgKX1cblxuICBgKVxufVxuXG5mdW5jdGlvbiB1bkFwcGx5UGF0Y2hlcyh7XG4gIHBhdGNoZXMsXG4gIGFwcFBhdGgsXG4gIHBhdGNoRGlyLFxufToge1xuICBwYXRjaGVzOiBQYXRjaGVkUGFja2FnZURldGFpbHNbXVxuICBhcHBQYXRoOiBzdHJpbmdcbiAgcGF0Y2hEaXI6IHN0cmluZ1xufSkge1xuICBmb3IgKGNvbnN0IHBhdGNoIG9mIHBhdGNoZXMuc2xpY2UoKS5yZXZlcnNlKCkpIHtcbiAgICBpZiAoXG4gICAgICAhYXBwbHlQYXRjaCh7XG4gICAgICAgIHBhdGNoRmlsZVBhdGg6IGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIsIHBhdGNoLnBhdGNoRmlsZW5hbWUpIGFzIHN0cmluZyxcbiAgICAgICAgcmV2ZXJzZTogdHJ1ZSxcbiAgICAgICAgcGF0Y2hEZXRhaWxzOiBwYXRjaCxcbiAgICAgICAgcGF0Y2hEaXIsXG4gICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgYmVzdEVmZm9ydDogZmFsc2UsXG4gICAgICB9KVxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnJlZChcIkZhaWxlZCB0byB1bi1hcHBseSBwYXRjaCBmaWxlXCIpLFxuICAgICAgICBjaGFsay5ib2xkKHBhdGNoLnBhdGNoRmlsZW5hbWUpLFxuICAgICAgICBcIlRyeSBjb21wbGV0ZWx5IHJlaW5zdGFsbGluZyBub2RlX21vZHVsZXMuXCIsXG4gICAgICApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKFwiVW4tYXBwbGllZFwiKSwgcGF0Y2gucGF0Y2hGaWxlbmFtZSlcbiAgfVxufVxuIl19