@decaf-ts/fabric-weaver
Version:
template for ts projects
212 lines • 27.2 kB
JavaScript
import { Logging } from "@decaf-ts/logging";
import { FabricBinaries } from "../constants/fabric-binaries";
import { PeerCommands, PeerLifecycleChaincodeCommands, } from "../constants/fabric-peer";
import { runCommand } from "../../utils/child-process";
export class FabricPeerLifecycleChaincodeCommandBuilder {
constructor(logger) {
this.binName = FabricBinaries.PEER;
this.baseCommand = PeerCommands.LIFECYCLE_CHAINCODE;
this.command = PeerLifecycleChaincodeCommands.PACKAGE;
this.peerDetails = {};
this.args = [];
if (!logger)
this.log = Logging.for(FabricPeerLifecycleChaincodeCommandBuilder);
else
this.log = logger.for(FabricPeerLifecycleChaincodeCommandBuilder.name);
}
setCommand(command) {
if (command !== undefined) {
this.log.debug(`Setting command to ${command}`);
this.command = command;
}
return this;
}
setDestination(destination) {
if (destination !== undefined) {
this.log.debug(`Setting contract destination to ${destination}`);
this.destination = destination;
}
return this;
}
setContractPath(contractPath) {
if (contractPath !== undefined) {
this.log.debug(`Setting contract path to ${contractPath}`);
this.args.push(`--path ${contractPath}`);
}
return this;
}
setLang(lang) {
if (lang !== undefined) {
this.log.debug(`Setting contract language to ${lang}`);
this.args.push(`--lang ${lang}`);
}
return this;
}
setLabel(label) {
if (label !== undefined) {
this.log.debug(`Setting contract label to ${label}`);
this.args.push(`--label ${label}`);
}
return this;
}
setOrdererAddress(ordererAddress) {
if (ordererAddress !== undefined) {
this.log.debug(`Setting orderer address to ${ordererAddress}`);
this.args.push(`--orderer ${ordererAddress}`);
}
return this;
}
setChannelID(channelID) {
if (channelID !== undefined) {
this.log.debug(`Setting channel ID to ${channelID}`);
this.args.push(`--channelID ${channelID}`);
}
return this;
}
setContractName(contractName) {
if (contractName !== undefined) {
this.log.debug(`Setting contract name to ${contractName}`);
this.args.push(`--name ${contractName}`);
}
return this;
}
setVersion(version) {
if (version !== undefined) {
this.log.debug(`Setting contract version to ${version}`);
this.args.push(`--version ${version}`);
}
return this;
}
setPackageID(packageID) {
if (packageID !== undefined) {
this.log.debug(`Setting contract package ID to ${packageID}`);
this.args.push(`--package-id ${packageID}`);
}
return this;
}
setSequence(sequence) {
if (sequence !== undefined) {
this.log.debug(`Setting contract sequence to ${sequence}`);
this.args.push(`--sequence ${sequence}`);
}
return this;
}
enableTLS(enable) {
if (enable !== undefined && enable === true) {
this.log.debug(`Setting TLS enabled: ${enable}`);
this.args.push("--tls");
}
return this;
}
setTLSCAFile(caFile) {
if (caFile !== undefined) {
this.log.debug(`Setting TLS CA file: ${caFile}`);
this.args.push(`--cafile ${caFile}`);
}
return this;
}
setOrdererTLSHostnameOverride(ordererTLSHostnameOverride) {
if (ordererTLSHostnameOverride !== undefined) {
this.log.debug(`Setting orderer TLS hostname override to ${ordererTLSHostnameOverride}`);
this.args.push(`--ordererTLSHostnameOverride ${ordererTLSHostnameOverride}`);
}
return this;
}
setCollectionsConfigPath(collectionsConfigPath) {
if (collectionsConfigPath !== undefined) {
this.log.debug(`Setting collection configuration path to ${collectionsConfigPath}`);
this.args.push(`--collections-config ${collectionsConfigPath}`);
}
return this;
}
setPeerAddresses(peerAddresses) {
if (peerAddresses !== undefined &&
Array.isArray(peerAddresses) &&
peerAddresses.length > 0) {
this.log.debug(`Setting peer addresses: ${peerAddresses.join(", ")}`);
this.peerDetails.peerAddresses = peerAddresses;
}
return this;
}
setPeerTLSRoots(peerTLSRoots) {
if (peerTLSRoots !== undefined &&
Array.isArray(peerTLSRoots) &&
peerTLSRoots.length > 0) {
this.log.debug(`Setting peer TLS roots: ${peerTLSRoots.join(", ")}`);
this.peerDetails.peerTLSRoots = peerTLSRoots;
}
return this;
}
setOutput(output) {
if (output !== undefined) {
this.log.debug(`Setting output to ${output}`);
this.args.push(`--output ${output}`);
}
return this;
}
build() {
const command = [
this.getBinary(),
this.getBaseCommand(),
this.getCommand(),
this.destination,
...[...new Set(this.args)],
...(this.generatePeerDetails() || []),
]
.filter((item) => item !== undefined && item !== null && item !== "")
.join(" ");
this.log.debug(`Built command: ${command}`);
return command;
}
getBaseCommand() {
return this.baseCommand;
}
getCommand() {
return this.command;
}
getBinary() {
return this.binName;
}
getArgs() {
return [...new Set(this.args)];
}
generatePeerDetails() {
const peerAddresses = this.peerDetails.peerAddresses || undefined;
const peerTLSRoots = this.peerDetails.peerTLSRoots || undefined;
this.log.info(`Generating peer details: ${peerAddresses}, ${peerTLSRoots}...`);
if (peerAddresses !== undefined &&
Array.isArray(peerAddresses) &&
peerAddresses.length > 0) {
const peerCommands = peerAddresses.map((address, i) => {
let str = `--peerAddresses ${address}`;
if (peerTLSRoots !== undefined && Array.isArray(peerTLSRoots)) {
str += ` --tlsRootCertFiles ${peerTLSRoots[i]}`;
}
return str;
});
this.log.info(`Generated peer details: ${peerCommands}`);
return peerCommands;
}
return undefined;
}
async execute(options) {
const bin = this.getBinary();
const argz = [
this.getBaseCommand(),
this.getCommand(),
this.destination,
...this.getArgs(),
...(this.generatePeerDetails() || []),
].filter((item) => item !== undefined && item !== null && item !== "");
try {
// const regex = /\[\s*INFO\s*\] Listening on http/;
// can be used as a promise but to lock the logs running as execsync
return (await runCommand(bin, argz, options));
}
catch (error) {
this.log.error(`Error: Failed to execute the command: ${error}`);
process.exit(1);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLDhCQUE4QixHQUMvQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLE9BQU8sMENBQTBDO0lBZXJELFlBQVksTUFBZTtRQVpuQixZQUFPLEdBQW1CLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDOUMsZ0JBQVcsR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUM7UUFFL0MsWUFBTyxHQUFHLDhCQUE4QixDQUFDLE9BQU8sQ0FBQztRQUlqRCxnQkFBVyxHQUNqQixFQUFFLENBQUM7UUFFRyxTQUFJLEdBQWEsRUFBRSxDQUFDO1FBRzFCLElBQUksQ0FBQyxNQUFNO1lBQ1QsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7O1lBQ2hFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXdDO1FBQ2pELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxP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dEIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQXVDO1FBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRztZQUNYLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVztZQUNoQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN0QyxDQUFDLE1BQU0sQ0FDTixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQ2pELENBQUM7UUFFZCxJQUFJLENBQUM7WUFDSCxvREFBb0Q7WUFDcEQsb0VBQW9FO1lBQ3BFLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUE2QixDQUFDO1FBQzVFLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgRmFicmljQmluYXJpZXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1iaW5hcmllc1wiO1xuaW1wb3J0IHtcbiAgUGVlckNvbW1hbmRzLFxuICBQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZHMsXG59IGZyb20gXCIuLi9jb25zdGFudHMvZmFicmljLXBlZXJcIjtcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvY2hpbGQtcHJvY2Vzc1wiO1xuXG5leHBvcnQgY2xhc3MgRmFicmljUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRCdWlsZGVyIHtcbiAgcHJpdmF0ZSBsb2c6IExvZ2dlcjtcblxuICBwcml2YXRlIGJpbk5hbWU6IEZhYnJpY0JpbmFyaWVzID0gRmFicmljQmluYXJpZXMuUEVFUjtcbiAgcHJpdmF0ZSBiYXNlQ29tbWFuZCA9IFBlZXJDb21tYW5kcy5MSUZFQ1lDTEVfQ0hBSU5DT0RFO1xuXG4gIHByaXZhdGUgY29tbWFuZCA9IFBlZXJMaWZlY3ljbGVDaGFpbmNvZGVDb21tYW5kcy5QQUNLQUdFO1xuXG4gIHByaXZhdGUgZGVzdGluYXRpb24/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwZWVyRGV0YWlsczogeyBwZWVyQWRkcmVzc2VzPzogc3RyaW5nW107IHBlZXJUTFNSb290cz86IHN0cmluZ1tdIH0gPVxuICAgIHt9O1xuXG4gIHByaXZhdGUgYXJnczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAoIWxvZ2dlcilcbiAgICAgIHRoaXMubG9nID0gTG9nZ2luZy5mb3IoRmFicmljUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRCdWlsZGVyKTtcbiAgICBlbHNlIHRoaXMubG9nID0gbG9nZ2VyLmZvcihGYWJyaWNQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZEJ1aWxkZXIubmFtZSk7XG4gIH1cblxuICBzZXRDb21tYW5kKGNvbW1hbmQ/OiBQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZHMpOiB0aGlzIHtcbiAgICBpZiAoY29tbWFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb21tYW5kIHRvICR7Y29tbWFuZH1gKTtcbiAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVzdGluYXRpb24oZGVzdGluYXRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgZGVzdGluYXRpb24gdG8gJHtkZXN0aW5hdGlvbn1gKTtcbiAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb250cmFjdFBhdGgoY29udHJhY3RQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbnRyYWN0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBwYXRoIHRvICR7Y29udHJhY3RQYXRofWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tcGF0aCAke2NvbnRyYWN0UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMYW5nKGxhbmc/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAobGFuZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBsYW5ndWFnZSB0byAke2xhbmd9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1sYW5nICR7bGFuZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRMYWJlbChsYWJlbD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChsYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBsYWJlbCB0byAke2xhYmVsfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tbGFiZWwgJHtsYWJlbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcmRlcmVyQWRkcmVzcyhvcmRlcmVyQWRkcmVzcz86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvcmRlcmVyQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvcmRlcmVyIGFkZHJlc3MgdG8gJHtvcmRlcmVyQWRkcmVzc31gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLW9yZGVyZXIgJHtvcmRlcmVyQWRkcmVzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDaGFubmVsSUQoY2hhbm5lbElEPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNoYW5uZWxJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjaGFubmVsIElEIHRvICR7Y2hhbm5lbElEfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tY2hhbm5lbElEICR7Y2hhbm5lbElEfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENvbnRyYWN0TmFtZShjb250cmFjdE5hbWU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoY29udHJhY3ROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IG5hbWUgdG8gJHtjb250cmFjdE5hbWV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1uYW1lICR7Y29udHJhY3ROYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFZlcnNpb24odmVyc2lvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IHZlcnNpb24gdG8gJHt2ZXJzaW9ufWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tdmVyc2lvbiAke3ZlcnNpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGFja2FnZUlEKHBhY2thZ2VJRD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChwYWNrYWdlSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgcGFja2FnZSBJRCB0byAke3BhY2thZ2VJRH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXBhY2thZ2UtaWQgJHtwYWNrYWdlSUR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U2VxdWVuY2Uoc2VxdWVuY2U/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoc2VxdWVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3Qgc2VxdWVuY2UgdG8gJHtzZXF1ZW5jZX1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXNlcXVlbmNlICR7c2VxdWVuY2V9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5hYmxlVExTKGVuYWJsZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICBpZiAoZW5hYmxlICE9PSB1bmRlZmluZWQgJiYgZW5hYmxlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgZW5hYmxlZDogJHtlbmFibGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChcIi0tdGxzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFRMU0NBRmlsZShjYUZpbGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoY2FGaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBDQSBmaWxlOiAke2NhRmlsZX1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNhZmlsZSAke2NhRmlsZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZShvcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZT86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgb3JkZXJlciBUTFMgaG9zdG5hbWUgb3ZlcnJpZGUgdG8gJHtvcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goXG4gICAgICAgIGAtLW9yZGVyZXJUTFNIb3N0bmFtZU92ZXJyaWRlICR7b3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb2xsZWN0aW9uc0NvbmZpZ1BhdGgoY29sbGVjdGlvbnNDb25maWdQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbGxlY3Rpb25zQ29uZmlnUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgYFNldHRpbmcgY29sbGVjdGlvbiBjb25maWd1cmF0aW9uIHBhdGggdG8gJHtjb2xsZWN0aW9uc0NvbmZpZ1BhdGh9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNvbGxlY3Rpb25zLWNvbmZpZyAke2NvbGxlY3Rpb25zQ29uZmlnUGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRQZWVyQWRkcmVzc2VzKHBlZXJBZGRyZXNzZXM/OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGlmIChcbiAgICAgIHBlZXJBZGRyZXNzZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShwZWVyQWRkcmVzc2VzKSAmJlxuICAgICAgcGVlckFkZHJlc3Nlcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwZWVyIGFkZHJlc3NlczogJHtwZWVyQWRkcmVzc2VzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgIHRoaXMucGVlckRldGFpbHMucGVlckFkZHJlc3NlcyA9IHBlZXJBZGRyZXNzZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGVlclRMU1Jvb3RzKHBlZXJUTFNSb290cz86IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgaWYgKFxuICAgICAgcGVlclRMU1Jvb3RzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocGVlclRMU1Jvb3RzKSAmJlxuICAgICAgcGVlclRMU1Jvb3RzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHBlZXIgVExTIHJvb3RzOiAke3BlZXJUTFNSb290cy5qb2luKFwiLCBcIil9YCk7XG4gICAgICB0aGlzLnBlZXJEZXRhaWxzLnBlZXJUTFNSb290cyA9IHBlZXJUTFNSb290cztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRPdXRwdXQob3V0cHV0Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKG91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBvdXRwdXQgdG8gJHtvdXRwdXR9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1vdXRwdXQgJHtvdXRwdXR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYnVpbGQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21tYW5kOiBzdHJpbmcgPSBbXG4gICAgICB0aGlzLmdldEJpbmFyeSgpLFxuICAgICAgdGhpcy5nZXRCYXNlQ29tbWFuZCgpLFxuICAgICAgdGhpcy5nZXRDb21tYW5kKCksXG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgLi4uWy4uLm5ldyBTZXQodGhpcy5hcmdzKV0sXG4gICAgICAuLi4odGhpcy5nZW5lcmF0ZVBlZXJEZXRhaWxzKCkgfHwgW10pLFxuICAgIF1cbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IFwiXCIpXG4gICAgICAuam9pbihcIiBcIik7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQnVpbHQgY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgIHJldHVybiBjb21tYW5kO1xuICB9XG5cbiAgZ2V0QmFzZUNvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29tbWFuZDtcbiAgfVxuXG4gIGdldENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kO1xuICB9XG5cbiAgZ2V0QmluYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmluTmFtZTtcbiAgfVxuXG4gIGdldEFyZ3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0aGlzLmFyZ3MpXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVQZWVyRGV0YWlscygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGVlckFkZHJlc3NlcyA9IHRoaXMucGVlckRldGFpbHMucGVlckFkZHJlc3NlcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVlclRMU1Jvb3RzID0gdGhpcy5wZWVyRGV0YWlscy5wZWVyVExTUm9vdHMgfHwgdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBHZW5lcmF0aW5nIHBlZXIgZGV0YWlsczogJHtwZWVyQWRkcmVzc2VzfSwgJHtwZWVyVExTUm9vdHN9Li4uYFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcGVlckFkZHJlc3NlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBBcnJheS5pc0FycmF5KHBlZXJBZGRyZXNzZXMpICYmXG4gICAgICBwZWVyQWRkcmVzc2VzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IHBlZXJDb21tYW5kcyA9IHBlZXJBZGRyZXNzZXMubWFwKChhZGRyZXNzLCBpKSA9PiB7XG4gICAgICAgIGxldCBzdHIgPSBgLS1wZWVyQWRkcmVzc2VzICR7YWRkcmVzc31gO1xuXG4gICAgICAgIGlmIChwZWVyVExTUm9vdHMgIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KHBlZXJUTFNSb290cykpIHtcbiAgICAgICAgICBzdHIgKz0gYCAtLXRsc1Jvb3RDZXJ0RmlsZXMgJHtwZWVyVExTUm9vdHNbaV19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sb2cuaW5mbyhgR2VuZXJhdGVkIHBlZXIgZGV0YWlsczogJHtwZWVyQ29tbWFuZHN9YCk7XG5cbiAgICAgIHJldHVybiBwZWVyQ29tbWFuZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUob3B0aW9ucz86IHsgW2luZGV4ZXI6IHN0cmluZ106IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYmluID0gdGhpcy5nZXRCaW5hcnkoKTtcbiAgICBjb25zdCBhcmd6ID0gW1xuICAgICAgdGhpcy5nZXRCYXNlQ29tbWFuZCgpLFxuICAgICAgdGhpcy5nZXRDb21tYW5kKCksXG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLFxuICAgICAgLi4udGhpcy5nZXRBcmdzKCksXG4gICAgICAuLi4odGhpcy5nZW5lcmF0ZVBlZXJEZXRhaWxzKCkgfHwgW10pLFxuICAgIF0uZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IFwiXCJcbiAgICApIGFzIHN0cmluZ1tdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGNvbnN0IHJlZ2V4ID0gL1xcW1xccypJTkZPXFxzKlxcXSBMaXN0ZW5pbmcgb24gaHR0cC87XG4gICAgICAvLyBjYW4gYmUgdXNlZCBhcyBhIHByb21pc2UgYnV0IHRvIGxvY2sgdGhlIGxvZ3MgcnVubmluZyBhcyBleGVjc3luY1xuICAgICAgcmV0dXJuIChhd2FpdCBydW5Db21tYW5kKGJpbiwgYXJneiwgb3B0aW9ucykpIGFzIHVua25vd24gYXMgUHJvbWlzZTx2b2lkPjtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEVycm9yOiBGYWlsZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZDogJHtlcnJvcn1gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==