UNPKG

@c4tplatform/caminojs

Version:
157 lines 25.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GeneralProposal = exports.GeneralVoteOption = void 0; const buffer_1 = require("buffer/"); const constants_1 = require("../constants"); const serialization_1 = require("../../../utils/serialization"); const bintools_1 = __importDefault(require("../../../utils/bintools")); const utf8 = "utf8"; const serialization = serialization_1.Serialization.getInstance(); const bintools = bintools_1.default.getInstance(); class GeneralVoteOption extends serialization_1.Serializable { serialize(encoding = "hex") { super.serialize(); return { option: serialization.encoder(this.option, encoding, "Buffer", "hex") }; } deserialize(fields, encoding = "hex") { super.deserialize(fields, encoding); this.option = serialization.decoder(fields["option"], encoding, "Buffer", "Buffer", 256 //max size ); return this; } fromBuffer(bytes, offset = 0) { let optionLen = bintools .copyFrom(bytes, offset, offset + 4) .readUInt32BE(0); offset += 4; this.option = bintools.copyFrom(bytes, offset, offset + optionLen); offset += optionLen; return offset; } toBuffer() { let barr = [buffer_1.Buffer.alloc(4), this.option]; let bsize = 4 + this.option.length; barr[0].writeUInt32BE(this.option.length, 0); return buffer_1.Buffer.concat(barr, bsize); } getSize() { return this.option.length + 4; } getOption() { return this.option; } constructor(option) { super(); this._typeName = "GeneralVoteOption"; this._typeID = undefined; this.option = buffer_1.Buffer.alloc(0); if (option) this.option = option; } } exports.GeneralVoteOption = GeneralVoteOption; class GeneralProposal { addGeneralOption(option) { const generalVoteOption = new GeneralVoteOption(buffer_1.Buffer.from(option)); this.options.push(generalVoteOption); if (this.options) { this.numOptions.writeUInt32BE(this.options.length, 0); } return this.options.length - 1; } serialize(encoding = "hex") { let fields = { start: serialization.encoder(this.start, encoding, "Buffer", "number"), end: serialization.encoder(this.end, encoding, "Buffer", "number"), options: this.options.map((opt) => opt.serialize(encoding)), totalVotedThresholdNominator: serialization.encoder(this.totalVotedThresholdNominator, encoding, "Buffer", "number"), mostVotedThresholdNominator: serialization.encoder(this.mostVotedThresholdNominator, encoding, "Buffer", "number"), allowEarlyFinish: this.allowEarlyFinish }; return fields; } deserialize(fields, encoding = "hex") { this.numOptions.writeUInt32BE(this.options.length, 0); this.options = fields["options"].map((opt) => new GeneralVoteOption().deserialize(opt, encoding)); this.start = serialization.decoder(fields["start"], encoding, "number", "Buffer"); this.end = serialization.decoder(fields["end"], encoding, "number", "Buffer"); this.totalVotedThresholdNominator = serialization.decoder(fields["totalVotedThresholdNominator"], encoding, "number", "Buffer"); this.mostVotedThresholdNominator = serialization.decoder(fields["mostVotedThresholdNominator"], encoding, "number", "Buffer"); this.allowEarlyFinish = fields["allowEarlyFinish"]; return this; } fromBuffer(bytes, offset = 0) { this.numOptions = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; const optionCount = this.numOptions.readUInt32BE(0); this.options = []; for (let i = 0; i < optionCount; i++) { const option = new GeneralVoteOption(); offset = option.fromBuffer(bytes, offset); this.options.push(option); } this.start = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.end = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.totalVotedThresholdNominator = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.mostVotedThresholdNominator = bintools.copyFrom(bytes, offset, offset + 8); offset += 8; this.allowEarlyFinish = bintools.copyFrom(bytes, offset, offset + 1).readUInt8(0) === 1; offset += 1; return offset; } toBuffer() { let barr = [this.numOptions]; let bsize = this.numOptions.length; this.options.forEach((opt) => { let optBuffer = opt.toBuffer(); barr.push(optBuffer); bsize += optBuffer.length; }); barr.push(this.start, this.end, this.totalVotedThresholdNominator, this.mostVotedThresholdNominator, buffer_1.Buffer.from([this.allowEarlyFinish ? 1 : 0])); bsize += this.start.length + this.end.length + this.totalVotedThresholdNominator.length + this.mostVotedThresholdNominator.length + 1; return buffer_1.Buffer.concat(barr, bsize); } constructor(start, end, totalVotedThresholdNominator, mostVotedThresholdNominator, allowEarlyFinish) { this._typeID = constants_1.PlatformVMConstants.GENERALPROPOSAL_TYPE_ID; // The order is important, must be followed in functions this.numOptions = buffer_1.Buffer.alloc(4); //1. this.start = buffer_1.Buffer.alloc(8); //3. this.end = buffer_1.Buffer.alloc(8); //4. this.totalVotedThresholdNominator = buffer_1.Buffer.alloc(8); //5. this.mostVotedThresholdNominator = buffer_1.Buffer.alloc(8); //6. const startTime = buffer_1.Buffer.alloc(8); // Buffer to hold the start time, 8 bytes startTime.writeUInt32BE(start, 4); const endTime = buffer_1.Buffer.alloc(8); // Buffer to hold the end time, 8 bytes endTime.writeUInt32BE(end, 4); this.options = []; this.start = startTime; this.end = endTime; this.totalVotedThresholdNominator = buffer_1.Buffer.alloc(8); this.totalVotedThresholdNominator.writeUIntBE(totalVotedThresholdNominator, 0, 8); this.mostVotedThresholdNominator = buffer_1.Buffer.alloc(8); this.mostVotedThresholdNominator.writeUIntBE(mostVotedThresholdNominator, 0, 8); this.allowEarlyFinish = allowEarlyFinish; } getTypeID() { return this._typeID; } getAllowEarlyFinish() { return this.allowEarlyFinish; } } exports.GeneralProposal = GeneralProposal; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbHByb3Bvc2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvcGxhdGZvcm12bS9hZGRwcm9wb3NhbHR4L2dlbmVyYWxwcm9wb3NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvQ0FBZ0M7QUFDaEMsNENBQWtEO0FBQ2xELGdFQUtxQztBQUNyQyx1RUFBOEM7QUFDOUMsTUFBTSxJQUFJLEdBQW1CLE1BQU0sQ0FBQTtBQUVuQyxNQUFNLGFBQWEsR0FBRyw2QkFBYSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ2pELE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFakQsTUFBYSxpQkFBa0IsU0FBUSw0QkFBWTtJQU1qRCxTQUFTLENBQUMsV0FBK0IsS0FBSztRQUM1QyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDakIsT0FBTztZQUNMLE1BQU0sRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUM7U0FDdEUsQ0FBQTtJQUNILENBQUM7SUFDRCxXQUFXLENBQUMsTUFBYyxFQUFFLFdBQStCLEtBQUs7UUFDOUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUNqQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ2hCLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLEdBQUcsQ0FBQyxVQUFVO1NBQ2YsQ0FBQTtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsQ0FBQztRQUMxQyxJQUFJLFNBQVMsR0FBVyxRQUFRO2FBQzdCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxD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MkIsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQzFDLDJCQUEyQixFQUMzQixDQUFDLEVBQ0QsQ0FBQyxDQUNGLENBQUE7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUE7SUFDMUMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtJQUM5QixDQUFDO0NBQ0Y7QUFuTEQsMENBbUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IHsgUGxhdGZvcm1WTUNvbnN0YW50cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIlxuaW1wb3J0IHtcbiAgU2VyaWFsaXphYmxlLFxuICBTZXJpYWxpemF0aW9uLFxuICBTZXJpYWxpemVkRW5jb2RpbmcsXG4gIFNlcmlhbGl6ZWRUeXBlXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9zZXJpYWxpemF0aW9uXCJcbmltcG9ydCBCaW5Ub29scyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYmludG9vbHNcIlxuY29uc3QgdXRmODogU2VyaWFsaXplZFR5cGUgPSBcInV0ZjhcIlxuXG5jb25zdCBzZXJpYWxpemF0aW9uID0gU2VyaWFsaXphdGlvbi5nZXRJbnN0YW5jZSgpXG5jb25zdCBiaW50b29sczogQmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpXG5cbmV4cG9ydCBjbGFzcyBHZW5lcmFsVm90ZU9wdGlvbiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7XG4gIHByb3RlY3RlZCBfdHlwZU5hbWUgPSBcIkdlbmVyYWxWb3RlT3B0aW9uXCJcbiAgcHJvdGVjdGVkIF90eXBlSUQgPSB1bmRlZmluZWRcblxuICBwcm90ZWN0ZWQgb3B0aW9uOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMClcblxuICBzZXJpYWxpemUoZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpOiBvYmplY3Qge1xuICAgIHN1cGVyLnNlcmlhbGl6ZSgpXG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbjogc2VyaWFsaXphdGlvbi5lbmNvZGVyKHRoaXMub3B0aW9uLCBlbmNvZGluZywgXCJCdWZmZXJcIiwgXCJoZXhcIilcbiAgICB9XG4gIH1cbiAgZGVzZXJpYWxpemUoZmllbGRzOiBvYmplY3QsIGVuY29kaW5nOiBTZXJpYWxpemVkRW5jb2RpbmcgPSBcImhleFwiKTogdGhpcyB7XG4gICAgc3VwZXIuZGVzZXJpYWxpemUoZmllbGRzLCBlbmNvZGluZylcbiAgICB0aGlzLm9wdGlvbiA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcIm9wdGlvblwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJCdWZmZXJcIixcbiAgICAgIFwiQnVmZmVyXCIsXG4gICAgICAyNTYgLy9tYXggc2l6ZVxuICAgIClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBmcm9tQnVmZmVyKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgbGV0IG9wdGlvbkxlbjogbnVtYmVyID0gYmludG9vbHNcbiAgICAgIC5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KVxuICAgICAgLnJlYWRVSW50MzJCRSgwKVxuICAgIG9mZnNldCArPSA0XG4gICAgdGhpcy5vcHRpb24gPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyBvcHRpb25MZW4pXG4gICAgb2Zmc2V0ICs9IG9wdGlvbkxlblxuICAgIHJldHVybiBvZmZzZXRcbiAgfVxuICB0b0J1ZmZlcigpOiBCdWZmZXIge1xuICAgIGxldCBiYXJyID0gW0J1ZmZlci5hbGxvYyg0KSwgdGhpcy5vcHRpb25dXG4gICAgbGV0IGJzaXplID0gNCArIHRoaXMub3B0aW9uLmxlbmd0aFxuICAgIGJhcnJbMF0ud3JpdGVVSW50MzJCRSh0aGlzLm9wdGlvbi5sZW5ndGgsIDApXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYmFyciwgYnNpemUpXG4gIH1cblxuICBnZXRTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uLmxlbmd0aCArIDRcbiAgfVxuXG4gIGdldE9wdGlvbigpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLm9wdGlvblxuICB9XG4gIGNvbnN0cnVjdG9yKG9wdGlvbj86IEJ1ZmZlcikge1xuICAgIHN1cGVyKClcbiAgICBpZiAob3B0aW9uKSB0aGlzLm9wdGlvbiA9IG9wdGlvblxuICB9XG59XG5leHBvcnQgY2xhc3MgR2VuZXJhbFByb3Bvc2FsIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZUlEID0gUGxhdGZvcm1WTUNvbnN0YW50cy5HRU5FUkFMUFJPUE9TQUxfVFlQRV9JRFxuXG4gIC8vIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQsIG11c3QgYmUgZm9sbG93ZWQgaW4gZnVuY3Rpb25zXG4gIHByb3RlY3RlZCBudW1PcHRpb25zOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCkgLy8xLlxuICBwcm90ZWN0ZWQgb3B0aW9uczogR2VuZXJhbFZvdGVPcHRpb25bXSAvLzIuXG5cbiAgcHJvdGVjdGVkIHN0YXJ0OiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCkgLy8zLlxuICBwcm90ZWN0ZWQgZW5kOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCkgLy80LlxuXG4gIHByb3RlY3RlZCB0b3RhbFZvdGVkVGhyZXNob2xkTm9taW5hdG9yOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCkgLy81LlxuICBwcm90ZWN0ZWQgbW9zdFZvdGVkVGhyZXNob2xkTm9taW5hdG9yOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCkgLy82LlxuICBwcm90ZWN0ZWQgYWxsb3dFYXJseUZpbmlzaDogYm9vbGVhbiAvLyA3LlxuXG4gIGFkZEdlbmVyYWxPcHRpb24ob3B0aW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGdlbmVyYWxWb3RlT3B0aW9uID0gbmV3IEdlbmVyYWxWb3RlT3B0aW9uKEJ1ZmZlci5mcm9tKG9wdGlvbikpXG4gICAgdGhpcy5vcHRpb25zLnB1c2goZ2VuZXJhbFZvdGVPcHRpb24pXG4gICAgaWYgKHRoaXMub3B0aW9ucykge1xuICAgICAgdGhpcy5udW1PcHRpb25zLndyaXRlVUludDMyQkUodGhpcy5vcHRpb25zLmxlbmd0aCwgMClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZW5ndGggLSAxXG4gIH1cblxuICBzZXJpYWxpemUoZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpOiBvYmplY3Qge1xuICAgIGxldCBmaWVsZHMgPSB7XG4gICAgICBzdGFydDogc2VyaWFsaXphdGlvbi5lbmNvZGVyKHRoaXMuc3RhcnQsIGVuY29kaW5nLCBcIkJ1ZmZlclwiLCBcIm51bWJlclwiKSxcbiAgICAgIGVuZDogc2VyaWFsaXphdGlvbi5lbmNvZGVyKHRoaXMuZW5kLCBlbmNvZGluZywgXCJCdWZmZXJcIiwgXCJudW1iZXJcIiksXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMubWFwKChvcHQpID0+IG9wdC5zZXJpYWxpemUoZW5jb2RpbmcpKSxcbiAgICAgIHRvdGFsVm90ZWRUaHJlc2hvbGROb21pbmF0b3I6IHNlcmlhbGl6YXRpb24uZW5jb2RlcihcbiAgICAgICAgdGhpcy50b3RhbFZvdGVkVGhyZXNob2xkTm9taW5hdG9yLFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgXCJCdWZmZXJcIixcbiAgICAgICAgXCJudW1iZXJcIlxuICAgICAgKSxcbiAgICAgIG1vc3RWb3RlZFRocmVzaG9sZE5vbWluYXRvcjogc2VyaWFsaXphdGlvbi5lbmNvZGVyKFxuICAgICAgICB0aGlzLm1vc3RWb3RlZFRocmVzaG9sZE5vbWluYXRvcixcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgIFwiQnVmZmVyXCIsXG4gICAgICAgIFwibnVtYmVyXCJcbiAgICAgICksXG4gICAgICBhbGxvd0Vhcmx5RmluaXNoOiB0aGlzLmFsbG93RWFybHlGaW5pc2hcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkc1xuICB9XG5cbiAgZGVzZXJpYWxpemUoZmllbGRzOiBvYmplY3QsIGVuY29kaW5nOiBTZXJpYWxpemVkRW5jb2RpbmcgPSBcImhleFwiKTogdGhpcyB7XG4gICAgdGhpcy5udW1PcHRpb25zLndyaXRlVUludDMyQkUodGhpcy5vcHRpb25zLmxlbmd0aCwgMClcbiAgICB0aGlzLm9wdGlvbnMgPSBmaWVsZHNbXCJvcHRpb25zXCJdLm1hcCgob3B0KSA9PlxuICAgICAgbmV3IEdlbmVyYWxWb3RlT3B0aW9uKCkuZGVzZXJpYWxpemUob3B0LCBlbmNvZGluZylcbiAgICApXG4gICAgdGhpcy5zdGFydCA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcInN0YXJ0XCJdLFxuICAgICAgZW5jb2RpbmcsXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJCdWZmZXJcIlxuICAgIClcbiAgICB0aGlzLmVuZCA9IHNlcmlhbGl6YXRpb24uZGVjb2RlcihcbiAgICAgIGZpZWxkc1tcImVuZFwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiQnVmZmVyXCJcbiAgICApXG4gICAgdGhpcy50b3RhbFZvdGVkVGhyZXNob2xkTm9taW5hdG9yID0gc2VyaWFsaXphdGlvbi5kZWNvZGVyKFxuICAgICAgZmllbGRzW1widG90YWxWb3RlZFRocmVzaG9sZE5vbWluYXRvclwiXSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiQnVmZmVyXCJcbiAgICApXG4gICAgdGhpcy5tb3N0Vm90ZWRUaHJlc2hvbGROb21pbmF0b3IgPSBzZXJpYWxpemF0aW9uLmRlY29kZXIoXG4gICAgICBmaWVsZHNbXCJtb3N0Vm90ZWRUaHJlc2hvbGROb21pbmF0b3JcIl0sXG4gICAgICBlbmNvZGluZyxcbiAgICAgIFwibnVtYmVyXCIsXG4gICAgICBcIkJ1ZmZlclwiXG4gICAgKVxuICAgIHRoaXMuYWxsb3dFYXJseUZpbmlzaCA9IGZpZWxkc1tcImFsbG93RWFybHlGaW5pc2hcIl1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBmcm9tQnVmZmVyKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgdGhpcy5udW1PcHRpb25zID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICBvZmZzZXQgKz0gNFxuICAgIGNvbnN0IG9wdGlvbkNvdW50ID0gdGhpcy5udW1PcHRpb25zLnJlYWRVSW50MzJCRSgwKVxuICAgIHRoaXMub3B0aW9ucyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25Db3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBuZXcgR2VuZXJhbFZvdGVPcHRpb24oKVxuICAgICAgb2Zmc2V0ID0gb3B0aW9uLmZyb21CdWZmZXIoYnl0ZXMsIG9mZnNldClcbiAgICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICB9XG4gICAgdGhpcy5zdGFydCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDgpXG4gICAgb2Zmc2V0ICs9IDhcbiAgICB0aGlzLmVuZCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDgpXG4gICAgb2Zmc2V0ICs9IDhcbiAgICB0aGlzLnRvdGFsVm90ZWRUaHJlc2hvbGROb21pbmF0b3IgPSBiaW50b29scy5jb3B5RnJvbShcbiAgICAgIGJ5dGVzLFxuICAgICAgb2Zmc2V0LFxuICAgICAgb2Zmc2V0ICsgOFxuICAgIClcbiAgICBvZmZzZXQgKz0gOFxuICAgIHRoaXMubW9zdFZvdGVkVGhyZXNob2xkTm9taW5hdG9yID0gYmludG9vbHMuY29weUZyb20oXG4gICAgICBieXRlcyxcbiAgICAgIG9mZnNldCxcbiAgICAgIG9mZnNldCArIDhcbiAgICApXG4gICAgb2Zmc2V0ICs9IDhcblxuICAgIHRoaXMuYWxsb3dFYXJseUZpbmlzaCA9XG4gICAgICBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyAxKS5yZWFkVUludDgoMCkgPT09IDFcbiAgICBvZmZzZXQgKz0gMVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgdG9CdWZmZXIoKTogQnVmZmVyIHtcbiAgICBsZXQgYmFyciA9IFt0aGlzLm51bU9wdGlvbnNdXG4gICAgbGV0IGJzaXplID0gdGhpcy5udW1PcHRpb25zLmxlbmd0aFxuXG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goKG9wdCkgPT4ge1xuICAgICAgbGV0IG9wdEJ1ZmZlciA9IG9wdC50b0J1ZmZlcigpXG4gICAgICBiYXJyLnB1c2gob3B0QnVmZmVyKVxuICAgICAgYnNpemUgKz0gb3B0QnVmZmVyLmxlbmd0aFxuICAgIH0pXG5cbiAgICBiYXJyLnB1c2goXG4gICAgICB0aGlzLnN0YXJ0LFxuICAgICAgdGhpcy5lbmQsXG4gICAgICB0aGlzLnRvdGFsVm90ZWRUaHJlc2hvbGROb21pbmF0b3IsXG4gICAgICB0aGlzLm1vc3RWb3RlZFRocmVzaG9sZE5vbWluYXRvcixcbiAgICAgIEJ1ZmZlci5mcm9tKFt0aGlzLmFsbG93RWFybHlGaW5pc2ggPyAxIDogMF0pXG4gICAgKVxuXG4gICAgYnNpemUgKz1cbiAgICAgIHRoaXMuc3RhcnQubGVuZ3RoICtcbiAgICAgIHRoaXMuZW5kLmxlbmd0aCArXG4gICAgICB0aGlzLnRvdGFsVm90ZWRUaHJlc2hvbGROb21pbmF0b3IubGVuZ3RoICtcbiAgICAgIHRoaXMubW9zdFZvdGVkVGhyZXNob2xkTm9taW5hdG9yLmxlbmd0aCArXG4gICAgICAxXG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChiYXJyLCBic2l6ZSlcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXJ0PzogbnVtYmVyLFxuICAgIGVuZD86IG51bWJlcixcbiAgICB0b3RhbFZvdGVkVGhyZXNob2xkTm9taW5hdG9yPzogbnVtYmVyLFxuICAgIG1vc3RWb3RlZFRocmVzaG9sZE5vbWluYXRvcj86IG51bWJlcixcbiAgICBhbGxvd0Vhcmx5RmluaXNoPzogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBCdWZmZXIuYWxsb2MoOCkgLy8gQnVmZmVyIHRvIGhvbGQgdGhlIHN0YXJ0IHRpbWUsIDggYnl0ZXNcbiAgICBzdGFydFRpbWUud3JpdGVVSW50MzJCRShzdGFydCwgNClcbiAgICBjb25zdCBlbmRUaW1lID0gQnVmZmVyLmFsbG9jKDgpIC8vIEJ1ZmZlciB0byBob2xkIHRoZSBlbmQgdGltZSwgOCBieXRlc1xuICAgIGVuZFRpbWUud3JpdGVVSW50MzJCRShlbmQsIDQpXG5cbiAgICB0aGlzLm9wdGlvbnMgPSBbXVxuICAgIHRoaXMuc3RhcnQgPSBzdGFydFRpbWVcbiAgICB0aGlzLmVuZCA9IGVuZFRpbWVcblxuICAgIHRoaXMudG90YWxWb3RlZFRocmVzaG9sZE5vbWluYXRvciA9IEJ1ZmZlci5hbGxvYyg4KVxuICAgIHRoaXMudG90YWxWb3RlZFRocmVzaG9sZE5vbWluYXRvci53cml0ZVVJbnRCRShcbiAgICAgIHRvdGFsVm90ZWRUaHJlc2hvbGROb21pbmF0b3IsXG4gICAgICAwLFxuICAgICAgOFxuICAgIClcbiAgICB0aGlzLm1vc3RWb3RlZFRocmVzaG9sZE5vbWluYXRvciA9IEJ1ZmZlci5hbGxvYyg4KVxuICAgIHRoaXMubW9zdFZvdGVkVGhyZXNob2xkTm9taW5hdG9yLndyaXRlVUludEJFKFxuICAgICAgbW9zdFZvdGVkVGhyZXNob2xkTm9taW5hdG9yLFxuICAgICAgMCxcbiAgICAgIDhcbiAgICApXG4gICAgdGhpcy5hbGxvd0Vhcmx5RmluaXNoID0gYWxsb3dFYXJseUZpbmlzaFxuICB9XG5cbiAgZ2V0VHlwZUlEKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGVJRFxuICB9XG5cbiAgZ2V0QWxsb3dFYXJseUZpbmlzaCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0Vhcmx5RmluaXNoXG4gIH1cbn1cbiJdfQ==