@decaf-ts/fabric-weaver
Version:
template for ts projects
112 lines • 17.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolvePath = resolvePath;
exports.compileStandaloneFile = compileStandaloneFile;
exports.overrideContractImports = overrideContractImports;
exports.overrideDoubleDotImports = overrideDoubleDotImports;
exports.addPackage = addPackage;
const constants_1 = require("../constants/constants.cjs");
const fs_1 = __importDefault(require("fs"));
const logging_1 = require("@decaf-ts/logging");
const path_1 = __importDefault(require("path"));
const typescript_1 = __importDefault(require("typescript"));
function resolvePath(inputPath) {
return path_1.default.isAbsolute(inputPath)
? inputPath
: path_1.default.resolve(process.cwd(), inputPath);
}
function compileStandaloneFile(filePath, outDir) {
const compilerOptions = {
target: typescript_1.default.ScriptTarget.ES2022,
module: typescript_1.default.ModuleKind.CommonJS,
allowJs: true,
checkJs: true,
declaration: false,
declarationMap: false,
emitDeclarationOnly: false,
isolatedModules: true,
sourceMap: false,
removeComments: true,
strict: true,
skipLibCheck: true,
resolveJsonModule: true,
forceConsistentCasingInFileNames: true,
experimentalDecorators: true,
emitDecoratorMetadata: true,
moduleResolution: typescript_1.default.ModuleResolutionKind.NodeJs,
noImplicitAny: true,
useDefineForClassFields: true,
allowSyntheticDefaultImports: true,
esModuleInterop: false,
outDir,
};
const host = typescript_1.default.createCompilerHost(compilerOptions);
host.writeFile = (fileName, content) => {
const outputPath = path_1.default.join(outDir, path_1.default.basename(fileName));
fs_1.default.writeFileSync(outputPath, content);
console.log(`Written: ${outputPath}`);
};
const program = typescript_1.default.createProgram([path_1.default.join(resolvePath(filePath))], compilerOptions, host);
const emitResult = program.emit();
const diagnostics = typescript_1.default
.getPreEmitDiagnostics(program)
.concat(emitResult.diagnostics);
diagnostics.forEach((diagnostic) => {
if (diagnostic.file && diagnostic.start !== undefined) {
const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
const message = typescript_1.default.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
console.log(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
}
else {
console.log(typescript_1.default.flattenDiagnosticMessageText(diagnostic.messageText, "\n"));
}
});
const exitCode = emitResult.emitSkipped ? 1 : 0;
overrideContractImports(outDir);
console.log(`Process exited with code ${exitCode}`);
}
function overrideContractImports(folderPath) {
folderPath = resolvePath(folderPath);
const files = fs_1.default.readdirSync(folderPath);
files.forEach((file) => {
const filePath = path_1.default.join(folderPath, file);
console.log(filePath);
if (fs_1.default.statSync(filePath).isFile() && file.toLowerCase().endsWith(".js")) {
// Read file content
const content = fs_1.default.readFileSync(filePath, "utf8");
// Parse/transform
const newContent = overrideDoubleDotImports(content);
// Write back to file
fs_1.default.writeFileSync(filePath, newContent, "utf8");
}
});
}
function overrideDoubleDotImports(code) {
return code.replace(/require\(\s*["']((?:\.\.\/)+(?:[^/"']+\/)*([^/"']+)|\.\/(?:[^/"']+\/)*([^/"']+))["']\s*\)/g, (match, p1, p2, p3) => {
const lastSegment = p2 || p3;
return `require("./${lastSegment}")`;
});
}
async function addPackage(contractName, version, destinationDirectory) {
const log = logging_1.Logging.for(addPackage);
const inputFiles = ["package.json", "package-lock.json"];
fs_1.default.mkdirSync(resolvePath(destinationDirectory), { recursive: true });
for (const file of inputFiles) {
const inputPath = path_1.default.join(__dirname, "../..", "assets", file);
if (!fs_1.default.existsSync(inputPath)) {
log.info(`File not found: ${inputPath}`);
continue;
}
const content = fs_1.default.readFileSync(inputPath, "utf-8");
const replacedContent = content
.replaceAll(new RegExp(constants_1.VERSION_PLACEHOLDER, "g"), version.toString())
.replaceAll(new RegExp(constants_1.NAME_PLACEHOLDER, "g"), contractName.toLowerCase())
.replaceAll(new RegExp(constants_1.ENTRY_PLACEHOLDER, "g"), `${contractName.toLowerCase()}.js`);
fs_1.default.writeFileSync(path_1.default.join(resolvePath(destinationDirectory), file), replacedContent, "utf-8");
log.info(`Add ${file} to ${destinationDirectory} for contract ${contractName}`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2NvbnRyYWN0cy9jb21waWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBV0Esa0NBSUM7QUFFRCxzREFtRUM7QUFFRCwwREFtQkM7QUFFRCw0REFRQztBQUNELGdDQXNDQztBQTFKRCxzREFJZ0M7QUFFaEMsNENBQW9CO0FBQ3BCLCtDQUE0QztBQUM1QyxnREFBd0I7QUFDeEIsNERBQTRCO0FBRTVCLFNBQWdCLFdBQVcsQ0FBQyxTQUFpQjtJQUMzQyxPQUFPLGNBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLE1BQWM7SUFDcEUsTUFBTSxlQUFlLEdBQXVCO1FBQzFDLE1BQU0sRUFBRSxvQkFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNO1FBQzlCLE1BQU0sRUFBRSxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1FBQzlCLE9BQU8sRUFBRSxJQUFJO1FBQ2IsT0FBTyxFQUFFLElBQUk7UUFDYixXQUFXLEVBQUUsS0FBSztRQUNsQixjQUFjLEVBQUUsS0FBSztRQUNyQixtQkFBbUIsRUFBRSxLQUFLO1FBQzFCLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLFNBQVMsRUFBRSxLQUFLO1FBQ2hCLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLE1BQU0sRUFBRSxJQUFJO1FBQ1osWUFBWSxFQUFFLElBQUk7UUFDbEIsaUJBQWlCLEVBQUUsSUFBSTtRQUN2QixnQ0FBZ0MsRUFBRSxJQUFJO1FBQ3RDLHNCQUFzQixFQUFFLElBQUk7UUFDNUIscUJBQXFCLEVBQUUsSUFBSTtRQUMzQixnQkFBZ0IsRUFBRSxvQkFBRSxDQUFDLG9CQUFvQixDQUFDLE1BQU07UUFDaEQsYUFBYSxFQUFFLElBQUk7UUFDbkIsdUJBQXVCLEVBQUUsSUFBSTtRQUM3Qiw0QkFBNEIsRUFBRSxJQUFJO1FBQ2xDLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLE1BQU07S0FDUCxDQUFDO0lBRUYsTUFBTSxJQUFJLEdBQUcsb0JBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGNBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5RCxZQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxvQkFBRSxDQUFDLGFBQWEsQ0FDOUIsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQ2xDLGVBQWUsRUFDZixJQUFJLENBQ0wsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVsQyxNQUFNLFdBQVcsR0FBRyxvQkFBRTtTQUNuQixxQkFBcUIsQ0FBQyxPQUFPLENBQUM7U0FDOUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVsQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDakMsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEQsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUN2RSxVQUFVLENBQUMsS0FBSyxDQUNqQixDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsb0JBQUUsQ0FBQyw0QkFBNEIsQ0FDN0MsVUFBVSxDQUFDLFdBQVcsRUFDdEIsSUFBSSxDQUNMLENBQUM7WUFDRixPQUFPLENBQUMsR0FBRyxDQUNULEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxNQUFNLE9BQU8sRUFBRSxDQUN6RSxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUNULG9CQUFFLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FDOUQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhELHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLFVBQWtCO0lBQ3hELFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsWUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV6QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDckIsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0QixJQUFJLFlBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pFLG9CQUFvQjtZQUNwQixNQUFNLE9BQU8sR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVsRCxrQkFBa0I7WUFDbEIsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFckQscUJBQXFCO1lBQ3JCLFlBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWTtJQUNuRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLDRGQUE0RixFQUM1RixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDN0IsT0FBTyxjQUFjLFdBQVcsSUFBSSxDQUFDO0lBQ3ZDLENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUNNLEtBQUssVUFBVSxVQUFVLENBQzlCLFlBQW9CLEVBQ3BCLE9BQWUsRUFDZixvQkFBNEI7SUFFNUIsTUFBTSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUV6RCxZQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFckUsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN6QyxTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXBELE1BQU0sZUFBZSxHQUFHLE9BQU87YUFDNUIsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLCtCQUFtQixFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNwRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsNEJBQWdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3pFLFVBQVUsQ0FDVCxJQUFJLE1BQU0sQ0FBQyw2QkFBaUIsRUFBRSxHQUFHLENBQUMsRUFDbEMsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FDbkMsQ0FBQztRQUVKLFlBQUUsQ0FBQyxhQUFhLENBQ2QsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxJQUFJLENBQUMsRUFDbEQsZUFBZSxFQUNmLE9BQU8sQ0FDUixDQUFDO1FBRUYsR0FBRyxDQUFDLElBQUksQ0FDTixPQUFPLElBQUksT0FBTyxvQkFBb0IsaUJBQWlCLFlBQVksRUFBRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFTlRSWV9QTEFDRUhPTERFUixcbiAgTkFNRV9QTEFDRUhPTERFUixcbiAgVkVSU0lPTl9QTEFDRUhPTERFUixcbn0gZnJvbSBcIi4uL2NvbnN0YW50cy9jb25zdGFudHNcIjtcblxuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aClcbiAgICA/IGlucHV0UGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGlucHV0UGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlU3RhbmRhbG9uZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgb3V0RGlyOiBzdHJpbmcpIHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zOiB0cy5Db21waWxlck9wdGlvbnMgPSB7XG4gICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVMyMDIyLFxuICAgIG1vZHVsZTogdHMuTW9kdWxlS2luZC5Db21tb25KUyxcbiAgICBhbGxvd0pzOiB0cnVlLFxuICAgIGNoZWNrSnM6IHRydWUsXG4gICAgZGVjbGFyYXRpb246IGZhbHNlLFxuICAgIGRlY2xhcmF0aW9uTWFwOiBmYWxzZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiBmYWxzZSxcbiAgICBpc29sYXRlZE1vZHVsZXM6IHRydWUsXG4gICAgc291cmNlTWFwOiBmYWxzZSxcbiAgICByZW1vdmVDb21tZW50czogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgIGZvcmNlQ29uc2lzdGVudENhc2luZ0luRmlsZU5hbWVzOiB0cnVlLFxuICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgZW1pdERlY29yYXRvck1ldGFkYXRhOiB0cnVlLFxuICAgIG1vZHVsZVJlc29sdXRpb246IHRzLk1vZHVsZVJlc29sdXRpb25LaW5kLk5vZGVKcyxcbiAgICBub0ltcGxpY2l0QW55OiB0cnVlLFxuICAgIHVzZURlZmluZUZvckNsYXNzRmllbGRzOiB0cnVlLFxuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgZXNNb2R1bGVJbnRlcm9wOiBmYWxzZSxcbiAgICBvdXREaXIsXG4gIH07XG5cbiAgY29uc3QgaG9zdCA9IHRzLmNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMpO1xuICBob3N0LndyaXRlRmlsZSA9IChmaWxlTmFtZSwgY29udGVudCkgPT4ge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4ob3V0RGlyLCBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lKSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBjb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgV3JpdHRlbjogJHtvdXRwdXRQYXRofWApO1xuICB9O1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKFxuICAgIFtwYXRoLmpvaW4ocmVzb2x2ZVBhdGgoZmlsZVBhdGgpKV0sXG4gICAgY29tcGlsZXJPcHRpb25zLFxuICAgIGhvc3RcbiAgKTtcbiAgY29uc3QgZW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGRpYWdub3N0aWNzID0gdHNcbiAgICAuZ2V0UHJlRW1pdERpYWdub3N0aWNzKHByb2dyYW0pXG4gICAgLmNvbmNhdChlbWl0UmVzdWx0LmRpYWdub3N0aWNzKTtcblxuICBkaWFnbm9zdGljcy5mb3JFYWNoKChkaWFnbm9zdGljKSA9PiB7XG4gICAgaWYgKGRpYWdub3N0aWMuZmlsZSAmJiBkaWFnbm9zdGljLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgbGluZSwgY2hhcmFjdGVyIH0gPSBkaWFnbm9zdGljLmZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oXG4gICAgICAgIGRpYWdub3N0aWMuc3RhcnRcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChcbiAgICAgICAgZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCxcbiAgICAgICAgXCJcXG5cIlxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgJHtkaWFnbm9zdGljLmZpbGUuZmlsZU5hbWV9ICgke2xpbmUgKyAxfSwke2NoYXJhY3RlciArIDF9KTogJHttZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICB0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsIFwiXFxuXCIpXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZXhpdENvZGUgPSBlbWl0UmVzdWx0LmVtaXRTa2lwcGVkID8gMSA6IDA7XG5cbiAgb3ZlcnJpZGVDb250cmFjdEltcG9ydHMob3V0RGlyKTtcbiAgY29uc29sZS5sb2coYFByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2V4aXRDb2RlfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVDb250cmFjdEltcG9ydHMoZm9sZGVyUGF0aDogc3RyaW5nKSB7XG4gIGZvbGRlclBhdGggPSByZXNvbHZlUGF0aChmb2xkZXJQYXRoKTtcbiAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhmb2xkZXJQYXRoKTtcblxuICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgZmlsZSk7XG4gICAgY29uc29sZS5sb2coZmlsZVBhdGgpO1xuXG4gICAgaWYgKGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5pc0ZpbGUoKSAmJiBmaWxlLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXCIuanNcIikpIHtcbiAgICAgIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0ZjhcIik7XG5cbiAgICAgIC8vIFBhcnNlL3RyYW5zZm9ybVxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IG92ZXJyaWRlRG91YmxlRG90SW1wb3J0cyhjb250ZW50KTtcblxuICAgICAgLy8gV3JpdGUgYmFjayB0byBmaWxlXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBuZXdDb250ZW50LCBcInV0ZjhcIik7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJyaWRlRG91YmxlRG90SW1wb3J0cyhjb2RlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGNvZGUucmVwbGFjZShcbiAgICAvcmVxdWlyZVxcKFxccypbXCInXSgoPzpcXC5cXC5cXC8pKyg/OlteL1wiJ10rXFwvKSooW14vXCInXSspfFxcLlxcLyg/OlteL1wiJ10rXFwvKSooW14vXCInXSspKVtcIiddXFxzKlxcKS9nLFxuICAgIChtYXRjaCwgcDEsIHAyLCBwMykgPT4ge1xuICAgICAgY29uc3QgbGFzdFNlZ21lbnQgPSBwMiB8fCBwMztcbiAgICAgIHJldHVybiBgcmVxdWlyZShcIi4vJHtsYXN0U2VnbWVudH1cIilgO1xuICAgIH1cbiAgKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFxuICBjb250cmFjdE5hbWU6IHN0cmluZyxcbiAgdmVyc2lvbjogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkRpcmVjdG9yeTogc3RyaW5nXG4pIHtcbiAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoYWRkUGFja2FnZSk7XG4gIGNvbnN0IGlucHV0RmlsZXMgPSBbXCJwYWNrYWdlLmpzb25cIiwgXCJwYWNrYWdlLWxvY2suanNvblwiXTtcblxuICBmcy5ta2RpclN5bmMocmVzb2x2ZVBhdGgoZGVzdGluYXRpb25EaXJlY3RvcnkpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgaW5wdXRGaWxlcykge1xuICAgIGNvbnN0IGlucHV0UGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vLi5cIiwgXCJhc3NldHNcIiwgZmlsZSk7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaW5wdXRQYXRoKSkge1xuICAgICAgbG9nLmluZm8oYEZpbGUgbm90IGZvdW5kOiAke2lucHV0UGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5wdXRQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgY29uc3QgcmVwbGFjZWRDb250ZW50ID0gY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwobmV3IFJlZ0V4cChWRVJTSU9OX1BMQUNFSE9MREVSLCBcImdcIiksIHZlcnNpb24udG9TdHJpbmcoKSlcbiAgICAgIC5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoTkFNRV9QTEFDRUhPTERFUiwgXCJnXCIpLCBjb250cmFjdE5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIC5yZXBsYWNlQWxsKFxuICAgICAgICBuZXcgUmVnRXhwKEVOVFJZX1BMQUNFSE9MREVSLCBcImdcIiksXG4gICAgICAgIGAke2NvbnRyYWN0TmFtZS50b0xvd2VyQ2FzZSgpfS5qc2BcbiAgICAgICk7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKHJlc29sdmVQYXRoKGRlc3RpbmF0aW9uRGlyZWN0b3J5KSwgZmlsZSksXG4gICAgICByZXBsYWNlZENvbnRlbnQsXG4gICAgICBcInV0Zi04XCJcbiAgICApO1xuXG4gICAgbG9nLmluZm8oXG4gICAgICBgQWRkICR7ZmlsZX0gdG8gJHtkZXN0aW5hdGlvbkRpcmVjdG9yeX0gZm9yIGNvbnRyYWN0ICR7Y29udHJhY3ROYW1lfWBcbiAgICApO1xuICB9XG59XG4iXX0=