UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

799 lines (798 loc) 86.3 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/cbor/write-utils.ts var write_utils_exports = {}; __export(write_utils_exports, { write: () => write, writeBigInt: () => writeBigInt, writeBoolean: () => writeBoolean, writeByteString: () => writeByteString, writeEncodedUtf8String: () => writeEncodedUtf8String, writeHeader: () => writeHeader, writeNullable: () => writeNullable, writeNumber: () => writeNumber, writePayload: () => writePayload, writeUtf8String: () => writeUtf8String }); module.exports = __toCommonJS(write_utils_exports); var import_errors = require("../errors/index.cjs"); var import_utils = require("../utils/index.cjs"); var import_iana = require("./_iana.cjs"); var import_spec = require("./spec.cjs"); var import_traits = require("./traits.cjs"); function writeHeader(w, mt, length) { switch (true) { case length < import_spec.AI_ONE_BYTE: w.writeUint8(mt << 5 | Number(length)); break; case length <= 255: w.writeUint8(mt << 5 | import_spec.AI_ONE_BYTE); w.writeUint8(Number(length)); break; case length <= 65535: w.writeUint8(mt << 5 | import_spec.AI_TWO_BYTES); w.writeUint16(Number(length)); break; case length <= 4294967295: w.writeUint8(mt << 5 | import_spec.AI_FOUR_BYTES); w.writeUint32(Number(length)); break; default: w.writeUint8(mt << 5 | import_spec.AI_EIGHT_BYTES); w.writeBigUint64(BigInt(length)); } } __name(writeHeader, "writeHeader"); function writePayload(w, value) { w.writeBytes(value); } __name(writePayload, "writePayload"); function writeByteString(w, value) { writeHeader(w, import_spec.MT_BYTE_STRING, value.length); writePayload(w, value); } __name(writeByteString, "writeByteString"); function writeUtf8String(w, value) { let l = value.length; if (l <= 0) { w.claim(1); w.data[w.offset++] = 96; return; } switch (l) { case 2: switch (value) { case "ns": w.claim(3); w.data[w.offset++] = 98; w.data.set([110, 115], w.offset); w.offset += 2; return; case "db": w.claim(3); w.data[w.offset++] = 98; w.data.set([100, 98], w.offset); w.offset += 2; return; case "ac": w.claim(3); w.data[w.offset++] = 98; w.data.set([97, 99], w.offset); w.offset += 2; return; } break; case 3: switch (value) { case "use": w.claim(4); w.data[w.offset++] = 99; w.data.set([117, 115, 101], w.offset); w.offset += 3; return; case "let": w.claim(4); w.data[w.offset++] = 99; w.data.set([108, 101, 116], w.offset); w.offset += 3; return; case "run": w.claim(4); w.data[w.offset++] = 99; w.data.set([114, 117, 110], w.offset); w.offset += 3; return; } break; case 4: switch (value) { case "user": w.claim(5); w.data[w.offset++] = 100; w.data.set([117, 115, 101, 114], w.offset); w.offset += 4; return; case "pass": w.claim(5); w.data[w.offset++] = 100; w.data.set([112, 97, 115, 115], w.offset); w.offset += 4; return; case "ping": w.claim(5); w.data[w.offset++] = 100; w.data.set([112, 105, 110, 103], w.offset); w.offset += 4; return; case "info": w.claim(5); w.data[w.offset++] = 100; w.data.set([105, 110, 102, 111], w.offset); w.offset += 4; return; case "live": w.claim(5); w.data[w.offset++] = 100; w.data.set([108, 105, 118, 101], w.offset); w.offset += 4; return; case "kill": w.claim(5); w.data[w.offset++] = 100; w.data.set([107, 105, 108, 108], w.offset); w.offset += 4; return; } break; case 5: switch (value) { case "unset": w.claim(6); w.data[w.offset++] = 101; w.data.set([117, 110, 115, 101, 116], w.offset); w.offset += 5; return; case "query": w.claim(6); w.data[w.offset++] = 101; w.data.set([113, 117, 101, 114, 121], w.offset); w.offset += 5; return; case "merge": w.claim(6); w.data[w.offset++] = 101; w.data.set([109, 101, 114, 103, 101], w.offset); w.offset += 5; return; case "patch": w.claim(6); w.data[w.offset++] = 101; w.data.set([112, 97, 116, 99, 104], w.offset); w.offset += 5; return; } break; case 6: switch (value) { case "method": w.claim(7); w.data[w.offset++] = 102; w.data.set([109, 101, 116, 104, 111, 100], w.offset); w.offset += 6; return; case "params": w.claim(7); w.data[w.offset++] = 102; w.data.set([112, 97, 114, 97, 109, 115], w.offset); w.offset += 6; return; case "signup": w.claim(7); w.data[w.offset++] = 102; w.data.set([115, 105, 103, 110, 117, 112], w.offset); w.offset += 6; return; case "signin": w.claim(7); w.data[w.offset++] = 102; w.data.set([115, 105, 103, 110, 105, 110], w.offset); w.offset += 6; return; case "select": w.claim(7); w.data[w.offset++] = 102; w.data.set([115, 101, 108, 101, 99, 116], w.offset); w.offset += 6; return; case "create": w.claim(7); w.data[w.offset++] = 102; w.data.set([99, 114, 101, 97, 116, 101], w.offset); w.offset += 6; return; case "insert": w.claim(7); w.data[w.offset++] = 102; w.data.set([105, 110, 115, 101, 114, 116], w.offset); w.offset += 6; return; case "update": w.claim(7); w.data[w.offset++] = 102; w.data.set([117, 112, 100, 97, 116, 101], w.offset); w.offset += 6; return; case "upsert": w.claim(7); w.data[w.offset++] = 102; w.data.set([117, 112, 115, 101, 114, 116], w.offset); w.offset += 6; return; case "delete": w.claim(7); w.data[w.offset++] = 102; w.data.set([100, 101, 108, 101, 116, 101], w.offset); w.offset += 6; return; case "relate": w.claim(7); w.data[w.offset++] = 102; w.data.set([114, 101, 108, 97, 116, 101], w.offset); w.offset += 6; return; } break; case 7: switch (value) { case "version": w.claim(8); w.data[w.offset++] = 103; w.data.set([118, 101, 114, 115, 105, 111, 110], w.offset); w.offset += 7; return; } break; case 10: switch (value) { case "invalidate": w.claim(11); w.data[w.offset++] = 106; w.data.set([ 105, 110, 118, 97, 108, 105, 100, 97, 116, 101 ], w.offset); w.offset += 10; return; } break; case 12: switch (value) { case "authenticate": w.claim(13); w.data[w.offset++] = 108; w.data.set([ 97, 117, 116, 104, 101, 110, 116, 105, 99, 97, 116, 101 ], w.offset); w.offset += 12; return; } break; } if (w.data.length - w.offset >= 5 + l + l + l) { const r = import_utils.utf8.encodeInto(value, w.data.subarray(w.offset + 5)); if (r.written < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 96 + r.written; l = 4; } else if (r.written <= 255) { w.data[w.offset++] = 120; w.data[w.offset++] = r.written; l = 3; } else if (r.written <= 65535) { w.data[w.offset++] = 121; w.view.setUint16(w.offset, r.written); w.offset += 2; l = 2; } else { w.data[w.offset++] = 122; w.view.setUint32(w.offset, r.written); w.offset += 4; l = 0; } if (l > 0) { w.data.copyWithin(w.offset, l += w.offset, l + r.written); } w.offset += r.written; } else { const bytes = import_utils.utf8.encode(value); writeEncodedUtf8String(w, bytes); } } __name(writeUtf8String, "writeUtf8String"); function writeEncodedUtf8String(w, value) { const l = value.length; if (l <= 0) { w.claim(1); w.data[w.offset++] = 96; return; } w.claim(9); if (l < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 96 + l; } else if (l <= 255) { w.data[w.offset++] = 120; w.data[w.offset++] = l; } else if (l <= 65535) { w.data[w.offset++] = 121; w.view.setUint16(w.offset, l); w.offset += 2; } else if (l <= 4294967295) { w.data[w.offset++] = 122; w.view.setUint32(w.offset, l); w.offset += 4; } else if (l <= import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER) { w.data[w.offset++] = 123; w.view.setBigUint64(w.offset, BigInt(l)); w.offset += 8; } else { throw new import_errors.NumberRangeError([0, import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER], l); } w.writeBytes(value); } __name(writeEncodedUtf8String, "writeEncodedUtf8String"); function writeUndefined(w) { w.claim(2); w.data[w.offset++] = 198; w.data[w.offset++] = import_spec.HEADER_NULL; } __name(writeUndefined, "writeUndefined"); function writeNullable(w, value) { if (value === null) { w.writeUint8(import_spec.HEADER_NULL); } else { writeUndefined(w); } } __name(writeNullable, "writeNullable"); function writeBoolean(w, value) { if (value) { w.writeUint8(import_spec.HEADER_TRUE); } else { w.writeUint8(import_spec.HEADER_FALSE); } } __name(writeBoolean, "writeBoolean"); function writeNumber(w, value) { if (Number.isInteger(value)) { if (value >= 0) { w.claim(9); if (value < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = value; } else if (value <= 255) { w.data[w.offset++] = import_spec.AI_ONE_BYTE; w.data[w.offset++] = value; } else if (value <= 65535) { w.data[w.offset++] = import_spec.AI_TWO_BYTES; w.view.setUint16(w.offset, value); w.offset += 2; } else if (value <= 4294967295) { w.data[w.offset++] = import_spec.AI_FOUR_BYTES; w.view.setUint32(w.offset, value); w.offset += 4; } else if (value <= import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER) { w.data[w.offset++] = import_spec.AI_EIGHT_BYTES; w.view.setBigUint64(w.offset, BigInt(value)); w.offset += 8; } else { throw new import_errors.NumberRangeError( [ -import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER, import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER ], value ); } } else { const ui = -value - 1; w.claim(9); if (ui < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 32 + ui; } else if (ui <= 255) { w.data[w.offset++] = 56; w.data[w.offset++] = ui; } else if (ui <= 65535) { w.data[w.offset++] = 57; w.view.setUint16(w.offset, ui); w.offset += 2; } else if (ui <= 4294967295) { w.data[w.offset++] = 58; w.view.setUint32(w.offset, ui); w.offset += 4; } else if (ui <= import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER) { w.data[w.offset++] = 59; w.view.setBigUint64(w.offset, BigInt(ui)); w.offset += 8; } else { throw new import_errors.NumberRangeError( [ -import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER, import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER ], value ); } } } else if (value === Infinity) { w.claim(3); w.data[w.offset++] = import_spec.HEADER_FLOAT_HALF; w.data[w.offset++] = 124; w.data[w.offset++] = 0; } else if (value === -Infinity) { w.claim(3); w.data[w.offset++] = import_spec.HEADER_FLOAT_HALF; w.data[w.offset++] = 252; w.data[w.offset++] = 0; } else if (value === value) { w.claim(9); w.data[w.offset++] = import_spec.HEADER_FLOAT_DOUBLE; w.view.setFloat64(w.offset, value); w.offset += 8; } else { w.claim(3); w.data[w.offset++] = import_spec.HEADER_FLOAT_HALF; w.data[w.offset++] = 126; w.data[w.offset++] = 0; } } __name(writeNumber, "writeNumber"); function writeBigInt(w, value) { if (value >= 0) { w.claim(9); if (value < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = Number(value); } else if (value <= 255) { w.data[w.offset++] = import_spec.AI_ONE_BYTE; w.data[w.offset++] = Number(value); } else if (value <= 65535) { w.data[w.offset++] = import_spec.AI_TWO_BYTES; w.view.setUint16(w.offset, Number(value)); w.offset += 2; } else if (value <= 4294967295) { w.data[w.offset++] = import_spec.AI_FOUR_BYTES; w.view.setUint32(w.offset, Number(value)); w.offset += 4; } else if (value <= import_spec.CBOR_MAX_UNSIGNED_INTEGER) { w.data[w.offset++] = import_spec.AI_EIGHT_BYTES; w.view.setBigUint64(w.offset, value); w.offset += 8; } else { throw new import_errors.NumberRangeError( [ import_spec.CBOR_MIN_NEGATIVE_INTEGER, import_spec.CBOR_MAX_UNSIGNED_INTEGER ], value ); } } else { const ui = -value - 1n; w.claim(9); if (ui < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 32 + Number(ui); } else if (ui <= 255) { w.data[w.offset++] = 56; w.data[w.offset++] = Number(ui); } else if (ui <= 65535) { w.data[w.offset++] = 57; w.view.setUint16(w.offset, Number(ui)); w.offset += 2; } else if (ui <= 4294967295) { w.data[w.offset++] = 58; w.view.setUint32(w.offset, Number(ui)); w.offset += 4; } else if (ui <= import_spec.CBOR_MAX_UNSIGNED_INTEGER) { w.data[w.offset++] = 59; w.view.setBigUint64(w.offset, ui); w.offset += 8; } else { throw new import_errors.NumberRangeError( [ import_spec.CBOR_MIN_NEGATIVE_INTEGER, import_spec.CBOR_MAX_UNSIGNED_INTEGER ], value ); } } } __name(writeBigInt, "writeBigInt"); function writeArrayHeader(w, length) { w.claim(9); if (length < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 128 + length; } else if (length <= 255) { w.data[w.offset++] = 152; w.data[w.offset++] = length; } else if (length <= 65535) { w.data[w.offset++] = 153; w.view.setUint16(w.offset, length); w.offset += 2; } else if (length <= 4294967295) { w.data[w.offset++] = 154; w.view.setUint32(w.offset, length); w.offset += 4; } else if (length <= import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER) { w.data[w.offset++] = 155; w.view.setBigUint64(w.offset, BigInt(length)); w.offset += 8; } else { throw new import_errors.NumberRangeError([0, import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER], length); } } __name(writeArrayHeader, "writeArrayHeader"); function writeMapHeader(w, length) { w.claim(9); if (length < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 160 + length; } else if (length <= 255) { w.data[w.offset++] = 184; w.data[w.offset++] = length; } else if (length <= 65535) { w.data[w.offset++] = 185; w.view.setUint16(w.offset, length); w.offset += 2; } else if (length <= 4294967295) { w.data[w.offset++] = 186; w.view.setUint32(w.offset, length); w.offset += 4; } else if (length <= import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER) { w.data[w.offset++] = 187; w.view.setBigUint64(w.offset, BigInt(length)); w.offset += 8; } else { throw new import_errors.NumberRangeError([0, import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER], length); } } __name(writeMapHeader, "writeMapHeader"); function writeTagHeader(w, tag) { w.claim(9); if (tag < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 192 + Number(tag); } else if (tag <= 255) { w.data[w.offset++] = 216; w.data[w.offset++] = Number(tag); } else if (tag <= 65535) { w.data[w.offset++] = 217; w.view.setUint16(w.offset, Number(tag)); w.offset += 2; } else if (tag <= 4294967295) { w.data[w.offset++] = 218; w.view.setUint32(w.offset, Number(tag)); w.offset += 4; } else if (tag <= import_spec.JS_MAX_SAFE_UNSIGNED_INTEGER) { w.data[w.offset++] = 219; w.view.setBigUint64(w.offset, BigInt(tag)); w.offset += 8; } else { throw new import_errors.NumberRangeError([0, import_spec.CBOR_MAX_UNSIGNED_INTEGER], tag); } } __name(writeTagHeader, "writeTagHeader"); function writeSimpleHeader(w, value) { w.claim(3); if (value < import_spec.AI_ONE_BYTE) { w.data[w.offset++] = 224 + value; } else if (value <= 255) { w.data[w.offset++] = 248; w.data[w.offset++] = value; } else { throw new import_errors.NumberRangeError([0, 255], value); } } __name(writeSimpleHeader, "writeSimpleHeader"); var PARENT_SET = 0; var PARENT_MAP = 1; var PARENT_OBJ = 2; var PARENT_TAG = 3; var CONTINUE = Symbol.for("@tai-kun/surrealdb/cbor/continue"); function write(w, value, options = {}) { const { replacer = [], isSafeMapKey = /* @__PURE__ */ __name((k) => k !== "__proto__" && k !== "constructor", "isSafeMapKey"), isSafeObjectKey = /* @__PURE__ */ __name((k) => k !== "__proto__" && k !== "constructor", "isSafeObjectKey") } = options; const replacers = typeof replacer === "function" ? [replacer, import_iana.ianaReplacer] : replacer.concat(import_iana.ianaReplacer); let parent; const parents = []; const seen = /* @__PURE__ */ new Set(); function begin(p) { if (p.$ !== PARENT_TAG && ++w.depth >= w.maxDepth) { throw new import_errors.CborMaxDepthReachedError(w.maxDepth); } seen.add(p.value); parents.push(parent = p); } __name(begin, "begin"); let kind; while (true) { if (value === null) { w.writeUint8(import_spec.HEADER_NULL); } else if (value === void 0) { writeUndefined(w); } else if (value === true) { w.writeUint8(import_spec.HEADER_TRUE); } else if (value === false) { w.writeUint8(import_spec.HEADER_FALSE); } else if ((kind = typeof value) === "string") { writeUtf8String(w, value); } else if (kind === "number") { writeNumber(w, value); } else if (kind === "bigint") { writeBigInt(w, value); } else if (seen.has(value)) { throw new import_errors.CircularReferenceError(value); } else if ((0, import_traits.canToCBOR)(value)) { const cbor = value.toCBOR(w); if (Array.isArray(cbor)) { begin({ $: PARENT_TAG, value }); if (cbor.length === 2) { writeTagHeader(w, cbor[0]); value = cbor[1]; } else if (cbor.length === 1) { value = cbor[0]; } else { throw new import_errors.SurrealValueError( "an array of length 1 or 2", `an array of length ${cbor.length}` ); } continue; } } else if ((0, import_utils.isPlainObject)(value)) { const keys = Object.keys(value); const length = keys.length; writeMapHeader(w, length); if (length > 0) { begin({ $: PARENT_OBJ, value, index: 0, length, isProperty: true, properties: keys }); } } else if (Array.isArray(value) || value instanceof Set) { const target = Array.isArray(value) ? value : Array.from(value); const length = target.length; writeArrayHeader(w, length); if (length > 0) { begin({ $: PARENT_SET, value, index: 0, length, target }); } } else if (value instanceof Map) { const keys = Array.from(value.keys()); const length = keys.length; writeMapHeader(w, length); if (length > 0) { begin({ $: PARENT_MAP, value, index: 0, length, isProperty: true, properties: keys }); } } else if (value instanceof Uint8Array) { writeByteString(w, value); } else if (value instanceof import_spec.Simple) { writeSimpleHeader(w, value.value); } else { let replaced = false; for (let i = 0, ret; i < replacers.length; i++) { if ((ret = replacers[i](value)) !== CONTINUE) { value = ret; replaced = true; break; } } if (replaced) { continue; } throw new import_errors.SurrealTypeError( [ "BigInt", "Boolean", "null", "Number", "Object", "String", "undefined" ], value ); } while (parent && (parent.$ === PARENT_TAG || parent.index === parent.length)) { if (parent.$ !== PARENT_TAG) { w.depth -= 1; } seen.delete(parent.value); parents.pop(); parent = parents[parents.length - 1]; } if (!parent) { break; } if (parent.$ === PARENT_OBJ) { if (parent.isProperty) { const key = value = parent.properties[parent.index]; if (!isSafeObjectKey(key, parent.value)) { throw new import_errors.CborUnsafeMapKeyError(value); } } else { value = parent.value[parent.properties[parent.index++]]; } parent.isProperty = !parent.isProperty; } else if (parent.$ === PARENT_SET) { value = parent.target[parent.index++]; } else if (parent.$ === PARENT_MAP) { if (parent.isProperty) { value = parent.properties[parent.index]; if (!isSafeMapKey(value, parent.value)) { throw new import_errors.CborUnsafeMapKeyError(value); } } else { value = parent.value.get(parent.properties[parent.index++]); } parent.isProperty = !parent.isProperty; } else { (0, import_errors.unreachable)(parent); } } } __name(write, "write"); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2Nib3Ivd3JpdGUtdXRpbHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIENib3JNYXhEZXB0aFJlYWNoZWRFcnJvcixcbiAgQ2JvclVuc2FmZU1hcEtleUVycm9yLFxuICBDaXJjdWxhclJlZmVyZW5jZUVycm9yLFxuICBOdW1iZXJSYW5nZUVycm9yLFxuICBTdXJyZWFsVHlwZUVycm9yLFxuICBTdXJyZWFsVmFsdWVFcnJvcixcbiAgdW5yZWFjaGFibGUsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFVpbnQ4QXJyYXlMaWtlIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi90eXBlc1wiO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgdXRmOCB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdXRpbHNcIjtcbmltcG9ydCB7IGlhbmFSZXBsYWNlciB9IGZyb20gXCIuL19pYW5hXCI7XG5pbXBvcnQge1xuICBBSV9FSUdIVF9CWVRFUyxcbiAgQUlfRk9VUl9CWVRFUyxcbiAgQUlfT05FX0JZVEUsXG4gIEFJX1RXT19CWVRFUyxcbiAgQ0JPUl9NQVhfVU5TSUdORURfSU5URUdFUixcbiAgQ0JPUl9NSU5fTkVHQVRJVkVfSU5URUdFUixcbiAgSEVBREVSX0ZBTFNFLFxuICBIRUFERVJfRkxPQVRfRE9VQkxFLFxuICBIRUFERVJfRkxPQVRfSEFMRixcbiAgSEVBREVSX05VTEwsXG4gIEhFQURFUl9UUlVFLFxuICBKU19NQVhfU0FGRV9VTlNJR05FRF9JTlRFR0VSLFxuICB0eXBlIE1ham9yVHlwZSxcbiAgTVRfQllURV9TVFJJTkcsXG4gIFNpbXBsZSxcbn0gZnJvbSBcIi4vc3BlY1wiO1xuaW1wb3J0IHsgY2FuVG9DQk9SLCB0eXBlIFRvQ0JPUiB9IGZyb20gXCIuL3RyYWl0c1wiO1xuaW1wb3J0IHR5cGUgeyBXcml0ZXIgfSBmcm9tIFwiLi93cml0ZXJcIjtcblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2Nib3Ivb3RoZXJzLyN3cml0ZWhlYWRlcilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSGVhZGVyKFxuICB3OiBXcml0ZXIsXG4gIG10OiBNYWpvclR5cGUsXG4gIGxlbmd0aDogbnVtYmVyIHwgYmlnaW50LFxuKTogdm9pZCB7XG4gIHN3aXRjaCAodHJ1ZSkge1xuICAgIGNhc2UgbGVuZ3RoIDwgQUlfT05FX0JZVEU6XG4gICAgICB3LndyaXRlVWludDgoKG10IDw8IDUpIHwgTnVtYmVyKGxlbmd0aCkpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIGxlbmd0aCA8PSAweGZmOlxuICAgICAgdy53cml0ZVVpbnQ4KChtdCA8PCA1KSB8IEFJX09ORV9CWVRFKTtcbiAgICAgIHcud3JpdGVVaW50OChOdW1iZXIobGVuZ3RoKSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVuZ3RoIDw9IDB4ZmZmZjpcbiAgICAgIHcud3JpdGVVaW50OCgobXQgPDwgNSkgfCBBSV9UV09fQllURVMpO1xuICAgICAgdy53cml0ZVVpbnQxNihOdW1iZXIobGVuZ3RoKSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVuZ3RoIDw9IDB4ZmZmZmZmZmY6XG4gICAgICB3LndyaXRlVWludDgoKG10IDw8IDUpIHwgQUlfRk9VUl9CWVRFUyk7XG4gICAgICB3LndyaXRlVWludDMyKE51bWJlcihsZW5ndGgpKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHcud3JpdGVVaW50OCgobXQgPDwgNSkgfCBBSV9FSUdIVF9CWVRFUyk7XG4gICAgICB3LndyaXRlQmlnVWludDY0KEJpZ0ludChsZW5ndGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9hcGkvY2Jvci9vdGhlcnMvI3dyaXRlcGF5bG9hZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGF5bG9hZChcbiAgdzogV3JpdGVyLFxuICB2YWx1ZTogVWludDhBcnJheUxpa2UsXG4pOiB2b2lkIHtcbiAgdy53cml0ZUJ5dGVzKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2Nib3Ivb3RoZXJzLyN3cml0ZWJ5dGVzdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUJ5dGVTdHJpbmcoXG4gIHc6IFdyaXRlcixcbiAgdmFsdWU6IFVpbnQ4QXJyYXlMaWtlLFxuKTogdm9pZCB7XG4gIHdyaXRlSGVhZGVyKHcsIE1UX0JZVEVfU1RSSU5HLCB2YWx1ZS5sZW5ndGgpO1xuICB3cml0ZVBheWxvYWQodywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9hcGkvY2Jvci9vdGhlcnMvI3dyaXRldXRmOHN0cmluZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVXRmOFN0cmluZyh3OiBXcml0ZXIsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IGwgPSB2YWx1ZS5sZW5ndGg7XG5cbiAgaWYgKGwgPD0gMCkge1xuICAgIHcuY2xhaW0oMSk7XG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gOTY7IC8vIDEyMCAtIDEgLSAyM1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChsKSB7XG4gICAgY2FzZSAyOlxuICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlIFwibnNcIjpcbiAgICAgICAgICB3LmNsYWltKDMpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDk4OyAvLyA5NiArIDJcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDZFLCAweDczXSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDI7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJkYlwiOlxuICAgICAgICAgIHcuY2xhaW0oMyk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gOTg7IC8vIDk2ICsgMlxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NjQsIDB4NjJdLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gMjtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBcImFjXCI6XG4gICAgICAgICAgdy5jbGFpbSgzKTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSA5ODsgLy8gOTYgKyAyXG4gICAgICAgICAgdy5kYXRhLnNldChbMHg2MSwgMHg2M10sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSAyO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDM6XG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJ1c2VcIjpcbiAgICAgICAgICB3LmNsYWltKDQpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDk5OyAvLyA5NiArIDNcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDc1LCAweDczLCAweDY1XSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDM7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJsZXRcIjpcbiAgICAgICAgICB3LmNsYWltKDQpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDk5OyAvLyA5NiArIDNcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDZDLCAweDY1LCAweDc0XSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDM7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJydW5cIjpcbiAgICAgICAgICB3LmNsYWltKDQpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDk5OyAvLyA5NiArIDNcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDcyLCAweDc1LCAweDZFXSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDM7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgNDpcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSBcInVzZXJcIjpcbiAgICAgICAgICB3LmNsYWltKDUpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMDsgLy8gOTYgKyA0XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg3NSwgMHg3MywgMHg2NSwgMHg3Ml0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA0O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwicGFzc1wiOlxuICAgICAgICAgIHcuY2xhaW0oNSk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTAwOyAvLyA5NiArIDRcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDcwLCAweDYxLCAweDczLCAweDczXSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJwaW5nXCI6XG4gICAgICAgICAgdy5jbGFpbSg1KTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMDA7IC8vIDk2ICsgNFxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NzAsIDB4NjksIDB4NkUsIDB4NjddLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gNDtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBcImluZm9cIjpcbiAgICAgICAgICB3LmNsYWltKDUpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMDsgLy8gOTYgKyA0XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg2OSwgMHg2RSwgMHg2NiwgMHg2Rl0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA0O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwibGl2ZVwiOlxuICAgICAgICAgIHcuY2xhaW0oNSk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTAwOyAvLyA5NiArIDRcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDZDLCAweDY5LCAweDc2LCAweDY1XSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJraWxsXCI6XG4gICAgICAgICAgdy5jbGFpbSg1KTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMDA7IC8vIDk2ICsgNFxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NkIsIDB4NjksIDB4NkMsIDB4NkNdLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gNDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSA1OlxuICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlIFwidW5zZXRcIjpcbiAgICAgICAgICB3LmNsYWltKDYpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMTsgLy8gOTYgKyA1XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg3NSwgMHg2RSwgMHg3MywgMHg2NSwgMHg3NF0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA1O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwicXVlcnlcIjpcbiAgICAgICAgICB3LmNsYWltKDYpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMTsgLy8gOTYgKyA1XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OV0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA1O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwibWVyZ2VcIjpcbiAgICAgICAgICB3LmNsYWltKDYpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMTsgLy8gOTYgKyA1XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg2RCwgMHg2NSwgMHg3MiwgMHg2NywgMHg2NV0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA1O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwicGF0Y2hcIjpcbiAgICAgICAgICB3LmNsYWltKDYpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMTsgLy8gOTYgKyA1XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg3MCwgMHg2MSwgMHg3NCwgMHg2MywgMHg2OF0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA1O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDY6XG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJtZXRob2RcIjpcbiAgICAgICAgICB3LmNsYWltKDcpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMjsgLy8gOTYgKyA2XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg2RCwgMHg2NSwgMHg3NCwgMHg2OCwgMHg2RiwgMHg2NF0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA2O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwicGFyYW1zXCI6XG4gICAgICAgICAgdy5jbGFpbSg3KTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMDI7IC8vIDk2ICsgNlxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NzAsIDB4NjEsIDB4NzIsIDB4NjEsIDB4NkQsIDB4NzNdLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gNjtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBcInNpZ251cFwiOlxuICAgICAgICAgIHcuY2xhaW0oNyk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTAyOyAvLyA5NiArIDZcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDczLCAweDY5LCAweDY3LCAweDZFLCAweDc1LCAweDcwXSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDY7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJzaWduaW5cIjpcbiAgICAgICAgICB3LmNsYWltKDcpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMjsgLy8gOTYgKyA2XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg3MywgMHg2OSwgMHg2NywgMHg2RSwgMHg2OSwgMHg2RV0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA2O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgdy5jbGFpbSg3KTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMDI7IC8vIDk2ICsgNlxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NzMsIDB4NjUsIDB4NkMsIDB4NjUsIDB4NjMsIDB4NzRdLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gNjtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBcImNyZWF0ZVwiOlxuICAgICAgICAgIHcuY2xhaW0oNyk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTAyOyAvLyA5NiArIDZcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDYzLCAweDcyLCAweDY1LCAweDYxLCAweDc0LCAweDY1XSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDY7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJpbnNlcnRcIjpcbiAgICAgICAgICB3LmNsYWltKDcpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMjsgLy8gOTYgKyA2XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg2OSwgMHg2RSwgMHg3MywgMHg2NSwgMHg3MiwgMHg3NF0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA2O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgdy5jbGFpbSg3KTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMDI7IC8vIDk2ICsgNlxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NzUsIDB4NzAsIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjVdLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gNjtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBcInVwc2VydFwiOlxuICAgICAgICAgIHcuY2xhaW0oNyk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTAyOyAvLyA5NiArIDZcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDc1LCAweDcwLCAweDczLCAweDY1LCAweDcyLCAweDc0XSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDY7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICB3LmNsYWltKDcpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwMjsgLy8gOTYgKyA2XG4gICAgICAgICAgdy5kYXRhLnNldChbMHg2NCwgMHg2NSwgMHg2QywgMHg2NSwgMHg3NCwgMHg2NV0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSA2O1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFwicmVsYXRlXCI6XG4gICAgICAgICAgdy5jbGFpbSg3KTtcbiAgICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMDI7IC8vIDk2ICsgNlxuICAgICAgICAgIHcuZGF0YS5zZXQoWzB4NzIsIDB4NjUsIDB4NkMsIDB4NjEsIDB4NzQsIDB4NjVdLCB3Lm9mZnNldCk7XG4gICAgICAgICAgdy5vZmZzZXQgKz0gNjtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSA3OlxuICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlIFwidmVyc2lvblwiOlxuICAgICAgICAgIHcuY2xhaW0oOCk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTAzOyAvLyA5NiArIDdcbiAgICAgICAgICB3LmRhdGEuc2V0KFsweDc2LCAweDY1LCAweDcyLCAweDczLCAweDY5LCAweDZGLCAweDZFXSwgdy5vZmZzZXQpO1xuICAgICAgICAgIHcub2Zmc2V0ICs9IDc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMTA6XG4gICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgIGNhc2UgXCJpbnZhbGlkYXRlXCI6XG4gICAgICAgICAgdy5jbGFpbSgxMSk7XG4gICAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTA2OyAvLyA5NiArIDEwXG4gICAgICAgICAgdy5kYXRhLnNldChbXG4gICAgICAgICAgICAweDY5LFxuICAgICAgICAgICAgMHg2RSxcbiAgICAgICAgICAgIDB4NzYsXG4gICAgICAgICAgICAweDYxLFxuICAgICAgICAgICAgMHg2QyxcbiAgICAgICAgICAgIDB4NjksXG4gICAgICAgICAgICAweDY0LFxuICAgICAgICAgICAgMHg2MSxcbiAgICAgICAgICAgIDB4NzQsXG4gICAgICAgICAgICAweDY1LFxuICAgICAgICAgIF0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSAxMDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAxMjpcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSBcImF1dGhlbnRpY2F0ZVwiOlxuICAgICAgICAgIHcuY2xhaW0oMTMpO1xuICAgICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEwODsgLy8gOTYgKyAxMlxuICAgICAgICAgIHcuZGF0YS5zZXQoW1xuICAgICAgICAgICAgMHg2MSxcbiAgICAgICAgICAgIDB4NzUsXG4gICAgICAgICAgICAweDc0LFxuICAgICAgICAgICAgMHg2OCxcbiAgICAgICAgICAgIDB4NjUsXG4gICAgICAgICAgICAweDZFLFxuICAgICAgICAgICAgMHg3NCxcbiAgICAgICAgICAgIDB4NjksXG4gICAgICAgICAgICAweDYzLFxuICAgICAgICAgICAgMHg2MSxcbiAgICAgICAgICAgIDB4NzQsXG4gICAgICAgICAgICAweDY1LFxuICAgICAgICAgIF0sIHcub2Zmc2V0KTtcbiAgICAgICAgICB3Lm9mZnNldCArPSAxMjtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gXHUzMEQxXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMERFXHUzMEYzXHUzMEI5XHUzMDZFXHUzMDVGXHUzMDgxXHUzMDZCIGAuZW5jb2RlSW50b2AgXHUzMDkyXHU0RjdGXHUzMDYzXHUzMDY2XHUzMEQwXHUzMEMzXHUzMEQ1XHUzMEExXHUzMEZDXHUzMDZCXHU3NkY0XHU2M0E1XHU2NkY4XHUzMDREXHU4RkJDXHUzMDgwXHUzMDAyXG4gIC8vIFx1NjU4N1x1NUI1N1x1NTIxN1x1MzA5MiBVVEYtOCBcdTMwNjdcdTMwQThcdTMwRjNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNTlcdTMwOEJcdTMwNjhcdTMwNERcdTMwMDFcdTVGQzVcdTg5ODFcdTMwNkFcdTMwRDBcdTMwQzNcdTMwRDVcdTMwQTFcdTMwRkNcdTMwNkVcdTMwQjVcdTMwQTRcdTMwQkFcdTMwNkYgYC5sZW5ndGhgIFx1MzBEMFx1MzBBNFx1MzBDOFx1NEVFNVx1NEUwQVxuICAvLyBgLmxlbmd0aCAqIDNgIFx1MzBEMFx1MzBBNFx1MzBDOFx1NEVFNVx1NEUwQlx1MzA2N1x1MzA0Mlx1MzA4QiBbXjFdXHUzMDAyXHUzMDU1XHUzMDg5XHUzMDZCIENCT1IgXHUzMDZFXHUzMEQ4XHUzMEMzXHUzMEMwXHUzMEZDXHUzMDkyXHU2NkY4XHUzMDREXHU4RkJDXHUzMDgwXHUzMDVGXHUzMDgxXHUzMDZCXHU2NzAwXHU1OTI3IDUgXHUzMEQwXHUzMEE0XHUzMEM4XHUzMDZFXG4gIC8vIFx1N0E3QVx1MzA0RFx1NUJCOVx1OTFDRlx1MzA0Q1x1OEZGRFx1NTJBMFx1MzA2N1x1NUZDNVx1ODk4MVx1MzA2OFx1MzA2QVx1MzA4Qlx1MzAwMlx1MzA2NFx1MzA3RVx1MzA4QVx1MzBFMVx1MzBFMlx1MzBFQVx1MzBGQ1x1MzA2RVx1N0E3QVx1MzA0RFx1NUJCOVx1OTFDRlx1MzA0QyBgLmxlbmd0aCAqIDMgKyA1YCBcdTMwRDBcdTMwQTRcdTMwQzhcdTRFRTVcdTRFMEFcdTMwNjdcdTMwNDJcdTMwOENcdTMwNzBcbiAgLy8gYC5lbmNvZGVJbnRvYCBcdTMwOTJcdTRGN0ZcdTMwNDZcdTMwNTNcdTMwNjhcdTMwNENcdTMwNjdcdTMwNERcdTMwOEJcdTMwMDJcbiAgLy8gW14xXTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL2VuY29kZUludG9cbiAgaWYgKCh3LmRhdGEubGVuZ3RoIC0gdy5vZmZzZXQpID49ICg1ICsgbCArIGwgKyBsKSkge1xuICAgIGNvbnN0IHIgPSB1dGY4LmVuY29kZUludG8odmFsdWUsIHcuZGF0YS5zdWJhcnJheSh3Lm9mZnNldCArIDUpKTtcblxuICAgIGlmIChyLndyaXR0ZW4gPCBBSV9PTkVfQllURSkge1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gOTYgKyByLndyaXR0ZW47IC8vICgxMjAgLSAxIC0gMjMpICsgdmFsdWVcbiAgICAgIGwgPSA0O1xuICAgIH0gZWxzZSBpZiAoci53cml0dGVuIDw9IDB4ZmYpIHtcbiAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEyMDsgLy8gKE1UX1VURjhfU1RSSU5HIDw8IDUpIHwgQUlfT05FX0JZVEVcbiAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IHIud3JpdHRlbjtcbiAgICAgIGwgPSAzO1xuICAgIH0gZWxzZSBpZiAoci53cml0dGVuIDw9IDB4ZmZmZikge1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTIxOyAvLyAoTVRfVVRGOF9TVFJJTkcgPDwgNSkgfCBBSV9UV09fQllURVNcbiAgICAgIHcudmlldy5zZXRVaW50MTYody5vZmZzZXQsIHIud3JpdHRlbik7XG4gICAgICB3Lm9mZnNldCArPSAyO1xuICAgICAgbCA9IDI7XG4gICAgfSBlbHNlIHsgLy8gZWxzZSBpZiAoci53cml0dGVuIDw9IDIxNDc0ODM2NDcgPCAweGZmZmZmZmZmKVxuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMTIyOyAvLyAoTVRfVVRGOF9TVFJJTkcgPDwgNSkgfCBBSV9GT1VSX0JZVEVTXG4gICAgICB3LnZpZXcuc2V0VWludDMyKHcub2Zmc2V0LCByLndyaXR0ZW4pO1xuICAgICAgdy5vZmZzZXQgKz0gNDtcbiAgICAgIGwgPSAwO1xuICAgIH1cblxuICAgIGlmIChsID4gMCkge1xuICAgICAgdy5kYXRhLmNvcHlXaXRoaW4ody5vZmZzZXQsIGwgKz0gdy5vZmZzZXQsIGwgKyByLndyaXR0ZW4pO1xuICAgIH1cblxuICAgIHcub2Zmc2V0ICs9IHIud3JpdHRlbjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBieXRlcyA9IHV0ZjguZW5jb2RlKHZhbHVlKTtcbiAgICB3cml0ZUVuY29kZWRVdGY4U3RyaW5nKHcsIGJ5dGVzKTtcbiAgfVxufVxuXG4vKipcbiAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9hcGkvY2Jvci9vdGhlcnMvI3dyaXRlZW5jb2RlZHV0ZjhzdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUVuY29kZWRVdGY4U3RyaW5nKFxuICB3OiBXcml0ZXIsXG4gIHZhbHVlOiBVaW50OEFycmF5TGlrZSxcbik6IHZvaWQge1xuICBjb25zdCBsID0gdmFsdWUubGVuZ3RoO1xuXG4gIGlmIChsIDw9IDApIHtcbiAgICB3LmNsYWltKDEpO1xuICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDk2OyAvLyAxMjAgLSAxIC0gMjNcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHcuY2xhaW0oOSk7IC8vIDEgKGhlYWRlcikgKyA4ICg2NC1iaXQgcGF5bG9hZClcblxuICBpZiAobCA8IEFJX09ORV9CWVRFKSB7XG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gOTYgKyBsOyAvLyAoMTIwIC0gMSAtIDIzKSArIGxcbiAgfSBlbHNlIGlmIChsIDw9IDB4ZmYpIHtcbiAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMjA7IC8vIChNVF9VVEY4X1NUUklORyA8PCA1KSB8IEFJX09ORV9CWVRFXG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gbDtcbiAgfSBlbHNlIGlmIChsIDw9IDB4ZmZmZikge1xuICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEyMTsgLy8gKE1UX1VURjhfU1RSSU5HIDw8IDUpIHwgQUlfVFdPX0JZVEVTXG4gICAgdy52aWV3LnNldFVpbnQxNih3Lm9mZnNldCwgbCk7XG4gICAgdy5vZmZzZXQgKz0gMjtcbiAgfSBlbHNlIGlmIChsIDw9IDB4ZmZmZmZmZmYpIHtcbiAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAxMjI7IC8vIChNVF9VVEY4X1NUUklORyA8PCA1KSB8IEFJX0ZPVVJfQllURVNcbiAgICB3LnZpZXcuc2V0VWludDMyKHcub2Zmc2V0LCBsKTtcbiAgICB3Lm9mZnNldCArPSA0O1xuICB9IGVsc2UgaWYgKGwgPD0gSlNfTUFYX1NBRkVfVU5TSUdORURfSU5URUdFUikge1xuICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEyMzsgLy8gKE1UX1VURjhfU1RSSU5HIDw8IDUpIHwgQUlfRUlHSFRfQllURVNcbiAgICB3LnZpZXcuc2V0QmlnVWludDY0KHcub2Zmc2V0LCBCaWdJbnQobCkpO1xuICAgIHcub2Zmc2V0ICs9IDg7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IE51bWJlclJhbmdlRXJyb3IoWzAsIEpTX01BWF9TQUZFX1VOU0lHTkVEX0lOVEVHRVJdLCBsKTtcbiAgfVxuICAvLyBcdTMwQThcdTMwRjNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNTdcdTMwNUZcdTY1ODdcdTVCNTdcdTUyMTdcdTMwNEMgSmF2YVNjcmlwdCBcdTRFRTVcdTU5MTZcdTMwNjdcdTMwQzdcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNTVcdTMwOENcdTMwOEJcdTUzRUZcdTgwRkRcdTYwMjdcdTMwOTJcdTgwMDNcdTMwNDhcdTMwOEJcdTMwNjhcdTMwMDFKYXZhU2NyaXB0IFx1MzA2RVx1NTIzNlx1N0QwNFx1MzA2QlxuICAvLyBcdTMwNTdcdTMwNUZcdTMwNENcdTMwNjNcdTMwNUZcdTY1ODdcdTVCNTdcdTUyMTdcdTk1NzdcdTMwNkVcdTY5MUNcdThBM0NcdTMwOTJcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNkZcdTMwNkFcdTMwNDRcdTMwNEJcdTMwODJcdTMwNTdcdTMwOENcdTMwNkFcdTMwNDRcdTMwMDJcbiAgLy8gfSBlbHNlIGlmIChsIDw9IDY0NDI0NTA5NDEpIHsgLy8gKDJeMzEtMSkqM1xuICAvLyAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDEyMzsgLy8gKE1UX1VURjhfU1RSSU5HIDw8IDUpIHwgQUlfRUlHSFRfQllURVNcbiAgLy8gICB3LnZpZXcuc2V0QmlnVWludDY0KHcub2Zmc2V0LCBCaWdJbnQobCkpO1xuICAvLyAgIHcub2Zmc2V0ICs9IDg7XG4gIC8vIH0gZWxzZSB7XG4gIC8vICAgdGhyb3cgbmV3IE51bWJlclJhbmdlRXJyb3IoWzAsIDY0NDI0NTA5NDFdLCBsKTtcbiAgLy8gfVxuXG4gIHcud3JpdGVCeXRlcyh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVW5kZWZpbmVkKHc6IFdyaXRlcik6IHZvaWQge1xuICAvLyBcdTRFRDVcdTY5RDhcdTMwNjdcdTMwNkYgSEVBREVSX1VOREVGSU5FRCBcdTMwOTJcdTY2RjhcdTMwNERcdThGQkNcdTMwODBcdTMwN0JcdTMwNDZcdTMwNENcdTZCNjNcdTMwNTdcdTMwNDRcdTMwNjhcdTYwMURcdTMwOEZcdTMwOENcdTMwOEJcdTMwNENcdTMwMDFTdXJyZWFsREIgXHUzMDZGIHVuZGVmaW5lZCBcdTMwNjhcbiAgLy8gIE5PTkUgXHUzMDRDXHU1NDBDXHU1MDI0XHUzMDY3XHUzMDgyXHUzMEJGXHUzMEIwXHU0RUQ4XHUzMDREXHUzMEM3XHUzMEZDXHUzMEJGXHUzMEEyXHUzMEE0XHUzMEM2XHUzMEUwXHUzMDY3IE5PTkUgXHUzMDkyXHU4ODY4XHU3M0ZFXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhCXHUzMDAyXG4gIC8vIHcud3JpdGVVaW50OChIRUFERVJfVU5ERUZJTkVEKTtcblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3VycmVhbGRiL3N1cnJlYWxkYi9ibG9iL3YyLjAuMS9jb3JlL3NyYy9ycGMvZm9ybWF0L2Nib3IvY29udmVydC5ycyNMMzBcbiAgLy8gXHUzMDg4XHUzMDhBXHUzMDAxTk9ORSBcdTMwNkVcdTMwQkZcdTMwQjBcdTMwNkYgNlxuICB3LmNsYWltKDIpOyAvLyAxIChoZWFkZXIpICsgMSAoYG51bGxgIHBheWxvYWQpXG4gIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDE5ODsgLy8gMTkyICsgNiA9IDE5OFxuICB3LmRhdGFbdy5vZmZzZXQrK10gPSBIRUFERVJfTlVMTDtcbn1cblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2Nib3Ivb3RoZXJzLyN3cml0ZW51bGxhYmxlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVOdWxsYWJsZSh3OiBXcml0ZXIsIHZhbHVlOiBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHcud3JpdGVVaW50OChIRUFERVJfTlVMTCk7XG4gIH0gZWxzZSB7XG4gICAgd3JpdGVVbmRlZmluZWQodyk7XG4gIH1cbn1cblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2Nib3Ivb3RoZXJzLyN3cml0ZWJvb2xlYW4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUJvb2xlYW4odzogV3JpdGVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICBpZiAodmFsdWUpIHtcbiAgICB3LndyaXRlVWludDgoSEVBREVSX1RSVUUpO1xuICB9IGVsc2Uge1xuICAgIHcud3JpdGVVaW50OChIRUFERVJfRkFMU0UpO1xuICB9XG59XG5cbi8qKlxuICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2FwaS9jYm9yL290aGVycy8jd3JpdGVudW1iZXIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZU51bWJlcih3OiBXcml0ZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgIHcuY2xhaW0oOSk7IC8vIDEgKGhlYWRlcikgKyA4ICg2NC1iaXQgcGF5bG9hZClcblxuICAgICAgaWYgKHZhbHVlIDwgQUlfT05FX0JZVEUpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZmYpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gQUlfT05FX0JZVEU7XG4gICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAweGZmZmYpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gQUlfVFdPX0JZVEVTO1xuICAgICAgICB3LnZpZXcuc2V0VWludDE2KHcub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHcub2Zmc2V0ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gQUlfRk9VUl9CWVRFUztcbiAgICAgICAgdy52aWV3LnNldFVpbnQzMih3Lm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB3Lm9mZnNldCArPSA0O1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSBKU19NQVhfU0FGRV9VTlNJR05FRF9JTlRFR0VSKSB7XG4gICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IEFJX0VJR0hUX0JZVEVTO1xuICAgICAgICB3LnZpZXcuc2V0QmlnVWludDY0KHcub2Zmc2V0LCBCaWdJbnQodmFsdWUpKTtcbiAgICAgICAgdy5vZmZzZXQgKz0gODtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBOdW1iZXJSYW5nZUVycm9yKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIC1KU19NQVhfU0FGRV9VTlNJR05FRF9JTlRFR0VSLFxuICAgICAgICAgICAgSlNfTUFYX1NBRkVfVU5TSUdORURfSU5URUdFUixcbiAgICAgICAgICBdLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1aSA9IC12YWx1ZSAtIDE7XG5cbiAgICAgIHcuY2xhaW0oOSk7IC8vIDEgKGhlYWRlcikgKyA4ICg2NC1iaXQgcGF5bG9hZClcblxuICAgICAgaWYgKHVpIDwgQUlfT05FX0JZVEUpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMzIgKyB1aTsgLy8gdmFsdWUgPSAtMjQgLT4gdWkgPSAyMyAtPiAzMiArIDIzID0gNTVcbiAgICAgIH0gZWxzZSBpZiAodWkgPD0gMHhmZikge1xuICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSA1NjsgLy8gKE1UX05FR0FUSVZFX0lOVEVHRVIgPDwgNSkgfCBBSV9PTkVfQllURVxuICAgICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSB1aTtcbiAgICAgIH0gZWxzZSBpZiAodWkgPD0gMHhmZmZmKSB7XG4gICAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDU3OyAvLyAoTVRfTkVHQVRJVkVfSU5URUdFUiA8PCA1KSB8IEFJX1RXT19CWVRFU1xuICAgICAgICB3LnZpZXcuc2V0VWludDE2KHcub2Zmc2V0LCB1aSk7XG4gICAgICAgIHcub2Zmc2V0ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKHVpIDw9IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gNTg7IC8vIChNVF9ORUdBVElWRV9JTlRFR0VSIDw8IDUpIHwgQUlfRk9VUl9CWVRFU1xuICAgICAgICB3LnZpZXcuc2V0VWludDMyKHcub2Zmc2V0LCB1aSk7XG4gICAgICAgIHcub2Zmc2V0ICs9IDQ7XG4gICAgICB9IGVsc2UgaWYgKHVpIDw9IEpTX01BWF9TQUZFX1VOU0lHTkVEX0lOVEVHRVIpIHtcbiAgICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gNTk7IC8vIChNVF9ORUdBVElWRV9JTlRFR0VSIDw8IDUpIHwgQUlfRUlHSFRfQllURVNcbiAgICAgICAgdy52aWV3LnNldEJpZ1VpbnQ2NCh3Lm9mZnNldCwgQmlnSW50KHVpKSk7XG4gICAgICAgIHcub2Zmc2V0ICs9IDg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgTnVtYmVyUmFuZ2VFcnJvcihcbiAgICAgICAgICBbXG4gICAgICAgICAgICAtSlNfTUFYX1NBRkVfVU5TSUdORURfSU5URUdFUixcbiAgICAgICAgICAgIEpTX01BWF9TQUZFX1VOU0lHTkVEX0lOVEVHRVIsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgdy5jbGFpbSgzKTsgLy8gMSAoaGVhZGVyKSArIDIgKDE2LWJpdCBwYXlsb2FkKVxuXG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gSEVBREVSX0ZMT0FUX0hBTEY7XG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMHg3YztcbiAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAweDAwO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSAtSW5maW5pdHkpIHtcbiAgICB3LmNsYWltKDMpOyAvLyAxIChoZWFkZXIpICsgMiAoMTYtYml0IHBheWxvYWQpXG5cbiAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSBIRUFERVJfRkxPQVRfSEFMRjtcbiAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAweGZjO1xuICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IDB4MDA7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IHZhbHVlKSB7XG4gICAgdy5jbGFpbSg5KTsgLy8gMSAoaGVhZGVyKSArIDggKDY0LWJpdCBwYXlsb2FkKVxuXG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gSEVBREVSX0ZMT0FUX0RPVUJMRTtcbiAgICB3LnZpZXcuc2V0RmxvYXQ2NCh3Lm9mZnNldCwgdmFsdWUpO1xuICAgIHcub2Zmc2V0ICs9IDg7XG4gIH0gZWxzZSB7XG4gICAgdy5jbGFpbSgzKTsgLy8gMSAoaGVhZGVyKSArIDIgKDE2LWJpdCBwYXlsb2FkKVxuXG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gSEVBREVSX0ZMT0FUX0hBTEY7XG4gICAgdy5kYXRhW3cub2Zmc2V0KytdID0gMHg3ZTtcbiAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAweDAwO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUJpZ0ludCh3OiBXcml0ZXIsIHZhbHVlOiBiaWdpbnQpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID49IDApIHtcbiAgICB3LmNsYWltKDkpOyAvLyAxIChoZWFkZXIpICsgOCAoNjQtYml0IHBheWxvYWQpXG5cbiAgICBpZiAodmFsdWUgPCBBSV9PTkVfQllURSkge1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gTnVtYmVyKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZmYpIHtcbiAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IEFJX09ORV9CWVRFO1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gTnVtYmVyKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZmZmZikge1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gQUlfVFdPX0JZVEVTO1xuICAgICAgdy52aWV3LnNldFVpbnQxNih3Lm9mZnNldCwgTnVtYmVyKHZhbHVlKSk7XG4gICAgICB3Lm9mZnNldCArPSAyO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMHhmZmZmZmZmZikge1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gQUlfRk9VUl9CWVRFUztcbiAgICAgIHcudmlldy5zZXRVaW50MzIody5vZmZzZXQsIE51bWJlcih2YWx1ZSkpO1xuICAgICAgdy5vZmZzZXQgKz0gNDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IENCT1JfTUFYX1VOU0lHTkVEX0lOVEVHRVIpIHtcbiAgICAgIHcuZGF0YVt3Lm9mZnNldCsrXSA9IEFJX0VJR0hUX0JZVEVTO1xuICAgICAgdy52aWV3LnNldEJpZ1VpbnQ2NCh3Lm9mZnNldCwgdmFsdWUpO1xuICAgICAgdy5vZmZzZXQgKz0gODtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE51bWJlclJhbmdlRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICBDQk9SX01JTl9ORUdBVElWRV9JTlRFR0VSLFxuICAgICAgICAgIENCT1JfTUFYX1VOU0lHTkVEX0lOVEVHRVIsXG4gICAgICAgIF0sXG4gICAgICAgIHZhbHVlLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdWkgPSAtdmFsdWUgLSAxbjtcblxuICAgIHcuY2xhaW0oOSk7IC8vIDEgKGhlYWRlcikgKyA4ICg2NC1iaXQgcGF5bG9hZClcblxuICAgIGlmICh1aSA8IEFJX09ORV9CWVRFKSB7XG4gICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSAzMiArIE51bWJlcih1aSk7IC8vIHZhbHVlID0gLTI0IC0+IHVpID0gMjMgLT4gMzIgKyAyMyA9IDU1XG4gICAgfSBlbHNlIGlmICh1aSA8PSAweGZmKSB7XG4gICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSA1NjsgLy8gKE1UX05FR0FUSVZFX0lOVEVHRVIgPDwgNSkgfCBBSV9PTkVfQllURVxuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gTnVtYmVyKHVpKTtcbiAgICB9IGVsc2UgaWYgKHVpIDw9IDB4ZmZmZikge1xuICAgICAgdy5kYXRhW3cub2Zmc2V0KytdID0gNTc7IC8vIChNVF9ORUdBVElWRV9JTlRFR0VSIDw8IDUpIHwgQUlfVFdPX0JZVEVTXG4gICAgICB3LnZpZXcuc2V0VWludDE2KHcub2Zmc2V0LCBOdW1iZXIodWkpKTtcbiAgICAgIHcub2Zmc2V0ICs9IDI7XG4gICAgfSBlbHNlIGlmICh1aSA8PSAweGZmZmZmZmZmKSB7XG4gICAgICB3LmRhdGFbdy5vZmZzZXQrK10gPSA1ODsgLy8gKE1UX05FR0FUSVZFX0lOVEVHRVIgPDwgNSkgfCBBSV9GT1VSX0JZVEVTXG4gICAgICB3LnZpZXcuc2V0VWludDMyKHcub2Zmc2V0LCBOdW1iZXIodWkpKTtcbiAgICAgIHcub2Zmc2V0ICs9IDQ7XG4gICAgfSBlbHNlIGlmICh1aSA8PSBDQ