@witnet/ethers
Version:
Wit/Oracle Ethers Framework package for EVM-compatible projects
177 lines • 26.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WitRandomness = void 0;
const ethers_1 = require("ethers");
const utils_1 = require("../utils");
const WitAppliance_1 = require("./WitAppliance");
class WitRandomness extends WitAppliance_1.WitAppliance {
constructor(witOracle, at) {
super(witOracle, "WitRandomnessV3", at);
this._legacy = new ethers_1.Contract(at, utils_1.ABIs["WitRandomnessV2"], this.signer);
}
static async at(witOracle, target) {
const randomizer = new WitRandomness(witOracle, target);
try {
let oracleAddr;
try {
oracleAddr = await randomizer.contract.witOracle.staticCall();
}
catch {
const abi = ["function witnet() public view returns (address)",];
const contract = new ethers_1.Contract(target, abi, randomizer.signer);
oracleAddr = await contract.witnet.staticCall();
}
if (oracleAddr !== witOracle.address) {
throw new Error(`WitRandomness at ${target}: mismatching Wit/Oracle address (${oracleAddr})`);
}
}
catch (error) {
throw new Error(`WitRandomness at ${target}: cannot fetch Wit/Oracle address\n${error?.stack?.split('\n')[0] || error}`);
}
return randomizer;
}
async class() {
return this.contract.class.staticCall();
}
async clone(curator, options) {
const tx = await this.contract.clone.populateTransaction(curator);
tx.gasPrice = options?.evmGasPrice || tx?.gasPrice;
return this.signer
.sendTransaction(tx)
.then(response => {
if (options?.onTransaction) {
options.onTransaction(response.hash);
}
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
})
.then(receipt => {
if (options?.onTransactionReceipt) {
options.onTransactionReceipt(receipt);
}
return receipt;
});
}
async estimateRandomizeFee(evmGasPrice) {
return this.contract
.getFunction("estimateRandomizeFee(uint256)")
.staticCall(evmGasPrice);
}
async fetchRandomnessAfter(evmBlockNumber) {
return this
.isRandomized(evmBlockNumber)
.then(isRandomized => {
return (isRandomized
? this.contract.fetchRandomnessAfter.staticCall(evmBlockNumber)
: undefined);
});
}
async fetchRandomnessAfterProof(evmBlockNumber) {
return this
.contract
.fetchRandomnessAfterProof
.staticCall(evmBlockNumber)
.then(result => ({
finality: BigInt(result[3]),
timestamp: Number(result[1]),
trail: result[2],
uuid: result[0],
}));
}
async filterEvents(options) {
let logs = await this._legacy.queryFilter("Randomizing", options.fromBlock, options?.toBlock);
if (logs && logs.length > 0) {
return logs.filter(log => !log.removed).map(log => ({
queryId: log?.args[3],
randomizeBlock: log?.args[0],
transactionHash: log.transactionHash,
}));
}
else {
return this.contract.queryFilter("Randomizing", options.fromBlock, options?.toBlock)
.then(logs => logs.filter(log => !log.removed))
.then(logs => logs.map(log => ({
queryId: log?.args[2],
randomizeBlock: log?.args[1],
requester: log?.args[0],
transactionHash: log.transactionHash,
})));
}
}
async getEvmBase() {
return this.contract
.base
.staticCall();
}
async getEvmConsumer() {
return this.contract
.consumer
.staticCall();
}
async getEvmCurator() {
return this.contract
.owner
.staticCall();
}
async getSettings() {
const [queryParams, waitingBlocks] = await Promise.all([
this.contract.getRandomizeQueryParams(),
this.contract.getRandomizeWaitingBlocks(),
]);
return {
callbackGasLimit: Number(queryParams[0]),
extraFeePercentage: Number(queryParams[1]),
randomizeWaitBlocks: Number(waitingBlocks),
witCommitteeSize: Number(queryParams[2]),
witInclusionFees: BigInt(queryParams[3]),
};
}
async getLastRandomizeBlock() {
return this.contract
.getFunction("getLastRandomizeBlock()")
.staticCall();
}
async getRandomizeStatus(evmBlockNumber) {
return this
.contract
.getRandomizeStatus
.staticCall(evmBlockNumber)
.then(result => {
switch (Number(result)) {
case 1: return "Awaiting";
case 2: return "Ready";
case 3: return "Error";
case 4: return "Finalizing";
}
return "Void";
});
}
async isRandomized(evmBlockNumber) {
return this
.contract
.isRandomized
.staticCall(evmBlockNumber);
}
async randomize(options) {
const evmGasPrice = options?.evmGasPrice || (await this.provider.getFeeData()).gasPrice || 0n;
const evmRandomizeFee = await this.estimateRandomizeFee(evmGasPrice);
const evmTransaction = await this.contract
.getFunction("randomize()")
.populateTransaction();
evmTransaction.gasPrice = evmGasPrice || evmTransaction?.gasPrice;
evmTransaction.value = evmRandomizeFee;
return this.signer
.sendTransaction(evmTransaction)
.then(response => {
if (options?.onRandomizeTransaction)
options.onRandomizeTransaction(response.hash);
return response.wait(options?.evmConfirmations || 1, options?.evmTimeout);
})
.then(receipt => {
if (options?.onRandomizeTransactionReceipt)
options.onRandomizeTransactionReceipt(receipt);
return receipt;
});
}
}
exports.WitRandomness = WitRandomness;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0UmFuZG9tbmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0UmFuZG9tbmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FPZTtBQUdmLG9DQUErQjtBQUcvQixpREFBNkM7QUFHN0MsTUFBYSxhQUFjLFNBQVEsMkJBQVk7SUFJM0MsWUFBdUIsU0FBb0IsRUFBRSxFQUFVO1FBQ25ELEtBQUssQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFRLENBQUMsRUFBRSxFQUFFLFlBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBb0IsRUFBRSxNQUFjO1FBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUN2RCxJQUFJLENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQTtZQUNkLElBQUksQ0FBQztnQkFDRCxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUNqRSxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNMLE1BQU0sR0FBRyxHQUFHLENBQUUsaURBQWlELEVBQUcsQ0FBQTtnQkFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxpQkFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUM3RCxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQ25ELENBQUM7WUFDRCxJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25D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LFFBQVEsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxPQUFPLEVBQUUsc0JBQXNCO2dCQUFFLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQzdFLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNaLElBQUksT0FBTyxFQUFFLDZCQUE2QjtnQkFBRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0YsT0FBTyxPQUFPLENBQUE7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0NBQ0o7QUF2TkQsc0NBdU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgXHJcbiAgICBCbG9ja1RhZyxcclxuICAgIENvbnRyYWN0LCBcclxuICAgIENvbnRyYWN0VHJhbnNhY3Rpb24sIFxyXG4gICAgQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQsIFxyXG4gICAgRXZlbnRMb2csXHJcbiAgICBUcmFuc2FjdGlvblJlY2VpcHQsXHJcbn0gZnJvbSBcImV0aGVyc1wiXHJcblxyXG5pbXBvcnQgeyBXaXRuZXQgfSBmcm9tIFwiQHdpdG5ldC9zZGtcIlxyXG5pbXBvcnQgeyBBQklzIH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHsgUmFuZG9taXplU3RhdHVzIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmltcG9ydCB7IFdpdEFwcGxpYW5jZSB9IGZyb20gXCIuL1dpdEFwcGxpYW5jZVwiXHJcbmltcG9ydCB7IFdpdE9yYWNsZSB9IGZyb20gXCIuL1dpdE9yYWNsZVwiXHJcblxyXG5leHBvcnQgY2xhc3MgV2l0UmFuZG9tbmVzcyBleHRlbmRzIFdpdEFwcGxpYW5jZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9sZWdhY3k6IENvbnRyYWN0O1xyXG5cclxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAod2l0T3JhY2xlOiBXaXRPcmFjbGUsIGF0OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih3aXRPcmFjbGUsIFwiV2l0UmFuZG9tbmVzc1YzXCIsIGF0KVxyXG4gICAgICAgIHRoaXMuX2xlZ2FjeSA9IG5ldyBDb250cmFjdChhdCwgQUJJc1tcIldpdFJhbmRvbW5lc3NWMlwiXSwgdGhpcy5zaWduZXIpXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFzeW5jIGF0KHdpdE9yYWNsZTogV2l0T3JhY2xlLCB0YXJnZXQ6IHN0cmluZyk6IFByb21pc2U8V2l0UmFuZG9tbmVzcz4ge1xyXG4gICAgICAgIGNvbnN0IHJhbmRvbWl6ZXIgPSBuZXcgV2l0UmFuZG9tbmVzcyh3aXRPcmFjbGUsIHRhcmdldClcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgb3JhY2xlQWRkclxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgb3JhY2xlQWRkciA9IGF3YWl0IHJhbmRvbWl6ZXIuY29udHJhY3Qud2l0T3JhY2xlLnN0YXRpY0NhbGwoKVxyXG4gICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFiaSA9IFsgXCJmdW5jdGlvbiB3aXRuZXQoKSBwdWJsaWMgdmlldyByZXR1cm5zIChhZGRyZXNzKVwiLCBdXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cmFjdCA9IG5ldyBDb250cmFjdCh0YXJnZXQsIGFiaSwgcmFuZG9taXplci5zaWduZXIpXHJcbiAgICAgICAgICAgICAgICBvcmFjbGVBZGRyID0gYXdhaXQgY29udHJhY3Qud2l0bmV0LnN0YXRpY0NhbGwoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvcmFjbGVBZGRyICE9PSB3aXRPcmFjbGUuYWRkcmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaXRSYW5kb21uZXNzIGF0ICR7dGFyZ2V0fTogbWlzbWF0Y2hpbmcgV2l0L09yYWNsZSBhZGRyZXNzICgke29yYWNsZUFkZHJ9KWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2l0UmFuZG9tbmVzcyBhdCAke3RhcmdldH06IGNhbm5vdCBmZXRjaCBXaXQvT3JhY2xlIGFkZHJlc3NcXG4ke1xyXG4gICAgICAgICAgICAgICAgZXJyb3I/LnN0YWNrPy5zcGxpdCgnXFxuJylbMF0gfHwgZXJyb3JcclxuICAgICAgICAgICAgfWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByYW5kb21pemVyXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGNsYXNzKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJhY3QuY2xhc3Muc3RhdGljQ2FsbCgpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGNsb25lKGN1cmF0b3I6IHN0cmluZywgb3B0aW9ucz86IHtcclxuICAgICAgICBldm1Db25maXJtYXRpb25zPzogbnVtYmVyLFxyXG4gICAgICAgIGV2bUdhc1ByaWNlPzogYmlnaW50LFxyXG4gICAgICAgIGV2bVRpbWVvdXQ/OiBudW1iZXIsXHJcbiAgICAgICAgb25UcmFuc2FjdGlvbj86IChUeEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnksXHJcbiAgICAgICAgb25UcmFuc2FjdGlvblJlY2VpcHQ/OiAocmVjZWlwdDogVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCkgPT4gYW55LFxyXG4gICAgfSk6IFByb21pc2U8Q29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsPiB7XHJcbiAgICAgICAgY29uc3QgdHg6IENvbnRyYWN0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnRyYWN0LmNsb25lLnBvcHVsYXRlVHJhbnNhY3Rpb24oY3VyYXRvcilcclxuICAgICAgICB0eC5nYXNQcmljZSA9IG9wdGlvbnM/LmV2bUdhc1ByaWNlIHx8IHR4Py5nYXNQcmljZVxyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25lclxyXG4gICAgICAgICAgICAuc2VuZFRyYW5zYWN0aW9uKHR4KVxyXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8ub25UcmFuc2FjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdGlvbihyZXNwb25zZS5oYXNoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLndhaXQob3B0aW9ucz8uZXZtQ29uZmlybWF0aW9ucyB8fCAxLCBvcHRpb25zPy5ldm1UaW1lb3V0KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAudGhlbihyZWNlaXB0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblRyYW5zYWN0aW9uUmVjZWlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25UcmFuc2FjdGlvblJlY2VpcHQocmVjZWlwdClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXB0O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBlc3RpbWF0ZVJhbmRvbWl6ZUZlZShldm1HYXNQcmljZTogYmlnaW50KTogUHJvbWlzZTxiaWdpbnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cmFjdFxyXG4gICAgICAgICAgICAuZ2V0RnVuY3Rpb24oXCJlc3RpbWF0ZVJhbmRvbWl6ZUZlZSh1aW50MjU2KVwiKVxyXG4gICAgICAgICAgICAuc3RhdGljQ2FsbChldm1HYXNQcmljZSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2hSYW5kb21uZXNzQWZ0ZXIoZXZtQmxvY2tOdW1iZXI6IGJpZ2ludCk6IFByb21pc2U8V2l0bmV0LkhleFN0cmluZyB8IHVuZGVmaW5lZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5pc1JhbmRvbWl6ZWQoZXZtQmxvY2tOdW1iZXIpXHJcbiAgICAgICAgICAgIC50aGVuKGlzUmFuZG9taXplZCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGlzUmFuZG9taXplZFxyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5jb250cmFjdC5mZXRjaFJhbmRvbW5lc3NBZnRlci5zdGF0aWNDYWxsKGV2bUJsb2NrTnVtYmVyKVxyXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGZldGNoUmFuZG9tbmVzc0FmdGVyUHJvb2YoZXZtQmxvY2tOdW1iZXI6IGJpZ2ludCk6IFByb21pc2U8e1xyXG4gICAgICAgIGZpbmFsaXR5OiBiaWdpbnQsXHJcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXIsIFxyXG4gICAgICAgIHRyYWlsOiBXaXRuZXQuSGFzaCwgXHJcbiAgICAgICAgdXVpZDogV2l0bmV0Lkhhc2gsIFxyXG4gICAgfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5jb250cmFjdFxyXG4gICAgICAgICAgICAuZmV0Y2hSYW5kb21uZXNzQWZ0ZXJQcm9vZlxyXG4gICAgICAgICAgICAuc3RhdGljQ2FsbChldm1CbG9ja051bWJlcilcclxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+ICh7XHJcbiAgICAgICAgICAgICAgICBmaW5hbGl0eTogQmlnSW50KHJlc3VsdFszXSksXHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IE51bWJlcihyZXN1bHRbMV0pLFxyXG4gICAgICAgICAgICAgICAgdHJhaWw6IHJlc3VsdFsyXSxcclxuICAgICAgICAgICAgICAgIHV1aWQ6IHJlc3VsdFswXSxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXJFdmVudHMob3B0aW9uczoge1xyXG4gICAgICAgIGZyb21CbG9jazogQmxvY2tUYWcsXHJcbiAgICAgICAgdG9CbG9jaz86IEJsb2NrVGFnLFxyXG4gICAgfSk6IFByb21pc2U8QXJyYXk8e1xyXG4gICAgICAgIHF1ZXJ5SWQ6IGJpZ2ludCxcclxuICAgICAgICByYW5kb21pemVCbG9jazogYmlnaW50LFxyXG4gICAgICAgIHJlcXVlc3Rlcj86IHN0cmluZyxcclxuICAgICAgICB0cmFuc2FjdGlvbkhhc2g6IHN0cmluZyxcclxuICAgIH0+PiB7XHJcbiAgICAgICAgbGV0IGxvZ3MgPSBhd2FpdCB0aGlzLl9sZWdhY3kucXVlcnlGaWx0ZXIoXCJSYW5kb21pemluZ1wiLCBvcHRpb25zLmZyb21CbG9jaywgb3B0aW9ucz8udG9CbG9jaylcclxuICAgICAgICBpZiAobG9ncyAmJiBsb2dzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvZ3MuZmlsdGVyKGxvZyA9PiAhbG9nLnJlbW92ZWQpLm1hcChsb2cgPT4gKHtcclxuICAgICAgICAgICAgICAgIHF1ZXJ5SWQ6IChsb2cgYXMgRXZlbnRMb2cpPy5hcmdzWzNdLFxyXG4gICAgICAgICAgICAgICAgcmFuZG9taXplQmxvY2s6IChsb2cgYXMgRXZlbnRMb2cpPy5hcmdzWzBdLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25IYXNoOiBsb2cudHJhbnNhY3Rpb25IYXNoLFxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cmFjdC5xdWVyeUZpbHRlcihcIlJhbmRvbWl6aW5nXCIsIG9wdGlvbnMuZnJvbUJsb2NrLCBvcHRpb25zPy50b0Jsb2NrKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4obG9ncyA9PiBsb2dzLmZpbHRlcihsb2cgPT4gIWxvZy5yZW1vdmVkKSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGxvZ3MgPT4gbG9ncy5tYXAobG9nID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlJZDogKGxvZyBhcyBFdmVudExvZyk/LmFyZ3NbMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZG9taXplQmxvY2s6IChsb2cgYXMgRXZlbnRMb2cpPy5hcmdzWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlcjogKGxvZyBhcyBFdmVudExvZyk/LmFyZ3NbMF0sXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25IYXNoOiBsb2cudHJhbnNhY3Rpb25IYXNoLFxyXG4gICAgICAgICAgICAgICAgfSkpKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RXZtQmFzZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyYWN0XHJcbiAgICAgICAgICAgIC5iYXNlXHJcbiAgICAgICAgICAgIC5zdGF0aWNDYWxsKClcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RXZtQ29uc3VtZXIoKTogUHJvbWlzZTxXaXRuZXQuSGV4U3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJhY3RcclxuICAgICAgICAgICAgLmNvbnN1bWVyXHJcbiAgICAgICAgICAgIC5zdGF0aWNDYWxsKClcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RXZtQ3VyYXRvcigpOiBQcm9taXNlPFdpdG5ldC5IZXhTdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cmFjdFxyXG4gICAgICAgICAgICAub3duZXJcclxuICAgICAgICAgICAgLnN0YXRpY0NhbGwoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRTZXR0aW5ncygpOiBQcm9taXNlPHtcclxuICAgICAgICBjYWxsYmFja0dhc0xpbWl0OiBudW1iZXIsXHJcbiAgICAgICAgZXh0cmFGZWVQZXJjZW50YWdlOiBudW1iZXIsXHJcbiAgICAgICAgcmFuZG9taXplV2FpdEJsb2NrczogbnVtYmVyLFxyXG4gICAgICAgIHdpdENvbW1pdHRlZVNpemU6IG51bWJlcixcclxuICAgICAgICB3aXRJbmNsdXNpb25GZWVzOiBiaWdpbnQsXHJcbiAgICB9PiB7XHJcbiAgICAgICAgY29uc3QgWyBxdWVyeVBhcmFtcywgd2FpdGluZ0Jsb2NrcyBdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyYWN0LmdldFJhbmRvbWl6ZVF1ZXJ5UGFyYW1zKCksXHJcbiAgICAgICAgICAgIHRoaXMuY29udHJhY3QuZ2V0UmFuZG9taXplV2FpdGluZ0Jsb2NrcygpLFxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY2FsbGJhY2tHYXNMaW1pdDogTnVtYmVyKHF1ZXJ5UGFyYW1zWzBdKSxcclxuICAgICAgICAgICAgZXh0cmFGZWVQZXJjZW50YWdlOiBOdW1iZXIocXVlcnlQYXJhbXNbMV0pLFxyXG4gICAgICAgICAgICByYW5kb21pemVXYWl0QmxvY2tzOiBOdW1iZXIod2FpdGluZ0Jsb2NrcyksXHJcbiAgICAgICAgICAgIHdpdENvbW1pdHRlZVNpemU6IE51bWJlcihxdWVyeVBhcmFtc1syXSksXHJcbiAgICAgICAgICAgIHdpdEluY2x1c2lvbkZlZXM6IEJpZ0ludChxdWVyeVBhcmFtc1szXSksXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRMYXN0UmFuZG9taXplQmxvY2soKTogUHJvbWlzZTxiaWdpbnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250cmFjdFxyXG4gICAgICAgICAgICAuZ2V0RnVuY3Rpb24oXCJnZXRMYXN0UmFuZG9taXplQmxvY2soKVwiKVxyXG4gICAgICAgICAgICAuc3RhdGljQ2FsbCgpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldFJhbmRvbWl6ZVN0YXR1cyhldm1CbG9ja051bWJlcjogYmlnaW50KTogUHJvbWlzZTxSYW5kb21pemVTdGF0dXM+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgICAgICAuY29udHJhY3RcclxuICAgICAgICAgICAgLmdldFJhbmRvbWl6ZVN0YXR1c1xyXG4gICAgICAgICAgICAuc3RhdGljQ2FsbChldm1CbG9ja051bWJlcilcclxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaChOdW1iZXIocmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFwiQXdhaXRpbmdcIjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBcIlJlYWR5XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gXCJFcnJvclwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFwiRmluYWxpemluZ1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVm9pZFwiO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBpc1JhbmRvbWl6ZWQoZXZtQmxvY2tOdW1iZXI6IGJpZ2ludCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5jb250cmFjdFxyXG4gICAgICAgICAgICAuaXNSYW5kb21pemVkXHJcbiAgICAgICAgICAgIC5zdGF0aWNDYWxsKGV2bUJsb2NrTnVtYmVyKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyByYW5kb21pemUob3B0aW9ucz86IHtcclxuICAgICAgICBldm1Db25maXJtYXRpb25zPzogbnVtYmVyLFxyXG4gICAgICAgIGV2bUdhc1ByaWNlPzogYmlnaW50LFxyXG4gICAgICAgIGV2bVRpbWVvdXQ/OiBudW1iZXIsXHJcbiAgICAgICAgb25SYW5kb21pemVUcmFuc2FjdGlvbj86ICh0eEhhc2g6IFdpdG5ldC5IYXNoKSA9PiBhbnksIFxyXG4gICAgICAgIG9uUmFuZG9taXplVHJhbnNhY3Rpb25SZWNlaXB0PzogKHJlY2VpcHQ6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwpID0+IGFueSxcclxuICAgIH0pOiBQcm9taXNlPENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgVHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbD4ge1xyXG4gICAgICAgIGNvbnN0IGV2bUdhc1ByaWNlID0gb3B0aW9ucz8uZXZtR2FzUHJpY2UgfHwgKGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0RmVlRGF0YSgpKS5nYXNQcmljZSB8fCAwblxyXG4gICAgICAgIGNvbnN0IGV2bVJhbmRvbWl6ZUZlZSA9IGF3YWl0IHRoaXMuZXN0aW1hdGVSYW5kb21pemVGZWUoZXZtR2FzUHJpY2UpXHJcbiAgICAgICAgY29uc3QgZXZtVHJhbnNhY3Rpb246IENvbnRyYWN0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnRyYWN0XHJcbiAgICAgICAgICAgIC5nZXRGdW5jdGlvbihcInJhbmRvbWl6ZSgpXCIpXHJcbiAgICAgICAgICAgIC5wb3B1bGF0ZVRyYW5zYWN0aW9uKClcclxuICAgICAgICBldm1UcmFuc2FjdGlvbi5nYXNQcmljZSA9IGV2bUdhc1ByaWNlIHx8IGV2bVRyYW5zYWN0aW9uPy5nYXNQcmljZVxyXG4gICAgICAgIGV2bVRyYW5zYWN0aW9uLnZhbHVlID0gZXZtUmFuZG9taXplRmVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyXHJcbiAgICAgICAgICAgIC5zZW5kVHJhbnNhY3Rpb24oZXZtVHJhbnNhY3Rpb24pXHJcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5vblJhbmRvbWl6ZVRyYW5zYWN0aW9uKSBvcHRpb25zLm9uUmFuZG9taXplVHJhbnNhY3Rpb24ocmVzcG9uc2UuaGFzaCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uud2FpdChvcHRpb25zPy5ldm1Db25maXJtYXRpb25zIHx8IDEsIG9wdGlvbnM/LmV2bVRpbWVvdXQpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKHJlY2VpcHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lm9uUmFuZG9taXplVHJhbnNhY3Rpb25SZWNlaXB0KSBvcHRpb25zLm9uUmFuZG9taXplVHJhbnNhY3Rpb25SZWNlaXB0KHJlY2VpcHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpcHRcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxufVxyXG4iXX0=