UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

211 lines (209 loc) • 25.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Result = exports.NotEnoughDataError = void 0; exports.readBVarByte = readBVarByte; exports.readBVarChar = readBVarChar; exports.readBigInt64LE = readBigInt64LE; exports.readBigUInt64LE = readBigUInt64LE; exports.readDoubleLE = readDoubleLE; exports.readFloatLE = readFloatLE; exports.readInt16LE = readInt16LE; exports.readInt32LE = readInt32LE; exports.readUInt16LE = readUInt16LE; exports.readUInt24LE = readUInt24LE; exports.readUInt32BE = readUInt32BE; exports.readUInt32LE = readUInt32LE; exports.readUInt40LE = readUInt40LE; exports.readUInt8 = readUInt8; exports.readUNumeric128LE = readUNumeric128LE; exports.readUNumeric64LE = readUNumeric64LE; exports.readUNumeric96LE = readUNumeric96LE; exports.readUsVarByte = readUsVarByte; exports.readUsVarChar = readUsVarChar; class Result { constructor(value, offset) { this.value = value; this.offset = offset; } } // This error is thrown and caught as part of normal parsing control flow: // whenever a parser encounters an incomplete value, it throws this error, // and the caller waits for more data to arrive before retrying. // // It deliberately does not extend `Error` - capturing a stack trace on // every construction is expensive, and the stack is never used as this // error never escapes the parsing internals. exports.Result = Result; class NotEnoughDataError { constructor(byteCount) { this.byteCount = byteCount; } } exports.NotEnoughDataError = NotEnoughDataError; function readUInt8(buf, offset) { offset = +offset; if (buf.length < offset + 1) { throw new NotEnoughDataError(offset + 1); } return new Result(buf.readUInt8(offset), offset + 1); } function readUInt16LE(buf, offset) { offset = +offset; if (buf.length < offset + 2) { throw new NotEnoughDataError(offset + 2); } return new Result(buf.readUInt16LE(offset), offset + 2); } function readInt16LE(buf, offset) { offset = +offset; if (buf.length < offset + 2) { throw new NotEnoughDataError(offset + 2); } return new Result(buf.readInt16LE(offset), offset + 2); } function readUInt24LE(buf, offset) { offset = +offset; if (buf.length < offset + 3) { throw new NotEnoughDataError(offset + 3); } return new Result(buf.readUIntLE(offset, 3), offset + 3); } function readUInt32LE(buf, offset) { offset = +offset; if (buf.length < offset + 4) { throw new NotEnoughDataError(offset + 4); } return new Result(buf.readUInt32LE(offset), offset + 4); } function readUInt32BE(buf, offset) { offset = +offset; if (buf.length < offset + 4) { throw new NotEnoughDataError(offset + 4); } return new Result(buf.readUInt32BE(offset), offset + 4); } function readUInt40LE(buf, offset) { offset = +offset; if (buf.length < offset + 5) { throw new NotEnoughDataError(offset + 5); } return new Result(buf.readUIntLE(offset, 5), offset + 5); } function readInt32LE(buf, offset) { offset = +offset; if (buf.length < offset + 4) { throw new NotEnoughDataError(offset + 4); } return new Result(buf.readInt32LE(offset), offset + 4); } function readBigUInt64LE(buf, offset) { offset = +offset; if (buf.length < offset + 8) { throw new NotEnoughDataError(offset + 8); } return new Result(buf.readBigUInt64LE(offset), offset + 8); } function readBigInt64LE(buf, offset) { offset = +offset; if (buf.length < offset + 8) { throw new NotEnoughDataError(offset + 8); } return new Result(buf.readBigInt64LE(offset), offset + 8); } function readFloatLE(buf, offset) { offset = +offset; if (buf.length < offset + 4) { throw new NotEnoughDataError(offset + 4); } return new Result(buf.readFloatLE(offset), offset + 4); } function readDoubleLE(buf, offset) { offset = +offset; if (buf.length < offset + 8) { throw new NotEnoughDataError(offset + 8); } return new Result(buf.readDoubleLE(offset), offset + 8); } function readBVarChar(buf, offset) { offset = +offset; let charCount; ({ offset, value: charCount } = readUInt8(buf, offset)); const byteLength = charCount * 2; if (buf.length < offset + byteLength) { throw new NotEnoughDataError(offset + byteLength); } return new Result(buf.toString('ucs2', offset, offset + byteLength), offset + byteLength); } function readBVarByte(buf, offset) { offset = +offset; let byteLength; ({ offset, value: byteLength } = readUInt8(buf, offset)); if (buf.length < offset + byteLength) { throw new NotEnoughDataError(offset + byteLength); } return new Result(buf.slice(offset, offset + byteLength), offset + byteLength); } function readUsVarChar(buf, offset) { offset = +offset; let charCount; ({ offset, value: charCount } = readUInt16LE(buf, offset)); const byteLength = charCount * 2; if (buf.length < offset + byteLength) { throw new NotEnoughDataError(offset + byteLength); } return new Result(buf.toString('ucs2', offset, offset + byteLength), offset + byteLength); } function readUsVarByte(buf, offset) { offset = +offset; let byteLength; ({ offset, value: byteLength } = readUInt16LE(buf, offset)); if (buf.length < offset + byteLength) { throw new NotEnoughDataError(offset + byteLength); } return new Result(buf.slice(offset, offset + byteLength), offset + byteLength); } function readUNumeric64LE(buf, offset) { offset = +offset; if (buf.length < offset + 8) { throw new NotEnoughDataError(offset + 8); } const low = buf.readUInt32LE(offset); const high = buf.readUInt32LE(offset + 4); return new Result(0x100000000 * high + low, offset + 8); } function readUNumeric96LE(buf, offset) { offset = +offset; if (buf.length < offset + 12) { throw new NotEnoughDataError(offset + 12); } const dword1 = buf.readUInt32LE(offset); const dword2 = buf.readUInt32LE(offset + 4); const dword3 = buf.readUInt32LE(offset + 8); return new Result(dword1 + 0x100000000 * dword2 + 0x100000000 * 0x100000000 * dword3, offset + 12); } function readUNumeric128LE(buf, offset) { offset = +offset; if (buf.length < offset + 16) { throw new NotEnoughDataError(offset + 16); } const dword1 = buf.readUInt32LE(offset); const dword2 = buf.readUInt32LE(offset + 4); const dword3 = buf.readUInt32LE(offset + 8); const dword4 = buf.readUInt32LE(offset + 12); return new Result(dword1 + 0x100000000 * dword2 + 0x100000000 * 0x100000000 * dword3 + 0x100000000 * 0x100000000 * 0x100000000 * dword4, offset + 16); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXN1bHQiLCJjb25zdHJ1Y3RvciIsInZhbHVlIiwib2Zmc2V0IiwiZXhwb3J0cyIsIk5vdEVub3VnaERhdGFFcnJvciIsImJ5dGVDb3VudCIsInJlYWRVSW50OCIsImJ1ZiIsImxlbmd0aCIsInJlYWRVSW50MTZMRSIsInJlYWRJbnQxNkxFIiwicmVhZFVJbnQyNExFIiwicmVhZFVJbnRMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRVSW50NDBMRSIsInJlYWRJbnQzMkxFIiwicmVhZEJpZ1VJbnQ2NExFIiwicmVhZEJpZ0ludDY0TEUiLCJyZWFkRmxvYXRMRSIsInJlYWREb3VibGVMRSIsInJlYWRCVmFyQ2hhciIsImNoYXJDb3VudCIsImJ5dGVMZW5ndGgiLCJ0b1N0cmluZyIsInJlYWRCVmFyQnl0ZSIsInNsaWNlIiwicmVhZFVzVmFyQ2hhciIsInJlYWRVc1ZhckJ5dGUiLCJyZWFkVU51bWVyaWM2NExFIiwibG93IiwiaGlnaCIsInJlYWRVTnVtZXJpYzk2TEUiLCJkd29yZDEiLCJkd29yZDIiLCJkd29yZDMiLCJyZWFkVU51bWVyaWMxMjhMRSIsImR3b3JkNCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9oZWxwZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSZXN1bHQ8VD4ge1xuICBkZWNsYXJlIHZhbHVlOiBUO1xuICBkZWNsYXJlIG9mZnNldDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgfVxufVxuXG4vLyBUaGlzIGVycm9yIGlzIHRocm93biBhbmQgY2F1Z2h0IGFzIHBhcnQgb2Ygbm9ybWFsIHBhcnNpbmcgY29udHJvbCBmbG93OlxuLy8gd2hlbmV2ZXIgYSBwYXJzZXIgZW5jb3VudGVycyBhbiBpbmNvbXBsZXRlIHZhbHVlLCBpdCB0aHJvd3MgdGhpcyBlcnJvcixcbi8vIGFuZCB0aGUgY2FsbGVyIHdhaXRzIGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlIGJlZm9yZSByZXRyeWluZy5cbi8vXG4vLyBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZXh0ZW5kIGBFcnJvcmAgLSBjYXB0dXJpbmcgYSBzdGFjayB0cmFjZSBvblxuLy8gZXZlcnkgY29uc3RydWN0aW9uIGlzIGV4cGVuc2l2ZSwgYW5kIHRoZSBzdGFjayBpcyBuZXZlciB1c2VkIGFzIHRoaXNcbi8vIGVycm9yIG5ldmVyIGVzY2FwZXMgdGhlIHBhcnNpbmcgaW50ZXJuYWxzLlxuZXhwb3J0IGNsYXNzIE5vdEVub3VnaERhdGFFcnJvciB7XG4gIGRlY2xhcmUgYnl0ZUNvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYnl0ZUNvdW50OiBudW1iZXIpIHtcbiAgICB0aGlzLmJ5dGVDb3VudCA9IGJ5dGVDb3VudDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFVJbnQ4KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIDEpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIDEpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnJlYWRVSW50OChvZmZzZXQpLCBvZmZzZXQgKyAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyAyKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyAyKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkVUludDE2TEUob2Zmc2V0KSwgb2Zmc2V0ICsgMik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkSW50MTZMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyAyKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyAyKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkSW50MTZMRShvZmZzZXQpLCBvZmZzZXQgKyAyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVSW50MjRMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyAzKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyAzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkVUludExFKG9mZnNldCwgMyksIG9mZnNldCArIDMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFVJbnQzMkxFKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIDQpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIDQpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnJlYWRVSW50MzJMRShvZmZzZXQpLCBvZmZzZXQgKyA0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVSW50MzJCRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyA0KSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyA0KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkVUludDMyQkUob2Zmc2V0KSwgb2Zmc2V0ICsgNCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVUludDQwTEUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgNSkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgNSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdChidWYucmVhZFVJbnRMRShvZmZzZXQsIDUpLCBvZmZzZXQgKyA1KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWFkSW50MzJMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyA0KSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyA0KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkSW50MzJMRShvZmZzZXQpLCBvZmZzZXQgKyA0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8YmlnaW50PiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyA4KSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyA4KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkQmlnVUludDY0TEUob2Zmc2V0KSwgb2Zmc2V0ICsgOCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQmlnSW50NjRMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8YmlnaW50PiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyA4KSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyA4KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5yZWFkQmlnSW50NjRMRShvZmZzZXQpLCBvZmZzZXQgKyA4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbG9hdExFKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIDQpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIDQpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnJlYWRGbG9hdExFKG9mZnNldCksIG9mZnNldCArIDQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZERvdWJsZUxFKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIDgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIDgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnJlYWREb3VibGVMRShvZmZzZXQpLCBvZmZzZXQgKyA4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCVmFyQ2hhcihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgbGV0IGNoYXJDb3VudDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogY2hhckNvdW50IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCBieXRlTGVuZ3RoID0gY2hhckNvdW50ICogMjtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGJ5dGVMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGJ5dGVMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnRvU3RyaW5nKCd1Y3MyJywgb2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKSwgb2Zmc2V0ICsgYnl0ZUxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQlZhckJ5dGUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PEJ1ZmZlcj4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGxldCBieXRlTGVuZ3RoO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBieXRlTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGJ5dGVMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGJ5dGVMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYnl0ZUxlbmd0aCksIG9mZnNldCArIGJ5dGVMZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFVzVmFyQ2hhcihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgbGV0IGNoYXJDb3VudDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogY2hhckNvdW50IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCBieXRlTGVuZ3RoID0gY2hhckNvdW50ICogMjtcblxuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGJ5dGVMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGJ5dGVMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnRvU3RyaW5nKCd1Y3MyJywgb2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKSwgb2Zmc2V0ICsgYnl0ZUxlbmd0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVXNWYXJCeXRlKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxCdWZmZXI+IHtcbiAgb2Zmc2V0ID0gK29mZnNldDtcblxuICBsZXQgYnl0ZUxlbmd0aDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogYnl0ZUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyBieXRlTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyBieXRlTGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi5zbGljZShvZmZzZXQsIG9mZnNldCArIGJ5dGVMZW5ndGgpLCBvZmZzZXQgKyBieXRlTGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVTnVtZXJpYzY0TEUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgOCkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgOCk7XG4gIH1cblxuICBjb25zdCBsb3cgPSBidWYucmVhZFVJbnQzMkxFKG9mZnNldCk7XG4gIGNvbnN0IGhpZ2ggPSBidWYucmVhZFVJbnQzMkxFKG9mZnNldCArIDQpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KCgweDEwMDAwMDAwMCAqIGhpZ2gpICsgbG93LCBvZmZzZXQgKyA4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVTnVtZXJpYzk2TEUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgMTIpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIDEyKTtcbiAgfVxuXG4gIGNvbnN0IGR3b3JkMSA9IGJ1Zi5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgY29uc3QgZHdvcmQyID0gYnVmLnJlYWRVSW50MzJMRShvZmZzZXQgKyA0KTtcbiAgY29uc3QgZHdvcmQzID0gYnVmLnJlYWRVSW50MzJMRShvZmZzZXQgKyA4KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkd29yZDEgKyAoMHgxMDAwMDAwMDAgKiBkd29yZDIpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiBkd29yZDMpLCBvZmZzZXQgKyAxMik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVU51bWVyaWMxMjhMRShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIG9mZnNldCA9ICtvZmZzZXQ7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyAxNikge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgMTYpO1xuICB9XG5cbiAgY29uc3QgZHdvcmQxID0gYnVmLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICBjb25zdCBkd29yZDIgPSBidWYucmVhZFVJbnQzMkxFKG9mZnNldCArIDQpO1xuICBjb25zdCBkd29yZDMgPSBidWYucmVhZFVJbnQzMkxFKG9mZnNldCArIDgpO1xuICBjb25zdCBkd29yZDQgPSBidWYucmVhZFVJbnQzMkxFKG9mZnNldCArIDEyKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkd29yZDEgKyAoMHgxMDAwMDAwMDAgKiBkd29yZDIpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiBkd29yZDMpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiAweDEwMDAwMDAwMCAqIGR3b3JkNCksIG9mZnNldCArIDE2KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFPLE1BQU1BLE1BQU0sQ0FBSTtFQUlyQkMsV0FBV0EsQ0FBQ0MsS0FBUSxFQUFFQyxNQUFjLEVBQUU7SUFDcEMsSUFBSSxDQUFDRCxLQUFLLEdBQUdBLEtBQUs7SUFDbEIsSUFBSSxDQUFDQyxNQUFNLEdBQUdBLE1BQU07RUFDdEI7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBQyxPQUFBLENBQUFKLE1BQUEsR0FBQUEsTUFBQTtBQUNPLE1BQU1LLGtCQUFrQixDQUFDO0VBRzlCSixXQUFXQSxDQUFDSyxTQUFpQixFQUFFO0lBQzdCLElBQUksQ0FBQ0EsU0FBUyxHQUFHQSxTQUFTO0VBQzVCO0FBQ0Y7QUFBQ0YsT0FBQSxDQUFBQyxrQkFBQSxHQUFBQSxrQkFBQTtBQUVNLFNBQVNFLFNBQVNBLENBQUNDLEdBQVcsRUFBRUwsTUFBYyxFQUFrQjtFQUNyRUEsTUFBTSxHQUFHLENBQUNBLE1BQU07RUFFaEIsSUFBSUssR0FBRyxDQUFDQyxNQUFNLEdBQUdOLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDM0IsTUFBTSxJQUFJRSxrQkFBa0IsQ0FBQ0YsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUMxQztFQUVBLE9BQU8sSUFBSUgsTUFBTSxDQUFDUSxHQUFHLENBQUNELFNBQVMsQ0FBQ0osTUFBTSxDQUFDLEVBQUVBLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDdEQ7QUFFTyxTQUFTTyxZQUFZQSxDQUFDRixHQUFXLEVBQUVMLE1BQWMsRUFBa0I7RUFDeEVBLE1BQU0sR0FBRyxDQUFDQSxNQUFNO0VBRWhCLElBQUlLLEdBQUcsQ0FBQ0MsTUFBTSxHQUFHTixNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQzNC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