@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
170 lines (168 loc) • 24.2 kB
JavaScript
;
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/data-types/standard/uuid.ts
var uuid_exports = {};
__export(uuid_exports, {
default: () => Uuid
});
module.exports = __toCommonJS(uuid_exports);
var import_encodable_datatypes = require("../encodable/index.cjs");
var import_errors = require("../../errors/index.cjs");
var import_uuid = require("../_internals/uuid.cjs");
var BYTE_TO_HEX = /* @__PURE__ */ Array.from(
{ length: 256 },
(_, i) => (i + 256).toString(16).slice(1)
);
var HEX_TO_BYTES = /* @__PURE__ */ Array.from(
{ length: 16 },
(_, i) => Array.from({ length: 16 }, (_2, j) => i * 16 + j)
);
function parseUuid36(uuid) {
if (uuid.length !== 36) {
throw new import_errors.SurrealValueError("a valid uuid", uuid);
}
const bytes = new Uint8Array(16);
for (let a, b, i = 0, j = 0; i < 36; i++) {
if ((a = uuid.charCodeAt(i)) !== 45) {
b = uuid.charCodeAt(++i);
a = a < 58 ? a - 48 : a < 71 ? a - 55 : a - 87;
b = b < 58 ? b - 48 : b < 71 ? b - 55 : b - 87;
bytes[j++] = HEX_TO_BYTES[a][b];
}
}
return bytes;
}
__name(parseUuid36, "parseUuid36");
var _Uuid = class _Uuid extends import_encodable_datatypes.Uuid {
get bytes() {
return this._bytes;
}
set bytes(v) {
if (!(0, import_uuid.isValidBytes)(v)) {
throw new import_errors.SurrealValueError("a valid uuid", v);
}
this._bytes = v;
this._variant = void 0;
this._version = void 0;
this._timestamp = void 0;
}
constructor(source) {
super(typeof source === "string" ? parseUuid36(source) : source);
}
get variant() {
if (this._variant === void 0) {
const bytes = this.bytes;
const v = bytes[8] >>> 4;
switch (true) {
case v < 0:
(0, import_errors.unreachable)();
case (v === 0 && bytes.every((b) => b === 0)):
this._variant = "NIL";
break;
case v <= 7:
this._variant = "NCS";
break;
case v <= 11:
this._variant = "RFC";
break;
case v <= 13:
this._variant = "MS";
break;
case (v === 15 && bytes.every((b) => b === 255)):
this._variant = "MAX";
break;
case v <= 15:
this._variant = "RESERVED";
break;
default:
(0, import_errors.unreachable)();
}
}
return this._variant;
}
get version() {
if (this._version === void 0) {
this._version = this.variant === "RFC" ? this.bytes[6] >>> 4 : null;
}
return this._version;
}
get timestamp() {
if (this._timestamp === void 0) {
this._timestamp = unsafe_getUnixMillisecondsFromUuid(this);
}
return this._timestamp;
}
clone() {
const This = this.constructor;
return new This(this.bytes.slice());
}
// TODO(tai-kun): 時間でイコール判定? bytes でイコール判定?
// equals(other): boolean {}
compareTo(other) {
let a = this.timestamp, b;
if (a === null) {
return 0;
}
b = "timestamp" in other ? other.timestamp : unsafe_getUnixMillisecondsFromUuid(other);
if (b === null) {
return 0;
}
return a < b ? -1 : a > b ? 1 : 0;
}
};
__name(_Uuid, "Uuid");
var Uuid = _Uuid;
function unsafe_getUnixMillisecondsFromUuid(uuid) {
switch (uuid.version) {
case 1:
return unsafe_getUnixMillisecondsFromUuidV1(uuid.bytes);
case 6:
return unsafe_getUnixMillisecondsFromUuidV6(uuid.bytes);
case 7:
return unsafe_getUnixMillisecondsFromUuidV7(uuid.bytes);
default:
return null;
}
}
__name(unsafe_getUnixMillisecondsFromUuid, "unsafe_getUnixMillisecondsFromUuid");
var GREGORIAN_OFFSET = 122192928000000000n;
function unsafe_getUnixMillisecondsFromUuidV1(bytes) {
const hex = "0x" + BYTE_TO_HEX[bytes[6]][1] + BYTE_TO_HEX[bytes[7]] + BYTE_TO_HEX[bytes[4]] + BYTE_TO_HEX[bytes[5]] + BYTE_TO_HEX[bytes[0]] + BYTE_TO_HEX[bytes[1]] + BYTE_TO_HEX[bytes[2]] + BYTE_TO_HEX[bytes[3]];
const timestamp = BigInt(hex);
const fromUnixEpoch = timestamp - GREGORIAN_OFFSET;
const unixMilliseconds = fromUnixEpoch / 10000n;
return Number(unixMilliseconds);
}
__name(unsafe_getUnixMillisecondsFromUuidV1, "unsafe_getUnixMillisecondsFromUuidV1");
function unsafe_getUnixMillisecondsFromUuidV6(bytes) {
const hex = "0x" + BYTE_TO_HEX[bytes[0]] + BYTE_TO_HEX[bytes[1]] + BYTE_TO_HEX[bytes[2]] + BYTE_TO_HEX[bytes[3]] + BYTE_TO_HEX[bytes[4]] + BYTE_TO_HEX[bytes[5]] + BYTE_TO_HEX[bytes[6]][1] + BYTE_TO_HEX[bytes[7]];
const timestamp = BigInt(hex);
const fromUnixEpoch = timestamp - GREGORIAN_OFFSET;
const unixMilliseconds = fromUnixEpoch / 10000n;
return Number(unixMilliseconds);
}
__name(unsafe_getUnixMillisecondsFromUuidV6, "unsafe_getUnixMillisecondsFromUuidV6");
function unsafe_getUnixMillisecondsFromUuidV7(bytes) {
const hex = "0x" + BYTE_TO_HEX[bytes[0]] + BYTE_TO_HEX[bytes[1]] + BYTE_TO_HEX[bytes[2]] + BYTE_TO_HEX[bytes[3]] + BYTE_TO_HEX[bytes[4]] + BYTE_TO_HEX[bytes[5]];
const unixMilliseconds = parseInt(hex);
return unixMilliseconds;
}
__name(unsafe_getUnixMillisecondsFromUuidV7, "unsafe_getUnixMillisecondsFromUuidV7");
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtdHlwZXMvc3RhbmRhcmQvdXVpZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtcbiAgVXVpZCBhcyBCYXNlLFxuICB0eXBlIFV1aWRTb3VyY2UsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5jb2RhYmxlLWRhdGF0eXBlc1wiO1xuaW1wb3J0IHsgU3VycmVhbFZhbHVlRXJyb3IsIHVucmVhY2hhYmxlIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lcnJvcnNcIjtcbmltcG9ydCB7IGlzVmFsaWRCeXRlcyB9IGZyb20gXCIuLi9faW50ZXJuYWxzL3V1aWRcIjtcblxuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi4vZW5jb2RhYmxlL3V1aWRcIjtcblxuLy8gY29uc3QgVVVJRF8zNl9SRUdFWCA9XG4vLyAgIC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtN11bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL1xuXG5leHBvcnQgdHlwZSBVdWlkVmFyaWFudCA9XG4gIHwgXCJOSUxcIiAvLyAwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcbiAgfCBcIk1BWFwiIC8vIGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZlxuICB8IFwiTkNTXCIgLy8gMHh4eCAoMGIwMDAwIH4gMGIwMTExKVxuICB8IFwiUkZDXCIgLy8gMTB4eCAoMGIxMDAwIH4gMGIxMDExKVxuICB8IFwiTVNcIiAvLyAxMTB4ICgwYjExMDAgfiAwYjExMDEpXG4gIHwgXCJSRVNFUlZFRFwiOyAvLyAxMTF4ICgwYjExMTAgfiAwYjExMTEpXG5cbmV4cG9ydCB0eXBlIFV1aWRWZXJzaW9uID0gMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNztcblxuLyoqXG4gKiBgYGB0c1xuICogW1xuICogICBcIjAwXCIsIC8vIEJZVEVfVE9fSEVYWzBdXG4gKiAgIFwiMDFcIiwgLy8gQllURV9UT19IRVhbMV1cbiAqICAgLi4uXG4gKiAgIFwiZmVcIiwgLy8gQllURV9UT19IRVhbMjU0XVxuICogICBcImZmXCIsIC8vIEJZVEVfVE9fSEVYWzI1NV1cbiAqIF1cbiAqIGBgYFxuICovXG5jb25zdCBCWVRFX1RPX0hFWCA9IC8qIEBfX1BVUkVfXyAqLyBBcnJheS5mcm9tKFxuICB7IGxlbmd0aDogMjU2IH0sXG4gIChfLCBpKSA9PiAoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSksXG4pO1xuXG4vKipcbiAqIGBgYHRzXG4gKiBbXG4gKiAgIFtcbiAqICAgICAweDAwLCAvLyBIRVhfVE9fQllURVNbMF1bMF1cbiAqICAgICAweDAxLCAvLyBIRVhfVE9fQllURVNbMF1bMV1cbiAqICAgICAuLi5cbiAqICAgXSxcbiAqICAgLi4uXG4gKiAgIFtcbiAqICAgICAuLi5cbiAqICAgICAweGZlLCAvLyBIRVhfVE9fQllURVNbMTVdWzE0XVxuICogICAgIDB4ZmYsIC8vIEhFWF9UT19CWVRFU1sxNV1bMTVdXG4gKiAgIF0sXG4gKiBdXG4gKiBgYGBcbiAqL1xuY29uc3QgSEVYX1RPX0JZVEVTID0gLyogQF9fUFVSRV9fICovIEFycmF5LmZyb20oXG4gIHsgbGVuZ3RoOiAxNiB9LFxuICAoXywgaSkgPT4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGopID0+IGkgKiAxNiArIGopLFxuKTtcblxuZnVuY3Rpb24gcGFyc2VVdWlkMzYodXVpZDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIC8vIGlmICh1dWlkID09PSBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiKSB7XG4gIC8vICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDE2KTtcbiAgLy8gfVxuXG4gIC8vIGlmICh1dWlkID09PSBcImZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZlwiKSB7XG4gIC8vICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDE2KS5maWxsKDB4ZmYpO1xuICAvLyB9XG5cbiAgaWYgKHV1aWQubGVuZ3RoICE9PSAzNikge1xuICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcImEgdmFsaWQgdXVpZFwiLCB1dWlkKTtcbiAgfVxuXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIGZvciAobGV0IGEsIGIsIGkgPSAwLCBqID0gMDsgaSA8IDM2OyBpKyspIHtcbiAgICBpZiAoKGEgPSB1dWlkLmNoYXJDb2RlQXQoaSkpICE9PSA0NSAvKiBcIi1cIiAqLykge1xuICAgICAgYiA9IHV1aWQuY2hhckNvZGVBdCgrK2kpO1xuICAgICAgYSA9IGEgPCA1OCA/IChhIC0gNDgpIDogKGEgPCA3MSA/IChhIC0gNTUpIDogKGEgLSA4NykpO1xuICAgICAgYiA9IGIgPCA1OCA/IChiIC0gNDgpIDogKGIgPCA3MSA/IChiIC0gNTUpIDogKGIgLSA4NykpO1xuICAgICAgYnl0ZXNbaisrXSA9IEhFWF9UT19CWVRFU1thXSFbYl0hO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvYXBpL2RhdGEvdXVpZClcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXVpZCBleHRlbmRzIEJhc2Uge1xuICBwcm90ZWN0ZWQgX3ZhcmlhbnQ6IFV1aWRWYXJpYW50IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3ZlcnNpb246IFV1aWRWZXJzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIF90aW1lc3RhbXA6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgb3ZlcnJpZGUgZ2V0IGJ5dGVzKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9ieXRlcztcbiAgfVxuXG4gIG92ZXJyaWRlIHNldCBieXRlcyh2OiBVaW50OEFycmF5KSB7XG4gICAgaWYgKCFpc1ZhbGlkQnl0ZXModikpIHtcbiAgICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcImEgdmFsaWQgdXVpZFwiLCB2KTtcbiAgICB9XG5cbiAgICB0aGlzLl9ieXRlcyA9IHY7XG4gICAgLy8gQ2xlYXIgY2FjaGVcbiAgICB0aGlzLl92YXJpYW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZlcnNpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdGltZXN0YW1wID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc291cmNlOiBVdWlkU291cmNlIHwgc3RyaW5nKSB7XG4gICAgc3VwZXIodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlVXVpZDM2KHNvdXJjZSkgOiBzb3VyY2UpO1xuICB9XG5cbiAgZ2V0IHZhcmlhbnQoKTogVXVpZFZhcmlhbnQge1xuICAgIGlmICh0aGlzLl92YXJpYW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgIGNvbnN0IHYgPSBieXRlc1s4XSEgPj4+IDQ7XG5cbiAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlIHYgPCAwYjAwMDA6XG4gICAgICAgICAgdW5yZWFjaGFibGUoKTtcblxuICAgICAgICBjYXNlIHYgPT09IDBiMDAwMCAmJiBieXRlcy5ldmVyeShiID0+IGIgPT09IDB4MDApOlxuICAgICAgICAgIHRoaXMuX3ZhcmlhbnQgPSBcIk5JTFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgdiA8PSAwYjAxMTE6XG4gICAgICAgICAgdGhpcy5fdmFyaWFudCA9IFwiTkNTXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB2IDw9IDBiMTAxMTpcbiAgICAgICAgICB0aGlzLl92YXJpYW50ID0gXCJSRkNcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHYgPD0gMGIxMTAxOlxuICAgICAgICAgIHRoaXMuX3ZhcmlhbnQgPSBcIk1TXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB2ID09PSAwYjExMTEgJiYgYnl0ZXMuZXZlcnkoYiA9PiBiID09PSAweGZmKTpcbiAgICAgICAgICB0aGlzLl92YXJpYW50ID0gXCJNQVhcIjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHYgPD0gMGIxMTExOlxuICAgICAgICAgIHRoaXMuX3ZhcmlhbnQgPSBcIlJFU0VSVkVEXCI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB1bnJlYWNoYWJsZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YXJpYW50O1xuICB9XG5cbiAgZ2V0IHZlcnNpb24oKTogVXVpZFZlcnNpb24gfCBudWxsIHtcbiAgICBpZiAodGhpcy5fdmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl92ZXJzaW9uID0gdGhpcy52YXJpYW50ID09PSBcIlJGQ1wiXG4gICAgICAgID8gKHRoaXMuYnl0ZXNbNl0hID4+PiA0KSBhcyBVdWlkVmVyc2lvblxuICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgdGltZXN0YW1wKCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh0aGlzLl90aW1lc3RhbXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fdGltZXN0YW1wID0gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZCh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGltZXN0YW1wO1xuICB9XG5cbiAgY2xvbmUoKTogdGhpcyB7XG4gICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFV1aWQ7XG5cbiAgICByZXR1cm4gbmV3IFRoaXModGhpcy5ieXRlcy5zbGljZSgpKSBhcyB0aGlzO1xuICB9XG5cbiAgLy8gVE9ETyh0YWkta3VuKTogXHU2NjQyXHU5NTkzXHUzMDY3XHUzMEE0XHUzMEIzXHUzMEZDXHUzMEVCXHU1MjI0XHU1QjlBPyBieXRlcyBcdTMwNjdcdTMwQTRcdTMwQjNcdTMwRkNcdTMwRUJcdTUyMjRcdTVCOUE/XG4gIC8vIGVxdWFscyhvdGhlcik6IGJvb2xlYW4ge31cblxuICBjb21wYXJlVG8oXG4gICAgb3RoZXI6IHtcbiAgICAgIHJlYWRvbmx5IGJ5dGVzOiBVaW50OEFycmF5O1xuICAgICAgcmVhZG9ubHkgdmVyc2lvbjogVXVpZFZlcnNpb24gfCBudWxsO1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyIHwgbnVsbDtcbiAgICB9LFxuICApOiAtMSB8IDAgfCAxIHtcbiAgICBsZXQgYSA9IHRoaXMudGltZXN0YW1wLCBiOiBudW1iZXIgfCBudWxsO1xuXG4gICAgaWYgKGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGIgPSBcInRpbWVzdGFtcFwiIGluIG90aGVyXG4gICAgICA/IG90aGVyLnRpbWVzdGFtcFxuICAgICAgOiB1bnNhZmVfZ2V0VW5peE1pbGxpc2Vjb25kc0Zyb21VdWlkKG90aGVyKTtcblxuICAgIGlmIChiID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZChcbiAgdXVpZDoge1xuICAgIHJlYWRvbmx5IGJ5dGVzOiBVaW50OEFycmF5O1xuICAgIHJlYWRvbmx5IHZlcnNpb246IFV1aWRWZXJzaW9uIHwgbnVsbDtcbiAgfSxcbik6IG51bWJlciB8IG51bGwge1xuICBzd2l0Y2ggKHV1aWQudmVyc2lvbikge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB1bnNhZmVfZ2V0VW5peE1pbGxpc2Vjb25kc0Zyb21VdWlkVjEodXVpZC5ieXRlcyk7XG5cbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZFY2KHV1aWQuYnl0ZXMpO1xuXG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuIHVuc2FmZV9nZXRVbml4TWlsbGlzZWNvbmRzRnJvbVV1aWRWNyh1dWlkLmJ5dGVzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBcdTMwQjBcdTMwRUNcdTMwQjRcdTMwRUFcdTMwQUFcdTY2QTZcdTMwNkVcdTk1OEJcdTU5Q0JcdTY1RTVcdTY2NDI6IDE1ODItMTAtMTVUMDA6MDA6MDAuMDAwWlxuY29uc3QgR1JFR09SSUFOX09GRlNFVCA9IDEyMl8xOTJfOTI4XzAwMF8wMDBfMDAwbjtcblxuZnVuY3Rpb24gdW5zYWZlX2dldFVuaXhNaWxsaXNlY29uZHNGcm9tVXVpZFYxKGJ5dGVzOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgLy8gIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDNcbiAgLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMVxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2xvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8ICAgICAgICAgICB0aW1lX21pZCAgICAgICAgICAgIHwgICAgIHRpbWVfaGlnaF9hbmRfdmVyc2lvbiAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8Y2xrX3NlcV9oaV9yZXMgfCAgY2xrX3NlcV9sb3cgIHwgICAgICAgICBub2RlICgwLTEpICAgICAgICAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICAvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgKDItNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICBjb25zdCBoZXggPSBcIjB4XCJcbiAgICAvLyBfX19fX19fXy1fX19fLTFYWFgtX19fXy1fX19fX19fX19fX19cbiAgICArIEJZVEVfVE9fSEVYW2J5dGVzWzZdIV0hWzFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s3XSFdXG4gICAgLy8gX19fX19fX18tWFhYWC0xX19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s0XSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s1XSFdXG4gICAgLy8gWFhYWFhYWFgtX19fXy0xX19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1swXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1sxXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1syXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1szXSFdO1xuICBjb25zdCB0aW1lc3RhbXAgPSBCaWdJbnQoaGV4KTtcbiAgY29uc3QgZnJvbVVuaXhFcG9jaCA9IHRpbWVzdGFtcCAtIEdSRUdPUklBTl9PRkZTRVQ7XG4gIGNvbnN0IHVuaXhNaWxsaXNlY29uZHMgPSBmcm9tVW5peEVwb2NoIC8gMTBfMDAwbjsgLy8gMTAwbnMgLT4gbXNcblxuICByZXR1cm4gTnVtYmVyKHVuaXhNaWxsaXNlY29uZHMpO1xufVxuXG5mdW5jdGlvbiB1bnNhZmVfZ2V0VW5peE1pbGxpc2Vjb25kc0Zyb21VdWlkVjYoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICAvLyBodHRwczovL3d3dy5pZXRmLm9yZy9hcmNoaXZlL2lkL2RyYWZ0LXBlYWJvZHktZGlzcGF0Y2gtbmV3LXV1aWQtZm9ybWF0LTA0Lmh0bWxfbmFtZS11dWlkLXZlcnNpb24tNlxuICAvLyAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgM1xuICAvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxXG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2hpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHwgICAgICAgICAgIHRpbWVfbWlkICAgICAgICAgICAgfCAgICAgIHRpbWVfbG93X2FuZF92ZXJzaW9uICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHxjbGtfc2VxX2hpX3JlcyB8ICBjbGtfc2VxX2xvdyAgfCAgICAgICAgIG5vZGUgKDAtMSkgICAgICAgICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIC8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSAoMi01KSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gIC8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gIGNvbnN0IGhleCA9IFwiMHhcIlxuICAgIC8vIFhYWFhYWFhYLV9fX18tNl9fXy1fX19fLV9fX19fX19fX19fX1xuICAgICsgQllURV9UT19IRVhbYnl0ZXNbMF0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbMV0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbMl0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbM10hXVxuICAgIC8vIF9fX19fX19fLVhYWFgtNl9fXy1fX19fLV9fX19fX19fX19fX1xuICAgICsgQllURV9UT19IRVhbYnl0ZXNbNF0hXVxuICAgICsgQllURV9UT19IRVhbYnl0ZXNbNV0hXVxuICAgIC8vIF9fX19fX19fLV9fX18tNlhYWC1fX19fLV9fX19fX19fX19fX1xuICAgICsgQllURV9UT19IRVhbYnl0ZXNbNl0hXSFbMV1cbiAgICArIEJZVEVfVE9fSEVYW2J5dGVzWzddIV07XG4gIGNvbnN0IHRpbWVzdGFtcCA9IEJpZ0ludChoZXgpO1xuICBjb25zdCBmcm9tVW5peEVwb2NoID0gdGltZXN0YW1wIC0gR1JFR09SSUFOX09GRlNFVDtcbiAgY29uc3QgdW5peE1pbGxpc2Vjb25kcyA9IGZyb21Vbml4RXBvY2ggLyAxMF8wMDBuOyAvLyAxMDBucyAtPiBtc1xuXG4gIHJldHVybiBOdW1iZXIodW5peE1pbGxpc2Vjb25kcyk7XG59XG5cbmZ1bmN0aW9uIHVuc2FmZV9nZXRVbml4TWlsbGlzZWNvbmRzRnJvbVV1aWRWNyhieXRlczogVWludDhBcnJheSk6IG51bWJlciB7XG4gIC8vIGh0dHBzOi8vd3d3LmlldGYub3JnL2FyY2hpdmUvaWQvZHJhZnQtcGVhYm9keS1kaXNwYXRjaC1uZXctdXVpZC1mb3JtYXQtMDQuaHRtbF9uYW1lLXV1aWQtdmVyc2lvbi03XG4gIC8vICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzXG4gIC8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDFcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfCAgICAgICAgICB1bml4X3RzX21zICAgICAgICAgICB8ICB2ZXIgIHwgICAgICAgcmFuZF9hICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfHZhcnwgICAgICAgICAgICAgICAgICAgICAgICByYW5kX2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kX2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAgY29uc3QgaGV4ID0gXCIweFwiXG4gICAgLy8gWFhYWFhYWFgtX19fXy03X19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1swXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1sxXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1syXSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1szXSFdXG4gICAgLy8gX19fX19fX18tWFhYWC03X19fLV9fX18tX19fX19fX19fX19fXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s0XSFdXG4gICAgKyBCWVRFX1RPX0hFWFtieXRlc1s1XSFdO1xuICBjb25zdCB1bml4TWlsbGlzZWNvbmRzID0gcGFyc2VJbnQoaGV4KTtcblxuICByZXR1cm4gdW5peE1pbGxpc2Vjb25kcztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxpQ0FHTztBQUNQLG9CQUErQztBQUMvQyxrQkFBNkI7QUE0QjdCLElBQU0sY0FBOEIsc0JBQU07QUFBQSxFQUN4QyxFQUFFLFFBQVEsSUFBSTtBQUFBLEVBQ2QsQ0FBQyxHQUFHLE9BQU8sSUFBSSxLQUFPLFNBQVMsRUFBRSxFQUFFLE1BQU0sQ0FBQztBQUM1QztBQW1CQSxJQUFNLGVBQStCLHNCQUFNO0FBQUEsRUFDekMsRUFBRSxRQUFRLEdBQUc7QUFBQSxFQUNiLENBQUMsR0FBRyxNQUFNLE1BQU0sS0FBSyxFQUFFLFFBQVEsR0FBRyxHQUFHLENBQUNBLElBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQztBQUMzRDtBQUVBLFNBQVMsWUFBWSxNQUEwQjtBQVM3QyxNQUFJLEtBQUssV0FBVyxJQUFJO0FBQ3RCLFVBQU0sSUFBSSxnQ0FBa0IsZ0JBQWdCLElBQUk7QUFBQSxFQUNsRDtBQUVBLFFBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtBQUUvQixXQUFTLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxLQUFLO0FBQ3hDLFNBQUssSUFBSSxLQUFLLFdBQVcsQ0FBQyxPQUFPLElBQWM7QUFDN0MsVUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksSUFBSSxLQUFNLElBQUksS0FBTyxJQUFJLEtBQU0sSUFBSSxLQUFPLElBQUk7QUFDbEQs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