UNPKG

projen

Version:

CDK for software projects

198 lines • 26.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.npx = exports.npm = exports.node = exports.poetry = exports.uv = exports.git = exports.MAX_BUFFER = void 0; exports.tool = tool; const child_process = __importStar(require("child_process")); const fs = __importStar(require("fs")); const os = __importStar(require("os")); const path = __importStar(require("path")); const dax_1 = require("./dax"); const logging = __importStar(require("../logging")); exports.MAX_BUFFER = 10 * 1024 * 1024; function spawnOpts(options) { return { maxBuffer: exports.MAX_BUFFER, cwd: options.cwd, env: options.env ? { ...process.env, ...options.env } : undefined, // run the program directly, without going through a shell shell: false, }; } /** * Runs a program with the given arguments, inheriting stdout. Throws if the * command exits with a non-zero status. */ function run(file, args, options) { logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`); child_process.execFileSync(file, args, { ...spawnOpts(options), // By default the child's stdout is redirected to STDERR (to keep the // parent's STDOUT clean) and its STDERR is piped so it surfaces in // exceptions. `inheritStdio` instead streams both straight to the parent. stdio: options.inheritStdio ? "inherit" : ["inherit", 2, "pipe"], }); } /** * Runs a program and returns its trimmed STDOUT (or STDOUT+STDERR interleaved * in their original write order, if `captureStderr` is set). Throws if the * command exits with a non-zero status. */ function capture(file, args, options) { logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`); if (options.captureStderr) { // Same fd for both streams so they interleave in write order. A shared // in-memory Writable won't work here - execFileSync only accepts stdio // streams backed by a real fd (tty/file/socket/pipe). const combinedFile = path.join(fs.mkdtempSync(path.join(os.tmpdir(), "projen-capture-")), "output"); const fd = fs.openSync(combinedFile, "w+"); try { try { child_process.execFileSync(file, args, { ...spawnOpts(options), stdio: ["inherit", fd, fd], }); } catch (e) { // mirrors execFileSync's own behavior of attaching output to the error e.stdout = fs.readFileSync(combinedFile); throw e; } return fs.readFileSync(combinedFile, "utf-8").trim(); } finally { fs.closeSync(fd); fs.rmSync(path.dirname(combinedFile), { recursive: true, force: true }); } } return child_process .execFileSync(file, args, { ...spawnOpts(options), stdio: ["inherit", "pipe", "pipe"], // "pipe" for STDERR means it appears in exceptions }) .toString("utf-8") .trim(); } /** * Runs a program and returns its trimmed STDOUT (or STDOUT+STDERR interleaved * in their original write order, if `captureStderr` is set), or `undefined` * if the command failed or produced no output. */ function tryCapture(file, args, options) { try { const value = capture(file, args, options); // an empty string is the same as undefined return value || undefined; } catch { return undefined; } } /** * Creates a shell-free {@link Tool} for the given program. * * @example const git = tool("git"); git.run(["tag", "--delete", tag], { cwd }); */ function tool(file) { return { run: (args, options) => run(file, args, options), capture: (args, options) => capture(file, args, options), tryCapture: (args, options) => tryCapture(file, args, options), }; } /** * Shell-free helper for invoking `git`. * * @example git.run(["tag", "--delete", tag], { cwd }); */ exports.git = tool("git"); /** * Shell-free helper for invoking `uv` (ships as a native binary on all * platforms). */ exports.uv = tool("uv"); /** * Shell-free helper for invoking `poetry`. */ exports.poetry = tool("poetry"); /** * Shell-free helper for invoking the current Node.js executable * (`process.execPath`). */ exports.node = tool(process.execPath); /** * Creates an {@link AsyncTool} that invokes `file` via dax, resolving Windows * `.cmd`/`.bat` shims and escaping every argument (so each value is passed as * a single literal argument). * * @example await npx.run(["commit-and-tag-version@^12"], { cwd }); */ function shimTool(file) { const build = (args, options) => { const cmd = (0, dax_1.$) `${file} ${args}`.cwd(options.cwd).stderr("piped").noThrow(); return options.env ? cmd.env(options.env) : cmd; }; const ensureOk = (args, result) => { if (result.code !== 0) { // Mimic the `child_process` error shape (`status`, `stderr`) so callers // can inspect stderr (e.g. to detect ENOENT/E404 from npm). const error = new Error(`Command failed (exit code ${result.code}): ${file} ${args.join(" ")}`); error.status = result.code; error.stderr = Buffer.from(result.stderr); throw error; } }; return { run: async (args, options) => { logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`); ensureOk(args, await build(args, options)); }, capture: async (args, options) => { logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`); const result = await build(args, options).stdout("piped"); ensureOk(args, result); return result.stdout.trim(); }, }; } /** * Cross-platform helper for `npm` (a Windows `.cmd` shim). */ exports.npm = shimTool("npm"); /** * Cross-platform helper for `npx` (a Windows `.cmd` shim). */ exports.npx = shimTool("npx"); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2V4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0xBLG9CQU1DO0FBck1ELDZEQUErQztBQUMvQyx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwrQkFBMEI7QUFDMUIsb0RBQXNDO0FBRXpCLFFBQUEsVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBd0QzQyxTQUFTLFNBQVMsQ0FBQyxPQUF3QjtJQUN6QyxPQUFPO1FBQ0wsU0FBUyxFQUFFLGtCQUFVO1FBQ3JCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztRQUNoQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsMERBQTBEO1FBQzFELEtBQUssRUFBRSxLQUFjO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLElBQWMsRUFBRSxPQUFtQjtJQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFFakUsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ3JDLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNyQixxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLDBFQUEwRTtRQUMxRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFD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QUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyAkIH0gZnJvbSBcIi4vZGF4XCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBNQVhfQlVGRkVSID0gMTAgKiAxMDI0ICogMTAyNDtcblxuLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2hlbGwtZnJlZSBleGVjdXRpb24gKGV4ZWNGaWxlU3luYywgc2hlbGw6IGZhbHNlKS5cbi8vXG4vLyBUaGUgcHJvZ3JhbSBhbmQgZWFjaCBhcmd1bWVudCBhcmUgcGFzc2VkIHRvIHRoZSBPUyBkaXJlY3RseSB3aXRob3V0IGdvaW5nXG4vLyB0aHJvdWdoIGEgc2hlbGwsIHNvIHRoZXJlIGlzIG5vIHF1b3RpbmcgdG8gZ2V0IHJpZ2h0IGFuZCBubyBkaWZmZXJlbmNlc1xuLy8gYmV0d2VlbiBwbGF0Zm9ybSBzaGVsbHMgdG8gYWNjb3VudCBmb3Igd2hlbiBjb21tYW5kcyBpbmNsdWRlIHZhbHVlcyBkZXJpdmVkXG4vLyBmcm9tIGZpbGVzLCBnaXQgb3V0cHV0LCBjb25maWd1cmF0aW9uLCBldGMuXG4vL1xuLy8gT25seSBwZXItdG9vbCBoZWxwZXJzIGFyZSBleHBvcnRlZCAoZS5nLiBgZ2l0YCk7IHRoZSBnZW5lcmljIHByaW1pdGl2ZXMgYXJlXG4vLyBrZXB0IHByaXZhdGUgc28gY2FsbCBzaXRlcyBhcmUgZXhwbGljaXQgYWJvdXQgd2hpY2ggdG9vbCB0aGV5IGludm9rZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzaGVsbC1mcmVlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNGaWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIG1lcmdlZCBvbiB0b3Agb2YgYHByb2Nlc3MuZW52YC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbiAgLyoqXG4gICAqIEZvciBgY2FwdHVyZWAvYHRyeUNhcHR1cmVgOiBpbnRlcmxlYXZlIFNUREVSUiBpbnRvIHRoZSBjYXB0dXJlZCBvdXRwdXRcbiAgICogaW5zdGVhZCBvZiBvbmx5IGNhcHR1cmluZyBTVERPVVQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlU3RkZXJyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgVG9vbC5ydW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMgZXh0ZW5kcyBFeGVjRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogU3RyZWFtIHRoZSBjaGlsZCdzIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmFpZ2h0IHRvIHRoZSBwYXJlbnQncyBzdGRvdXQgYW5kXG4gICAqIHN0ZGVyciAoZnVsbCBpbmhlcml0YW5jZSksIGluc3RlYWQgb2YgcmVkaXJlY3Rpbmcgc3Rkb3V0IHRvIHN0ZGVyciBhbmRcbiAgICogY2FwdHVyaW5nIHN0ZGVyciAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIGxhdW5jaGluZyBhIGNoaWxkIHByb2Nlc3Mgd2hvc2Ugc3Rkb3V0IGlzIG1lYW5pbmdmdWwgYW5kXG4gICAqIHdob3NlIG91dHB1dCBzaG91bGQgc3RyZWFtIGxpdmUgdG8gdGhlIHVzZXIgKGUuZy4gdGhlIHByb2plbiBDTEkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5oZXJpdFN0ZGlvPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gc3Bhd25PcHRzKG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgIGVudjogb3B0aW9ucy5lbnYgPyB7IC4uLnByb2Nlc3MuZW52LCAuLi5vcHRpb25zLmVudiB9IDogdW5kZWZpbmVkLFxuICAgIC8vIHJ1biB0aGUgcHJvZ3JhbSBkaXJlY3RseSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgc2hlbGxcbiAgICBzaGVsbDogZmFsc2UgYXMgY29uc3QsXG4gIH07XG59XG5cbi8qKlxuICogUnVucyBhIHByb2dyYW0gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBpbmhlcml0aW5nIHN0ZG91dC4gVGhyb3dzIGlmIHRoZVxuICogY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLlxuICovXG5mdW5jdGlvbiBydW4oZmlsZTogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQge1xuICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG5cbiAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoZmlsZSwgYXJncywge1xuICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAvLyBCeSBkZWZhdWx0IHRoZSBjaGlsZCdzIHN0ZG91dCBpcyByZWRpcmVjdGVkIHRvIFNUREVSUiAodG8ga2VlcCB0aGVcbiAgICAvLyBwYXJlbnQncyBTVERPVVQgY2xlYW4pIGFuZCBpdHMgU1RERVJSIGlzIHBpcGVkIHNvIGl0IHN1cmZhY2VzIGluXG4gICAgLy8gZXhjZXB0aW9ucy4gYGluaGVyaXRTdGRpb2AgaW5zdGVhZCBzdHJlYW1zIGJvdGggc3RyYWlnaHQgdG8gdGhlIHBhcmVudC5cbiAgICBzdGRpbzogb3B0aW9ucy5pbmhlcml0U3RkaW8gPyBcImluaGVyaXRcIiA6IFtcImluaGVyaXRcIiwgMiwgXCJwaXBlXCJdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgdHJpbW1lZCBTVERPVVQgKG9yIFNURE9VVCtTVERFUlIgaW50ZXJsZWF2ZWRcbiAqIGluIHRoZWlyIG9yaWdpbmFsIHdyaXRlIG9yZGVyLCBpZiBgY2FwdHVyZVN0ZGVycmAgaXMgc2V0KS4gVGhyb3dzIGlmIHRoZVxuICogY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlKFxuICBmaWxlOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMsXG4pOiBzdHJpbmcge1xuICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG5cbiAgaWYgKG9wdGlvbnMuY2FwdHVyZVN0ZGVycikge1xuICAgIC8vIFNhbWUgZmQgZm9yIGJvdGggc3RyZWFtcyBzbyB0aGV5IGludGVybGVhdmUgaW4gd3JpdGUgb3JkZXIuIEEgc2hhcmVkXG4gICAgLy8gaW4tbWVtb3J5IFdyaXRhYmxlIHdvbid0IHdvcmsgaGVyZSAtIGV4ZWNGaWxlU3luYyBvbmx5IGFjY2VwdHMgc3RkaW9cbiAgICAvLyBzdHJlYW1zIGJhY2tlZCBieSBhIHJlYWwgZmQgKHR0eS9maWxlL3NvY2tldC9waXBlKS5cbiAgICBjb25zdCBjb21iaW5lZEZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwicHJvamVuLWNhcHR1cmUtXCIpKSxcbiAgICAgIFwib3V0cHV0XCIsXG4gICAgKTtcbiAgICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKGNvbWJpbmVkRmlsZSwgXCJ3K1wiKTtcbiAgICB0cnkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoZmlsZSwgYXJncywge1xuICAgICAgICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAgICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBmZCwgZmRdLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBtaXJyb3JzIGV4ZWNGaWxlU3luYydzIG93biBiZWhhdmlvciBvZiBhdHRhY2hpbmcgb3V0cHV0IHRvIHRoZSBlcnJvclxuICAgICAgICBlLnN0ZG91dCA9IGZzLnJlYWRGaWxlU3luYyhjb21iaW5lZEZpbGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhjb21iaW5lZEZpbGUsIFwidXRmLThcIikudHJpbSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBmcy5jbG9zZVN5bmMoZmQpO1xuICAgICAgZnMucm1TeW5jKHBhdGguZGlybmFtZShjb21iaW5lZEZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkX3Byb2Nlc3NcbiAgICAuZXhlY0ZpbGVTeW5jKGZpbGUsIGFyZ3MsIHtcbiAgICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcInBpcGVcIl0sIC8vIFwicGlwZVwiIGZvciBTVERFUlIgbWVhbnMgaXQgYXBwZWFycyBpbiBleGNlcHRpb25zXG4gICAgfSlcbiAgICAudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgIC50cmltKCk7XG59XG5cbi8qKlxuICogUnVucyBhIHByb2dyYW0gYW5kIHJldHVybnMgaXRzIHRyaW1tZWQgU1RET1VUIChvciBTVERPVVQrU1RERVJSIGludGVybGVhdmVkXG4gKiBpbiB0aGVpciBvcmlnaW5hbCB3cml0ZSBvcmRlciwgaWYgYGNhcHR1cmVTdGRlcnJgIGlzIHNldCksIG9yIGB1bmRlZmluZWRgXG4gKiBpZiB0aGUgY29tbWFuZCBmYWlsZWQgb3IgcHJvZHVjZWQgbm8gb3V0cHV0LlxuICovXG5mdW5jdGlvbiB0cnlDYXB0dXJlKFxuICBmaWxlOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlID0gY2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIGFuIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB1bmRlZmluZWRcbiAgICByZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQSBzaGVsbC1mcmVlIGhhbmRsZSBmb3IgaW52b2tpbmcgYSBzaW5nbGUgcHJvZ3JhbSBieSBuYW1lIG9yIHBhdGguXG4gKlxuICogRWFjaCBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIHByb2dyYW0gdmVyYmF0aW0gKG5vIHNoZWxsIHBhcnNpbmcpLCBzbyB0aGVyZVxuICogaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgZm9yIHZhbHVlcyBzdWNoIGFzIHRhZ3MsIHZlcnNpb25zLCBicmFuY2ggbmFtZXNcbiAqIG9yIGZpbGUgcGF0aHMuXG4gKlxuICogTm90ZTogdGhlIHByb2dyYW0gaXMgZXhlY3V0ZWQgZGlyZWN0bHksIHdpdGhvdXQgYSBzaGVsbC4gT24gV2luZG93cyB0aGlzXG4gKiBtZWFucyBpdCBtdXN0IGJlIGEgcmVhbCBleGVjdXRhYmxlIC0gYC5jbWRgL2AuYmF0YCBzaGltcyAoc3VjaCBhc1xuICogbnBtLWluc3RhbGxlZCBDTElzIGxpa2UgbnBtL25weC95YXJuL3BucG0pIGNhbm5vdCBiZSBpbnZva2VkIHRoaXMgd2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2wge1xuICAvKipcbiAgICogUnVucyBgPHRvb2w+IDxhcmdzPmAsIGluaGVyaXRpbmcgc3Rkb3V0LiBUaHJvd3Mgb24gbm9uLXplcm8gZXhpdC5cbiAgICovXG4gIHJ1bihhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVC4gVGhyb3dzIG9uIG5vbi16ZXJvIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlXG4gICAqIGNvbW1hbmQgZmFpbGVkIG9yIHByb2R1Y2VkIG5vIG91dHB1dC5cbiAgICovXG4gIHRyeUNhcHR1cmUoYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hlbGwtZnJlZSB7QGxpbmsgVG9vbH0gZm9yIHRoZSBnaXZlbiBwcm9ncmFtLlxuICpcbiAqIEBleGFtcGxlIGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7IGdpdC5ydW4oW1widGFnXCIsIFwiLS1kZWxldGVcIiwgdGFnXSwgeyBjd2QgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKGZpbGU6IHN0cmluZyk6IFRvb2wge1xuICByZXR1cm4ge1xuICAgIHJ1bjogKGFyZ3MsIG9wdGlvbnMpID0+IHJ1bihmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICBjYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gY2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICB0cnlDYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gdHJ5Q2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYGdpdGAuXG4gKlxuICogQGV4YW1wbGUgZ2l0LnJ1bihbXCJ0YWdcIiwgXCItLWRlbGV0ZVwiLCB0YWddLCB7IGN3ZCB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7XG5cbi8qKlxuICogU2hlbGwtZnJlZSBoZWxwZXIgZm9yIGludm9raW5nIGB1dmAgKHNoaXBzIGFzIGEgbmF0aXZlIGJpbmFyeSBvbiBhbGxcbiAqIHBsYXRmb3JtcykuXG4gKi9cbmV4cG9ydCBjb25zdCB1diA9IHRvb2woXCJ1dlwiKTtcblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYHBvZXRyeWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwb2V0cnkgPSB0b29sKFwicG9ldHJ5XCIpO1xuXG4vKipcbiAqIFNoZWxsLWZyZWUgaGVscGVyIGZvciBpbnZva2luZyB0aGUgY3VycmVudCBOb2RlLmpzIGV4ZWN1dGFibGVcbiAqIChgcHJvY2Vzcy5leGVjUGF0aGApLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZSA9IHRvb2wocHJvY2Vzcy5leGVjUGF0aCk7XG5cbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyb3NzLXBsYXRmb3JtIGV4ZWN1dGlvbiB2aWEgZGF4IChmb3IgYmluYXJpZXMgdGhhdCBtYXkgYmUgYC5jbWRgIHNoaW1zKS5cbi8vXG4vLyBgdG9vbGAgYWJvdmUgdXNlcyBgZXhlY0ZpbGVTeW5jYCB3aXRoIGBzaGVsbDogZmFsc2VgLCB3aGljaCBjYW5ub3QgbGF1bmNoXG4vLyBXaW5kb3dzIGAuY21kYC9gLmJhdGAgc2hpbXMgc3VjaCBhcyBgbnB4YCBvciBgbnBtYC4gYHNoaW1Ub29sYCBydW5zIHRocm91Z2hcbi8vIGRheCwgd2hpY2ggcmVzb2x2ZXMgdGhvc2Ugc2hpbXMgY3Jvc3MtcGxhdGZvcm0uIEFyZ3VtZW50cyBhcmUgaW50ZXJwb2xhdGVkXG4vLyB0aHJvdWdoIGRheCdzIGVzY2FwaW5nIChOT1QgYCQucmF3YCksIHNvIGVhY2ggdmFsdWUgaXMgcGFzc2VkIGFzIGEgc2luZ2xlXG4vLyBsaXRlcmFsIGFyZ3VtZW50IHdpdGggbm8gcXVvdGluZyB0byBnZXQgcmlnaHQuIGRheCBpcyBhc3luY2hyb25vdXMsIHNvXG4vLyB0aGVzZSBoZWxwZXJzIGFyZSBvbmx5IHVzYWJsZSBmcm9tIGFzeW5jIGNhbGwgc2l0ZXMuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG5cbi8qKlxuICogQXN5bmMsIGRheC1iYWNrZWQgZXF1aXZhbGVudCBvZiB7QGxpbmsgVG9vbH0gZm9yIHByb2dyYW1zIHRoYXQgbWF5IGJlIGFcbiAqIFdpbmRvd3MgYC5jbWRgL2AuYmF0YCBzaGltIChlLmcuIGBucHhgLCBgbnBtYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNUb29sIHtcbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gLCBpbmhlcml0aW5nIHN0ZG91dC4gUmVqZWN0cyBvbiBub24temVybyBleGl0LlxuICAgKi9cbiAgcnVuKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSdW5zIGA8dG9vbD4gPGFyZ3M+YCBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULiBSZWplY3RzIG9uIG5vbi16ZXJvXG4gICAqIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiB7QGxpbmsgQXN5bmNUb29sfSB0aGF0IGludm9rZXMgYGZpbGVgIHZpYSBkYXgsIHJlc29sdmluZyBXaW5kb3dzXG4gKiBgLmNtZGAvYC5iYXRgIHNoaW1zIGFuZCBlc2NhcGluZyBldmVyeSBhcmd1bWVudCAoc28gZWFjaCB2YWx1ZSBpcyBwYXNzZWQgYXNcbiAqIGEgc2luZ2xlIGxpdGVyYWwgYXJndW1lbnQpLlxuICpcbiAqIEBleGFtcGxlIGF3YWl0IG5weC5ydW4oW1wiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIl0sIHsgY3dkIH0pO1xuICovXG5mdW5jdGlvbiBzaGltVG9vbChmaWxlOiBzdHJpbmcpOiBBc3luY1Rvb2wge1xuICBjb25zdCBidWlsZCA9IChhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY21kID0gJGAke2ZpbGV9ICR7YXJnc31gLmN3ZChvcHRpb25zLmN3ZCkuc3RkZXJyKFwicGlwZWRcIikubm9UaHJvdygpO1xuICAgIHJldHVybiBvcHRpb25zLmVudiA/IGNtZC5lbnYob3B0aW9ucy5lbnYpIDogY21kO1xuICB9O1xuICBjb25zdCBlbnN1cmVPayA9IChcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICByZXN1bHQ6IHsgY29kZTogbnVtYmVyOyBzdGRlcnI6IHN0cmluZyB9LFxuICApID0+IHtcbiAgICBpZiAocmVzdWx0LmNvZGUgIT09IDApIHtcbiAgICAgIC8vIE1pbWljIHRoZSBgY2hpbGRfcHJvY2Vzc2AgZXJyb3Igc2hhcGUgKGBzdGF0dXNgLCBgc3RkZXJyYCkgc28gY2FsbGVyc1xuICAgICAgLy8gY2FuIGluc3BlY3Qgc3RkZXJyIChlLmcuIHRvIGRldGVjdCBFTk9FTlQvRTQwNCBmcm9tIG5wbSkuXG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgKGV4aXQgY29kZSAke3Jlc3VsdC5jb2RlfSk6ICR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfWAsXG4gICAgICApO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gcmVzdWx0LmNvZGU7XG4gICAgICBlcnJvci5zdGRlcnIgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBydW46IGFzeW5jIChhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICBlbnN1cmVPayhhcmdzLCBhd2FpdCBidWlsZChhcmdzLCBvcHRpb25zKSk7XG4gICAgfSxcbiAgICBjYXB0dXJlOiBhc3luYyAoYXJncywgb3B0aW9ucykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGQoYXJncywgb3B0aW9ucykuc3Rkb3V0KFwicGlwZWRcIik7XG4gICAgICBlbnN1cmVPayhhcmdzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBgbnBtYCAoYSBXaW5kb3dzIGAuY21kYCBzaGltKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5wbSA9IHNoaW1Ub29sKFwibnBtXCIpO1xuXG4vKipcbiAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3IgYG5weGAgKGEgV2luZG93cyBgLmNtZGAgc2hpbSkuXG4gKi9cbmV4cG9ydCBjb25zdCBucHggPSBzaGltVG9vbChcIm5weFwiKTtcbiJdfQ==