@c4tplatform/caminojs
Version:
Camino Platform JS Library
175 lines • 20.8 kB
JavaScript
"use strict";
/**
* @packageDocumentation
* @module Common-AssetAmount
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.StandardAssetAmountDestination = exports.AssetAmount = void 0;
const buffer_1 = require("buffer/");
const bn_js_1 = __importDefault(require("bn.js"));
const errors_1 = require("../utils/errors");
/**
* Class for managing asset amounts in the UTXOSet fee calcuation
*/
class AssetAmount {
constructor(assetID, amount, burn) {
// assetID that is amount is managing.
this.assetID = buffer_1.Buffer.alloc(32);
// amount of this asset that should be sent.
this.amount = new bn_js_1.default(0);
// burn is the amount of this asset that should be burned.
this.burn = new bn_js_1.default(0);
// spent is the total amount of this asset that has been consumed.
this.spent = new bn_js_1.default(0);
// stakeableLockSpent is the amount of this asset that has been consumed that
// was locked.
this.stakeableLockSpent = new bn_js_1.default(0);
// change is the excess amount of this asset that was consumed over the amount
// requested to be consumed(amount + burn).
this.change = new bn_js_1.default(0);
// stakeableLockChange is a flag to mark if the input that generated the
// change was locked.
this.stakeableLockChange = false;
// finished is a convenience flag to track "spent >= amount + burn"
this.finished = false;
this.getAssetID = () => {
return this.assetID;
};
this.getAssetIDString = () => {
return this.assetID.toString("hex");
};
this.getAmount = () => {
return this.amount;
};
this.getSpent = () => {
return this.spent;
};
this.getBurn = () => {
return this.burn;
};
this.getChange = () => {
return this.change;
};
this.getStakeableLockSpent = () => {
return this.stakeableLockSpent;
};
this.getStakeableLockChange = () => {
return this.stakeableLockChange;
};
this.isFinished = () => {
return this.finished;
};
// spendAmount should only be called if this asset is still awaiting more
// funds to consume.
this.spendAmount = (amt, stakeableLocked = false) => {
if (this.finished) {
/* istanbul ignore next */
throw new errors_1.InsufficientFundsError("Error - AssetAmount.spendAmount: attempted to spend " + "excess funds");
}
this.spent = this.spent.add(amt);
if (stakeableLocked) {
this.stakeableLockSpent = this.stakeableLockSpent.add(amt);
}
const total = this.amount.add(this.burn);
if (this.spent.gte(total)) {
this.change = this.spent.sub(total);
if (stakeableLocked) {
this.stakeableLockChange = true;
}
this.finished = true;
}
return this.finished;
};
this.assetID = assetID;
this.amount = typeof amount === "undefined" ? new bn_js_1.default(0) : amount;
this.burn = typeof burn === "undefined" ? new bn_js_1.default(0) : burn;
this.spent = new bn_js_1.default(0);
this.stakeableLockSpent = new bn_js_1.default(0);
this.stakeableLockChange = false;
}
}
exports.AssetAmount = AssetAmount;
class StandardAssetAmountDestination {
constructor(destinations, destinationsThreshold, senders, changeAddresses, changeAddressesThreshold) {
this.amounts = [];
this.destinations = [];
this.destinationsThreshold = 0;
this.senders = [];
this.changeAddresses = [];
this.changeAddressesThreshold = 0;
this.amountkey = {};
this.inputs = [];
this.outputs = [];
this.change = [];
// TODO: should this function allow for repeated calls with the same
// assetID?
this.addAssetAmount = (assetID, amount, burn) => {
let aa = new AssetAmount(assetID, amount, burn);
this.amounts.push(aa);
this.amountkey[aa.getAssetIDString()] = aa;
};
this.addInput = (input) => {
this.inputs.push(input);
};
this.addOutput = (output) => {
this.outputs.push(output);
};
this.addChange = (output) => {
this.change.push(output);
};
this.getAmounts = () => {
return this.amounts;
};
this.getDestinations = () => {
return this.destinations;
};
this.getDestinationsThreshold = () => {
return this.destinationsThreshold;
};
this.getSenders = () => {
return this.senders;
};
this.getChangeAddresses = () => {
return this.changeAddresses;
};
this.getChangeAddressesThreshold = () => {
return this.changeAddressesThreshold;
};
this.getAssetAmount = (assetHexStr) => {
return this.amountkey[`${assetHexStr}`];
};
this.assetExists = (assetHexStr) => {
return assetHexStr in this.amountkey;
};
this.getInputs = () => {
return this.inputs;
};
this.getOutputs = () => {
return this.outputs;
};
this.getChangeOutputs = () => {
return this.change;
};
this.getAllOutputs = () => {
return this.outputs.concat(this.change);
};
this.canComplete = () => {
for (let i = 0; i < this.amounts.length; i++) {
if (!this.amounts[`${i}`].isFinished()) {
return false;
}
}
return true;
};
this.destinations = destinations;
this.destinationsThreshold = destinationsThreshold;
this.changeAddresses = changeAddresses;
this.changeAddressesThreshold = changeAddressesThreshold;
this.senders = senders;
}
}
exports.StandardAssetAmountDestination = StandardAssetAmountDestination;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRhbW91bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL2Fzc2V0YW1vdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQUVILG9DQUFnQztBQUNoQyxrREFBc0I7QUFHdEIsNENBQXdEO0FBRXhEOztHQUVHO0FBQ0gsTUFBYSxXQUFXO0lBcUZ0QixZQUFZLE9BQWUsRUFBRSxNQUFVLEVBQUUsSUFBUTtRQXBGakQsc0NBQXNDO1FBQzVCLFlBQU8sR0FBVyxlQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzVDLDRDQUE0QztRQUNsQyxXQUFNLEdBQU8sSUFBSSxlQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEMsMERBQTBEO1FBQ2hELFNBQUksR0FBTyxJQUFJLGVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5QixrRUFBa0U7UUFDeEQsVUFBSyxHQUFPLElBQUksZUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9CLDZFQUE2RTtRQUM3RSxjQUFjO1FBQ0osdUJBQWtCLEdBQU8sSUFBSSxlQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFNUMsOEVBQThFO1FBQzlFLDJDQUEyQztRQUNqQyxXQUFNLEdBQU8sSUFBSSxlQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEMsd0VBQXdFO1FBQ3hFLHFCQUFxQjtRQUNYLHdCQUFtQixHQUFZLEtBQUssQ0FBQTtRQUU5QyxtRUFBbUU7UUFDekQsYUFBUSxHQUFZLEtBQUssQ0FBQTtRQUVuQyxlQUFVLEdBQUcsR0FBVyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUNyQixDQUFDLENBQUE7UUFFRCxxQkFBZ0IsR0FBRyxHQUFXLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQyxDQUFDLENBQUE7UUFFRCxjQUFT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QUFZLEVBQUU7WUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3RDLE9BQU8sS0FBSyxDQUFBO2lCQUNiO2FBQ0Y7WUFDRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUMsQ0FBQTtRQVNDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTtRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtRQUN0QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUE7UUFDeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7SUFDeEIsQ0FBQztDQUNGO0FBekdELHdFQXlHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIENvbW1vbi1Bc3NldEFtb3VudFxuICovXG5cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCJcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIlxuaW1wb3J0IHsgU3RhbmRhcmRUcmFuc2ZlcmFibGVPdXRwdXQgfSBmcm9tIFwiLi9vdXRwdXRcIlxuaW1wb3J0IHsgU3RhbmRhcmRUcmFuc2ZlcmFibGVJbnB1dCB9IGZyb20gXCIuL2lucHV0XCJcbmltcG9ydCB7IEluc3VmZmljaWVudEZ1bmRzRXJyb3IgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JzXCJcblxuLyoqXG4gKiBDbGFzcyBmb3IgbWFuYWdpbmcgYXNzZXQgYW1vdW50cyBpbiB0aGUgVVRYT1NldCBmZWUgY2FsY3VhdGlvblxuICovXG5leHBvcnQgY2xhc3MgQXNzZXRBbW91bnQge1xuICAvLyBhc3NldElEIHRoYXQgaXMgYW1vdW50IGlzIG1hbmFnaW5nLlxuICBwcm90ZWN0ZWQgYXNzZXRJRDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDMyKVxuICAvLyBhbW91bnQgb2YgdGhpcyBhc3NldCB0aGF0IHNob3VsZCBiZSBzZW50LlxuICBwcm90ZWN0ZWQgYW1vdW50OiBCTiA9IG5ldyBCTigwKVxuICAvLyBidXJuIGlzIHRoZSBhbW91bnQgb2YgdGhpcyBhc3NldCB0aGF0IHNob3VsZCBiZSBidXJuZWQuXG4gIHByb3RlY3RlZCBidXJuOiBCTiA9IG5ldyBCTigwKVxuXG4gIC8vIHNwZW50IGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGhpcyBhc3NldCB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkLlxuICBwcm90ZWN0ZWQgc3BlbnQ6IEJOID0gbmV3IEJOKDApXG4gIC8vIHN0YWtlYWJsZUxvY2tTcGVudCBpcyB0aGUgYW1vdW50IG9mIHRoaXMgYXNzZXQgdGhhdCBoYXMgYmVlbiBjb25zdW1lZCB0aGF0XG4gIC8vIHdhcyBsb2NrZWQuXG4gIHByb3RlY3RlZCBzdGFrZWFibGVMb2NrU3BlbnQ6IEJOID0gbmV3IEJOKDApXG5cbiAgLy8gY2hhbmdlIGlzIHRoZSBleGNlc3MgYW1vdW50IG9mIHRoaXMgYXNzZXQgdGhhdCB3YXMgY29uc3VtZWQgb3ZlciB0aGUgYW1vdW50XG4gIC8vIHJlcXVlc3RlZCB0byBiZSBjb25zdW1lZChhbW91bnQgKyBidXJuKS5cbiAgcHJvdGVjdGVkIGNoYW5nZTogQk4gPSBuZXcgQk4oMClcbiAgLy8gc3Rha2VhYmxlTG9ja0NoYW5nZSBpcyBhIGZsYWcgdG8gbWFyayBpZiB0aGUgaW5wdXQgdGhhdCBnZW5lcmF0ZWQgdGhlXG4gIC8vIGNoYW5nZSB3YXMgbG9ja2VkLlxuICBwcm90ZWN0ZWQgc3Rha2VhYmxlTG9ja0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLy8gZmluaXNoZWQgaXMgYSBjb252ZW5pZW5jZSBmbGFnIHRvIHRyYWNrIFwic3BlbnQgPj0gYW1vdW50ICsgYnVyblwiXG4gIHByb3RlY3RlZCBmaW5pc2hlZDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgZ2V0QXNzZXRJRCA9ICgpOiBCdWZmZXIgPT4ge1xuICAgIHJldHVybiB0aGlzLmFzc2V0SURcbiAgfVxuXG4gIGdldEFzc2V0SURTdHJpbmcgPSAoKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gdGhpcy5hc3NldElELnRvU3RyaW5nKFwiaGV4XCIpXG4gIH1cblxuICBnZXRBbW91bnQgPSAoKTogQk4gPT4ge1xuICAgIHJldHVybiB0aGlzLmFtb3VudFxuICB9XG5cbiAgZ2V0U3BlbnQgPSAoKTogQk4gPT4ge1xuICAgIHJldHVybiB0aGlzLnNwZW50XG4gIH1cblxuICBnZXRCdXJuID0gKCk6IEJOID0+IHtcbiAgICByZXR1cm4gdGhpcy5idXJuXG4gIH1cblxuICBnZXRDaGFuZ2UgPSAoKTogQk4gPT4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZVxuICB9XG5cbiAgZ2V0U3Rha2VhYmxlTG9ja1NwZW50ID0gKCk6IEJOID0+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFrZWFibGVMb2NrU3BlbnRcbiAgfVxuXG4gIGdldFN0YWtlYWJsZUxvY2tDaGFuZ2UgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc3Rha2VhYmxlTG9ja0NoYW5nZVxuICB9XG5cbiAgaXNGaW5pc2hlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hlZFxuICB9XG5cbiAgLy8gc3BlbmRBbW91bnQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgYXNzZXQgaXMgc3RpbGwgYXdhaXRpbmcgbW9yZVxuICAvLyBmdW5kcyB0byBjb25zdW1lLlxuICBzcGVuZEFtb3VudCA9IChhbXQ6IEJOLCBzdGFrZWFibGVMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdGhyb3cgbmV3IEluc3VmZmljaWVudEZ1bmRzRXJyb3IoXG4gICAgICAgIFwiRXJyb3IgLSBBc3NldEFtb3VudC5zcGVuZEFtb3VudDogYXR0ZW1wdGVkIHRvIHNwZW5kIFwiICsgXCJleGNlc3MgZnVuZHNcIlxuICAgICAgKVxuICAgIH1cbiAgICB0aGlzLnNwZW50ID0gdGhpcy5zcGVudC5hZGQoYW10KVxuICAgIGlmIChzdGFrZWFibGVMb2NrZWQpIHtcbiAgICAgIHRoaXMuc3Rha2VhYmxlTG9ja1NwZW50ID0gdGhpcy5zdGFrZWFibGVMb2NrU3BlbnQuYWRkKGFtdClcbiAgICB9XG5cbiAgICBjb25zdCB0b3RhbDogQk4gPSB0aGlzLmFtb3VudC5hZGQodGhpcy5idXJuKVxuICAgIGlmICh0aGlzLnNwZW50Lmd0ZSh0b3RhbCkpIHtcbiAgICAgIHRoaXMuY2hhbmdlID0gdGhpcy5zcGVudC5zdWIodG90YWwpXG4gICAgICBpZiAoc3Rha2VhYmxlTG9ja2VkKSB7XG4gICAgICAgIHRoaXMuc3Rha2VhYmxlTG9ja0NoYW5nZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaGVkXG4gIH1cblxuICBjb25zdHJ1Y3Rvcihhc3NldElEOiBCdWZmZXIsIGFtb3VudDogQk4sIGJ1cm46IEJOKSB7XG4gICAgdGhpcy5hc3NldElEID0gYXNzZXRJRFxuICAgIHRoaXMuYW1vdW50ID0gdHlwZW9mIGFtb3VudCA9PT0gXCJ1bmRlZmluZWRcIiA/IG5ldyBCTigwKSA6IGFtb3VudFxuICAgIHRoaXMuYnVybiA9IHR5cGVvZiBidXJuID09PSBcInVuZGVmaW5lZFwiID8gbmV3IEJOKDApIDogYnVyblxuICAgIHRoaXMuc3BlbnQgPSBuZXcgQk4oMClcbiAgICB0aGlzLnN0YWtlYWJsZUxvY2tTcGVudCA9IG5ldyBCTigwKVxuICAgIHRoaXMuc3Rha2VhYmxlTG9ja0NoYW5nZSA9IGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YW5kYXJkQXNzZXRBbW91bnREZXN0aW5hdGlvbjxcbiAgVE8gZXh0ZW5kcyBTdGFuZGFyZFRyYW5zZmVyYWJsZU91dHB1dCxcbiAgVEkgZXh0ZW5kcyBTdGFuZGFyZFRyYW5zZmVyYWJsZUlucHV0XG4+IHtcbiAgcHJvdGVjdGVkIGFtb3VudHM6IEFzc2V0QW1vdW50W10gPSBbXVxuICBwcm90ZWN0ZWQgZGVzdGluYXRpb25zOiBCdWZmZXJbXSA9IFtdXG4gIHByb3RlY3RlZCBkZXN0aW5hdGlvbnNUaHJlc2hvbGQ6IG51bWJlciA9IDBcbiAgcHJvdGVjdGVkIHNlbmRlcnM6IEJ1ZmZlcltdID0gW11cbiAgcHJvdGVjdGVkIGNoYW5nZUFkZHJlc3NlczogQnVmZmVyW10gPSBbXVxuICBwcm90ZWN0ZWQgY2hhbmdlQWRkcmVzc2VzVGhyZXNob2xkOiBudW1iZXIgPSAwXG4gIHByb3RlY3RlZCBhbW91bnRrZXk6IG9iamVjdCA9IHt9XG4gIHByb3RlY3RlZCBpbnB1dHM6IFRJW10gPSBbXVxuICBwcm90ZWN0ZWQgb3V0cHV0czogVE9bXSA9IFtdXG4gIHByb3RlY3RlZCBjaGFuZ2U6IFRPW10gPSBbXVxuXG4gIC8vIFRPRE86IHNob3VsZCB0aGlzIGZ1bmN0aW9uIGFsbG93IGZvciByZXBlYXRlZCBjYWxscyB3aXRoIHRoZSBzYW1lXG4gIC8vICAgICAgIGFzc2V0SUQ/XG4gIGFkZEFzc2V0QW1vdW50ID0gKGFzc2V0SUQ6IEJ1ZmZlciwgYW1vdW50OiBCTiwgYnVybjogQk4pID0+IHtcbiAgICBsZXQgYWE6IEFzc2V0QW1vdW50ID0gbmV3IEFzc2V0QW1vdW50KGFzc2V0SUQsIGFtb3VudCwgYnVybilcbiAgICB0aGlzLmFtb3VudHMucHVzaChhYSlcbiAgICB0aGlzLmFtb3VudGtleVthYS5nZXRBc3NldElEU3RyaW5nKCldID0gYWFcbiAgfVxuXG4gIGFkZElucHV0ID0gKGlucHV0OiBUSSkgPT4ge1xuICAgIHRoaXMuaW5wdXRzLnB1c2goaW5wdXQpXG4gIH1cblxuICBhZGRPdXRwdXQgPSAob3V0cHV0OiBUTykgPT4ge1xuICAgIHRoaXMub3V0cHV0cy5wdXNoKG91dHB1dClcbiAgfVxuXG4gIGFkZENoYW5nZSA9IChvdXRwdXQ6IFRPKSA9PiB7XG4gICAgdGhpcy5jaGFuZ2UucHVzaChvdXRwdXQpXG4gIH1cblxuICBnZXRBbW91bnRzID0gKCk6IEFzc2V0QW1vdW50W10gPT4ge1xuICAgIHJldHVybiB0aGlzLmFtb3VudHNcbiAgfVxuXG4gIGdldERlc3RpbmF0aW9ucyA9ICgpOiBCdWZmZXJbXSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb25zXG4gIH1cblxuICBnZXREZXN0aW5hdGlvbnNUaHJlc2hvbGQgPSAoKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbnNUaHJlc2hvbGRcbiAgfVxuXG4gIGdldFNlbmRlcnMgPSAoKTogQnVmZmVyW10gPT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRlcnNcbiAgfVxuXG4gIGdldENoYW5nZUFkZHJlc3NlcyA9ICgpOiBCdWZmZXJbXSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlQWRkcmVzc2VzXG4gIH1cblxuICBnZXRDaGFuZ2VBZGRyZXNzZXNUaHJlc2hvbGQgPSAoKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VBZGRyZXNzZXNUaHJlc2hvbGRcbiAgfVxuXG4gIGdldEFzc2V0QW1vdW50ID0gKGFzc2V0SGV4U3RyOiBzdHJpbmcpOiBBc3NldEFtb3VudCA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYW1vdW50a2V5W2Ake2Fzc2V0SGV4U3RyfWBdXG4gIH1cblxuICBhc3NldEV4aXN0cyA9IChhc3NldEhleFN0cjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGFzc2V0SGV4U3RyIGluIHRoaXMuYW1vdW50a2V5XG4gIH1cblxuICBnZXRJbnB1dHMgPSAoKTogVElbXSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRzXG4gIH1cblxuICBnZXRPdXRwdXRzID0gKCk6IFRPW10gPT4ge1xuICAgIHJldHVybiB0aGlzLm91dHB1dHNcbiAgfVxuXG4gIGdldENoYW5nZU91dHB1dHMgPSAoKTogVE9bXSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlXG4gIH1cblxuICBnZXRBbGxPdXRwdXRzID0gKCk6IFRPW10gPT4ge1xuICAgIHJldHVybiB0aGlzLm91dHB1dHMuY29uY2F0KHRoaXMuY2hhbmdlKVxuICB9XG5cbiAgY2FuQ29tcGxldGUgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYW1vdW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmFtb3VudHNbYCR7aX1gXS5pc0ZpbmlzaGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBkZXN0aW5hdGlvbnM6IEJ1ZmZlcltdLFxuICAgIGRlc3RpbmF0aW9uc1RocmVzaG9sZDogbnVtYmVyLFxuICAgIHNlbmRlcnM6IEJ1ZmZlcltdLFxuICAgIGNoYW5nZUFkZHJlc3NlczogQnVmZmVyW10sXG4gICAgY2hhbmdlQWRkcmVzc2VzVGhyZXNob2xkOiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbnMgPSBkZXN0aW5hdGlvbnNcbiAgICB0aGlzLmRlc3RpbmF0aW9uc1RocmVzaG9sZCA9IGRlc3RpbmF0aW9uc1RocmVzaG9sZFxuICAgIHRoaXMuY2hhbmdlQWRkcmVzc2VzID0gY2hhbmdlQWRkcmVzc2VzXG4gICAgdGhpcy5jaGFuZ2VBZGRyZXNzZXNUaHJlc2hvbGQgPSBjaGFuZ2VBZGRyZXNzZXNUaHJlc2hvbGRcbiAgICB0aGlzLnNlbmRlcnMgPSBzZW5kZXJzXG4gIH1cbn1cbiJdfQ==