UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

227 lines (226 loc) • 28.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _sprintfJs = require("sprintf-js"); var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer")); var _crypto = require("crypto"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const traceIdSize = 36; const TOKEN = { VERSION: 0x00, ENCRYPTION: 0x01, INSTOPT: 0x02, THREADID: 0x03, MARS: 0x04, TRACEID: 0x05, FEDAUTHREQUIRED: 0x06, TERMINATOR: 0xFF }; const ENCRYPT = { OFF: 0x00, ON: 0x01, NOT_SUP: 0x02, REQ: 0x03 }; const encryptByValue = {}; for (const name in ENCRYPT) { const value = ENCRYPT[name]; encryptByValue[value] = name; } const MARS = { OFF: 0x00, ON: 0x01 }; const marsByValue = {}; for (const name in MARS) { const value = MARS[name]; marsByValue[value] = name; } /* s2.2.6.4 */ class PreloginPayload { constructor(bufferOrOptions = { encrypt: false, version: { major: 0, minor: 0, build: 0, subbuild: 0 } }) { if (bufferOrOptions instanceof Buffer) { this.data = bufferOrOptions; this.options = { encrypt: false, version: { major: 0, minor: 0, build: 0, subbuild: 0 } }; } else { this.options = bufferOrOptions; this.createOptions(); } this.extractOptions(); } createOptions() { const options = [this.createVersionOption(), this.createEncryptionOption(), this.createInstanceOption(), this.createThreadIdOption(), this.createMarsOption(), this.createTraceIdOption(), this.createFedAuthOption()]; let length = 0; for (let i = 0, len = options.length; i < len; i++) { const option = options[i]; length += 5 + option.data.length; } length++; // terminator this.data = Buffer.alloc(length, 0); let optionOffset = 0; let optionDataOffset = 5 * options.length + 1; for (let j = 0, len = options.length; j < len; j++) { const option = options[j]; this.data.writeUInt8(option.token, optionOffset + 0); this.data.writeUInt16BE(optionDataOffset, optionOffset + 1); this.data.writeUInt16BE(option.data.length, optionOffset + 3); optionOffset += 5; option.data.copy(this.data, optionDataOffset); optionDataOffset += option.data.length; } this.data.writeUInt8(TOKEN.TERMINATOR, optionOffset); } createVersionOption() { const buffer = new _writableTrackingBuffer.default(); buffer.writeUInt8(this.options.version.major); buffer.writeUInt8(this.options.version.minor); buffer.writeUInt16BE(this.options.version.build); buffer.writeUInt16BE(this.options.version.subbuild); return { token: TOKEN.VERSION, data: buffer.data }; } createEncryptionOption() { const buffer = new _writableTrackingBuffer.default(); if (this.options.encrypt) { buffer.writeUInt8(ENCRYPT.ON); } else { buffer.writeUInt8(ENCRYPT.NOT_SUP); } return { token: TOKEN.ENCRYPTION, data: buffer.data }; } createInstanceOption() { const buffer = new _writableTrackingBuffer.default(); buffer.writeUInt8(0x00); return { token: TOKEN.INSTOPT, data: buffer.data }; } createThreadIdOption() { const buffer = new _writableTrackingBuffer.default(); buffer.writeUInt32BE(0x00); return { token: TOKEN.THREADID, data: buffer.data }; } createMarsOption() { const buffer = new _writableTrackingBuffer.default(); buffer.writeUInt8(MARS.OFF); return { token: TOKEN.MARS, data: buffer.data }; } createTraceIdOption() { const buffer = new _writableTrackingBuffer.default(); // Generate a random series of bytes to use as the TraceID. // Used for debugging purposes. buffer.writeBuffer((0, _crypto.randomBytes)(traceIdSize)); return { token: TOKEN.TRACEID, data: buffer.data }; } createFedAuthOption() { const buffer = new _writableTrackingBuffer.default(); buffer.writeUInt8(0x01); return { token: TOKEN.FEDAUTHREQUIRED, data: buffer.data }; } extractOptions() { let offset = 0; while (this.data[offset] !== TOKEN.TERMINATOR) { let dataOffset = this.data.readUInt16BE(offset + 1); const dataLength = this.data.readUInt16BE(offset + 3); switch (this.data[offset]) { case TOKEN.VERSION: this.extractVersion(dataOffset); break; case TOKEN.ENCRYPTION: this.extractEncryption(dataOffset); break; case TOKEN.INSTOPT: this.extractInstance(dataOffset); break; case TOKEN.THREADID: if (dataLength > 0) { this.extractThreadId(dataOffset); } break; case TOKEN.MARS: this.extractMars(dataOffset); break; case TOKEN.TRACEID: this.extractTraceId(dataOffset); break; case TOKEN.FEDAUTHREQUIRED: this.extractFedAuth(dataOffset); break; } offset += 5; dataOffset += dataLength; } } extractVersion(offset) { this.version = { major: this.data.readUInt8(offset + 0), minor: this.data.readUInt8(offset + 1), build: this.data.readUInt16BE(offset + 2), subbuild: this.data.readUInt16BE(offset + 4) }; } extractEncryption(offset) { this.encryption = this.data.readUInt8(offset); this.encryptionString = encryptByValue[this.encryption]; } extractInstance(offset) { this.instance = this.data.readUInt8(offset); } extractThreadId(offset) { this.threadId = this.data.readUInt32BE(offset); } extractMars(offset) { this.mars = this.data.readUInt8(offset); this.marsString = marsByValue[this.mars]; } extractTraceId(offset) { this.traceId = this.data.subarray(offset, offset + traceIdSize); } extractFedAuth(offset) { this.fedAuthRequired = this.data.readUInt8(offset); } toString(indent = '') { return indent + 'PreLogin - ' + (0, _sprintfJs.sprintf)('version:%d.%d.%d.%d, encryption:0x%02X(%s), instopt:0x%02X, threadId:0x%08X, mars:0x%02X(%s), traceId:%s', this.version.major, this.version.minor, this.version.build, this.version.subbuild, this.encryption ? this.encryption : 0, this.encryptionString ? this.encryptionString : '', this.instance ? this.instance : 0, this.threadId ? this.threadId : 0, this.mars ? this.mars : 0, this.marsString ? this.marsString : '', this.traceId ? this.traceId.toString('hex') : ''); } } var _default = exports.default = PreloginPayload; module.exports = PreloginPayload; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ByaW50ZkpzIiwicmVxdWlyZSIsIl93cml0YWJsZVRyYWNraW5nQnVmZmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jcnlwdG8iLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJ0cmFjZUlkU2l6ZSIsIlRPS0VOIiwiVkVSU0lPTiIsIkVOQ1JZUFRJT04iLCJJTlNUT1BUIiwiVEhSRUFESUQiLCJNQVJTIiwiVFJBQ0VJRCIsIkZFREFVVEhSRVFVSVJFRCIsIlRFUk1JTkFUT1IiLCJFTkNSWVBUIiwiT0ZGIiwiT04iLCJOT1RfU1VQIiwiUkVRIiwiZW5jcnlwdEJ5VmFsdWUiLCJuYW1lIiwidmFsdWUiLCJtYXJzQnlWYWx1ZSIsIlByZWxvZ2luUGF5bG9hZCIsImNvbnN0cnVjdG9yIiwiYnVmZmVyT3JPcHRpb25zIiwiZW5jcnlwdCIsInZlcnNpb24iLCJtYWpvciIsIm1pbm9yIiwiYnVpbGQiLCJzdWJidWlsZCIsIkJ1ZmZlciIsImRhdGEiLCJvcHRpb25zIiwiY3JlYXRlT3B0aW9ucyIsImV4dHJhY3RPcHRpb25zIiwiY3JlYXRlVmVyc2lvbk9wdGlvbiIsImNyZWF0ZUVuY3J5cHRpb25PcHRpb24iLCJjcmVhdGVJbnN0YW5jZU9wdGlvbiIsImNyZWF0ZVRocmVhZElkT3B0aW9uIiwiY3JlYXRlTWFyc09wdGlvbiIsImNyZWF0ZVRyYWNlSWRPcHRpb24iLCJjcmVhdGVGZWRBdXRoT3B0aW9uIiwibGVuZ3RoIiwiaSIsImxlbiIsIm9wdGlvbiIsImFsbG9jIiwib3B0aW9uT2Zmc2V0Iiwib3B0aW9uRGF0YU9mZnNldCIsImoiLCJ3cml0ZVVJbnQ4IiwidG9rZW4iLCJ3cml0ZVVJbnQxNkJFIiwiY29weSIsImJ1ZmZlciIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVCdWZmZXIiLCJyYW5kb21CeXRlcyIsIm9mZnNldCIsImRhdGFPZmZzZXQiLCJyZWFkVUludDE2QkUiLCJkYXRhTGVuZ3RoIiwiZXh0cmFjdFZlcnNpb24iLCJleHRyYWN0RW5jcnlwdGlvbiIsImV4dHJhY3RJbnN0YW5jZSIsImV4dHJhY3RUaHJlYWRJZCIsImV4dHJhY3RNYXJzIiwiZXh0cmFjdFRyYWNlSWQiLCJleHRyYWN0RmVkQXV0aCIsInJlYWRVSW50OCIsImVuY3J5cHRpb24iLCJlbmNyeXB0aW9uU3RyaW5nIiwiaW5zdGFuY2UiLCJ0aHJlYWRJZCIsInJlYWRVSW50MzJCRSIsIm1hcnMiLCJtYXJzU3RyaW5nIiwidHJhY2VJZCIsInN1YmFycmF5IiwiZmVkQXV0aFJlcXVpcmVkIiwidG9TdHJpbmciLCJpbmRlbnQiLCJzcHJpbnRmIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3ByZWxvZ2luLXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ3NwcmludGYtanMnO1xuXG5pbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5jb25zdCB0cmFjZUlkU2l6ZSA9IDM2O1xuXG5jb25zdCBUT0tFTiA9IHtcbiAgVkVSU0lPTjogMHgwMCxcbiAgRU5DUllQVElPTjogMHgwMSxcbiAgSU5TVE9QVDogMHgwMixcbiAgVEhSRUFESUQ6IDB4MDMsXG4gIE1BUlM6IDB4MDQsXG4gIFRSQUNFSUQ6IDB4MDUsXG4gIEZFREFVVEhSRVFVSVJFRDogMHgwNixcbiAgVEVSTUlOQVRPUjogMHhGRlxufTtcblxuY29uc3QgRU5DUllQVDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgT0ZGOiAweDAwLFxuICBPTjogMHgwMSxcbiAgTk9UX1NVUDogMHgwMixcbiAgUkVROiAweDAzXG59O1xuXG5jb25zdCBlbmNyeXB0QnlWYWx1ZTogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSA9IHt9O1xuXG5mb3IgKGNvbnN0IG5hbWUgaW4gRU5DUllQVCkge1xuICBjb25zdCB2YWx1ZSA9IEVOQ1JZUFRbbmFtZV07XG4gIGVuY3J5cHRCeVZhbHVlW3ZhbHVlXSA9IG5hbWU7XG59XG5cbmNvbnN0IE1BUlM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7XG4gIE9GRjogMHgwMCxcbiAgT046IDB4MDFcbn07XG5cbmNvbnN0IG1hcnNCeVZhbHVlOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge307XG5cbmZvciAoY29uc3QgbmFtZSBpbiBNQVJTKSB7XG4gIGNvbnN0IHZhbHVlID0gTUFSU1tuYW1lXTtcbiAgbWFyc0J5VmFsdWVbdmFsdWVdID0gbmFtZTtcbn1cblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBlbmNyeXB0OiBib29sZWFuO1xuICB2ZXJzaW9uOiB7XG4gICAgbWFqb3I6IG51bWJlcjtcbiAgICBtaW5vcjogbnVtYmVyO1xuICAgIGJ1aWxkOiBudW1iZXI7XG4gICAgc3ViYnVpbGQ6IG51bWJlcjtcbiAgfTtcbn1cblxuLypcbiAgczIuMi42LjRcbiAqL1xuY2xhc3MgUHJlbG9naW5QYXlsb2FkIHtcbiAgZGVjbGFyZSBkYXRhOiBCdWZmZXI7XG4gIGRlY2xhcmUgb3B0aW9uczogT3B0aW9ucztcblxuICBkZWNsYXJlIHZlcnNpb246IHtcbiAgICBtYWpvcjogbnVtYmVyO1xuICAgIG1pbm9yOiBudW1iZXI7XG4gICAgYnVpbGQ6IG51bWJlcjtcbiAgICBzdWJidWlsZDogbnVtYmVyO1xuICB9O1xuXG4gIGRlY2xhcmUgZW5jcnlwdGlvbjogbnVtYmVyO1xuICBkZWNsYXJlIGVuY3J5cHRpb25TdHJpbmc6IHN0cmluZztcblxuICBkZWNsYXJlIGluc3RhbmNlOiBudW1iZXI7XG5cbiAgZGVjbGFyZSB0aHJlYWRJZDogbnVtYmVyO1xuXG4gIGRlY2xhcmUgbWFyczogbnVtYmVyO1xuICBkZWNsYXJlIG1hcnNTdHJpbmc6IHN0cmluZztcbiAgZGVjbGFyZSB0cmFjZUlkOiBCdWZmZXI7XG4gIGRlY2xhcmUgZmVkQXV0aFJlcXVpcmVkOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYnVmZmVyT3JPcHRpb25zOiBCdWZmZXIgfCBPcHRpb25zID0geyBlbmNyeXB0OiBmYWxzZSwgdmVyc2lvbjogeyBtYWpvcjogMCwgbWlub3I6IDAsIGJ1aWxkOiAwLCBzdWJidWlsZDogMCB9IH0pIHtcbiAgICBpZiAoYnVmZmVyT3JPcHRpb25zIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB0aGlzLmRhdGEgPSBidWZmZXJPck9wdGlvbnM7XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7IGVuY3J5cHQ6IGZhbHNlLCB2ZXJzaW9uOiB7IG1ham9yOiAwLCBtaW5vcjogMCwgYnVpbGQ6IDAsIHN1YmJ1aWxkOiAwIH0gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zID0gYnVmZmVyT3JPcHRpb25zIGFzIE9wdGlvbnM7XG4gICAgICB0aGlzLmNyZWF0ZU9wdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5leHRyYWN0T3B0aW9ucygpO1xuICB9XG5cbiAgY3JlYXRlT3B0aW9ucygpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAgdGhpcy5jcmVhdGVWZXJzaW9uT3B0aW9uKCksXG4gICAgICB0aGlzLmNyZWF0ZUVuY3J5cHRpb25PcHRpb24oKSxcbiAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2VPcHRpb24oKSxcbiAgICAgIHRoaXMuY3JlYXRlVGhyZWFkSWRPcHRpb24oKSxcbiAgICAgIHRoaXMuY3JlYXRlTWFyc09wdGlvbigpLFxuICAgICAgdGhpcy5jcmVhdGVUcmFjZUlkT3B0aW9uKCksXG4gICAgICB0aGlzLmNyZWF0ZUZlZEF1dGhPcHRpb24oKVxuICAgIF07XG5cbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tpXTtcbiAgICAgIGxlbmd0aCArPSA1ICsgb3B0aW9uLmRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBsZW5ndGgrKzsgLy8gdGVybWluYXRvclxuICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5hbGxvYyhsZW5ndGgsIDApO1xuICAgIGxldCBvcHRpb25PZmZzZXQgPSAwO1xuICAgIGxldCBvcHRpb25EYXRhT2Zmc2V0ID0gNSAqIG9wdGlvbnMubGVuZ3RoICsgMTtcblxuICAgIGZvciAobGV0IGogPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zW2pdO1xuICAgICAgdGhpcy5kYXRhLndyaXRlVUludDgob3B0aW9uLnRva2VuLCBvcHRpb25PZmZzZXQgKyAwKTtcbiAgICAgIHRoaXMuZGF0YS53cml0ZVVJbnQxNkJFKG9wdGlvbkRhdGFPZmZzZXQsIG9wdGlvbk9mZnNldCArIDEpO1xuICAgICAgdGhpcy5kYXRhLndyaXRlVUludDE2QkUob3B0aW9uLmRhdGEubGVuZ3RoLCBvcHRpb25PZmZzZXQgKyAzKTtcbiAgICAgIG9wdGlvbk9mZnNldCArPSA1O1xuICAgICAgb3B0aW9uLmRhdGEuY29weSh0aGlzLmRhdGEsIG9wdGlvbkRhdGFPZmZzZXQpO1xuICAgICAgb3B0aW9uRGF0YU9mZnNldCArPSBvcHRpb24uZGF0YS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhLndyaXRlVUludDgoVE9LRU4uVEVSTUlOQVRPUiwgb3B0aW9uT2Zmc2V0KTtcbiAgfVxuXG4gIGNyZWF0ZVZlcnNpb25PcHRpb24oKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm9wdGlvbnMudmVyc2lvbi5tYWpvcik7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5vcHRpb25zLnZlcnNpb24ubWlub3IpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQxNkJFKHRoaXMub3B0aW9ucy52ZXJzaW9uLmJ1aWxkKTtcbiAgICBidWZmZXIud3JpdGVVSW50MTZCRSh0aGlzLm9wdGlvbnMudmVyc2lvbi5zdWJidWlsZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiBUT0tFTi5WRVJTSU9OLFxuICAgICAgZGF0YTogYnVmZmVyLmRhdGFcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlRW5jcnlwdGlvbk9wdGlvbigpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jcnlwdCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDgoRU5DUllQVC5PTik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQ4KEVOQ1JZUFQuTk9UX1NVUCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogVE9LRU4uRU5DUllQVElPTixcbiAgICAgIGRhdGE6IGJ1ZmZlci5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUluc3RhbmNlT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgoMHgwMCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiBUT0tFTi5JTlNUT1BULFxuICAgICAgZGF0YTogYnVmZmVyLmRhdGFcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlVGhyZWFkSWRPcHRpb24oKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICBidWZmZXIud3JpdGVVSW50MzJCRSgweDAwKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46IFRPS0VOLlRIUkVBRElELFxuICAgICAgZGF0YTogYnVmZmVyLmRhdGFcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlTWFyc09wdGlvbigpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KE1BUlMuT0ZGKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46IFRPS0VOLk1BUlMsXG4gICAgICBkYXRhOiBidWZmZXIuZGF0YVxuICAgIH07XG4gIH1cblxuICBjcmVhdGVUcmFjZUlkT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgLy8gR2VuZXJhdGUgYSByYW5kb20gc2VyaWVzIG9mIGJ5dGVzIHRvIHVzZSBhcyB0aGUgVHJhY2VJRC5cbiAgICAvLyBVc2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgYnVmZmVyLndyaXRlQnVmZmVyKHJhbmRvbUJ5dGVzKHRyYWNlSWRTaXplKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiBUT0tFTi5UUkFDRUlELFxuICAgICAgZGF0YTogYnVmZmVyLmRhdGFcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlRmVkQXV0aE9wdGlvbigpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KDB4MDEpO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogVE9LRU4uRkVEQVVUSFJFUVVJUkVELFxuICAgICAgZGF0YTogYnVmZmVyLmRhdGFcbiAgICB9O1xuICB9XG5cbiAgZXh0cmFjdE9wdGlvbnMoKSB7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgd2hpbGUgKHRoaXMuZGF0YVtvZmZzZXRdICE9PSBUT0tFTi5URVJNSU5BVE9SKSB7XG4gICAgICBsZXQgZGF0YU9mZnNldCA9IHRoaXMuZGF0YS5yZWFkVUludDE2QkUob2Zmc2V0ICsgMSk7XG4gICAgICBjb25zdCBkYXRhTGVuZ3RoID0gdGhpcy5kYXRhLnJlYWRVSW50MTZCRShvZmZzZXQgKyAzKTtcbiAgICAgIHN3aXRjaCAodGhpcy5kYXRhW29mZnNldF0pIHtcbiAgICAgICAgY2FzZSBUT0tFTi5WRVJTSU9OOlxuICAgICAgICAgIHRoaXMuZXh0cmFjdFZlcnNpb24oZGF0YU9mZnNldCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVE9LRU4uRU5DUllQVElPTjpcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbmNyeXB0aW9uKGRhdGFPZmZzZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPS0VOLklOU1RPUFQ6XG4gICAgICAgICAgdGhpcy5leHRyYWN0SW5zdGFuY2UoZGF0YU9mZnNldCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVE9LRU4uVEhSRUFESUQ6XG4gICAgICAgICAgaWYgKGRhdGFMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RUaHJlYWRJZChkYXRhT2Zmc2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVE9LRU4uTUFSUzpcbiAgICAgICAgICB0aGlzLmV4dHJhY3RNYXJzKGRhdGFPZmZzZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPS0VOLlRSQUNFSUQ6XG4gICAgICAgICAgdGhpcy5leHRyYWN0VHJhY2VJZChkYXRhT2Zmc2V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUT0tFTi5GRURBVVRIUkVRVUlSRUQ6XG4gICAgICAgICAgdGhpcy5leHRyYWN0RmVkQXV0aChkYXRhT2Zmc2V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSA1O1xuICAgICAgZGF0YU9mZnNldCArPSBkYXRhTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIGV4dHJhY3RWZXJzaW9uKG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpcy52ZXJzaW9uID0ge1xuICAgICAgbWFqb3I6IHRoaXMuZGF0YS5yZWFkVUludDgob2Zmc2V0ICsgMCksXG4gICAgICBtaW5vcjogdGhpcy5kYXRhLnJlYWRVSW50OChvZmZzZXQgKyAxKSxcbiAgICAgIGJ1aWxkOiB0aGlzLmRhdGEucmVhZFVJbnQxNkJFKG9mZnNldCArIDIpLFxuICAgICAgc3ViYnVpbGQ6IHRoaXMuZGF0YS5yZWFkVUludDE2QkUob2Zmc2V0ICsgNClcbiAgICB9O1xuICB9XG5cbiAgZXh0cmFjdEVuY3J5cHRpb24ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLmVuY3J5cHRpb24gPSB0aGlzLmRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgdGhpcy5lbmNyeXB0aW9uU3RyaW5nID0gZW5jcnlwdEJ5VmFsdWVbdGhpcy5lbmNyeXB0aW9uXTtcbiAgfVxuXG4gIGV4dHJhY3RJbnN0YW5jZShvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLmRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gIH1cblxuICBleHRyYWN0VGhyZWFkSWQob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRocmVhZElkID0gdGhpcy5kYXRhLnJlYWRVSW50MzJCRShvZmZzZXQpO1xuICB9XG5cbiAgZXh0cmFjdE1hcnMob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLm1hcnMgPSB0aGlzLmRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgdGhpcy5tYXJzU3RyaW5nID0gbWFyc0J5VmFsdWVbdGhpcy5tYXJzXTtcbiAgfVxuXG4gIGV4dHJhY3RUcmFjZUlkKG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpcy50cmFjZUlkID0gdGhpcy5kYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgdHJhY2VJZFNpemUpO1xuICB9XG5cbiAgZXh0cmFjdEZlZEF1dGgob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IHRoaXMuZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgfVxuXG4gIHRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgcmV0dXJuIGluZGVudCArICdQcmVMb2dpbiAtICcgKyBzcHJpbnRmKFxuICAgICAgJ3ZlcnNpb246JWQuJWQuJWQuJWQsIGVuY3J5cHRpb246MHglMDJYKCVzKSwgaW5zdG9wdDoweCUwMlgsIHRocmVhZElkOjB4JTA4WCwgbWFyczoweCUwMlgoJXMpLCB0cmFjZUlkOiVzJyxcbiAgICAgIHRoaXMudmVyc2lvbi5tYWpvciwgdGhpcy52ZXJzaW9uLm1pbm9yLCB0aGlzLnZlcnNpb24uYnVpbGQsIHRoaXMudmVyc2lvbi5zdWJidWlsZCxcbiAgICAgIHRoaXMuZW5jcnlwdGlvbiA/IHRoaXMuZW5jcnlwdGlvbiA6IDAsXG4gICAgICB0aGlzLmVuY3J5cHRpb25TdHJpbmcgPyB0aGlzLmVuY3J5cHRpb25TdHJpbmcgOiAnJyxcbiAgICAgIHRoaXMuaW5zdGFuY2UgPyB0aGlzLmluc3RhbmNlIDogMCxcbiAgICAgIHRoaXMudGhyZWFkSWQgPyB0aGlzLnRocmVhZElkIDogMCxcbiAgICAgIHRoaXMubWFycyA/IHRoaXMubWFycyA6IDAsXG4gICAgICB0aGlzLm1hcnNTdHJpbmcgPyB0aGlzLm1hcnNTdHJpbmcgOiAnJyxcbiAgICAgIHRoaXMudHJhY2VJZCA/IHRoaXMudHJhY2VJZC50b1N0cmluZygnaGV4JykgOiAnJyxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByZWxvZ2luUGF5bG9hZDtcbm1vZHVsZS5leHBvcnRzID0gUHJlbG9naW5QYXlsb2FkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBQXFDLFNBQUFFLHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRXJDLE1BQU1HLFdBQVcsR0FBRyxFQUFFO0FBRXRCLE1BQU1DLEtB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