{"version":3,"file":"index.cjs","sources":["../node_modules/tslib/tslib.es6.mjs","persistence.js","compatibility.js","errors.js","utils.js","travels.js","createTravels.js"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n","export const TRAVELS_HISTORY_SCHEMA_VERSION = 1;\nexport class TravelsPersistenceError extends Error {\n    constructor(code, message, options = {}) {\n        super(message);\n        this.name = 'TravelsPersistenceError';\n        this.code = code;\n        this.cause = options.cause;\n    }\n}\nconst isObjectRecord = (value) => {\n    return typeof value === 'object' && value !== null;\n};\nconst hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);\nconst isValidMetadataEntry = (entry) => {\n    return entry == null || (isObjectRecord(entry) && !Array.isArray(entry));\n};\nconst isValidPatchPath = (path) => {\n    if (typeof path === 'string') {\n        return path === '' || path.startsWith('/');\n    }\n    return (Array.isArray(path) &&\n        path.every((segment) => typeof segment === 'string' || typeof segment === 'number'));\n};\nconst isRootPatchPath = (path) => {\n    return path === '' || (Array.isArray(path) && path.length === 0);\n};\nconst isValidPatchOperation = (operation) => {\n    if (!isObjectRecord(operation)) {\n        return false;\n    }\n    const op = operation.op;\n    if (op !== 'add' &&\n        op !== 'remove' &&\n        op !== 'replace') {\n        return false;\n    }\n    if (!isValidPatchPath(operation.path)) {\n        return false;\n    }\n    if ((op === 'add' || op === 'remove') && isRootPatchPath(operation.path)) {\n        return false;\n    }\n    if ((op === 'add' || op === 'replace') && !hasOwn(operation, 'value')) {\n        return false;\n    }\n    return true;\n};\nconst isPatchHistoryEntries = (value) => {\n    return (Array.isArray(value) &&\n        value.every((entry) => Array.isArray(entry) && entry.every(isValidPatchOperation)));\n};\nexport const getTravelPatchesValidationError = (patches) => {\n    if (!isObjectRecord(patches)) {\n        return `patches must be an object with 'patches' and 'inversePatches' arrays`;\n    }\n    const patchHistory = patches;\n    if (!isPatchHistoryEntries(patchHistory.patches) ||\n        !isPatchHistoryEntries(patchHistory.inversePatches)) {\n        return `patches must have 'patches' and 'inversePatches' arrays of JSON Patch operations`;\n    }\n    if (patchHistory.patches.length !== patchHistory.inversePatches.length) {\n        return `patches.patches and patches.inversePatches must have the same length`;\n    }\n    return null;\n};\nconst parseSnapshotInput = (input) => {\n    if (typeof input !== 'string') {\n        return input;\n    }\n    try {\n        return JSON.parse(input);\n    }\n    catch (error) {\n        throw new TravelsPersistenceError('PARSE_ERROR', 'Travels: persisted history is not valid JSON.', { cause: error });\n    }\n};\nconst normalizeSnapshot = (snapshot) => {\n    if (!isObjectRecord(snapshot)) {\n        throw new TravelsPersistenceError('INVALID_SCHEMA', 'Travels: persisted history must be an object.');\n    }\n    if (snapshot.version !== TRAVELS_HISTORY_SCHEMA_VERSION) {\n        throw new TravelsPersistenceError('UNSUPPORTED_VERSION', `Travels: unsupported persisted history version ${String(snapshot.version)}. Expected ${TRAVELS_HISTORY_SCHEMA_VERSION}.`);\n    }\n    if (!('state' in snapshot)) {\n        throw new TravelsPersistenceError('INVALID_SCHEMA', \"Travels: persisted history must include 'state'.\");\n    }\n    if (!('patches' in snapshot)) {\n        throw new TravelsPersistenceError('INVALID_SCHEMA', \"Travels: persisted history must include 'patches'.\");\n    }\n    const patches = snapshot.patches;\n    const patchValidationError = getTravelPatchesValidationError(patches);\n    if (patchValidationError) {\n        throw new TravelsPersistenceError('INVALID_PATCHES', `Travels: ${patchValidationError}.`);\n    }\n    const position = snapshot.position;\n    if (typeof position !== 'number' ||\n        !Number.isFinite(position) ||\n        !Number.isInteger(position) ||\n        position < 0 ||\n        (patches && position > patches.patches.length)) {\n        throw new TravelsPersistenceError('INVALID_SCHEMA', `Travels: persisted history position ${String(position)} is invalid for the patch history.`);\n    }\n    const metadataInput = snapshot.metadata;\n    let metadata;\n    if (metadataInput !== undefined) {\n        if (!Array.isArray(metadataInput)) {\n            throw new TravelsPersistenceError('INVALID_SCHEMA', \"Travels: persisted history 'metadata' must be an array when provided.\");\n        }\n        const metadataEntries = metadataInput;\n        if (!metadataEntries.every(isValidMetadataEntry)) {\n            throw new TravelsPersistenceError('INVALID_SCHEMA', \"Travels: persisted history 'metadata' entries must be objects, null, or undefined.\");\n        }\n        metadata = metadataEntries.map((entry) => entry == null ? undefined : entry);\n    }\n    if (metadata !== undefined && metadata.length !== patches.patches.length) {\n        throw new TravelsPersistenceError('INVALID_SCHEMA', \"Travels: persisted history 'metadata' length must match patches length.\");\n    }\n    return {\n        version: TRAVELS_HISTORY_SCHEMA_VERSION,\n        state: snapshot.state,\n        patches: patches,\n        position,\n        metadata,\n    };\n};\nconst resolveFallback = (fallback) => {\n    if (!fallback) {\n        return undefined;\n    }\n    return typeof fallback === 'function' ? fallback() : fallback;\n};\nexport const deserializeTravelsHistory = (input, options = {}) => {\n    var _a;\n    try {\n        const parsed = parseSnapshotInput(input);\n        let migrated = parsed;\n        if (options.migrate) {\n            try {\n                migrated = options.migrate(parsed);\n            }\n            catch (error) {\n                throw new TravelsPersistenceError('MIGRATION_FAILED', 'Travels: persisted history migration failed.', { cause: error });\n            }\n        }\n        return normalizeSnapshot(migrated);\n    }\n    catch (error) {\n        const persistenceError = error instanceof TravelsPersistenceError\n            ? error\n            : new TravelsPersistenceError('INVALID_SCHEMA', 'Travels: persisted history could not be deserialized.', { cause: error });\n        (_a = options.onError) === null || _a === void 0 ? void 0 : _a.call(options, persistenceError);\n        const fallback = resolveFallback(options.fallback);\n        if (fallback) {\n            return normalizeSnapshot(fallback);\n        }\n        throw persistenceError;\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBVSxDQUFDO0FBRXpELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxLQUFLO0lBSWhELFlBQ0UsSUFBaUMsRUFDakMsT0FBZSxFQUNmLFVBQStCLEVBQUU7UUFFakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyx5QkFBeUIsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQW9DLEVBQUU7SUFDMUUsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQVcsRUFBRSxDQUNyRCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRW5ELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFjLEVBQVcsRUFBRTtJQUN2RCxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQWEsRUFBVyxFQUFFO0lBQ2xELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLEtBQUss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QWtCLEVBQ2xCLDhDQUE4QyxFQUM5QyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FDakIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBTyxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sZ0JBQWdCLEdBQ3BCLEtBQUssWUFBWSx1QkFBdUI7WUFDdEMsQ0FBQyxDQUFDLEtBQUs7WUFDUCxDQUFDLENBQUMsSUFBSSx1QkFBdUIsQ0FDekIsZ0JBQWdCLEVBQ2hCLHVEQUF1RCxFQUN2RCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FDakIsQ0FBQztRQUVSLE1BQUEsT0FBTyxDQUFDLE9BQU8sd0RBQUcsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLGlCQUFpQixDQUFPLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxNQUFNLGdCQUFnQixDQUFDO0lBQ3pCLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIFBhdGNoZXNPcHRpb24sXG4gIFRyYXZlbE1ldGFkYXRhLFxuICBUcmF2ZWxQYXRjaGVzLFxuICBUcmF2ZWxzRGVzZXJpYWxpemVPcHRpb25zLFxuICBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvckNvZGUsXG4gIFRyYXZlbHNTZXJpYWxpemVkSGlzdG9yeSxcbn0gZnJvbSAnLi90eXBlJztcblxuZXhwb3J0IGNvbnN0IFRSQVZFTFNfSElTVE9SWV9TQ0hFTUFfVkVSU0lPTiA9IDEgYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvZGU6IFRyYXZlbHNQZXJzaXN0ZW5jZUVycm9yQ29kZTtcbiAgcHVibGljIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb2RlOiBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvckNvZGUsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY2F1c2U/OiB1bmtub3duIH0gPSB7fVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVHJhdmVsc1BlcnNpc3RlbmNlRXJyb3InO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5jYXVzZSA9IG9wdGlvbnMuY2F1c2U7XG4gIH1cbn1cblxuY29uc3QgaXNPYmplY3RSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufTtcblxuY29uc3QgaGFzT3duID0gKHZhbHVlOiBvYmplY3QsIGtleTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSk7XG5cbmNvbnN0IGlzVmFsaWRNZXRhZGF0YUVudHJ5ID0gKGVudHJ5OiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBlbnRyeSA9PSBudWxsIHx8IChpc09iamVjdFJlY29yZChlbnRyeSkgJiYgIUFycmF5LmlzQXJyYXkoZW50cnkpKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRQYXRjaFBhdGggPSAocGF0aDogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhdGggPT09ICcnIHx8IHBhdGguc3RhcnRzV2l0aCgnLycpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KHBhdGgpICYmXG4gICAgcGF0aC5ldmVyeShcbiAgICAgIChzZWdtZW50KSA9PiB0eXBlb2Ygc2VnbWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHNlZ21lbnQgPT09ICdudW1iZXInXG4gICAgKVxuICApO1xufTtcblxuY29uc3QgaXNSb290UGF0Y2hQYXRoID0gKHBhdGg6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIHBhdGggPT09ICcnIHx8IChBcnJheS5pc0FycmF5KHBhdGgpICYmIHBhdGgubGVuZ3RoID09PSAwKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRQYXRjaE9wZXJhdGlvbiA9IChvcGVyYXRpb246IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgaWYgKCFpc09iamVjdFJlY29yZChvcGVyYXRpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBvcGVyYXRpb24ub3A7XG4gIGlmIChcbiAgICBvcCAhPT0gJ2FkZCcgJiZcbiAgICBvcCAhPT0gJ3JlbW92ZScgJiZcbiAgICBvcCAhPT0gJ3JlcGxhY2UnXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZFBhdGNoUGF0aChvcGVyYXRpb24ucGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoKG9wID09PSAnYWRkJyB8fCBvcCA9PT0gJ3JlbW92ZScpICYmIGlzUm9vdFBhdGNoUGF0aChvcGVyYXRpb24ucGF0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoKG9wID09PSAnYWRkJyB8fCBvcCA9PT0gJ3JlcGxhY2UnKSAmJiAhaGFzT3duKG9wZXJhdGlvbiwgJ3ZhbHVlJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzUGF0Y2hIaXN0b3J5RW50cmllcyA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHVua25vd25bXVtdID0+IHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgIHZhbHVlLmV2ZXJ5KFxuICAgICAgKGVudHJ5KSA9PiBBcnJheS5pc0FycmF5KGVudHJ5KSAmJiBlbnRyeS5ldmVyeShpc1ZhbGlkUGF0Y2hPcGVyYXRpb24pXG4gICAgKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRyYXZlbFBhdGNoZXNWYWxpZGF0aW9uRXJyb3IgPSA8XG4gIFAgZXh0ZW5kcyBQYXRjaGVzT3B0aW9uID0ge30sXG4+KFxuICBwYXRjaGVzOiB1bmtub3duXG4pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgaWYgKCFpc09iamVjdFJlY29yZChwYXRjaGVzKSkge1xuICAgIHJldHVybiBgcGF0Y2hlcyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICdwYXRjaGVzJyBhbmQgJ2ludmVyc2VQYXRjaGVzJyBhcnJheXNgO1xuICB9XG5cbiAgY29uc3QgcGF0Y2hIaXN0b3J5ID0gcGF0Y2hlcyBhcyBUcmF2ZWxQYXRjaGVzPFA+O1xuICBpZiAoXG4gICAgIWlzUGF0Y2hIaXN0b3J5RW50cmllcyhwYXRjaEhpc3RvcnkucGF0Y2hlcykgfHxcbiAgICAhaXNQYXRjaEhpc3RvcnlFbnRyaWVzKHBhdGNoSGlzdG9yeS5pbnZlcnNlUGF0Y2hlcylcbiAgKSB7XG4gICAgcmV0dXJuIGBwYXRjaGVzIG11c3QgaGF2ZSAncGF0Y2hlcycgYW5kICdpbnZlcnNlUGF0Y2hlcycgYXJyYXlzIG9mIEpTT04gUGF0Y2ggb3BlcmF0aW9uc2A7XG4gIH1cblxuICBpZiAocGF0Y2hIaXN0b3J5LnBhdGNoZXMubGVuZ3RoICE9PSBwYXRjaEhpc3RvcnkuaW52ZXJzZVBhdGNoZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGBwYXRjaGVzLnBhdGNoZXMgYW5kIHBhdGNoZXMuaW52ZXJzZVBhdGNoZXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aGA7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IHBhcnNlU25hcHNob3RJbnB1dCA9IChpbnB1dDogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoaW5wdXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvcihcbiAgICAgICdQQVJTRV9FUlJPUicsXG4gICAgICAnVHJhdmVsczogcGVyc2lzdGVkIGhpc3RvcnkgaXMgbm90IHZhbGlkIEpTT04uJyxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBub3JtYWxpemVTbmFwc2hvdCA9IDxTLCBQIGV4dGVuZHMgUGF0Y2hlc09wdGlvbiA9IHt9PihcbiAgc25hcHNob3Q6IHVua25vd25cbik6IFRyYXZlbHNTZXJpYWxpemVkSGlzdG9yeTxTLCBQPiA9PiB7XG4gIGlmICghaXNPYmplY3RSZWNvcmQoc25hcHNob3QpKSB7XG4gICAgdGhyb3cgbmV3IFRyYXZlbHNQZXJzaXN0ZW5jZUVycm9yKFxuICAgICAgJ0lOVkFMSURfU0NIRU1BJyxcbiAgICAgICdUcmF2ZWxzOiBwZXJzaXN0ZWQgaGlzdG9yeSBtdXN0IGJlIGFuIG9iamVjdC4nXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzbmFwc2hvdC52ZXJzaW9uICE9PSBUUkFWRUxTX0hJU1RPUllfU0NIRU1BX1ZFUlNJT04pIHtcbiAgICB0aHJvdyBuZXcgVHJhdmVsc1BlcnNpc3RlbmNlRXJyb3IoXG4gICAgICAnVU5TVVBQT1JURURfVkVSU0lPTicsXG4gICAgICBgVHJhdmVsczogdW5zdXBwb3J0ZWQgcGVyc2lzdGVkIGhpc3RvcnkgdmVyc2lvbiAke1N0cmluZyhcbiAgICAgICAgc25hcHNob3QudmVyc2lvblxuICAgICAgKX0uIEV4cGVjdGVkICR7VFJBVkVMU19ISVNUT1JZX1NDSEVNQV9WRVJTSU9OfS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmICghKCdzdGF0ZScgaW4gc25hcHNob3QpKSB7XG4gICAgdGhyb3cgbmV3IFRyYXZlbHNQZXJzaXN0ZW5jZUVycm9yKFxuICAgICAgJ0lOVkFMSURfU0NIRU1BJyxcbiAgICAgIFwiVHJhdmVsczogcGVyc2lzdGVkIGhpc3RvcnkgbXVzdCBpbmNsdWRlICdzdGF0ZScuXCJcbiAgICApO1xuICB9XG5cbiAgaWYgKCEoJ3BhdGNoZXMnIGluIHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvcihcbiAgICAgICdJTlZBTElEX1NDSEVNQScsXG4gICAgICBcIlRyYXZlbHM6IHBlcnNpc3RlZCBoaXN0b3J5IG11c3QgaW5jbHVkZSAncGF0Y2hlcycuXCJcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcGF0Y2hlcyA9IHNuYXBzaG90LnBhdGNoZXMgYXMgVHJhdmVsUGF0Y2hlczxQPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcGF0Y2hWYWxpZGF0aW9uRXJyb3IgPSBnZXRUcmF2ZWxQYXRjaGVzVmFsaWRhdGlvbkVycm9yKHBhdGNoZXMpO1xuICBpZiAocGF0Y2hWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgVHJhdmVsc1BlcnNpc3RlbmNlRXJyb3IoXG4gICAgICAnSU5WQUxJRF9QQVRDSEVTJyxcbiAgICAgIGBUcmF2ZWxzOiAke3BhdGNoVmFsaWRhdGlvbkVycm9yfS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBvc2l0aW9uID0gc25hcHNob3QucG9zaXRpb247XG4gIGlmIChcbiAgICB0eXBlb2YgcG9zaXRpb24gIT09ICdudW1iZXInIHx8XG4gICAgIU51bWJlci5pc0Zpbml0ZShwb3NpdGlvbikgfHxcbiAgICAhTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbikgfHxcbiAgICBwb3NpdGlvbiA8IDAgfHxcbiAgICAocGF0Y2hlcyAmJiBwb3NpdGlvbiA+IHBhdGNoZXMucGF0Y2hlcy5sZW5ndGgpXG4gICkge1xuICAgIHRocm93IG5ldyBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvcihcbiAgICAgICdJTlZBTElEX1NDSEVNQScsXG4gICAgICBgVHJhdmVsczogcGVyc2lzdGVkIGhpc3RvcnkgcG9zaXRpb24gJHtTdHJpbmcoXG4gICAgICAgIHBvc2l0aW9uXG4gICAgICApfSBpcyBpbnZhbGlkIGZvciB0aGUgcGF0Y2ggaGlzdG9yeS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhSW5wdXQgPSBzbmFwc2hvdC5tZXRhZGF0YSBhcyB1bmtub3duO1xuICBsZXQgbWV0YWRhdGE6IEFycmF5PFRyYXZlbE1ldGFkYXRhIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG1ldGFkYXRhSW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YUlucHV0KSkge1xuICAgICAgdGhyb3cgbmV3IFRyYXZlbHNQZXJzaXN0ZW5jZUVycm9yKFxuICAgICAgICAnSU5WQUxJRF9TQ0hFTUEnLFxuICAgICAgICBcIlRyYXZlbHM6IHBlcnNpc3RlZCBoaXN0b3J5ICdtZXRhZGF0YScgbXVzdCBiZSBhbiBhcnJheSB3aGVuIHByb3ZpZGVkLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhRW50cmllczogdW5rbm93bltdID0gbWV0YWRhdGFJbnB1dDtcbiAgICBpZiAoIW1ldGFkYXRhRW50cmllcy5ldmVyeShpc1ZhbGlkTWV0YWRhdGFFbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBUcmF2ZWxzUGVyc2lzdGVuY2VFcnJvcihcbiAgICAgICAgJ0lOVkFMSURfU0NIRU1BJyxcbiAgICAgICAgXCJUcmF2ZWxzOiBwZXJzaXN0ZWQgaGlzdG9yeSAnbWV0YWRhdGEnIGVudHJpZXMgbXVzdCBiZSBvYmplY3RzLCBudWxsLCBvciB1bmRlZmluZWQuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEgPSBtZXRhZGF0YUVudHJpZXMubWFwKChlbnRyeSkgPT5cbiAgICAgIGVudHJ5ID09IG51bGwgPyB1bmRlZmluZWQgOiAoZW50cnkgYXMgVHJhdmVsTWV0YWRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChtZXRhZGF0YSAhPT0gdW5kZWZpbmVkICYmIG1ldGFkYXRhLmxlbmd0aCAhPT0gcGF0Y2hlcyEucGF0Y2hlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVHJhdmVsc1BlcnNpc3RlbmNlRXJyb3IoXG4gICAgICAnSU5WQUxJRF9TQ0hFTUEnLFxuICAgICAgXCJUcmF2ZWxzOiBwZXJzaXN0ZWQgaGlzdG9yeSAnbWV0YWRhdGEnIGxlbmd0aCBtdXN0IG1hdGNoIHBhdGNoZXMgbGVuZ3RoLlwiXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogVFJBVkVMU19ISVNUT1JZX1NDSEVNQV9WRVJTSU9OLFxuICAgIHN0YXRlOiBzbmFwc2hvdC5zdGF0ZSBhcyBTLFxuICAgIHBhdGNoZXM6IHBhdGNoZXMgYXMgVHJhdmVsUGF0Y2hlczxQPixcbiAgICBwb3NpdGlvbixcbiAgICBtZXRhZGF0YSxcbiAgfTtcbn07XG5cbmNvbnN0IHJlc29sdmVGYWxsYmFjayA9IDxTLCBQIGV4dGVuZHMgUGF0Y2hlc09wdGlvbiA9IHt9PihcbiAgZmFsbGJhY2s6IFRyYXZlbHNEZXNlcmlhbGl6ZU9wdGlvbnM8UywgUD5bJ2ZhbGxiYWNrJ11cbik6IFRyYXZlbHNTZXJpYWxpemVkSGlzdG9yeTxTLCBQPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghZmFsbGJhY2spIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiBmYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGZhbGxiYWNrKCkgOiBmYWxsYmFjaztcbn07XG5cbmV4cG9ydCBjb25zdCBkZXNlcmlhbGl6ZVRyYXZlbHNIaXN0b3J5ID0gPFxuICBTLFxuICBQIGV4dGVuZHMgUGF0Y2hlc09wdGlvbiA9IHt9LFxuPihcbiAgaW5wdXQ6IHVua25vd24sXG4gIG9wdGlvbnM6IFRyYXZlbHNEZXNlcmlhbGl6ZU9wdGlvbnM8UywgUD4gPSB7fVxuKTogVHJhdmVsc1NlcmlhbGl6ZWRIaXN0b3J5PFMsIFA+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVNuYXBzaG90SW5wdXQoaW5wdXQpO1xuICAgIGxldCBtaWdyYXRlZCA9IHBhcnNlZDtcblxuICAgIGlmIChvcHRpb25zLm1pZ3JhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1pZ3JhdGVkID0gb3B0aW9ucy5taWdyYXRlKHBhcnNlZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgVHJhdmVsc1BlcnNpc3RlbmNlRXJyb3IoXG4gICAgICAgICAgJ01JR1JBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICdUcmF2ZWxzOiBwZXJzaXN0ZWQgaGlzdG9yeSBtaWdyYXRpb24gZmFpbGVkLicsXG4gICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVTbmFwc2hvdDxTLCBQPihtaWdyYXRlZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcGVyc2lzdGVuY2VFcnJvciA9XG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFRyYXZlbHNQZXJzaXN0ZW5jZUVycm9yXG4gICAgICAgID8gZXJyb3JcbiAgICAgICAgOiBuZXcgVHJhdmVsc1BlcnNpc3RlbmNlRXJyb3IoXG4gICAgICAgICAgICAnSU5WQUxJRF9TQ0hFTUEnLFxuICAgICAgICAgICAgJ1RyYXZlbHM6IHBlcnNpc3RlZCBoaXN0b3J5IGNvdWxkIG5vdCBiZSBkZXNlcmlhbGl6ZWQuJyxcbiAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICAgICAgICApO1xuXG4gICAgb3B0aW9ucy5vbkVycm9yPy4ocGVyc2lzdGVuY2VFcnJvcik7XG5cbiAgICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVGYWxsYmFjayhvcHRpb25zLmZhbGxiYWNrKTtcbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVTbmFwc2hvdDxTLCBQPihmYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdGhyb3cgcGVyc2lzdGVuY2VFcnJvcjtcbiAgfVxufTtcbiJdfQ==","const formatPath = (segments) => {\n    if (segments.length === 0) {\n        return '$';\n    }\n    return segments.reduce((path, segment) => {\n        if (typeof segment === 'number') {\n            return `${path}[${segment}]`;\n        }\n        return `${path}.${segment}`;\n    }, '$');\n};\nconst isDomNode = (value) => {\n    return (typeof Node !== 'undefined' &&\n        typeof value === 'object' &&\n        value !== null &&\n        value instanceof Node);\n};\nconst isPlainObjectOrNullProto = (value) => {\n    const proto = Object.getPrototypeOf(value);\n    return proto === Object.prototype || proto === null;\n};\nexport const findStateCompatibilityIssues = (value, options = {}) => {\n    var _a;\n    const maxIssues = (_a = options.maxIssues) !== null && _a !== void 0 ? _a : 20;\n    const seen = new WeakSet();\n    const issues = [];\n    const addIssue = (code, path, message) => {\n        if (issues.length >= maxIssues) {\n            return;\n        }\n        issues.push({\n            code,\n            path: formatPath(path),\n            message,\n        });\n    };\n    const visit = (current, path) => {\n        if (issues.length >= maxIssues) {\n            return;\n        }\n        if (typeof current === 'undefined') {\n            addIssue('UNDEFINED', path, 'undefined is removed by JSON persistence; use null for intentional empty values.');\n            return;\n        }\n        if (typeof current === 'function') {\n            addIssue('FUNCTION', path, 'functions cannot be patched or persisted as state data.');\n            return;\n        }\n        if (typeof current === 'symbol') {\n            addIssue('SYMBOL', path, 'symbols cannot be represented in JSON Patch persistence.');\n            return;\n        }\n        if (current === null || typeof current !== 'object') {\n            return;\n        }\n        if (seen.has(current)) {\n            addIssue('CIRCULAR_REFERENCE', path, 'circular references are not supported by JSON persistence.');\n            return;\n        }\n        seen.add(current);\n        if (current instanceof Date) {\n            addIssue('DATE', path, 'Date values can be cloned, but JSON persistence restores them as strings; store timestamps or ISO strings explicitly.');\n            return;\n        }\n        if (current instanceof WeakMap || current instanceof WeakSet) {\n            addIssue('WEAK_COLLECTION', path, 'WeakMap and WeakSet cannot be inspected, patched, or persisted safely.');\n            return;\n        }\n        if (current instanceof Map) {\n            addIssue(options.mutable ? 'MAP_SET_MUTABLE' : 'MAP_SET_PERSISTENCE', path, options.mutable\n                ? 'Map is not supported in mutable mode; store entries as arrays or use immutable mode.'\n                : 'Map works in immutable runtime mode, but JSON persistence requires a custom codec.');\n            current.forEach((entryValue, entryKey) => {\n                visit(entryKey, path.concat('<map-key>'));\n                visit(entryValue, path.concat(String(entryKey)));\n            });\n            return;\n        }\n        if (current instanceof Set) {\n            addIssue(options.mutable ? 'MAP_SET_MUTABLE' : 'MAP_SET_PERSISTENCE', path, options.mutable\n                ? 'Set is not supported in mutable mode; store values as arrays or use immutable mode.'\n                : 'Set works in immutable runtime mode, but JSON persistence requires a custom codec.');\n            let index = 0;\n            current.forEach((entryValue) => {\n                visit(entryValue, path.concat(index));\n                index += 1;\n            });\n            return;\n        }\n        if (isDomNode(current)) {\n            addIssue('DOM_NODE', path, 'DOM nodes and refs should be stored outside Travels state.');\n            return;\n        }\n        if (Array.isArray(current)) {\n            current.forEach((item, index) => visit(item, path.concat(index)));\n            return;\n        }\n        if (!isPlainObjectOrNullProto(current)) {\n            addIssue('CLASS_INSTANCE', path, 'class instances and custom prototypes lose methods/prototypes during JSON persistence.');\n            return;\n        }\n        for (const key of Reflect.ownKeys(current)) {\n            if (typeof key === 'symbol') {\n                addIssue('SYMBOL', path, 'symbol keys cannot be represented in JSON Patch persistence.');\n                continue;\n            }\n            visit(current[key], path.concat(key));\n        }\n    };\n    visit(value, []);\n    return issues;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGF0aWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wYXRpYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCQSxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQWdDLEVBQVUsRUFBRTtJQUM5RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQy9DLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsT0FBTyxHQUFHLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztRQUMvQixDQUFDO1FBRUQsT0FBTyxHQUFHLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUM5QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDVixDQUFDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWMsRUFBVyxFQUFFO0lBQzVDLE9BQU8sQ0FDTCxPQUFPLElBQUksS0FBSyxXQUFXO1FBQzNCLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxLQUFLLFlBQVksSUFBSSxDQUN0QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEtBQWEsRUFBVyxFQUFFO0lBQzFELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQ3RELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQzFDLEtBQWMsRUFDZCxVQUFnQyxFQUFFLEVBQ1AsRUFBRTs7SUFDN0IsTUFBTSxT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QUFDO2dCQUM1QixRQUFRLENBQ04sUUFBUSxFQUNSLElBQUksRUFDSiw4REFBOEQsQ0FDL0QsQ0FBQztnQkFDRixTQUFTO1lBQ1gsQ0FBQztZQUVELEtBQUssQ0FBRSxPQUFtQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTdGF0ZUNvbXBhdGliaWxpdHlJc3N1ZUNvZGUgPVxuICB8ICdDSVJDVUxBUl9SRUZFUkVOQ0UnXG4gIHwgJ0RBVEUnXG4gIHwgJ0ZVTkNUSU9OJ1xuICB8ICdDTEFTU19JTlNUQU5DRSdcbiAgfCAnRE9NX05PREUnXG4gIHwgJ01BUF9TRVRfTVVUQUJMRSdcbiAgfCAnTUFQX1NFVF9QRVJTSVNURU5DRSdcbiAgfCAnV0VBS19DT0xMRUNUSU9OJ1xuICB8ICdTWU1CT0wnXG4gIHwgJ1VOREVGSU5FRCc7XG5cbmV4cG9ydCB0eXBlIFN0YXRlQ29tcGF0aWJpbGl0eUlzc3VlID0ge1xuICBjb2RlOiBTdGF0ZUNvbXBhdGliaWxpdHlJc3N1ZUNvZGU7XG4gIHBhdGg6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxudHlwZSBDb21wYXRpYmlsaXR5T3B0aW9ucyA9IHtcbiAgbXV0YWJsZT86IGJvb2xlYW47XG4gIG1heElzc3Vlcz86IG51bWJlcjtcbn07XG5cbmNvbnN0IGZvcm1hdFBhdGggPSAoc2VnbWVudHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pOiBzdHJpbmcgPT4ge1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICckJztcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cy5yZWR1Y2U8c3RyaW5nPigocGF0aCwgc2VnbWVudCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2VnbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBgJHtwYXRofVske3NlZ21lbnR9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3BhdGh9LiR7c2VnbWVudH1gO1xuICB9LCAnJCcpO1xufTtcblxuY29uc3QgaXNEb21Ob2RlID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIE5vZGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBOb2RlXG4gICk7XG59O1xuXG5jb25zdCBpc1BsYWluT2JqZWN0T3JOdWxsUHJvdG8gPSAodmFsdWU6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kU3RhdGVDb21wYXRpYmlsaXR5SXNzdWVzID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAgb3B0aW9uczogQ29tcGF0aWJpbGl0eU9wdGlvbnMgPSB7fVxuKTogU3RhdGVDb21wYXRpYmlsaXR5SXNzdWVbXSA9PiB7XG4gIGNvbnN0IG1heElzc3VlcyA9IG9wdGlvbnMubWF4SXNzdWVzID8/IDIwO1xuICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICBjb25zdCBpc3N1ZXM6IFN0YXRlQ29tcGF0aWJpbGl0eUlzc3VlW10gPSBbXTtcbiAgY29uc3QgYWRkSXNzdWUgPSAoXG4gICAgY29kZTogU3RhdGVDb21wYXRpYmlsaXR5SXNzdWVDb2RlLFxuICAgIHBhdGg6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICkgPT4ge1xuICAgIGlmIChpc3N1ZXMubGVuZ3RoID49IG1heElzc3Vlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzc3Vlcy5wdXNoKHtcbiAgICAgIGNvZGUsXG4gICAgICBwYXRoOiBmb3JtYXRQYXRoKHBhdGgpLFxuICAgICAgbWVzc2FnZSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCB2aXNpdCA9IChjdXJyZW50OiB1bmtub3duLCBwYXRoOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiB7XG4gICAgaWYgKGlzc3Vlcy5sZW5ndGggPj0gbWF4SXNzdWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYWRkSXNzdWUoXG4gICAgICAgICdVTkRFRklORUQnLFxuICAgICAgICBwYXRoLFxuICAgICAgICAndW5kZWZpbmVkIGlzIHJlbW92ZWQgYnkgSlNPTiBwZXJzaXN0ZW5jZTsgdXNlIG51bGwgZm9yIGludGVudGlvbmFsIGVtcHR5IHZhbHVlcy4nXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWRkSXNzdWUoXG4gICAgICAgICdGVU5DVElPTicsXG4gICAgICAgIHBhdGgsXG4gICAgICAgICdmdW5jdGlvbnMgY2Fubm90IGJlIHBhdGNoZWQgb3IgcGVyc2lzdGVkIGFzIHN0YXRlIGRhdGEuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdzeW1ib2wnKSB7XG4gICAgICBhZGRJc3N1ZShcbiAgICAgICAgJ1NZTUJPTCcsXG4gICAgICAgIHBhdGgsXG4gICAgICAgICdzeW1ib2xzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFBhdGNoIHBlcnNpc3RlbmNlLidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlZW4uaGFzKGN1cnJlbnQpKSB7XG4gICAgICBhZGRJc3N1ZShcbiAgICAgICAgJ0NJUkNVTEFSX1JFRkVSRU5DRScsXG4gICAgICAgIHBhdGgsXG4gICAgICAgICdjaXJjdWxhciByZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEpTT04gcGVyc2lzdGVuY2UuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWVuLmFkZChjdXJyZW50KTtcblxuICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgYWRkSXNzdWUoXG4gICAgICAgICdEQVRFJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgJ0RhdGUgdmFsdWVzIGNhbiBiZSBjbG9uZWQsIGJ1dCBKU09OIHBlcnNpc3RlbmNlIHJlc3RvcmVzIHRoZW0gYXMgc3RyaW5nczsgc3RvcmUgdGltZXN0YW1wcyBvciBJU08gc3RyaW5ncyBleHBsaWNpdGx5LidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBXZWFrTWFwIHx8IGN1cnJlbnQgaW5zdGFuY2VvZiBXZWFrU2V0KSB7XG4gICAgICBhZGRJc3N1ZShcbiAgICAgICAgJ1dFQUtfQ09MTEVDVElPTicsXG4gICAgICAgIHBhdGgsXG4gICAgICAgICdXZWFrTWFwIGFuZCBXZWFrU2V0IGNhbm5vdCBiZSBpbnNwZWN0ZWQsIHBhdGNoZWQsIG9yIHBlcnNpc3RlZCBzYWZlbHkuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgYWRkSXNzdWUoXG4gICAgICAgIG9wdGlvbnMubXV0YWJsZSA/ICdNQVBfU0VUX01VVEFCTEUnIDogJ01BUF9TRVRfUEVSU0lTVEVOQ0UnLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLm11dGFibGVcbiAgICAgICAgICA/ICdNYXAgaXMgbm90IHN1cHBvcnRlZCBpbiBtdXRhYmxlIG1vZGU7IHN0b3JlIGVudHJpZXMgYXMgYXJyYXlzIG9yIHVzZSBpbW11dGFibGUgbW9kZS4nXG4gICAgICAgICAgOiAnTWFwIHdvcmtzIGluIGltbXV0YWJsZSBydW50aW1lIG1vZGUsIGJ1dCBKU09OIHBlcnNpc3RlbmNlIHJlcXVpcmVzIGEgY3VzdG9tIGNvZGVjLidcbiAgICAgICk7XG4gICAgICBjdXJyZW50LmZvckVhY2goKGVudHJ5VmFsdWUsIGVudHJ5S2V5KSA9PiB7XG4gICAgICAgIHZpc2l0KGVudHJ5S2V5LCBwYXRoLmNvbmNhdCgnPG1hcC1rZXk+JykpO1xuICAgICAgICB2aXNpdChlbnRyeVZhbHVlLCBwYXRoLmNvbmNhdChTdHJpbmcoZW50cnlLZXkpKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgYWRkSXNzdWUoXG4gICAgICAgIG9wdGlvbnMubXV0YWJsZSA/ICdNQVBfU0VUX01VVEFCTEUnIDogJ01BUF9TRVRfUEVSU0lTVEVOQ0UnLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLm11dGFibGVcbiAgICAgICAgICA/ICdTZXQgaXMgbm90IHN1cHBvcnRlZCBpbiBtdXRhYmxlIG1vZGU7IHN0b3JlIHZhbHVlcyBhcyBhcnJheXMgb3IgdXNlIGltbXV0YWJsZSBtb2RlLidcbiAgICAgICAgICA6ICdTZXQgd29ya3MgaW4gaW1tdXRhYmxlIHJ1bnRpbWUgbW9kZSwgYnV0IEpTT04gcGVyc2lzdGVuY2UgcmVxdWlyZXMgYSBjdXN0b20gY29kZWMuJ1xuICAgICAgKTtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBjdXJyZW50LmZvckVhY2goKGVudHJ5VmFsdWUpID0+IHtcbiAgICAgICAgdmlzaXQoZW50cnlWYWx1ZSwgcGF0aC5jb25jYXQoaW5kZXgpKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0RvbU5vZGUoY3VycmVudCkpIHtcbiAgICAgIGFkZElzc3VlKFxuICAgICAgICAnRE9NX05PREUnLFxuICAgICAgICBwYXRoLFxuICAgICAgICAnRE9NIG5vZGVzIGFuZCByZWZzIHNob3VsZCBiZSBzdG9yZWQgb3V0c2lkZSBUcmF2ZWxzIHN0YXRlLidcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHZpc2l0KGl0ZW0sIHBhdGguY29uY2F0KGluZGV4KSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNQbGFpbk9iamVjdE9yTnVsbFByb3RvKGN1cnJlbnQpKSB7XG4gICAgICBhZGRJc3N1ZShcbiAgICAgICAgJ0NMQVNTX0lOU1RBTkNFJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgJ2NsYXNzIGluc3RhbmNlcyBhbmQgY3VzdG9tIHByb3RvdHlwZXMgbG9zZSBtZXRob2RzL3Byb3RvdHlwZXMgZHVyaW5nIEpTT04gcGVyc2lzdGVuY2UuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoY3VycmVudCkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgICBhZGRJc3N1ZShcbiAgICAgICAgICAnU1lNQk9MJyxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgICdzeW1ib2wga2V5cyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBQYXRjaCBwZXJzaXN0ZW5jZS4nXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aXNpdCgoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgcGF0aC5jb25jYXQoa2V5KSk7XG4gICAgfVxuICB9O1xuXG4gIHZpc2l0KHZhbHVlLCBbXSk7XG4gIHJldHVybiBpc3N1ZXM7XG59O1xuIl19","export class TravelsError extends Error {\n    constructor(code, message, options = {}) {\n        super(message);\n        this.name = 'TravelsError';\n        this.code = code;\n        this.cause = options.cause;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sWUFBYSxTQUFRLEtBQUs7SUFJckMsWUFDRSxJQUFzQixFQUN0QixPQUFlLEVBQ2YsVUFBK0IsRUFBRTtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUcmF2ZWxzRXJyb3JDb2RlIH0gZnJvbSAnLi90eXBlJztcblxuZXhwb3J0IGNsYXNzIFRyYXZlbHNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvZGU6IFRyYXZlbHNFcnJvckNvZGU7XG4gIHB1YmxpYyByZWFkb25seSBjYXVzZT86IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29kZTogVHJhdmVsc0Vycm9yQ29kZSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBjYXVzZT86IHVua25vd24gfSA9IHt9XG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdUcmF2ZWxzRXJyb3InO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5jYXVzZSA9IG9wdGlvbnMuY2F1c2U7XG4gIH1cbn1cbiJdfQ==","export const isObjectLike = (value) => {\n    return typeof value === 'object' && value !== null;\n};\nexport const isPlainObject = (value) => {\n    if (!isObjectLike(value)) {\n        return false;\n    }\n    const proto = Object.getPrototypeOf(value);\n    if (proto === null) {\n        return true;\n    }\n    return proto === Object.prototype;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLEtBQWMsRUFDeUIsRUFBRTtJQUN6QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUMzQixLQUFjLEVBQ3lCLEVBQUU7SUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUNwQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgaXNPYmplY3RMaWtlID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGxhaW5PYmplY3QgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+ID0+IHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn07XG4iXX0=","import { __rest } from \"tslib\";\nimport { apply, create, isDraft, rawReturn, } from 'mutative';\nimport { deserializeTravelsHistory, TRAVELS_HISTORY_SCHEMA_VERSION, } from './persistence';\nimport { findStateCompatibilityIssues } from './compatibility';\nimport { TravelsError } from './errors';\nimport { isObjectLike, isPlainObject } from './utils';\nconst tryStructuredClone = (value) => {\n    if (typeof globalThis.structuredClone !== 'function') {\n        return undefined;\n    }\n    try {\n        return globalThis.structuredClone(value);\n    }\n    catch (_a) {\n        return undefined;\n    }\n};\nconst deepCloneValue = (value, seen = new WeakMap()) => {\n    if (value === null || typeof value !== 'object') {\n        return value;\n    }\n    if (seen.has(value)) {\n        return seen.get(value);\n    }\n    if (Array.isArray(value)) {\n        const cloned = new Array(value.length);\n        seen.set(value, cloned);\n        for (let i = 0; i < value.length; i += 1) {\n            if (Object.prototype.hasOwnProperty.call(value, i)) {\n                cloned[i] = deepCloneValue(value[i], seen);\n            }\n        }\n        return cloned;\n    }\n    if (value instanceof Map) {\n        const cloned = new Map();\n        seen.set(value, cloned);\n        value.forEach((entryValue, entryKey) => {\n            cloned.set(deepCloneValue(entryKey, seen), deepCloneValue(entryValue, seen));\n        });\n        return cloned;\n    }\n    if (value instanceof Set) {\n        const cloned = new Set();\n        seen.set(value, cloned);\n        value.forEach((entryValue) => {\n            cloned.add(deepCloneValue(entryValue, seen));\n        });\n        return cloned;\n    }\n    if (value instanceof Date) {\n        const cloned = new Date(value.getTime());\n        seen.set(value, cloned);\n        return cloned;\n    }\n    const structuredCloneValue = tryStructuredClone(value);\n    if (structuredCloneValue !== undefined) {\n        seen.set(value, structuredCloneValue);\n        return structuredCloneValue;\n    }\n    if (!isPlainObject(value) && Object.getPrototypeOf(value) !== null) {\n        return value;\n    }\n    const cloned = {};\n    seen.set(value, cloned);\n    for (const key in value) {\n        if (Object.prototype.hasOwnProperty.call(value, key)) {\n            cloned[key] = deepCloneValue(value[key], seen);\n        }\n    }\n    return cloned;\n};\nconst cloneTravelPatches = (base) => ({\n    patches: base\n        ? base.patches.map((patch) => patch.map((operation) => deepCloneValue(operation)))\n        : [],\n    inversePatches: base\n        ? base.inversePatches.map((patch) => patch.map((operation) => deepCloneValue(operation)))\n        : [],\n});\nconst cloneTravelMetadata = (metadata) => metadata ? deepCloneValue(metadata) : undefined;\nconst cloneTravelMetadataList = (metadata) => metadata.map(cloneTravelMetadata);\nconst alignMetadataToPatchCount = (metadata, count) => Array.from({ length: count }, (_, index) => cloneTravelMetadata(metadata === null || metadata === void 0 ? void 0 : metadata[index]));\nconst deepClone = (source, target) => {\n    if (target && source && typeof source === 'object') {\n        for (const key in source) {\n            if (Object.prototype.hasOwnProperty.call(source, key)) {\n                target[key] = deepCloneValue(source[key]);\n            }\n        }\n        return target;\n    }\n    return deepCloneValue(source);\n};\nconst cloneInitialSnapshot = (value) => {\n    if (value === null || typeof value !== 'object') {\n        return value;\n    }\n    const structuredCloneValue = tryStructuredClone(value);\n    if (structuredCloneValue !== undefined) {\n        return structuredCloneValue;\n    }\n    return deepClone(value);\n};\nconst containsDraft = (value, seen = new WeakSet()) => {\n    if (!isObjectLike(value)) {\n        return false;\n    }\n    if (isDraft(value)) {\n        return true;\n    }\n    const objectValue = value;\n    if (seen.has(objectValue)) {\n        return false;\n    }\n    seen.add(objectValue);\n    if (value instanceof Map) {\n        for (const [key, item] of value) {\n            if (containsDraft(key, seen) || containsDraft(item, seen)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (value instanceof Set) {\n        for (const item of value) {\n            if (containsDraft(item, seen)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    for (const key of Reflect.ownKeys(objectValue)) {\n        if (containsDraft(objectValue[key], seen)) {\n            return true;\n        }\n    }\n    return false;\n};\nconst hasOnlyArrayIndices = (value) => {\n    if (!Array.isArray(value)) {\n        return false;\n    }\n    const keys = Reflect.ownKeys(value);\n    const hasOnlyIndices = keys.every((key) => {\n        if (key === 'length') {\n            return true;\n        }\n        if (typeof key === 'symbol') {\n            return false;\n        }\n        const index = Number(key);\n        return Number.isInteger(index) && index >= 0 && String(index) === key;\n    });\n    if (!hasOnlyIndices) {\n        return false;\n    }\n    // Sparse arrays cannot be safely synchronized with in-place patches.\n    return Object.keys(value).length === value.length;\n};\nconst isPatchHistoryEntries = (value) => {\n    return Array.isArray(value) && value.every((entry) => Array.isArray(entry));\n};\nconst getInitialPatchesValidationError = (initialPatches) => {\n    if (!initialPatches) {\n        return null;\n    }\n    if (!isPatchHistoryEntries(initialPatches.patches) ||\n        !isPatchHistoryEntries(initialPatches.inversePatches)) {\n        return `initialPatches must have 'patches' and 'inversePatches' arrays`;\n    }\n    if (initialPatches.patches.length !== initialPatches.inversePatches.length) {\n        return `initialPatches.patches and initialPatches.inversePatches must have the same length`;\n    }\n    return null;\n};\n// Align mutable value updates with immutable replacements by syncing objects\nconst overwriteDraftWith = (draft, value) => {\n    const draftIsArray = Array.isArray(draft);\n    const valueIsArray = Array.isArray(value);\n    const draftKeys = Reflect.ownKeys(draft);\n    for (const key of draftKeys) {\n        if (draftIsArray && key === 'length') {\n            continue;\n        }\n        if (!Object.prototype.hasOwnProperty.call(value, key)) {\n            delete draft[key];\n        }\n    }\n    if (draftIsArray && valueIsArray) {\n        draft.length = value.length;\n    }\n    Object.assign(draft, value);\n};\n/**\n * Core Travels class for managing undo/redo history\n */\nexport class Travels {\n    /**\n     * Validate and normalize a persisted Travels history snapshot.\n     */\n    static deserialize(snapshot, options) {\n        return deserializeTravelsHistory(snapshot, options);\n    }\n    constructor(initialState, options = {}) {\n        var _a, _b;\n        this.listeners = new Set();\n        this.pendingState = null;\n        this.pendingStateVersion = 0;\n        this.controlsCache = null;\n        this.historyCache = null;\n        this.historyVersion = 0;\n        this.mutableFallbackWarned = false;\n        this.mutableRootReplaceWarned = false;\n        this.stateCompatibilityWarningKeys = new Set();\n        this.trackingPauseDepth = 0;\n        this.transactionDepth = 0;\n        /**\n         * Subscribe to state changes\n         * @returns Unsubscribe function\n         */\n        this.subscribe = (listener) => {\n            this.listeners.add(listener);\n            return () => {\n                this.listeners.delete(listener);\n            };\n        };\n        /**\n         * Get the current state\n         */\n        this.getState = () => this.state;\n        const { maxHistory = 10, history, initialPatches: inputInitialPatches, initialPosition: inputInitialPosition = 0, strictInitialPatches = false, autoArchive = true, mutable = false, warnOnUnsupportedState = process.env.NODE_ENV !== 'production', onError, onBranchDiscard, devtools, patchesOptions } = options, mutativeOptions = __rest(options, [\"maxHistory\", \"history\", \"initialPatches\", \"initialPosition\", \"strictInitialPatches\", \"autoArchive\", \"mutable\", \"warnOnUnsupportedState\", \"onError\", \"onBranchDiscard\", \"devtools\", \"patchesOptions\"]);\n        let initialPatches = (_a = history === null || history === void 0 ? void 0 : history.patches) !== null && _a !== void 0 ? _a : inputInitialPatches;\n        let initialPosition = (_b = history === null || history === void 0 ? void 0 : history.position) !== null && _b !== void 0 ? _b : inputInitialPosition;\n        if (process.env.NODE_ENV !== 'production' &&\n            history &&\n            (inputInitialPatches || inputInitialPosition !== 0)) {\n            console.warn('Travels: history overrides initialPatches and initialPosition.');\n        }\n        // Validate and enforce maxHistory constraints\n        if (typeof maxHistory !== 'number' ||\n            !Number.isFinite(maxHistory) ||\n            !Number.isInteger(maxHistory)) {\n            throw new Error(`Travels: maxHistory must be a non-negative integer, but got ${maxHistory}`);\n        }\n        if (maxHistory < 0) {\n            throw new Error(`Travels: maxHistory must be non-negative, but got ${maxHistory}`);\n        }\n        if (maxHistory === 0 && process.env.NODE_ENV !== 'production') {\n            console.warn('Travels: maxHistory is 0, which disables undo/redo history. This is rarely intended.');\n        }\n        const initialPatchesValidationError = getInitialPatchesValidationError(initialPatches);\n        if (initialPatchesValidationError) {\n            if (strictInitialPatches) {\n                throw new Error(`Travels: ${initialPatchesValidationError}`);\n            }\n            if (process.env.NODE_ENV !== 'production') {\n                console.warn(`Travels: ${initialPatchesValidationError}. Falling back to empty history. ` +\n                    `Set strictInitialPatches: true to throw instead.`);\n            }\n            initialPatches = undefined;\n            initialPosition = 0;\n        }\n        this.state = initialState;\n        // For mutable mode, deep clone initialState to prevent mutations\n        this.initialState = cloneInitialSnapshot(initialState);\n        this.maxHistory = maxHistory;\n        this.autoArchive = autoArchive;\n        this.mutable = mutable;\n        this.warnOnUnsupportedState = warnOnUnsupportedState;\n        this.onError = onError;\n        this.onBranchDiscard = onBranchDiscard;\n        this.devtools = devtools;\n        this.options = Object.assign(Object.assign({}, mutativeOptions), { enablePatches: patchesOptions !== null && patchesOptions !== void 0 ? patchesOptions : true });\n        this.warnAboutStateCompatibility(initialState);\n        const { patches: normalizedPatches, position: normalizedPosition, metadata: normalizedMetadata, } = this.normalizeInitialHistory(initialPatches, initialPosition, history === null || history === void 0 ? void 0 : history.metadata);\n        this.allPatches = normalizedPatches;\n        this.allMetadata = normalizedMetadata;\n        this.initialPatches = initialPatches\n            ? cloneTravelPatches(normalizedPatches)\n            : undefined;\n        this.initialMetadata = (history === null || history === void 0 ? void 0 : history.metadata)\n            ? normalizedMetadata.slice()\n            : undefined;\n        this.position = normalizedPosition;\n        this.initialPosition = normalizedPosition;\n        this.tempPatches = cloneTravelPatches();\n        this.tempMetadata = undefined;\n    }\n    warnAboutStateCompatibility(state) {\n        if (!this.warnOnUnsupportedState ||\n            process.env.NODE_ENV === 'production') {\n            return;\n        }\n        const issues = findStateCompatibilityIssues(state, {\n            mutable: this.mutable,\n        });\n        for (const issue of issues) {\n            const key = `${issue.code}:${issue.path}`;\n            if (this.stateCompatibilityWarningKeys.has(key)) {\n                continue;\n            }\n            this.stateCompatibilityWarningKeys.add(key);\n            console.warn(`Travels state compatibility warning at ${issue.path}: ${issue.message}`);\n        }\n    }\n    normalizeInitialHistory(initialPatches, initialPosition, metadata) {\n        const cloned = cloneTravelPatches(initialPatches);\n        const total = cloned.patches.length;\n        const alignedMetadata = alignMetadataToPatchCount(metadata, total);\n        const historyLimit = this.maxHistory > 0 ? this.maxHistory : 0;\n        const invalidInitialPosition = typeof initialPosition !== 'number' ||\n            !Number.isFinite(initialPosition) ||\n            !Number.isInteger(initialPosition);\n        let position = invalidInitialPosition ? 0 : initialPosition;\n        const clampedPosition = Math.max(0, Math.min(position, total));\n        if (process.env.NODE_ENV !== 'production' &&\n            (invalidInitialPosition || clampedPosition !== position)) {\n            console.warn(`Travels: initialPosition (${initialPosition}) is invalid for available patches (${total}). ` +\n                `Using ${clampedPosition} instead.`);\n        }\n        position = clampedPosition;\n        if (total === 0) {\n            return { patches: cloned, position: 0, metadata: [] };\n        }\n        if (historyLimit === 0) {\n            if (process.env.NODE_ENV !== 'production') {\n                console.warn(`Travels: maxHistory (${this.maxHistory}) discards persisted history.`);\n            }\n            return { patches: cloneTravelPatches(), position: 0, metadata: [] };\n        }\n        if (historyLimit >= total) {\n            return {\n                patches: cloned,\n                position,\n                metadata: alignedMetadata,\n            };\n        }\n        const trim = total - historyLimit;\n        const windowStart = Math.min(position, trim);\n        const windowEnd = windowStart + historyLimit;\n        const trimmedBase = {\n            patches: cloned.patches.slice(windowStart, windowEnd),\n            inversePatches: cloned.inversePatches.slice(windowStart, windowEnd),\n        };\n        const trimmed = cloneTravelPatches(trimmedBase);\n        const adjustedPosition = position - windowStart;\n        if (process.env.NODE_ENV !== 'production') {\n            console.warn(`Travels: initialPatches length (${total}) exceeds maxHistory (${historyLimit}). ` +\n                `Retained ${historyLimit} steps from position ${windowStart}. ` +\n                `Position adjusted to ${adjustedPosition}.`);\n        }\n        return {\n            patches: trimmed,\n            position: adjustedPosition,\n            metadata: alignedMetadata.slice(windowStart, windowEnd),\n        };\n    }\n    invalidateHistoryCache() {\n        this.historyVersion += 1;\n        this.historyCache = null;\n    }\n    /**\n     * Notify all listeners of state changes\n     */\n    getEventPatches() {\n        if (!this.listeners.size && !this.devtools) {\n            return undefined;\n        }\n        return this.getPatches();\n    }\n    notify(patches) {\n        if (!this.listeners.size) {\n            return;\n        }\n        const eventPatches = patches !== null && patches !== void 0 ? patches : this.getPatches();\n        this.listeners.forEach((listener) => listener(this.state, eventPatches, this.position));\n    }\n    emitDevtools(type, metadata, patches) {\n        var _a;\n        if (!this.devtools) {\n            return;\n        }\n        const eventPatches = patches !== null && patches !== void 0 ? patches : this.getPatches();\n        (_a = this.devtools) === null || _a === void 0 ? void 0 : _a.call(this, {\n            type,\n            state: this.state,\n            position: this.position,\n            patches: eventPatches,\n            metadata,\n        });\n    }\n    emitChange(type, metadata) {\n        const patches = this.getEventPatches();\n        this.notify(patches);\n        this.emitDevtools(type, metadata, patches);\n    }\n    reportError(code, error) {\n        var _a;\n        const travelsError = error instanceof TravelsError\n            ? error\n            : new TravelsError(code, `Travels: ${code}`, { cause: error });\n        (_a = this.onError) === null || _a === void 0 ? void 0 : _a.call(this, travelsError);\n        return travelsError;\n    }\n    toEntries(patches, metadata = []) {\n        return patches.patches.map((patch, index) => ({\n            patches: patch.map((operation) => deepCloneValue(operation)),\n            inversePatches: patches.inversePatches[index].map((operation) => deepCloneValue(operation)),\n            metadata: cloneTravelMetadata(metadata[index]),\n        }));\n    }\n    discardFutureFrom(position) {\n        var _a;\n        if (position >= this.allPatches.patches.length) {\n            return;\n        }\n        const discardedPatches = {\n            patches: this.allPatches.patches.slice(position),\n            inversePatches: this.allPatches.inversePatches.slice(position),\n        };\n        const discardedMetadata = cloneTravelMetadataList(this.allMetadata.slice(position));\n        this.allPatches.patches.splice(position, this.allPatches.patches.length - position);\n        this.allPatches.inversePatches.splice(position, this.allPatches.inversePatches.length - position);\n        this.allMetadata.splice(position, this.allMetadata.length - position);\n        (_a = this.onBranchDiscard) === null || _a === void 0 ? void 0 : _a.call(this, {\n            position,\n            discarded: this.toEntries(discardedPatches, discardedMetadata),\n        });\n    }\n    trimHistoryToMax() {\n        if (this.maxHistory >= this.allPatches.patches.length) {\n            return;\n        }\n        if (this.maxHistory === 0) {\n            this.allPatches.patches = [];\n            this.allPatches.inversePatches = [];\n            this.allMetadata = [];\n            return;\n        }\n        this.allPatches.patches = this.allPatches.patches.slice(-this.maxHistory);\n        this.allPatches.inversePatches = this.allPatches.inversePatches.slice(-this.maxHistory);\n        this.allMetadata = cloneTravelMetadataList(this.allMetadata.slice(-this.maxHistory));\n    }\n    resetHistoryToCurrentState() {\n        this.initialState = cloneInitialSnapshot(this.state);\n        this.initialPosition = 0;\n        this.initialPatches = undefined;\n        this.initialMetadata = undefined;\n        this.position = 0;\n        this.allPatches = cloneTravelPatches();\n        this.allMetadata = [];\n        this.tempPatches = cloneTravelPatches();\n        this.tempMetadata = undefined;\n    }\n    hasRecordedHistory() {\n        var _a, _b, _c;\n        return (this.position !== 0 ||\n            this.initialPosition !== 0 ||\n            !!((_a = this.initialPatches) === null || _a === void 0 ? void 0 : _a.patches.length) ||\n            !!((_b = this.initialPatches) === null || _b === void 0 ? void 0 : _b.inversePatches.length) ||\n            !!((_c = this.initialMetadata) === null || _c === void 0 ? void 0 : _c.length) ||\n            this.allPatches.patches.length > 0 ||\n            this.allPatches.inversePatches.length > 0 ||\n            this.allMetadata.length > 0 ||\n            this.tempPatches.patches.length > 0 ||\n            this.tempPatches.inversePatches.length > 0 ||\n            this.tempMetadata !== undefined);\n    }\n    restoreStateFromSnapshot(snapshot) {\n        const canRestoreMutably = this.mutable && isObjectLike(this.state) && isObjectLike(snapshot);\n        if (canRestoreMutably) {\n            const [, patches] = create(this.state, (draft) => {\n                for (const key of Object.keys(draft)) {\n                    delete draft[key];\n                }\n                deepClone(snapshot, draft);\n                if (Array.isArray(draft) && Array.isArray(snapshot)) {\n                    draft.length = snapshot.length;\n                }\n            }, this.options);\n            apply(this.state, patches, { mutable: true });\n            return;\n        }\n        this.state = snapshot;\n    }\n    captureTransactionSnapshot() {\n        return {\n            state: this.mutable && isObjectLike(this.state)\n                ? cloneInitialSnapshot(this.state)\n                : this.state,\n            position: this.position,\n            allPatches: cloneTravelPatches(this.allPatches),\n            allMetadata: cloneTravelMetadataList(this.allMetadata),\n            tempPatches: cloneTravelPatches(this.tempPatches),\n            tempMetadata: cloneTravelMetadata(this.tempMetadata),\n            initialState: cloneInitialSnapshot(this.initialState),\n            initialPosition: this.initialPosition,\n            initialPatches: this.initialPatches\n                ? cloneTravelPatches(this.initialPatches)\n                : undefined,\n            initialMetadata: this.initialMetadata\n                ? cloneTravelMetadataList(this.initialMetadata)\n                : undefined,\n            pendingState: this.pendingState,\n            pendingStateVersion: this.pendingStateVersion,\n        };\n    }\n    restoreTransactionSnapshot(snapshot) {\n        this.restoreStateFromSnapshot(snapshot.state);\n        this.position = snapshot.position;\n        this.allPatches = cloneTravelPatches(snapshot.allPatches);\n        this.allMetadata = cloneTravelMetadataList(snapshot.allMetadata);\n        this.tempPatches = cloneTravelPatches(snapshot.tempPatches);\n        this.tempMetadata = cloneTravelMetadata(snapshot.tempMetadata);\n        this.initialState = cloneInitialSnapshot(snapshot.initialState);\n        this.initialPosition = snapshot.initialPosition;\n        this.initialPatches = snapshot.initialPatches\n            ? cloneTravelPatches(snapshot.initialPatches)\n            : undefined;\n        this.initialMetadata = snapshot.initialMetadata\n            ? cloneTravelMetadataList(snapshot.initialMetadata)\n            : undefined;\n        this.pendingState = snapshot.pendingState;\n        this.pendingStateVersion = snapshot.pendingStateVersion;\n        this.invalidateHistoryCache();\n        this.notify();\n    }\n    /**\n     * Check if patches contain root-level replacement operations\n     * Root replacement cannot be done mutably as it changes the type/value of the entire state\n     */\n    hasRootReplacement(patches) {\n        return patches.some((patch) => ((Array.isArray(patch.path) && patch.path.length === 0) ||\n            patch.path === '') &&\n            patch.op === 'replace');\n    }\n    /**\n     * Update the state\n     */\n    setState(updater, metadata) {\n        let patches;\n        let inversePatches;\n        let nextPendingState;\n        const canUseMutableRoot = this.mutable && isObjectLike(this.state);\n        const isFunctionUpdater = typeof updater === 'function';\n        const stateIsArray = Array.isArray(this.state);\n        const updaterIsArray = Array.isArray(updater);\n        const canMutatePlainObjects = !stateIsArray &&\n            !updaterIsArray &&\n            isPlainObject(this.state) &&\n            isPlainObject(updater);\n        const canMutateArrays = stateIsArray &&\n            updaterIsArray &&\n            hasOnlyArrayIndices(this.state) &&\n            hasOnlyArrayIndices(updater);\n        const canMutateWithValue = canUseMutableRoot &&\n            !isFunctionUpdater &&\n            (canMutateArrays || canMutatePlainObjects);\n        const useMutable = (isFunctionUpdater && canUseMutableRoot) || canMutateWithValue;\n        if (this.mutable && !canUseMutableRoot && !this.mutableFallbackWarned) {\n            this.mutableFallbackWarned = true;\n            if (process.env.NODE_ENV !== 'production') {\n                console.warn('Travels: mutable mode requires the state root to be an object. Falling back to immutable updates.');\n            }\n        }\n        if (useMutable) {\n            // For observable state: generate patches then apply mutably\n            const [nextState, p, ip] = create(this.state, isFunctionUpdater\n                ? updater\n                : (draft) => {\n                    overwriteDraftWith(draft, updater);\n                }, this.options);\n            patches = p;\n            inversePatches = ip;\n            if (this.hasRootReplacement(patches)) {\n                if (process.env.NODE_ENV !== 'production' &&\n                    !this.mutableRootReplaceWarned) {\n                    this.mutableRootReplaceWarned = true;\n                    console.warn('Travels: mutable mode cannot apply root replacements in place. Falling back to immutable update for this change.');\n                }\n                // Root replacement cannot be applied mutably; fall back to immutable assignment.\n                this.state = nextState;\n                nextPendingState = nextState;\n            }\n            else {\n                // Apply patches to mutate the existing state object\n                apply(this.state, patches, { mutable: true });\n                // Keep the same reference\n                nextPendingState = this.state;\n            }\n        }\n        else {\n            // For immutable state: create new object\n            const [nextState, p, ip] = (typeof updater === 'function'\n                ? create(this.state, (draft) => {\n                    const result = updater(draft);\n                    if (result === draft) {\n                        return result;\n                    }\n                    return isObjectLike(result) && !containsDraft(result)\n                        ? rawReturn(result)\n                        : result;\n                }, this.options)\n                : create(this.state, () => isObjectLike(updater)\n                    ? rawReturn(updater)\n                    : updater, this.options));\n            patches = p;\n            inversePatches = ip;\n            this.state = nextState;\n            nextPendingState = nextState;\n        }\n        const hasNoChanges = patches.length === 0 && inversePatches.length === 0;\n        if (hasNoChanges) {\n            return;\n        }\n        this.pendingState = nextPendingState;\n        const pendingStateVersion = ++this.pendingStateVersion;\n        // Reset pendingState asynchronously, but only if no newer update landed.\n        Promise.resolve().then(() => {\n            if (this.pendingStateVersion === pendingStateVersion) {\n                this.pendingState = null;\n            }\n        });\n        this.warnAboutStateCompatibility(this.state);\n        if (this.trackingPauseDepth > 0) {\n            this.resetHistoryToCurrentState();\n            this.invalidateHistoryCache();\n            this.emitChange('replaceStateWithoutHistory', metadata);\n            return;\n        }\n        if (this.autoArchive) {\n            const notLast = this.position < this.allPatches.patches.length;\n            // Remove all patches after the current position\n            if (notLast) {\n                this.discardFutureFrom(this.position);\n            }\n            this.allPatches.patches.push(patches);\n            this.allPatches.inversePatches.push(inversePatches);\n            this.allMetadata.push(cloneTravelMetadata(metadata));\n            this.position =\n                this.maxHistory < this.allPatches.patches.length\n                    ? this.maxHistory\n                    : this.position + 1;\n            this.trimHistoryToMax();\n        }\n        else {\n            const notLast = this.position <\n                this.allPatches.patches.length +\n                    Number(!!this.tempPatches.patches.length);\n            // Remove all patches after the current position\n            if (notLast) {\n                this.discardFutureFrom(this.position);\n            }\n            if (!this.tempPatches.patches.length || notLast) {\n                this.position =\n                    this.maxHistory < this.allPatches.patches.length + 1\n                        ? this.maxHistory\n                        : this.position + 1;\n            }\n            if (notLast) {\n                this.tempPatches.patches.length = 0;\n                this.tempPatches.inversePatches.length = 0;\n                this.tempMetadata = undefined;\n            }\n            this.tempPatches.patches.push(patches);\n            this.tempPatches.inversePatches.push(inversePatches);\n            if (metadata !== undefined || this.tempMetadata === undefined) {\n                this.tempMetadata = cloneTravelMetadata(metadata);\n            }\n        }\n        this.invalidateHistoryCache();\n        this.emitChange('setState', metadata);\n    }\n    /**\n     * Archive the current state (only for manual archive mode)\n     */\n    archivePending(metadata) {\n        if (!this.tempPatches.patches.length)\n            return false;\n        const archiveMetadata = metadata === undefined ? this.tempMetadata : metadata;\n        const pendingArchive = this.getPendingArchiveEntry();\n        this.allPatches.patches.push(pendingArchive.patches);\n        this.allPatches.inversePatches.push(pendingArchive.inversePatches);\n        this.allMetadata.push(cloneTravelMetadata(archiveMetadata));\n        // Respect maxHistory limit\n        this.trimHistoryToMax();\n        // Clear temporary patches after archiving\n        this.tempPatches.patches.length = 0;\n        this.tempPatches.inversePatches.length = 0;\n        this.tempMetadata = undefined;\n        this.invalidateHistoryCache();\n        this.emitChange('archive', archiveMetadata);\n        return true;\n    }\n    archive(metadata) {\n        if (this.autoArchive) {\n            console.warn('Auto archive is enabled, no need to archive manually');\n            return;\n        }\n        this.archivePending(metadata);\n    }\n    transaction(metadataOrFn, maybeFn) {\n        const metadata = typeof metadataOrFn === 'function'\n            ? undefined\n            : cloneTravelMetadata(metadataOrFn);\n        const fn = typeof metadataOrFn === 'function' ? metadataOrFn : maybeFn;\n        if (!fn) {\n            return;\n        }\n        const previousAutoArchive = this.autoArchive;\n        const previousMetadata = this.transactionMetadata;\n        const isRootTransaction = this.transactionDepth === 0;\n        const transactionSnapshot = this.captureTransactionSnapshot();\n        let failed = false;\n        this.transactionDepth += 1;\n        if (isRootTransaction) {\n            this.transactionMetadata = metadata;\n        }\n        else if (!this.transactionMetadata && metadata) {\n            this.transactionMetadata = metadata;\n        }\n        this.autoArchive = false;\n        try {\n            fn();\n        }\n        catch (error) {\n            failed = true;\n            this.restoreTransactionSnapshot(transactionSnapshot);\n            this.transactionMetadata = previousMetadata;\n            throw this.reportError('TRANSACTION_FAILED', error);\n        }\n        finally {\n            this.transactionDepth -= 1;\n            if (this.transactionDepth === 0) {\n                this.autoArchive = previousAutoArchive;\n                if (!failed) {\n                    const committed = this.archivePending(this.transactionMetadata);\n                    if (committed) {\n                        this.emitDevtools('transaction', this.transactionMetadata);\n                    }\n                }\n                this.transactionMetadata = previousMetadata;\n            }\n        }\n    }\n    batch(metadataOrFn, maybeFn) {\n        this.transaction(metadataOrFn, maybeFn);\n    }\n    pauseTracking() {\n        this.trackingPauseDepth += 1;\n    }\n    resumeTracking() {\n        this.trackingPauseDepth = Math.max(0, this.trackingPauseDepth - 1);\n    }\n    replaceStateWithoutHistory(updater) {\n        const historyVersionBefore = this.historyVersion;\n        this.pauseTracking();\n        try {\n            this.setState(updater);\n        }\n        finally {\n            this.resumeTracking();\n        }\n        if (this.historyVersion === historyVersionBefore &&\n            // Mutable stores can change externally before this no-op updater rebases the baseline.\n            (this.hasRecordedHistory() || this.mutable)) {\n            this.resetHistoryToCurrentState();\n            this.invalidateHistoryCache();\n            this.emitChange('replaceStateWithoutHistory');\n        }\n    }\n    /**\n     * Get all patches including temporary patches\n     */\n    getPendingArchiveEntry() {\n        var _a;\n        // Use pendingState if available, otherwise use current state.\n        const stateToUse = ((_a = this.pendingState) !== null && _a !== void 0 ? _a : this.state);\n        const archivedState = apply(stateToUse, this.tempPatches.inversePatches.flat().reverse());\n        // Merge temp patches into the same entry shape archive() would commit.\n        const [, patches, inversePatches] = create(stateToUse, () => isObjectLike(archivedState)\n            ? rawReturn(archivedState)\n            : archivedState, this.options);\n        return {\n            patches: inversePatches,\n            inversePatches: patches,\n        };\n    }\n    getAllPatches() {\n        const shouldArchive = !this.autoArchive && !!this.tempPatches.patches.length;\n        if (shouldArchive) {\n            const pendingArchive = this.getPendingArchiveEntry();\n            return {\n                patches: this.allPatches.patches.concat([pendingArchive.patches]),\n                inversePatches: this.allPatches.inversePatches.concat([\n                    pendingArchive.inversePatches,\n                ]),\n            };\n        }\n        return this.allPatches;\n    }\n    /**\n     * Get the complete history of states\n     *\n     * @returns The history array. Reference equality indicates cache hit.\n     *\n     * @remarks\n     * **IMPORTANT**: Treat the returned array and every state entry as read-only.\n     * They are cached internally.\n     * - In development mode, only the array container is frozen.\n     * - State entries are shared cached snapshots and are not deep-frozen.\n     * - In production mode, modifying the array or its entries will corrupt the cache.\n     */\n    getHistory() {\n        if (this.historyCache &&\n            this.historyCache.version === this.historyVersion) {\n            return this.historyCache.history;\n        }\n        let currentState = this.state;\n        const _allPatches = this.getAllPatches();\n        const patches = !this.autoArchive && _allPatches.patches.length > this.maxHistory\n            ? _allPatches.patches.slice(_allPatches.patches.length - this.maxHistory)\n            : _allPatches.patches;\n        const inversePatches = !this.autoArchive && _allPatches.inversePatches.length > this.maxHistory\n            ? _allPatches.inversePatches.slice(_allPatches.inversePatches.length - this.maxHistory)\n            : _allPatches.inversePatches;\n        // Build future history\n        const futureHistory = [];\n        for (let i = this.position; i < patches.length; i++) {\n            currentState = apply(currentState, patches[i]);\n            futureHistory.push(currentState);\n        }\n        // Build past history\n        currentState = this.state;\n        const pastHistory = [];\n        for (let i = this.position - 1; i > -1; i--) {\n            currentState = apply(currentState, inversePatches[i]);\n            pastHistory.push(currentState);\n        }\n        pastHistory.reverse();\n        const history = [...pastHistory, this.state, ...futureHistory];\n        this.historyCache = {\n            version: this.historyVersion,\n            history,\n        };\n        // In development mode, freeze the history container to catch push/splice.\n        // Entries remain shared cached snapshots and should be treated as read-only.\n        if (process.env.NODE_ENV !== 'production') {\n            Object.freeze(history);\n        }\n        return history;\n    }\n    /**\n     * Go to a specific position in the history\n     */\n    go(nextPosition) {\n        if (typeof nextPosition !== 'number' || !Number.isFinite(nextPosition)) {\n            console.warn(`Can't go to invalid position ${nextPosition}`);\n            return;\n        }\n        if (!Number.isInteger(nextPosition)) {\n            const normalizedPosition = Math.trunc(nextPosition);\n            console.warn(`Can't go to non-integer position ${nextPosition}. Using ${normalizedPosition} instead.`);\n            nextPosition = normalizedPosition;\n        }\n        const shouldArchive = !this.autoArchive && !!this.tempPatches.patches.length;\n        if (shouldArchive) {\n            this.archive();\n        }\n        const _allPatches = this.getAllPatches();\n        const back = nextPosition < this.position;\n        if (nextPosition > _allPatches.patches.length) {\n            console.warn(`Can't go forward to position ${nextPosition}`);\n            nextPosition = _allPatches.patches.length;\n        }\n        if (nextPosition < 0) {\n            console.warn(`Can't go back to position ${nextPosition}`);\n            nextPosition = 0;\n        }\n        if (nextPosition === this.position)\n            return;\n        const inversePatchesForNavigation = shouldArchive && _allPatches.inversePatches.length > 0\n            ? _allPatches.inversePatches.map((patch, index, allPatches) => index === allPatches.length - 1 ? [...patch].reverse() : patch)\n            : _allPatches.inversePatches;\n        const patchesToApply = back\n            ? inversePatchesForNavigation\n                .slice(-this.maxHistory)\n                .slice(nextPosition, this.position)\n                .flat()\n                .reverse()\n            : _allPatches.patches\n                .slice(-this.maxHistory)\n                .slice(this.position, nextPosition)\n                .flat();\n        // Can only use mutable mode if:\n        // 1. mutable mode is enabled\n        // 2. current state is an object\n        // 3. patches don't contain root-level replacements (which change the entire state)\n        const canGoMutably = this.mutable &&\n            isObjectLike(this.state) &&\n            !this.hasRootReplacement(patchesToApply);\n        if (canGoMutably) {\n            // For observable state: mutate in place\n            apply(this.state, patchesToApply, { mutable: true });\n        }\n        else {\n            // For immutable state or primitive types: create new state\n            this.state = apply(this.state, patchesToApply);\n        }\n        this.position = nextPosition;\n        this.invalidateHistoryCache();\n        this.emitChange('go');\n    }\n    /**\n     * Go back in the history\n     */\n    back(amount = 1) {\n        this.go(this.position - amount);\n    }\n    /**\n     * Go forward in the history\n     */\n    forward(amount = 1) {\n        this.go(this.position + amount);\n    }\n    /**\n     * Reset to the initial state\n     */\n    reset() {\n        const canResetMutably = this.mutable &&\n            isObjectLike(this.state) &&\n            isObjectLike(this.initialState);\n        if (canResetMutably) {\n            // For observable state: use patch system to reset to initial state\n            // Generate patches from current state to initial state\n            const [, patches] = create(this.state, (draft) => {\n                // Clear all properties\n                for (const key of Object.keys(draft)) {\n                    delete draft[key];\n                }\n                // Deep copy all properties from initialState\n                deepClone(this.initialState, draft);\n                if (Array.isArray(draft) && Array.isArray(this.initialState)) {\n                    draft.length = this.initialState.length;\n                }\n            }, this.options);\n            apply(this.state, patches, { mutable: true });\n        }\n        else {\n            // For immutable state: restore from a snapshot clone.\n            this.state = cloneInitialSnapshot(this.initialState);\n        }\n        this.position = this.initialPosition;\n        this.allPatches = cloneTravelPatches(this.initialPatches);\n        this.allMetadata = this.initialMetadata\n            ? cloneTravelMetadataList(this.initialMetadata)\n            : [];\n        this.tempPatches = cloneTravelPatches();\n        this.tempMetadata = undefined;\n        this.invalidateHistoryCache();\n        this.emitChange('reset');\n    }\n    /**\n     * Remove all history and make the current state (including any unarchived temp patches) as the new initial state.\n     *\n     * This is a destructive operation that discards all history and overwrites\n     * the internal baseline. Future `reset()` calls will return to this snapshot.\n     */\n    rebase() {\n        this.initialState = cloneInitialSnapshot(this.state);\n        this.initialPosition = 0;\n        this.initialPatches = undefined;\n        this.initialMetadata = undefined;\n        this.position = 0;\n        this.allPatches = cloneTravelPatches();\n        this.allMetadata = [];\n        this.tempPatches = cloneTravelPatches();\n        this.tempMetadata = undefined;\n        this.invalidateHistoryCache();\n        this.emitChange('rebase');\n    }\n    /**\n     * Check if it's possible to go back\n     */\n    canBack() {\n        return this.position > 0;\n    }\n    /**\n     * Check if it's possible to go forward\n     */\n    canForward() {\n        const shouldArchive = !this.autoArchive && !!this.tempPatches.patches.length;\n        const _allPatches = this.getAllPatches();\n        // Temporary patches represent the current state, not a future state\n        return shouldArchive\n            ? this.position < _allPatches.patches.length - 1\n            : this.position < _allPatches.patches.length;\n    }\n    /**\n     * Check if it's possible to archive the current state\n     */\n    canArchive() {\n        return !this.autoArchive && !!this.tempPatches.patches.length;\n    }\n    /**\n     * Get the current position in the history\n     */\n    getPosition() {\n        return this.position;\n    }\n    /**\n     * Get the patches history\n     */\n    getPatches() {\n        const shouldArchive = !this.autoArchive && !!this.tempPatches.patches.length;\n        const patchSource = shouldArchive ? this.getAllPatches() : this.allPatches;\n        return cloneTravelPatches(patchSource);\n    }\n    /**\n     * Serialize the current state, patch history, and position for persistence.\n     */\n    serialize() {\n        return {\n            version: TRAVELS_HISTORY_SCHEMA_VERSION,\n            state: cloneInitialSnapshot(this.state),\n            patches: this.getPatches(),\n            position: this.getPosition(),\n            metadata: this.getMetadata(),\n        };\n    }\n    getMetadata() {\n        const metadata = alignMetadataToPatchCount(this.allMetadata, this.allPatches.patches.length);\n        if (!this.autoArchive && this.tempPatches.patches.length) {\n            metadata.push(cloneTravelMetadata(this.tempMetadata));\n        }\n        return metadata;\n    }\n    getHistoryEntries() {\n        return this.toEntries(this.getPatches(), this.getMetadata());\n    }\n    /**\n     * Get the controls object\n     */\n    getControls() {\n        if (this.controlsCache) {\n            return this.controlsCache;\n        }\n        const self = this;\n        const controls = {\n            get position() {\n                return self.getPosition();\n            },\n            getHistory: () => self.getHistory(),\n            get patches() {\n                return self.getPatches();\n            },\n            back: (amount) => self.back(amount),\n            forward: (amount) => self.forward(amount),\n            reset: () => self.reset(),\n            go: (position) => self.go(position),\n            canBack: () => self.canBack(),\n            canForward: () => self.canForward(),\n            rebase: () => self.rebase(),\n        };\n        if (!this.autoArchive) {\n            controls.archive =\n                (metadata) => self.archive(metadata);\n            controls.canArchive =\n                () => self.canArchive();\n        }\n        if (process.env.NODE_ENV !== 'production') {\n            Object.freeze(controls);\n        }\n        this.controlsCache = controls;\n        return controls;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90cmF2ZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBSUwsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1AsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBZ0JsQixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDhCQUE4QixHQUMvQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBMEJ0RCxNQUFNLGtCQUFrQixHQUFHLENBQUksS0FBUSxFQUFpQixFQUFFO0lBQ3hELElBQUksT0FBUSxVQUFrQixDQUFDLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUM5RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBUSxVQUFrQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQU0sQ0FBQztJQUN6RCxDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBVSxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQWUsRUFBTyxFQUFFO0lBQzVFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVE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RSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDNUMsTUFBTSxFQUFFLEdBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7U0FDbEMsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsUUFBb0QsQ0FBQyxPQUFPO2dCQUMzRCxDQUFDLFFBQXlCLEVBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0QsUUFBb0QsQ0FBQyxVQUFVO2dCQUM5RCxHQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFFOUIsT0FBTyxRQUVvQyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgT3B0aW9ucyBhcyBNdXRhdGl2ZU9wdGlvbnMsXG4gIHR5cGUgUGF0Y2hlcyxcbiAgdHlwZSBEcmFmdCxcbiAgYXBwbHksXG4gIGNyZWF0ZSxcbiAgaXNEcmFmdCxcbiAgcmF3UmV0dXJuLFxufSBmcm9tICdtdXRhdGl2ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhdGNoZXNPcHRpb24sXG4gIFJlYmFzYWJsZU1hbnVhbFRyYXZlbHNDb250cm9scyxcbiAgUmViYXNhYmxlVHJhdmVsc0NvbnRyb2xzLFxuICBUcmF2ZWxIaXN0b3J5RW50cnksXG4gIFRyYXZlbE1ldGFkYXRhLFxuICBUcmF2ZWxQYXRjaGVzLFxuICBUcmF2ZWxzQnJhbmNoRGlzY2FyZEV2ZW50LFxuICBUcmF2ZWxzRGVzZXJpYWxpemVPcHRpb25zLFxuICBUcmF2ZWxzRGV2dG9vbHNFdmVudCxcbiAgVHJhdmVsc09wdGlvbnMsXG4gIFRyYXZlbHNTZXJpYWxpemVkSGlzdG9yeSxcbiAgVXBkYXRlcixcbiAgVmFsdWUsXG59IGZyb20gJy4vdHlwZSc7XG5pbXBvcnQge1xuICBkZXNlcmlhbGl6ZVRyYXZlbHNIaXN0b3J5LFxuICBUUkFWRUxTX0hJU1RPUllfU0NIRU1BX1ZFUlNJT04sXG59IGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgZmluZFN0YXRlQ29tcGF0aWJpbGl0eUlzc3VlcyB9IGZyb20gJy4vY29tcGF0aWJpbGl0eSc7XG5pbXBvcnQgeyBUcmF2ZWxzRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBpc09iamVjdExpa2UsIGlzUGxhaW5PYmplY3QgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBMaXN0ZW5lciBjYWxsYmFjayBmb3Igc3RhdGUgY2hhbmdlc1xuICovXG50eXBlIExpc3RlbmVyPFMsIFAgZXh0ZW5kcyBQYXRjaGVzT3B0aW9uID0ge30+ID0gKFxuICBzdGF0ZTogUyxcbiAgcGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPixcbiAgcG9zaXRpb246IG51bWJlclxuKSA9PiB2b2lkO1xuXG50eXBlIFRyYW5zYWN0aW9uU25hcHNob3Q8UywgUCBleHRlbmRzIFBhdGNoZXNPcHRpb24gPSB7fT4gPSB7XG4gIHN0YXRlOiBTO1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICBhbGxQYXRjaGVzOiBUcmF2ZWxQYXRjaGVzPFA+O1xuICBhbGxNZXRhZGF0YTogQXJyYXk8VHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWQ+O1xuICB0ZW1wUGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPjtcbiAgdGVtcE1ldGFkYXRhPzogVHJhdmVsTWV0YWRhdGE7XG4gIGluaXRpYWxTdGF0ZTogUztcbiAgaW5pdGlhbFBvc2l0aW9uOiBudW1iZXI7XG4gIGluaXRpYWxQYXRjaGVzPzogVHJhdmVsUGF0Y2hlczxQPjtcbiAgaW5pdGlhbE1ldGFkYXRhPzogQXJyYXk8VHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWQ+O1xuICBwZW5kaW5nU3RhdGU6IFMgfCBudWxsO1xuICBwZW5kaW5nU3RhdGVWZXJzaW9uOiBudW1iZXI7XG59O1xuXG5jb25zdCB0cnlTdHJ1Y3R1cmVkQ2xvbmUgPSA8VD4odmFsdWU6IFQpOiBUIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgYXMgVDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcblxuY29uc3QgZGVlcENsb25lVmFsdWUgPSAodmFsdWU6IGFueSwgc2VlbiA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYW55PigpKTogYW55ID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHNlZW4uZ2V0KHZhbHVlKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGNsb25lZDogYW55W10gPSBuZXcgQXJyYXkodmFsdWUubGVuZ3RoKTtcbiAgICBzZWVuLnNldCh2YWx1ZSwgY2xvbmVkKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGkpKSB7XG4gICAgICAgIGNsb25lZFtpXSA9IGRlZXBDbG9uZVZhbHVlKHZhbHVlW2ldLCBzZWVuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgY2xvbmVkID0gbmV3IE1hcCgpO1xuICAgIHNlZW4uc2V0KHZhbHVlLCBjbG9uZWQpO1xuICAgIHZhbHVlLmZvckVhY2goKGVudHJ5VmFsdWUsIGVudHJ5S2V5KSA9PiB7XG4gICAgICBjbG9uZWQuc2V0KFxuICAgICAgICBkZWVwQ2xvbmVWYWx1ZShlbnRyeUtleSwgc2VlbiksXG4gICAgICAgIGRlZXBDbG9uZVZhbHVlKGVudHJ5VmFsdWUsIHNlZW4pXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBjbG9uZWQgPSBuZXcgU2V0KCk7XG4gICAgc2Vlbi5zZXQodmFsdWUsIGNsb25lZCk7XG4gICAgdmFsdWUuZm9yRWFjaCgoZW50cnlWYWx1ZSkgPT4ge1xuICAgICAgY2xvbmVkLmFkZChkZWVwQ2xvbmVWYWx1ZShlbnRyeVZhbHVlLCBzZWVuKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBjbG9uZWQgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpO1xuICAgIHNlZW4uc2V0KHZhbHVlLCBjbG9uZWQpO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBjb25zdCBzdHJ1Y3R1cmVkQ2xvbmVWYWx1ZSA9IHRyeVN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIGlmIChzdHJ1Y3R1cmVkQ2xvbmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2Vlbi5zZXQodmFsdWUsIHN0cnVjdHVyZWRDbG9uZVZhbHVlKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lVmFsdWU7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBjbG9uZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgc2Vlbi5zZXQodmFsdWUsIGNsb25lZCk7XG4gIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgY2xvbmVkW2tleV0gPSBkZWVwQ2xvbmVWYWx1ZSh2YWx1ZVtrZXldLCBzZWVuKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xvbmVkO1xufTtcblxuY29uc3QgY2xvbmVUcmF2ZWxQYXRjaGVzID0gPFAgZXh0ZW5kcyBQYXRjaGVzT3B0aW9uID0ge30+KFxuICBiYXNlPzogVHJhdmVsUGF0Y2hlczxQPlxuKTogVHJhdmVsUGF0Y2hlczxQPiA9PiAoe1xuICBwYXRjaGVzOiBiYXNlXG4gICAgPyBiYXNlLnBhdGNoZXMubWFwKChwYXRjaCkgPT5cbiAgICAgICAgcGF0Y2gubWFwKChvcGVyYXRpb24pID0+IGRlZXBDbG9uZVZhbHVlKG9wZXJhdGlvbikpXG4gICAgICApXG4gICAgOiBbXSxcbiAgaW52ZXJzZVBhdGNoZXM6IGJhc2VcbiAgICA/IGJhc2UuaW52ZXJzZVBhdGNoZXMubWFwKChwYXRjaCkgPT5cbiAgICAgICAgcGF0Y2gubWFwKChvcGVyYXRpb24pID0+IGRlZXBDbG9uZVZhbHVlKG9wZXJhdGlvbikpXG4gICAgICApXG4gICAgOiBbXSxcbn0pO1xuXG5jb25zdCBjbG9uZVRyYXZlbE1ldGFkYXRhID0gKFxuICBtZXRhZGF0YTogVHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWRcbik6IFRyYXZlbE1ldGFkYXRhIHwgdW5kZWZpbmVkID0+XG4gIG1ldGFkYXRhID8gKGRlZXBDbG9uZVZhbHVlKG1ldGFkYXRhKSBhcyBUcmF2ZWxNZXRhZGF0YSkgOiB1bmRlZmluZWQ7XG5cbmNvbnN0IGNsb25lVHJhdmVsTWV0YWRhdGFMaXN0ID0gKFxuICBtZXRhZGF0YTogQXJyYXk8VHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWQ+XG4pOiBBcnJheTxUcmF2ZWxNZXRhZGF0YSB8IHVuZGVmaW5lZD4gPT4gbWV0YWRhdGEubWFwKGNsb25lVHJhdmVsTWV0YWRhdGEpO1xuXG5jb25zdCBhbGlnbk1ldGFkYXRhVG9QYXRjaENvdW50ID0gKFxuICBtZXRhZGF0YTogQXJyYXk8VHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuICBjb3VudDogbnVtYmVyXG4pOiBBcnJheTxUcmF2ZWxNZXRhZGF0YSB8IHVuZGVmaW5lZD4gPT5cbiAgQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGluZGV4KSA9PlxuICAgIGNsb25lVHJhdmVsTWV0YWRhdGEobWV0YWRhdGE/LltpbmRleF0pXG4gICk7XG5cbmNvbnN0IGRlZXBDbG9uZSA9IDxUPihzb3VyY2U6IFQsIHRhcmdldD86IGFueSk6IFQgPT4ge1xuICBpZiAodGFyZ2V0ICYmIHNvdXJjZSAmJiB0eXBlb2Ygc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSBhcyBhbnkpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gZGVlcENsb25lVmFsdWUoKHNvdXJjZSBhcyBhbnkpW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIGRlZXBDbG9uZVZhbHVlKHNvdXJjZSk7XG59O1xuXG5jb25zdCBjbG9uZUluaXRpYWxTbmFwc2hvdCA9IDxUPih2YWx1ZTogVCk6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN0cnVjdHVyZWRDbG9uZVZhbHVlID0gdHJ5U3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgaWYgKHN0cnVjdHVyZWRDbG9uZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lVmFsdWU7XG4gIH1cblxuICByZXR1cm4gZGVlcENsb25lKHZhbHVlKTtcbn07XG5cbmNvbnN0IGNvbnRhaW5zRHJhZnQgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuICBzZWVuID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpc0RyYWZ0KHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qgb2JqZWN0VmFsdWUgPSB2YWx1ZSBhcyBvYmplY3Q7XG4gIGlmIChzZWVuLmhhcyhvYmplY3RWYWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc2Vlbi5hZGQob2JqZWN0VmFsdWUpO1xuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgaXRlbV0gb2YgdmFsdWUpIHtcbiAgICAgIGlmIChjb250YWluc0RyYWZ0KGtleSwgc2VlbikgfHwgY29udGFpbnNEcmFmdChpdGVtLCBzZWVuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICBpZiAoY29udGFpbnNEcmFmdChpdGVtLCBzZWVuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKG9iamVjdFZhbHVlKSkge1xuICAgIGlmIChjb250YWluc0RyYWZ0KChvYmplY3RWYWx1ZSBhcyBhbnkpW2tleV0sIHNlZW4pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBoYXNPbmx5QXJyYXlJbmRpY2VzID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgYW55W10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyh2YWx1ZSk7XG4gIGNvbnN0IGhhc09ubHlJbmRpY2VzID0ga2V5cy5ldmVyeSgoa2V5KSA9PiB7XG4gICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKGtleSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoaW5kZXgpICYmIGluZGV4ID49IDAgJiYgU3RyaW5nKGluZGV4KSA9PT0ga2V5O1xuICB9KTtcblxuICBpZiAoIWhhc09ubHlJbmRpY2VzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gU3BhcnNlIGFycmF5cyBjYW5ub3QgYmUgc2FmZWx5IHN5bmNocm9uaXplZCB3aXRoIGluLXBsYWNlIHBhdGNoZXMuXG4gIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSB2YWx1ZS5sZW5ndGg7XG59O1xuXG5jb25zdCBpc1BhdGNoSGlzdG9yeUVudHJpZXMgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW11bXSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoZW50cnkpID0+IEFycmF5LmlzQXJyYXkoZW50cnkpKTtcbn07XG5cbmNvbnN0IGdldEluaXRpYWxQYXRjaGVzVmFsaWRhdGlvbkVycm9yID0gPFAgZXh0ZW5kcyBQYXRjaGVzT3B0aW9uID0ge30+KFxuICBpbml0aWFsUGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPiB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGlmICghaW5pdGlhbFBhdGNoZXMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChcbiAgICAhaXNQYXRjaEhpc3RvcnlFbnRyaWVzKGluaXRpYWxQYXRjaGVzLnBhdGNoZXMpIHx8XG4gICAgIWlzUGF0Y2hIaXN0b3J5RW50cmllcyhpbml0aWFsUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcylcbiAgKSB7XG4gICAgcmV0dXJuIGBpbml0aWFsUGF0Y2hlcyBtdXN0IGhhdmUgJ3BhdGNoZXMnIGFuZCAnaW52ZXJzZVBhdGNoZXMnIGFycmF5c2A7XG4gIH1cblxuICBpZiAoaW5pdGlhbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggIT09IGluaXRpYWxQYXRjaGVzLmludmVyc2VQYXRjaGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBgaW5pdGlhbFBhdGNoZXMucGF0Y2hlcyBhbmQgaW5pdGlhbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aGA7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8vIEFsaWduIG11dGFibGUgdmFsdWUgdXBkYXRlcyB3aXRoIGltbXV0YWJsZSByZXBsYWNlbWVudHMgYnkgc3luY2luZyBvYmplY3RzXG5jb25zdCBvdmVyd3JpdGVEcmFmdFdpdGggPSAoZHJhZnQ6IERyYWZ0PGFueT4sIHZhbHVlOiBhbnkpOiB2b2lkID0+IHtcbiAgY29uc3QgZHJhZnRJc0FycmF5ID0gQXJyYXkuaXNBcnJheShkcmFmdCk7XG4gIGNvbnN0IHZhbHVlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuXG4gIGNvbnN0IGRyYWZ0S2V5cyA9IFJlZmxlY3Qub3duS2V5cyhkcmFmdCBhcyBvYmplY3QpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkcmFmdEtleXMpIHtcbiAgICBpZiAoZHJhZnRJc0FycmF5ICYmIGtleSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICBkZWxldGUgKGRyYWZ0IGFzIGFueSlba2V5IGFzIGFueV07XG4gICAgfVxuICB9XG5cbiAgaWYgKGRyYWZ0SXNBcnJheSAmJiB2YWx1ZUlzQXJyYXkpIHtcbiAgICAoZHJhZnQgYXMgYW55W10pLmxlbmd0aCA9ICh2YWx1ZSBhcyBhbnlbXSkubGVuZ3RoO1xuICB9XG5cbiAgT2JqZWN0LmFzc2lnbihkcmFmdCBhcyBvYmplY3QsIHZhbHVlKTtcbn07XG5cbi8qKlxuICogQ29yZSBUcmF2ZWxzIGNsYXNzIGZvciBtYW5hZ2luZyB1bmRvL3JlZG8gaGlzdG9yeVxuICovXG5leHBvcnQgY2xhc3MgVHJhdmVsczxcbiAgUyxcbiAgRiBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgQSBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuICBQIGV4dGVuZHMgUGF0Y2hlc09wdGlvbiA9IHt9LFxuPiB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIGEgcGVyc2lzdGVkIFRyYXZlbHMgaGlzdG9yeSBzbmFwc2hvdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemU8UywgUCBleHRlbmRzIFBhdGNoZXNPcHRpb24gPSB7fT4oXG4gICAgc25hcHNob3Q6IHVua25vd24sXG4gICAgb3B0aW9ucz86IFRyYXZlbHNEZXNlcmlhbGl6ZU9wdGlvbnM8UywgUD5cbiAgKTogVHJhdmVsc1NlcmlhbGl6ZWRIaXN0b3J5PFMsIFA+IHtcbiAgICByZXR1cm4gZGVzZXJpYWxpemVUcmF2ZWxzSGlzdG9yeShzbmFwc2hvdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtdXRhYmxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBtdXRhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHN0YXRlOiBTO1xuICBwcml2YXRlIHBvc2l0aW9uOiBudW1iZXI7XG4gIHByaXZhdGUgYWxsUGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPjtcbiAgcHJpdmF0ZSBhbGxNZXRhZGF0YTogQXJyYXk8VHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWQ+O1xuICBwcml2YXRlIHRlbXBQYXRjaGVzOiBUcmF2ZWxQYXRjaGVzPFA+O1xuICBwcml2YXRlIHRlbXBNZXRhZGF0YT86IFRyYXZlbE1ldGFkYXRhO1xuICBwcml2YXRlIG1heEhpc3Rvcnk6IG51bWJlcjtcbiAgcHJpdmF0ZSBpbml0aWFsU3RhdGU6IFM7XG4gIHByaXZhdGUgaW5pdGlhbFBvc2l0aW9uOiBudW1iZXI7XG4gIHByaXZhdGUgaW5pdGlhbFBhdGNoZXM/OiBUcmF2ZWxQYXRjaGVzPFA+O1xuICBwcml2YXRlIGluaXRpYWxNZXRhZGF0YT86IEFycmF5PFRyYXZlbE1ldGFkYXRhIHwgdW5kZWZpbmVkPjtcbiAgcHJpdmF0ZSBhdXRvQXJjaGl2ZTogQTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBNdXRhdGl2ZU9wdGlvbnM8UGF0Y2hlc09wdGlvbiB8IHRydWUsIEY+O1xuICBwcml2YXRlIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBwcml2YXRlIG9uQnJhbmNoRGlzY2FyZD86IChldmVudDogVHJhdmVsc0JyYW5jaERpc2NhcmRFdmVudDxQPikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkZXZ0b29scz86IChldmVudDogVHJhdmVsc0RldnRvb2xzRXZlbnQ8UywgUD4pID0+IHZvaWQ7XG4gIHByaXZhdGUgbGlzdGVuZXJzOiBTZXQ8TGlzdGVuZXI8UywgUD4+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHBlbmRpbmdTdGF0ZTogUyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdTdGF0ZVZlcnNpb24gPSAwO1xuICBwcml2YXRlIGNvbnRyb2xzQ2FjaGU6XG4gICAgfCBSZWJhc2FibGVUcmF2ZWxzQ29udHJvbHM8UywgRiwgUD5cbiAgICB8IFJlYmFzYWJsZU1hbnVhbFRyYXZlbHNDb250cm9sczxTLCBGLCBQPlxuICAgIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGlzdG9yeUNhY2hlOiB7IHZlcnNpb246IG51bWJlcjsgaGlzdG9yeTogU1tdIH0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBoaXN0b3J5VmVyc2lvbiA9IDA7XG4gIHByaXZhdGUgbXV0YWJsZUZhbGxiYWNrV2FybmVkID0gZmFsc2U7XG4gIHByaXZhdGUgbXV0YWJsZVJvb3RSZXBsYWNlV2FybmVkID0gZmFsc2U7XG4gIHByaXZhdGUgd2Fybk9uVW5zdXBwb3J0ZWRTdGF0ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzdGF0ZUNvbXBhdGliaWxpdHlXYXJuaW5nS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHRyYWNraW5nUGF1c2VEZXB0aCA9IDA7XG4gIHByaXZhdGUgdHJhbnNhY3Rpb25EZXB0aCA9IDA7XG4gIHByaXZhdGUgdHJhbnNhY3Rpb25NZXRhZGF0YT86IFRyYXZlbE1ldGFkYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxTdGF0ZTogUywgb3B0aW9uczogVHJhdmVsc09wdGlvbnM8RiwgQSwgUD4gPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1heEhpc3RvcnkgPSAxMCxcbiAgICAgIGhpc3RvcnksXG4gICAgICBpbml0aWFsUGF0Y2hlczogaW5wdXRJbml0aWFsUGF0Y2hlcyxcbiAgICAgIGluaXRpYWxQb3NpdGlvbjogaW5wdXRJbml0aWFsUG9zaXRpb24gPSAwLFxuICAgICAgc3RyaWN0SW5pdGlhbFBhdGNoZXMgPSBmYWxzZSxcbiAgICAgIGF1dG9BcmNoaXZlID0gdHJ1ZSBhcyBBLFxuICAgICAgbXV0YWJsZSA9IGZhbHNlLFxuICAgICAgd2Fybk9uVW5zdXBwb3J0ZWRTdGF0ZSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG4gICAgICBvbkVycm9yLFxuICAgICAgb25CcmFuY2hEaXNjYXJkLFxuICAgICAgZGV2dG9vbHMsXG4gICAgICBwYXRjaGVzT3B0aW9ucyxcbiAgICAgIC4uLm11dGF0aXZlT3B0aW9uc1xuICAgIH0gPSBvcHRpb25zO1xuICAgIGxldCBpbml0aWFsUGF0Y2hlcyA9IGhpc3Rvcnk/LnBhdGNoZXMgPz8gaW5wdXRJbml0aWFsUGF0Y2hlcztcbiAgICBsZXQgaW5pdGlhbFBvc2l0aW9uID0gaGlzdG9yeT8ucG9zaXRpb24gPz8gaW5wdXRJbml0aWFsUG9zaXRpb247XG5cbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICBoaXN0b3J5ICYmXG4gICAgICAoaW5wdXRJbml0aWFsUGF0Y2hlcyB8fCBpbnB1dEluaXRpYWxQb3NpdGlvbiAhPT0gMClcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1RyYXZlbHM6IGhpc3Rvcnkgb3ZlcnJpZGVzIGluaXRpYWxQYXRjaGVzIGFuZCBpbml0aWFsUG9zaXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgZW5mb3JjZSBtYXhIaXN0b3J5IGNvbnN0cmFpbnRzXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG1heEhpc3RvcnkgIT09ICdudW1iZXInIHx8XG4gICAgICAhTnVtYmVyLmlzRmluaXRlKG1heEhpc3RvcnkpIHx8XG4gICAgICAhTnVtYmVyLmlzSW50ZWdlcihtYXhIaXN0b3J5KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhdmVsczogbWF4SGlzdG9yeSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGJ1dCBnb3QgJHttYXhIaXN0b3J5fWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1heEhpc3RvcnkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmF2ZWxzOiBtYXhIaXN0b3J5IG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBidXQgZ290ICR7bWF4SGlzdG9yeX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtYXhIaXN0b3J5ID09PSAwICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1RyYXZlbHM6IG1heEhpc3RvcnkgaXMgMCwgd2hpY2ggZGlzYWJsZXMgdW5kby9yZWRvIGhpc3RvcnkuIFRoaXMgaXMgcmFyZWx5IGludGVuZGVkLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFBhdGNoZXNWYWxpZGF0aW9uRXJyb3IgPVxuICAgICAgZ2V0SW5pdGlhbFBhdGNoZXNWYWxpZGF0aW9uRXJyb3IoaW5pdGlhbFBhdGNoZXMpO1xuXG4gICAgaWYgKGluaXRpYWxQYXRjaGVzVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICBpZiAoc3RyaWN0SW5pdGlhbFBhdGNoZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmF2ZWxzOiAke2luaXRpYWxQYXRjaGVzVmFsaWRhdGlvbkVycm9yfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFRyYXZlbHM6ICR7aW5pdGlhbFBhdGNoZXNWYWxpZGF0aW9uRXJyb3J9LiBGYWxsaW5nIGJhY2sgdG8gZW1wdHkgaGlzdG9yeS4gYCArXG4gICAgICAgICAgICBgU2V0IHN0cmljdEluaXRpYWxQYXRjaGVzOiB0cnVlIHRvIHRocm93IGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpbml0aWFsUGF0Y2hlcyA9IHVuZGVmaW5lZDtcbiAgICAgIGluaXRpYWxQb3NpdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAvLyBGb3IgbXV0YWJsZSBtb2RlLCBkZWVwIGNsb25lIGluaXRpYWxTdGF0ZSB0byBwcmV2ZW50IG11dGF0aW9uc1xuICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gY2xvbmVJbml0aWFsU25hcHNob3QoaW5pdGlhbFN0YXRlKTtcbiAgICB0aGlzLm1heEhpc3RvcnkgPSBtYXhIaXN0b3J5O1xuICAgIHRoaXMuYXV0b0FyY2hpdmUgPSBhdXRvQXJjaGl2ZTtcbiAgICB0aGlzLm11dGFibGUgPSBtdXRhYmxlO1xuICAgIHRoaXMud2Fybk9uVW5zdXBwb3J0ZWRTdGF0ZSA9IHdhcm5PblVuc3VwcG9ydGVkU3RhdGU7XG4gICAgdGhpcy5vbkVycm9yID0gb25FcnJvcjtcbiAgICB0aGlzLm9uQnJhbmNoRGlzY2FyZCA9IG9uQnJhbmNoRGlzY2FyZDtcbiAgICB0aGlzLmRldnRvb2xzID0gZGV2dG9vbHMgYXMgKChldmVudDogVHJhdmVsc0RldnRvb2xzRXZlbnQ8UywgUD4pID0+IHZvaWQpXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5tdXRhdGl2ZU9wdGlvbnMsXG4gICAgICBlbmFibGVQYXRjaGVzOiBwYXRjaGVzT3B0aW9ucyA/PyB0cnVlLFxuICAgIH07XG5cbiAgICB0aGlzLndhcm5BYm91dFN0YXRlQ29tcGF0aWJpbGl0eShpbml0aWFsU3RhdGUpO1xuXG4gICAgY29uc3Qge1xuICAgICAgcGF0Y2hlczogbm9ybWFsaXplZFBhdGNoZXMsXG4gICAgICBwb3NpdGlvbjogbm9ybWFsaXplZFBvc2l0aW9uLFxuICAgICAgbWV0YWRhdGE6IG5vcm1hbGl6ZWRNZXRhZGF0YSxcbiAgICB9ID0gdGhpcy5ub3JtYWxpemVJbml0aWFsSGlzdG9yeShcbiAgICAgIGluaXRpYWxQYXRjaGVzLFxuICAgICAgaW5pdGlhbFBvc2l0aW9uLFxuICAgICAgaGlzdG9yeT8ubWV0YWRhdGFcbiAgICApO1xuXG4gICAgdGhpcy5hbGxQYXRjaGVzID0gbm9ybWFsaXplZFBhdGNoZXM7XG4gICAgdGhpcy5hbGxNZXRhZGF0YSA9IG5vcm1hbGl6ZWRNZXRhZGF0YTtcbiAgICB0aGlzLmluaXRpYWxQYXRjaGVzID0gaW5pdGlhbFBhdGNoZXNcbiAgICAgID8gY2xvbmVUcmF2ZWxQYXRjaGVzKG5vcm1hbGl6ZWRQYXRjaGVzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbml0aWFsTWV0YWRhdGEgPSBoaXN0b3J5Py5tZXRhZGF0YVxuICAgICAgPyBub3JtYWxpemVkTWV0YWRhdGEuc2xpY2UoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5wb3NpdGlvbiA9IG5vcm1hbGl6ZWRQb3NpdGlvbjtcbiAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IG5vcm1hbGl6ZWRQb3NpdGlvbjtcblxuICAgIHRoaXMudGVtcFBhdGNoZXMgPSBjbG9uZVRyYXZlbFBhdGNoZXMoKTtcbiAgICB0aGlzLnRlbXBNZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgd2FybkFib3V0U3RhdGVDb21wYXRpYmlsaXR5KHN0YXRlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMud2Fybk9uVW5zdXBwb3J0ZWRTdGF0ZSB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzc3VlcyA9IGZpbmRTdGF0ZUNvbXBhdGliaWxpdHlJc3N1ZXMoc3RhdGUsIHtcbiAgICAgIG11dGFibGU6IHRoaXMubXV0YWJsZSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgaXNzdWUgb2YgaXNzdWVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtpc3N1ZS5jb2RlfToke2lzc3VlLnBhdGh9YDtcbiAgICAgIGlmICh0aGlzLnN0YXRlQ29tcGF0aWJpbGl0eVdhcm5pbmdLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlQ29tcGF0aWJpbGl0eVdhcm5pbmdLZXlzLmFkZChrZXkpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVHJhdmVscyBzdGF0ZSBjb21wYXRpYmlsaXR5IHdhcm5pbmcgYXQgJHtpc3N1ZS5wYXRofTogJHtpc3N1ZS5tZXNzYWdlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVJbml0aWFsSGlzdG9yeShcbiAgICBpbml0aWFsUGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPiB8IHVuZGVmaW5lZCxcbiAgICBpbml0aWFsUG9zaXRpb246IG51bWJlcixcbiAgICBtZXRhZGF0YT86IEFycmF5PFRyYXZlbE1ldGFkYXRhIHwgdW5kZWZpbmVkPlxuICApOiB7XG4gICAgcGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPjtcbiAgICBwb3NpdGlvbjogbnVtYmVyO1xuICAgIG1ldGFkYXRhOiBBcnJheTxUcmF2ZWxNZXRhZGF0YSB8IHVuZGVmaW5lZD47XG4gIH0ge1xuICAgIGNvbnN0IGNsb25lZCA9IGNsb25lVHJhdmVsUGF0Y2hlcyhpbml0aWFsUGF0Y2hlcyk7XG4gICAgY29uc3QgdG90YWwgPSBjbG9uZWQucGF0Y2hlcy5sZW5ndGg7XG4gICAgY29uc3QgYWxpZ25lZE1ldGFkYXRhID0gYWxpZ25NZXRhZGF0YVRvUGF0Y2hDb3VudChtZXRhZGF0YSwgdG90YWwpO1xuICAgIGNvbnN0IGhpc3RvcnlMaW1pdCA9IHRoaXMubWF4SGlzdG9yeSA+IDAgPyB0aGlzLm1heEhpc3RvcnkgOiAwO1xuICAgIGNvbnN0IGludmFsaWRJbml0aWFsUG9zaXRpb24gPVxuICAgICAgdHlwZW9mIGluaXRpYWxQb3NpdGlvbiAhPT0gJ251bWJlcicgfHxcbiAgICAgICFOdW1iZXIuaXNGaW5pdGUoaW5pdGlhbFBvc2l0aW9uKSB8fFxuICAgICAgIU51bWJlci5pc0ludGVnZXIoaW5pdGlhbFBvc2l0aW9uKTtcbiAgICBsZXQgcG9zaXRpb24gPSBpbnZhbGlkSW5pdGlhbFBvc2l0aW9uID8gMCA6IChpbml0aWFsUG9zaXRpb24gYXMgbnVtYmVyKTtcbiAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwb3NpdGlvbiwgdG90YWwpKTtcblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgIChpbnZhbGlkSW5pdGlhbFBvc2l0aW9uIHx8IGNsYW1wZWRQb3NpdGlvbiAhPT0gcG9zaXRpb24pXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBUcmF2ZWxzOiBpbml0aWFsUG9zaXRpb24gKCR7aW5pdGlhbFBvc2l0aW9ufSkgaXMgaW52YWxpZCBmb3IgYXZhaWxhYmxlIHBhdGNoZXMgKCR7dG90YWx9KS4gYCArXG4gICAgICAgICAgYFVzaW5nICR7Y2xhbXBlZFBvc2l0aW9ufSBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcG9zaXRpb24gPSBjbGFtcGVkUG9zaXRpb247XG5cbiAgICBpZiAodG90YWwgPT09IDApIHtcbiAgICAgIHJldHVybiB7IHBhdGNoZXM6IGNsb25lZCwgcG9zaXRpb246IDAsIG1ldGFkYXRhOiBbXSB9O1xuICAgIH1cblxuICAgIGlmIChoaXN0b3J5TGltaXQgPT09IDApIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgVHJhdmVsczogbWF4SGlzdG9yeSAoJHt0aGlzLm1heEhpc3Rvcnl9KSBkaXNjYXJkcyBwZXJzaXN0ZWQgaGlzdG9yeS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHBhdGNoZXM6IGNsb25lVHJhdmVsUGF0Y2hlcygpLCBwb3NpdGlvbjogMCwgbWV0YWRhdGE6IFtdIH07XG4gICAgfVxuXG4gICAgaWYgKGhpc3RvcnlMaW1pdCA+PSB0b3RhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0Y2hlczogY2xvbmVkLFxuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgbWV0YWRhdGE6IGFsaWduZWRNZXRhZGF0YSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbSA9IHRvdGFsIC0gaGlzdG9yeUxpbWl0O1xuICAgIGNvbnN0IHdpbmRvd1N0YXJ0ID0gTWF0aC5taW4ocG9zaXRpb24sIHRyaW0pO1xuICAgIGNvbnN0IHdpbmRvd0VuZCA9IHdpbmRvd1N0YXJ0ICsgaGlzdG9yeUxpbWl0O1xuICAgIGNvbnN0IHRyaW1tZWRCYXNlID0ge1xuICAgICAgcGF0Y2hlczogY2xvbmVkLnBhdGNoZXMuc2xpY2Uod2luZG93U3RhcnQsIHdpbmRvd0VuZCksXG4gICAgICBpbnZlcnNlUGF0Y2hlczogY2xvbmVkLmludmVyc2VQYXRjaGVzLnNsaWNlKHdpbmRvd1N0YXJ0LCB3aW5kb3dFbmQpLFxuICAgIH0gYXMgVHJhdmVsUGF0Y2hlczxQPjtcblxuICAgIGNvbnN0IHRyaW1tZWQgPSBjbG9uZVRyYXZlbFBhdGNoZXModHJpbW1lZEJhc2UpO1xuICAgIGNvbnN0IGFkanVzdGVkUG9zaXRpb24gPSBwb3NpdGlvbiAtIHdpbmRvd1N0YXJ0O1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFRyYXZlbHM6IGluaXRpYWxQYXRjaGVzIGxlbmd0aCAoJHt0b3RhbH0pIGV4Y2VlZHMgbWF4SGlzdG9yeSAoJHtoaXN0b3J5TGltaXR9KS4gYCArXG4gICAgICAgICAgYFJldGFpbmVkICR7aGlzdG9yeUxpbWl0fSBzdGVwcyBmcm9tIHBvc2l0aW9uICR7d2luZG93U3RhcnR9LiBgICtcbiAgICAgICAgICBgUG9zaXRpb24gYWRqdXN0ZWQgdG8gJHthZGp1c3RlZFBvc2l0aW9ufS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXRjaGVzOiB0cmltbWVkLFxuICAgICAgcG9zaXRpb246IGFkanVzdGVkUG9zaXRpb24sXG4gICAgICBtZXRhZGF0YTogYWxpZ25lZE1ldGFkYXRhLnNsaWNlKHdpbmRvd1N0YXJ0LCB3aW5kb3dFbmQpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVIaXN0b3J5Q2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5oaXN0b3J5VmVyc2lvbiArPSAxO1xuICAgIHRoaXMuaGlzdG9yeUNhY2hlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gc3RhdGUgY2hhbmdlc1xuICAgKiBAcmV0dXJucyBVbnN1YnNjcmliZSBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIHN1YnNjcmliZSA9IChsaXN0ZW5lcjogTGlzdGVuZXI8UywgUD4pID0+IHtcbiAgICB0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIE5vdGlmeSBhbGwgbGlzdGVuZXJzIG9mIHN0YXRlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgZ2V0RXZlbnRQYXRjaGVzKCk6IFRyYXZlbFBhdGNoZXM8UD4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5saXN0ZW5lcnMuc2l6ZSAmJiAhdGhpcy5kZXZ0b29scykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2hlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnkocGF0Y2hlcz86IFRyYXZlbFBhdGNoZXM8UD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLnNpemUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRQYXRjaGVzID0gcGF0Y2hlcyA/PyB0aGlzLmdldFBhdGNoZXMoKTtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT5cbiAgICAgIGxpc3RlbmVyKHRoaXMuc3RhdGUsIGV2ZW50UGF0Y2hlcywgdGhpcy5wb3NpdGlvbilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0RGV2dG9vbHMoXG4gICAgdHlwZTogVHJhdmVsc0RldnRvb2xzRXZlbnQ8UywgUD5bJ3R5cGUnXSxcbiAgICBtZXRhZGF0YT86IFRyYXZlbE1ldGFkYXRhLFxuICAgIHBhdGNoZXM/OiBUcmF2ZWxQYXRjaGVzPFA+XG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZXZ0b29scykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudFBhdGNoZXMgPSBwYXRjaGVzID8/IHRoaXMuZ2V0UGF0Y2hlcygpO1xuICAgIHRoaXMuZGV2dG9vbHM/Lih7XG4gICAgICB0eXBlLFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvbixcbiAgICAgIHBhdGNoZXM6IGV2ZW50UGF0Y2hlcyxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKFxuICAgIHR5cGU6IFRyYXZlbHNEZXZ0b29sc0V2ZW50PFMsIFA+Wyd0eXBlJ10sXG4gICAgbWV0YWRhdGE/OiBUcmF2ZWxNZXRhZGF0YVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXRjaGVzID0gdGhpcy5nZXRFdmVudFBhdGNoZXMoKTtcbiAgICB0aGlzLm5vdGlmeShwYXRjaGVzKTtcbiAgICB0aGlzLmVtaXREZXZ0b29scyh0eXBlLCBtZXRhZGF0YSwgcGF0Y2hlcyk7XG4gIH1cblxuICBwcml2YXRlIHJlcG9ydEVycm9yKGNvZGU6ICdUUkFOU0FDVElPTl9GQUlMRUQnLCBlcnJvcjogdW5rbm93bik6IFRyYXZlbHNFcnJvciB7XG4gICAgY29uc3QgdHJhdmVsc0Vycm9yID1cbiAgICAgIGVycm9yIGluc3RhbmNlb2YgVHJhdmVsc0Vycm9yXG4gICAgICAgID8gZXJyb3JcbiAgICAgICAgOiBuZXcgVHJhdmVsc0Vycm9yKGNvZGUsIGBUcmF2ZWxzOiAke2NvZGV9YCwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgdGhpcy5vbkVycm9yPy4odHJhdmVsc0Vycm9yKTtcbiAgICByZXR1cm4gdHJhdmVsc0Vycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0VudHJpZXMoXG4gICAgcGF0Y2hlczogVHJhdmVsUGF0Y2hlczxQPixcbiAgICBtZXRhZGF0YTogQXJyYXk8VHJhdmVsTWV0YWRhdGEgfCB1bmRlZmluZWQ+ID0gW11cbiAgKTogVHJhdmVsSGlzdG9yeUVudHJ5PFA+W10ge1xuICAgIHJldHVybiBwYXRjaGVzLnBhdGNoZXMubWFwKChwYXRjaCwgaW5kZXgpID0+ICh7XG4gICAgICBwYXRjaGVzOiBwYXRjaC5tYXAoKG9wZXJhdGlvbikgPT4gZGVlcENsb25lVmFsdWUob3BlcmF0aW9uKSkgYXMgUGF0Y2hlczxQPixcbiAgICAgIGludmVyc2VQYXRjaGVzOiBwYXRjaGVzLmludmVyc2VQYXRjaGVzW2luZGV4XS5tYXAoKG9wZXJhdGlvbikgPT5cbiAgICAgICAgZGVlcENsb25lVmFsdWUob3BlcmF0aW9uKVxuICAgICAgKSBhcyBQYXRjaGVzPFA+LFxuICAgICAgbWV0YWRhdGE6IGNsb25lVHJhdmVsTWV0YWRhdGEobWV0YWRhdGFbaW5kZXhdKSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGRpc2NhcmRGdXR1cmVGcm9tKHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocG9zaXRpb24gPj0gdGhpcy5hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlzY2FyZGVkUGF0Y2hlcyA9IHtcbiAgICAgIHBhdGNoZXM6IHRoaXMuYWxsUGF0Y2hlcy5wYXRjaGVzLnNsaWNlKHBvc2l0aW9uKSxcbiAgICAgIGludmVyc2VQYXRjaGVzOiB0aGlzLmFsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMuc2xpY2UocG9zaXRpb24pLFxuICAgIH0gYXMgVHJhdmVsUGF0Y2hlczxQPjtcbiAgICBjb25zdCBkaXNjYXJkZWRNZXRhZGF0YSA9IGNsb25lVHJhdmVsTWV0YWRhdGFMaXN0KFxuICAgICAgdGhpcy5hbGxNZXRhZGF0YS5zbGljZShwb3NpdGlvbilcbiAgICApO1xuXG4gICAgdGhpcy5hbGxQYXRjaGVzLnBhdGNoZXMuc3BsaWNlKFxuICAgICAgcG9zaXRpb24sXG4gICAgICB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggLSBwb3NpdGlvblxuICAgICk7XG4gICAgdGhpcy5hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLnNwbGljZShcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgdGhpcy5hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLmxlbmd0aCAtIHBvc2l0aW9uXG4gICAgKTtcbiAgICB0aGlzLmFsbE1ldGFkYXRhLnNwbGljZShwb3NpdGlvbiwgdGhpcy5hbGxNZXRhZGF0YS5sZW5ndGggLSBwb3NpdGlvbik7XG5cbiAgICB0aGlzLm9uQnJhbmNoRGlzY2FyZD8uKHtcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgZGlzY2FyZGVkOiB0aGlzLnRvRW50cmllcyhkaXNjYXJkZWRQYXRjaGVzLCBkaXNjYXJkZWRNZXRhZGF0YSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1IaXN0b3J5VG9NYXgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWF4SGlzdG9yeSA+PSB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhIaXN0b3J5ID09PSAwKSB7XG4gICAgICB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcyA9IFtdO1xuICAgICAgdGhpcy5hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzID0gW107XG4gICAgICB0aGlzLmFsbE1ldGFkYXRhID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hbGxQYXRjaGVzLnBhdGNoZXMgPSB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5zbGljZSgtdGhpcy5tYXhIaXN0b3J5KTtcbiAgICB0aGlzLmFsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMgPSB0aGlzLmFsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMuc2xpY2UoXG4gICAgICAtdGhpcy5tYXhIaXN0b3J5XG4gICAgKTtcbiAgICB0aGlzLmFsbE1ldGFkYXRhID0gY2xvbmVUcmF2ZWxNZXRhZGF0YUxpc3QoXG4gICAgICB0aGlzLmFsbE1ldGFkYXRhLnNsaWNlKC10aGlzLm1heEhpc3RvcnkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRIaXN0b3J5VG9DdXJyZW50U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsU3RhdGUgPSBjbG9uZUluaXRpYWxTbmFwc2hvdCh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IDA7XG4gICAgdGhpcy5pbml0aWFsUGF0Y2hlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluaXRpYWxNZXRhZGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB0aGlzLmFsbFBhdGNoZXMgPSBjbG9uZVRyYXZlbFBhdGNoZXMoKTtcbiAgICB0aGlzLmFsbE1ldGFkYXRhID0gW107XG4gICAgdGhpcy50ZW1wUGF0Y2hlcyA9IGNsb25lVHJhdmVsUGF0Y2hlcygpO1xuICAgIHRoaXMudGVtcE1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNSZWNvcmRlZEhpc3RvcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucG9zaXRpb24gIT09IDAgfHxcbiAgICAgIHRoaXMuaW5pdGlhbFBvc2l0aW9uICE9PSAwIHx8XG4gICAgICAhIXRoaXMuaW5pdGlhbFBhdGNoZXM/LnBhdGNoZXMubGVuZ3RoIHx8XG4gICAgICAhIXRoaXMuaW5pdGlhbFBhdGNoZXM/LmludmVyc2VQYXRjaGVzLmxlbmd0aCB8fFxuICAgICAgISF0aGlzLmluaXRpYWxNZXRhZGF0YT8ubGVuZ3RoIHx8XG4gICAgICB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmFsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5hbGxNZXRhZGF0YS5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLnRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy50ZW1wUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLnRlbXBNZXRhZGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZVN0YXRlRnJvbVNuYXBzaG90KHNuYXBzaG90OiBTKTogdm9pZCB7XG4gICAgY29uc3QgY2FuUmVzdG9yZU11dGFibHkgPVxuICAgICAgdGhpcy5tdXRhYmxlICYmIGlzT2JqZWN0TGlrZSh0aGlzLnN0YXRlKSAmJiBpc09iamVjdExpa2Uoc25hcHNob3QpO1xuXG4gICAgaWYgKGNhblJlc3RvcmVNdXRhYmx5KSB7XG4gICAgICBjb25zdCBbLCBwYXRjaGVzXSA9IGNyZWF0ZShcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZHJhZnQgYXMgb2JqZWN0KSkge1xuICAgICAgICAgICAgZGVsZXRlIChkcmFmdCBhcyBhbnkpW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZXBDbG9uZShzbmFwc2hvdCwgZHJhZnQpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRyYWZ0KSAmJiBBcnJheS5pc0FycmF5KHNuYXBzaG90KSkge1xuICAgICAgICAgICAgKGRyYWZ0IGFzIGFueVtdKS5sZW5ndGggPSAoc25hcHNob3QgYXMgYW55W10pLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgKTtcblxuICAgICAgYXBwbHkodGhpcy5zdGF0ZSBhcyBvYmplY3QsIHBhdGNoZXMsIHsgbXV0YWJsZTogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gc25hcHNob3Q7XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVUcmFuc2FjdGlvblNuYXBzaG90KCk6IFRyYW5zYWN0aW9uU25hcHNob3Q8UywgUD4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTpcbiAgICAgICAgdGhpcy5tdXRhYmxlICYmIGlzT2JqZWN0TGlrZSh0aGlzLnN0YXRlKVxuICAgICAgICAgID8gY2xvbmVJbml0aWFsU25hcHNob3QodGhpcy5zdGF0ZSlcbiAgICAgICAgICA6IHRoaXMuc3RhdGUsXG4gICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvbixcbiAgICAgIGFsbFBhdGNoZXM6IGNsb25lVHJhdmVsUGF0Y2hlcyh0aGlzLmFsbFBhdGNoZXMpLFxuICAgICAgYWxsTWV0YWRhdGE6IGNsb25lVHJhdmVsTWV0YWRhdGFMaXN0KHRoaXMuYWxsTWV0YWRhdGEpLFxuICAgICAgdGVtcFBhdGNoZXM6IGNsb25lVHJhdmVsUGF0Y2hlcyh0aGlzLnRlbXBQYXRjaGVzKSxcbiAgICAgIHRlbXBNZXRhZGF0YTogY2xvbmVUcmF2ZWxNZXRhZGF0YSh0aGlzLnRlbXBNZXRhZGF0YSksXG4gICAgICBpbml0aWFsU3RhdGU6IGNsb25lSW5pdGlhbFNuYXBzaG90KHRoaXMuaW5pdGlhbFN0YXRlKSxcbiAgICAgIGluaXRpYWxQb3NpdGlvbjogdGhpcy5pbml0aWFsUG9zaXRpb24sXG4gICAgICBpbml0aWFsUGF0Y2hlczogdGhpcy5pbml0aWFsUGF0Y2hlc1xuICAgICAgICA/IGNsb25lVHJhdmVsUGF0Y2hlcyh0aGlzLmluaXRpYWxQYXRjaGVzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGluaXRpYWxNZXRhZGF0YTogdGhpcy5pbml0aWFsTWV0YWRhdGFcbiAgICAgICAgPyBjbG9uZVRyYXZlbE1ldGFkYXRhTGlzdCh0aGlzLmluaXRpYWxNZXRhZGF0YSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwZW5kaW5nU3RhdGU6IHRoaXMucGVuZGluZ1N0YXRlLFxuICAgICAgcGVuZGluZ1N0YXRlVmVyc2lvbjogdGhpcy5wZW5kaW5nU3RhdGVWZXJzaW9uLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVUcmFuc2FjdGlvblNuYXBzaG90KFxuICAgIHNuYXBzaG90OiBUcmFuc2FjdGlvblNuYXBzaG90PFMsIFA+XG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVzdG9yZVN0YXRlRnJvbVNuYXBzaG90KHNuYXBzaG90LnN0YXRlKTtcbiAgICB0aGlzLnBvc2l0aW9uID0gc25hcHNob3QucG9zaXRpb247XG4gICAgdGhpcy5hbGxQYXRjaGVzID0gY2xvbmVUcmF2ZWxQYXRjaGVzKHNuYXBzaG90LmFsbFBhdGNoZXMpO1xuICAgIHRoaXMuYWxsTWV0YWRhdGEgPSBjbG9uZVRyYXZlbE1ldGFkYXRhTGlzdChzbmFwc2hvdC5hbGxNZXRhZGF0YSk7XG4gICAgdGhpcy50ZW1wUGF0Y2hlcyA9IGNsb25lVHJhdmVsUGF0Y2hlcyhzbmFwc2hvdC50ZW1wUGF0Y2hlcyk7XG4gICAgdGhpcy50ZW1wTWV0YWRhdGEgPSBjbG9uZVRyYXZlbE1ldGFkYXRhKHNuYXBzaG90LnRlbXBNZXRhZGF0YSk7XG4gICAgdGhpcy5pbml0aWFsU3RhdGUgPSBjbG9uZUluaXRpYWxTbmFwc2hvdChzbmFwc2hvdC5pbml0aWFsU3RhdGUpO1xuICAgIHRoaXMuaW5pdGlhbFBvc2l0aW9uID0gc25hcHNob3QuaW5pdGlhbFBvc2l0aW9uO1xuICAgIHRoaXMuaW5pdGlhbFBhdGNoZXMgPSBzbmFwc2hvdC5pbml0aWFsUGF0Y2hlc1xuICAgICAgPyBjbG9uZVRyYXZlbFBhdGNoZXMoc25hcHNob3QuaW5pdGlhbFBhdGNoZXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluaXRpYWxNZXRhZGF0YSA9IHNuYXBzaG90LmluaXRpYWxNZXRhZGF0YVxuICAgICAgPyBjbG9uZVRyYXZlbE1ldGFkYXRhTGlzdChzbmFwc2hvdC5pbml0aWFsTWV0YWRhdGEpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBlbmRpbmdTdGF0ZSA9IHNuYXBzaG90LnBlbmRpbmdTdGF0ZTtcbiAgICB0aGlzLnBlbmRpbmdTdGF0ZVZlcnNpb24gPSBzbmFwc2hvdC5wZW5kaW5nU3RhdGVWZXJzaW9uO1xuXG4gICAgdGhpcy5pbnZhbGlkYXRlSGlzdG9yeUNhY2hlKCk7XG4gICAgdGhpcy5ub3RpZnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYXRjaGVzIGNvbnRhaW4gcm9vdC1sZXZlbCByZXBsYWNlbWVudCBvcGVyYXRpb25zXG4gICAqIFJvb3QgcmVwbGFjZW1lbnQgY2Fubm90IGJlIGRvbmUgbXV0YWJseSBhcyBpdCBjaGFuZ2VzIHRoZSB0eXBlL3ZhbHVlIG9mIHRoZSBlbnRpcmUgc3RhdGVcbiAgICovXG4gIHByaXZhdGUgaGFzUm9vdFJlcGxhY2VtZW50KHBhdGNoZXM6IFBhdGNoZXM8UD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0Y2hlcy5zb21lKFxuICAgICAgKHBhdGNoKSA9PlxuICAgICAgICAoKEFycmF5LmlzQXJyYXkocGF0Y2gucGF0aCkgJiYgcGF0Y2gucGF0aC5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICAgcGF0Y2gucGF0aCA9PT0gJycpICYmXG4gICAgICAgIHBhdGNoLm9wID09PSAncmVwbGFjZSdcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZVxuICAgKi9cbiAgZ2V0U3RhdGUgPSAoKSA9PiB0aGlzLnN0YXRlO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgc2V0U3RhdGUodXBkYXRlcjogVXBkYXRlcjxTPiwgbWV0YWRhdGE/OiBUcmF2ZWxNZXRhZGF0YSk6IHZvaWQge1xuICAgIGxldCBwYXRjaGVzOiBQYXRjaGVzPFA+O1xuICAgIGxldCBpbnZlcnNlUGF0Y2hlczogUGF0Y2hlczxQPjtcbiAgICBsZXQgbmV4dFBlbmRpbmdTdGF0ZTogUztcblxuICAgIGNvbnN0IGNhblVzZU11dGFibGVSb290ID0gdGhpcy5tdXRhYmxlICYmIGlzT2JqZWN0TGlrZSh0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBpc0Z1bmN0aW9uVXBkYXRlciA9IHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nO1xuICAgIGNvbnN0IHN0YXRlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkodGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgdXBkYXRlcklzQXJyYXkgPSBBcnJheS5pc0FycmF5KHVwZGF0ZXIpO1xuICAgIGNvbnN0IGNhbk11dGF0ZVBsYWluT2JqZWN0cyA9XG4gICAgICAhc3RhdGVJc0FycmF5ICYmXG4gICAgICAhdXBkYXRlcklzQXJyYXkgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QodGhpcy5zdGF0ZSkgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QodXBkYXRlcik7XG4gICAgY29uc3QgY2FuTXV0YXRlQXJyYXlzID1cbiAgICAgIHN0YXRlSXNBcnJheSAmJlxuICAgICAgdXBkYXRlcklzQXJyYXkgJiZcbiAgICAgIGhhc09ubHlBcnJheUluZGljZXModGhpcy5zdGF0ZSkgJiZcbiAgICAgIGhhc09ubHlBcnJheUluZGljZXModXBkYXRlcik7XG4gICAgY29uc3QgY2FuTXV0YXRlV2l0aFZhbHVlID1cbiAgICAgIGNhblVzZU11dGFibGVSb290ICYmXG4gICAgICAhaXNGdW5jdGlvblVwZGF0ZXIgJiZcbiAgICAgIChjYW5NdXRhdGVBcnJheXMgfHwgY2FuTXV0YXRlUGxhaW5PYmplY3RzKTtcbiAgICBjb25zdCB1c2VNdXRhYmxlID1cbiAgICAgIChpc0Z1bmN0aW9uVXBkYXRlciAmJiBjYW5Vc2VNdXRhYmxlUm9vdCkgfHwgY2FuTXV0YXRlV2l0aFZhbHVlO1xuXG4gICAgaWYgKHRoaXMubXV0YWJsZSAmJiAhY2FuVXNlTXV0YWJsZVJvb3QgJiYgIXRoaXMubXV0YWJsZUZhbGxiYWNrV2FybmVkKSB7XG4gICAgICB0aGlzLm11dGFibGVGYWxsYmFja1dhcm5lZCA9IHRydWU7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnVHJhdmVsczogbXV0YWJsZSBtb2RlIHJlcXVpcmVzIHRoZSBzdGF0ZSByb290IHRvIGJlIGFuIG9iamVjdC4gRmFsbGluZyBiYWNrIHRvIGltbXV0YWJsZSB1cGRhdGVzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXNlTXV0YWJsZSkge1xuICAgICAgLy8gRm9yIG9ic2VydmFibGUgc3RhdGU6IGdlbmVyYXRlIHBhdGNoZXMgdGhlbiBhcHBseSBtdXRhYmx5XG4gICAgICBjb25zdCBbbmV4dFN0YXRlLCBwLCBpcF0gPSBjcmVhdGUoXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIGlzRnVuY3Rpb25VcGRhdGVyXG4gICAgICAgICAgPyAodXBkYXRlciBhcyAoZHJhZnQ6IERyYWZ0PFM+KSA9PiB2b2lkKVxuICAgICAgICAgIDogKGRyYWZ0OiBEcmFmdDxTPikgPT4ge1xuICAgICAgICAgICAgICBvdmVyd3JpdGVEcmFmdFdpdGgoZHJhZnQhLCB1cGRhdGVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgKSBhcyBbUywgUGF0Y2hlczxQPiwgUGF0Y2hlczxQPl07XG5cbiAgICAgIHBhdGNoZXMgPSBwO1xuICAgICAgaW52ZXJzZVBhdGNoZXMgPSBpcDtcblxuICAgICAgaWYgKHRoaXMuaGFzUm9vdFJlcGxhY2VtZW50KHBhdGNoZXMpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgIXRoaXMubXV0YWJsZVJvb3RSZXBsYWNlV2FybmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubXV0YWJsZVJvb3RSZXBsYWNlV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnVHJhdmVsczogbXV0YWJsZSBtb2RlIGNhbm5vdCBhcHBseSByb290IHJlcGxhY2VtZW50cyBpbiBwbGFjZS4gRmFsbGluZyBiYWNrIHRvIGltbXV0YWJsZSB1cGRhdGUgZm9yIHRoaXMgY2hhbmdlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUm9vdCByZXBsYWNlbWVudCBjYW5ub3QgYmUgYXBwbGllZCBtdXRhYmx5OyBmYWxsIGJhY2sgdG8gaW1tdXRhYmxlIGFzc2lnbm1lbnQuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICAgIG5leHRQZW5kaW5nU3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcHBseSBwYXRjaGVzIHRvIG11dGF0ZSB0aGUgZXhpc3Rpbmcgc3RhdGUgb2JqZWN0XG4gICAgICAgIGFwcGx5KHRoaXMuc3RhdGUgYXMgb2JqZWN0LCBwYXRjaGVzLCB7IG11dGFibGU6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gS2VlcCB0aGUgc2FtZSByZWZlcmVuY2VcbiAgICAgICAgbmV4dFBlbmRpbmdTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBpbW11dGFibGUgc3RhdGU6IGNyZWF0ZSBuZXcgb2JqZWN0XG4gICAgICBjb25zdCBbbmV4dFN0YXRlLCBwLCBpcF0gPSAoXG4gICAgICAgIHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyBjcmVhdGUoXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIChkcmFmdDogRHJhZnQ8Uz4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAodXBkYXRlciBhcyAoZHJhZnQ6IERyYWZ0PFM+KSA9PiBTIHwgdm9pZCkoXG4gICAgICAgICAgICAgICAgICBkcmFmdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZHJhZnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZShyZXN1bHQpICYmICFjb250YWluc0RyYWZ0KHJlc3VsdClcbiAgICAgICAgICAgICAgICAgID8gKHJhd1JldHVybihyZXN1bHQgYXMgb2JqZWN0KSBhcyBTKVxuICAgICAgICAgICAgICAgICAgOiAocmVzdWx0IGFzIFMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGNyZWF0ZShcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICBpc09iamVjdExpa2UodXBkYXRlcilcbiAgICAgICAgICAgICAgICAgID8gKHJhd1JldHVybih1cGRhdGVyIGFzIG9iamVjdCkgYXMgUylcbiAgICAgICAgICAgICAgICAgIDogKHVwZGF0ZXIgYXMgUyksXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICAgKVxuICAgICAgKSBhcyB1bmtub3duIGFzIFtTLCBQYXRjaGVzPFA+LCBQYXRjaGVzPFA+XTtcblxuICAgICAgcGF0Y2hlcyA9IHA7XG4gICAgICBpbnZlcnNlUGF0Y2hlcyA9IGlwO1xuICAgICAgdGhpcy5zdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICAgIG5leHRQZW5kaW5nU3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTm9DaGFuZ2VzID0gcGF0Y2hlcy5sZW5ndGggPT09IDAgJiYgaW52ZXJzZVBhdGNoZXMubGVuZ3RoID09PSAwO1xuXG4gICAgaWYgKGhhc05vQ2hhbmdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1N0YXRlID0gbmV4dFBlbmRpbmdTdGF0ZTtcbiAgICBjb25zdCBwZW5kaW5nU3RhdGVWZXJzaW9uID0gKyt0aGlzLnBlbmRpbmdTdGF0ZVZlcnNpb247XG5cbiAgICAvLyBSZXNldCBwZW5kaW5nU3RhdGUgYXN5bmNocm9ub3VzbHksIGJ1dCBvbmx5IGlmIG5vIG5ld2VyIHVwZGF0ZSBsYW5kZWQuXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nU3RhdGVWZXJzaW9uID09PSBwZW5kaW5nU3RhdGVWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1N0YXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMud2FybkFib3V0U3RhdGVDb21wYXRpYmlsaXR5KHRoaXMuc3RhdGUpO1xuXG4gICAgaWYgKHRoaXMudHJhY2tpbmdQYXVzZURlcHRoID4gMCkge1xuICAgICAgdGhpcy5yZXNldEhpc3RvcnlUb0N1cnJlbnRTdGF0ZSgpO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGlzdG9yeUNhY2hlKCk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoJ3JlcGxhY2VTdGF0ZVdpdGhvdXRIaXN0b3J5JywgbWV0YWRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dG9BcmNoaXZlKSB7XG4gICAgICBjb25zdCBub3RMYXN0ID0gdGhpcy5wb3NpdGlvbiA8IHRoaXMuYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aDtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBwYXRjaGVzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICBpZiAobm90TGFzdCkge1xuICAgICAgICB0aGlzLmRpc2NhcmRGdXR1cmVGcm9tKHRoaXMucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5wdXNoKHBhdGNoZXMpO1xuICAgICAgdGhpcy5hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLnB1c2goaW52ZXJzZVBhdGNoZXMpO1xuICAgICAgdGhpcy5hbGxNZXRhZGF0YS5wdXNoKGNsb25lVHJhdmVsTWV0YWRhdGEobWV0YWRhdGEpKTtcblxuICAgICAgdGhpcy5wb3NpdGlvbiA9XG4gICAgICAgIHRoaXMubWF4SGlzdG9yeSA8IHRoaXMuYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aFxuICAgICAgICAgID8gdGhpcy5tYXhIaXN0b3J5XG4gICAgICAgICAgOiB0aGlzLnBvc2l0aW9uICsgMTtcblxuICAgICAgdGhpcy50cmltSGlzdG9yeVRvTWF4KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vdExhc3QgPVxuICAgICAgICB0aGlzLnBvc2l0aW9uIDxcbiAgICAgICAgdGhpcy5hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoICtcbiAgICAgICAgICBOdW1iZXIoISF0aGlzLnRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoKTtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBwYXRjaGVzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICBpZiAobm90TGFzdCkge1xuICAgICAgICB0aGlzLmRpc2NhcmRGdXR1cmVGcm9tKHRoaXMucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMudGVtcFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggfHwgbm90TGFzdCkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID1cbiAgICAgICAgICB0aGlzLm1heEhpc3RvcnkgPCB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggKyAxXG4gICAgICAgICAgICA/IHRoaXMubWF4SGlzdG9yeVxuICAgICAgICAgICAgOiB0aGlzLnBvc2l0aW9uICsgMTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vdExhc3QpIHtcbiAgICAgICAgdGhpcy50ZW1wUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMudGVtcFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy50ZW1wTWV0YWRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGVtcFBhdGNoZXMucGF0Y2hlcy5wdXNoKHBhdGNoZXMpO1xuICAgICAgdGhpcy50ZW1wUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcy5wdXNoKGludmVyc2VQYXRjaGVzKTtcbiAgICAgIGlmIChtZXRhZGF0YSAhPT0gdW5kZWZpbmVkIHx8IHRoaXMudGVtcE1ldGFkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy50ZW1wTWV0YWRhdGEgPSBjbG9uZVRyYXZlbE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmludmFsaWRhdGVIaXN0b3J5Q2FjaGUoKTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3NldFN0YXRlJywgbWV0YWRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyY2hpdmUgdGhlIGN1cnJlbnQgc3RhdGUgKG9ubHkgZm9yIG1hbnVhbCBhcmNoaXZlIG1vZGUpXG4gICAqL1xuICBwcml2YXRlIGFyY2hpdmVQZW5kaW5nKG1ldGFkYXRhPzogVHJhdmVsTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudGVtcFBhdGNoZXMucGF0Y2hlcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhcmNoaXZlTWV0YWRhdGEgPVxuICAgICAgbWV0YWRhdGEgPT09IHVuZGVmaW5lZCA/IHRoaXMudGVtcE1ldGFkYXRhIDogbWV0YWRhdGE7XG4gICAgY29uc3QgcGVuZGluZ0FyY2hpdmUgPSB0aGlzLmdldFBlbmRpbmdBcmNoaXZlRW50cnkoKTtcblxuICAgIHRoaXMuYWxsUGF0Y2hlcy5wYXRjaGVzLnB1c2gocGVuZGluZ0FyY2hpdmUucGF0Y2hlcyk7XG4gICAgdGhpcy5hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLnB1c2gocGVuZGluZ0FyY2hpdmUuaW52ZXJzZVBhdGNoZXMpO1xuICAgIHRoaXMuYWxsTWV0YWRhdGEucHVzaChjbG9uZVRyYXZlbE1ldGFkYXRhKGFyY2hpdmVNZXRhZGF0YSkpO1xuXG4gICAgLy8gUmVzcGVjdCBtYXhIaXN0b3J5IGxpbWl0XG4gICAgdGhpcy50cmltSGlzdG9yeVRvTWF4KCk7XG5cbiAgICAvLyBDbGVhciB0ZW1wb3JhcnkgcGF0Y2hlcyBhZnRlciBhcmNoaXZpbmdcbiAgICB0aGlzLnRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnRlbXBQYXRjaGVzLmludmVyc2VQYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy50ZW1wTWV0YWRhdGEgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmludmFsaWRhdGVIaXN0b3J5Q2FjaGUoKTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ2FyY2hpdmUnLCBhcmNoaXZlTWV0YWRhdGEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGFyY2hpdmUobWV0YWRhdGE/OiBUcmF2ZWxNZXRhZGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9BcmNoaXZlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0F1dG8gYXJjaGl2ZSBpcyBlbmFibGVkLCBubyBuZWVkIHRvIGFyY2hpdmUgbWFudWFsbHknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFyY2hpdmVQZW5kaW5nKG1ldGFkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmFuc2FjdGlvbihcbiAgICBtZXRhZGF0YTogVHJhdmVsTWV0YWRhdGEsXG4gICAgZm46ICgpID0+IHZvaWRcbiAgKTogdm9pZDtcbiAgcHVibGljIHRyYW5zYWN0aW9uKGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgcHVibGljIHRyYW5zYWN0aW9uKFxuICAgIG1ldGFkYXRhT3JGbjogVHJhdmVsTWV0YWRhdGEgfCAoKCkgPT4gdm9pZCksXG4gICAgbWF5YmVGbj86ICgpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YWRhdGEgPVxuICAgICAgdHlwZW9mIG1ldGFkYXRhT3JGbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGNsb25lVHJhdmVsTWV0YWRhdGEobWV0YWRhdGFPckZuKTtcbiAgICBjb25zdCBmbiA9IHR5cGVvZiBtZXRhZGF0YU9yRm4gPT09ICdmdW5jdGlvbicgPyBtZXRhZGF0YU9yRm4gOiBtYXliZUZuO1xuXG4gICAgaWYgKCFmbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzQXV0b0FyY2hpdmUgPSB0aGlzLmF1dG9BcmNoaXZlO1xuICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSB0aGlzLnRyYW5zYWN0aW9uTWV0YWRhdGE7XG4gICAgY29uc3QgaXNSb290VHJhbnNhY3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDA7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25TbmFwc2hvdCA9IHRoaXMuY2FwdHVyZVRyYW5zYWN0aW9uU25hcHNob3QoKTtcbiAgICBsZXQgZmFpbGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGggKz0gMTtcbiAgICBpZiAoaXNSb290VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25NZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudHJhbnNhY3Rpb25NZXRhZGF0YSAmJiBtZXRhZGF0YSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbk1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgfVxuICAgIHRoaXMuYXV0b0FyY2hpdmUgPSBmYWxzZSBhcyBBO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlc3RvcmVUcmFuc2FjdGlvblNuYXBzaG90KHRyYW5zYWN0aW9uU25hcHNob3QpO1xuICAgICAgdGhpcy50cmFuc2FjdGlvbk1ldGFkYXRhID0gcHJldmlvdXNNZXRhZGF0YTtcbiAgICAgIHRocm93IHRoaXMucmVwb3J0RXJyb3IoJ1RSQU5TQUNUSU9OX0ZBSUxFRCcsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoIC09IDE7XG5cbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDApIHtcbiAgICAgICAgdGhpcy5hdXRvQXJjaGl2ZSA9IHByZXZpb3VzQXV0b0FyY2hpdmU7XG4gICAgICAgIGlmICghZmFpbGVkKSB7XG4gICAgICAgICAgY29uc3QgY29tbWl0dGVkID0gdGhpcy5hcmNoaXZlUGVuZGluZyh0aGlzLnRyYW5zYWN0aW9uTWV0YWRhdGEpO1xuICAgICAgICAgIGlmIChjb21taXR0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdERldnRvb2xzKCd0cmFuc2FjdGlvbicsIHRoaXMudHJhbnNhY3Rpb25NZXRhZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25NZXRhZGF0YSA9IHByZXZpb3VzTWV0YWRhdGE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJhdGNoKG1ldGFkYXRhOiBUcmF2ZWxNZXRhZGF0YSwgZm46ICgpID0+IHZvaWQpOiB2b2lkO1xuICBwdWJsaWMgYmF0Y2goZm46ICgpID0+IHZvaWQpOiB2b2lkO1xuICBwdWJsaWMgYmF0Y2goXG4gICAgbWV0YWRhdGFPckZuOiBUcmF2ZWxNZXRhZGF0YSB8ICgoKSA9PiB2b2lkKSxcbiAgICBtYXliZUZuPzogKCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uKG1ldGFkYXRhT3JGbiBhcyBhbnksIG1heWJlRm4gYXMgYW55KTtcbiAgfVxuXG4gIHB1YmxpYyBwYXVzZVRyYWNraW5nKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2tpbmdQYXVzZURlcHRoICs9IDE7XG4gIH1cblxuICBwdWJsaWMgcmVzdW1lVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgdGhpcy50cmFja2luZ1BhdXNlRGVwdGggPSBNYXRoLm1heCgwLCB0aGlzLnRyYWNraW5nUGF1c2VEZXB0aCAtIDEpO1xuICB9XG5cbiAgcHVibGljIHJlcGxhY2VTdGF0ZVdpdGhvdXRIaXN0b3J5KHVwZGF0ZXI6IFVwZGF0ZXI8Uz4pOiB2b2lkIHtcbiAgICBjb25zdCBoaXN0b3J5VmVyc2lvbkJlZm9yZSA9IHRoaXMuaGlzdG9yeVZlcnNpb247XG5cbiAgICB0aGlzLnBhdXNlVHJhY2tpbmcoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh1cGRhdGVyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZXN1bWVUcmFja2luZygpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuaGlzdG9yeVZlcnNpb24gPT09IGhpc3RvcnlWZXJzaW9uQmVmb3JlICYmXG4gICAgICAvLyBNdXRhYmxlIHN0b3JlcyBjYW4gY2hhbmdlIGV4dGVybmFsbHkgYmVmb3JlIHRoaXMgbm8tb3AgdXBkYXRlciByZWJhc2VzIHRoZSBiYXNlbGluZS5cbiAgICAgICh0aGlzLmhhc1JlY29yZGVkSGlzdG9yeSgpIHx8IHRoaXMubXV0YWJsZSlcbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXRIaXN0b3J5VG9DdXJyZW50U3RhdGUoKTtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhpc3RvcnlDYWNoZSgpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCdyZXBsYWNlU3RhdGVXaXRob3V0SGlzdG9yeScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBhdGNoZXMgaW5jbHVkaW5nIHRlbXBvcmFyeSBwYXRjaGVzXG4gICAqL1xuICBwcml2YXRlIGdldFBlbmRpbmdBcmNoaXZlRW50cnkoKToge1xuICAgIHBhdGNoZXM6IFBhdGNoZXM8UD47XG4gICAgaW52ZXJzZVBhdGNoZXM6IFBhdGNoZXM8UD47XG4gIH0ge1xuICAgIC8vIFVzZSBwZW5kaW5nU3RhdGUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGN1cnJlbnQgc3RhdGUuXG4gICAgY29uc3Qgc3RhdGVUb1VzZSA9ICh0aGlzLnBlbmRpbmdTdGF0ZSA/PyB0aGlzLnN0YXRlKSBhcyBvYmplY3Q7XG5cbiAgICBjb25zdCBhcmNoaXZlZFN0YXRlID0gYXBwbHkoXG4gICAgICBzdGF0ZVRvVXNlLFxuICAgICAgdGhpcy50ZW1wUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcy5mbGF0KCkucmV2ZXJzZSgpXG4gICAgKSBhcyBTO1xuXG4gICAgLy8gTWVyZ2UgdGVtcCBwYXRjaGVzIGludG8gdGhlIHNhbWUgZW50cnkgc2hhcGUgYXJjaGl2ZSgpIHdvdWxkIGNvbW1pdC5cbiAgICBjb25zdCBbLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc10gPSBjcmVhdGUoXG4gICAgICBzdGF0ZVRvVXNlLFxuICAgICAgKCk6IG9iamVjdCA9PlxuICAgICAgICBpc09iamVjdExpa2UoYXJjaGl2ZWRTdGF0ZSlcbiAgICAgICAgICA/IChyYXdSZXR1cm4oYXJjaGl2ZWRTdGF0ZSBhcyBvYmplY3QpIGFzIG9iamVjdClcbiAgICAgICAgICA6IChhcmNoaXZlZFN0YXRlIGFzIG9iamVjdCksXG4gICAgICB0aGlzLm9wdGlvbnNcbiAgICApIGFzIFtTLCBQYXRjaGVzPFA+LCBQYXRjaGVzPFA+XTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRjaGVzOiBpbnZlcnNlUGF0Y2hlcyxcbiAgICAgIGludmVyc2VQYXRjaGVzOiBwYXRjaGVzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFBhdGNoZXMoKTogVHJhdmVsUGF0Y2hlczxQPiB7XG4gICAgY29uc3Qgc2hvdWxkQXJjaGl2ZSA9XG4gICAgICAhdGhpcy5hdXRvQXJjaGl2ZSAmJiAhIXRoaXMudGVtcFBhdGNoZXMucGF0Y2hlcy5sZW5ndGg7XG5cbiAgICBpZiAoc2hvdWxkQXJjaGl2ZSkge1xuICAgICAgY29uc3QgcGVuZGluZ0FyY2hpdmUgPSB0aGlzLmdldFBlbmRpbmdBcmNoaXZlRW50cnkoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGNoZXM6IHRoaXMuYWxsUGF0Y2hlcy5wYXRjaGVzLmNvbmNhdChbcGVuZGluZ0FyY2hpdmUucGF0Y2hlc10pLFxuICAgICAgICBpbnZlcnNlUGF0Y2hlczogdGhpcy5hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLmNvbmNhdChbXG4gICAgICAgICAgcGVuZGluZ0FyY2hpdmUuaW52ZXJzZVBhdGNoZXMsXG4gICAgICAgIF0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hbGxQYXRjaGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29tcGxldGUgaGlzdG9yeSBvZiBzdGF0ZXNcbiAgICpcbiAgICogQHJldHVybnMgVGhlIGhpc3RvcnkgYXJyYXkuIFJlZmVyZW5jZSBlcXVhbGl0eSBpbmRpY2F0ZXMgY2FjaGUgaGl0LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAqKklNUE9SVEFOVCoqOiBUcmVhdCB0aGUgcmV0dXJuZWQgYXJyYXkgYW5kIGV2ZXJ5IHN0YXRlIGVudHJ5IGFzIHJlYWQtb25seS5cbiAgICogVGhleSBhcmUgY2FjaGVkIGludGVybmFsbHkuXG4gICAqIC0gSW4gZGV2ZWxvcG1lbnQgbW9kZSwgb25seSB0aGUgYXJyYXkgY29udGFpbmVyIGlzIGZyb3plbi5cbiAgICogLSBTdGF0ZSBlbnRyaWVzIGFyZSBzaGFyZWQgY2FjaGVkIHNuYXBzaG90cyBhbmQgYXJlIG5vdCBkZWVwLWZyb3plbi5cbiAgICogLSBJbiBwcm9kdWN0aW9uIG1vZGUsIG1vZGlmeWluZyB0aGUgYXJyYXkgb3IgaXRzIGVudHJpZXMgd2lsbCBjb3JydXB0IHRoZSBjYWNoZS5cbiAgICovXG4gIHB1YmxpYyBnZXRIaXN0b3J5KCk6IHJlYWRvbmx5IFNbXSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXN0b3J5Q2FjaGUgJiZcbiAgICAgIHRoaXMuaGlzdG9yeUNhY2hlLnZlcnNpb24gPT09IHRoaXMuaGlzdG9yeVZlcnNpb25cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmhpc3RvcnlDYWNoZS5oaXN0b3J5O1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IF9hbGxQYXRjaGVzID0gdGhpcy5nZXRBbGxQYXRjaGVzKCk7XG5cbiAgICBjb25zdCBwYXRjaGVzID1cbiAgICAgICF0aGlzLmF1dG9BcmNoaXZlICYmIF9hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoID4gdGhpcy5tYXhIaXN0b3J5XG4gICAgICAgID8gX2FsbFBhdGNoZXMucGF0Y2hlcy5zbGljZShcbiAgICAgICAgICAgIF9hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoIC0gdGhpcy5tYXhIaXN0b3J5XG4gICAgICAgICAgKVxuICAgICAgICA6IF9hbGxQYXRjaGVzLnBhdGNoZXM7XG4gICAgY29uc3QgaW52ZXJzZVBhdGNoZXMgPVxuICAgICAgIXRoaXMuYXV0b0FyY2hpdmUgJiYgX2FsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMubGVuZ3RoID4gdGhpcy5tYXhIaXN0b3J5XG4gICAgICAgID8gX2FsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMuc2xpY2UoXG4gICAgICAgICAgICBfYWxsUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcy5sZW5ndGggLSB0aGlzLm1heEhpc3RvcnlcbiAgICAgICAgICApXG4gICAgICAgIDogX2FsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXM7XG5cbiAgICAvLyBCdWlsZCBmdXR1cmUgaGlzdG9yeVxuICAgIGNvbnN0IGZ1dHVyZUhpc3Rvcnk6IFNbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBvc2l0aW9uOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY3VycmVudFN0YXRlID0gYXBwbHkoY3VycmVudFN0YXRlIGFzIG9iamVjdCwgcGF0Y2hlc1tpXSkgYXMgUztcbiAgICAgIGZ1dHVyZUhpc3RvcnkucHVzaChjdXJyZW50U3RhdGUpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHBhc3QgaGlzdG9yeVxuICAgIGN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgcGFzdEhpc3Rvcnk6IFNbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBvc2l0aW9uIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGFwcGx5KGN1cnJlbnRTdGF0ZSBhcyBvYmplY3QsIGludmVyc2VQYXRjaGVzW2ldKSBhcyBTO1xuICAgICAgcGFzdEhpc3RvcnkucHVzaChjdXJyZW50U3RhdGUpO1xuICAgIH1cbiAgICBwYXN0SGlzdG9yeS5yZXZlcnNlKCk7XG5cbiAgICBjb25zdCBoaXN0b3J5OiBTW10gPSBbLi4ucGFzdEhpc3RvcnksIHRoaXMuc3RhdGUsIC4uLmZ1dHVyZUhpc3RvcnldO1xuXG4gICAgdGhpcy5oaXN0b3J5Q2FjaGUgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLmhpc3RvcnlWZXJzaW9uLFxuICAgICAgaGlzdG9yeSxcbiAgICB9O1xuXG4gICAgLy8gSW4gZGV2ZWxvcG1lbnQgbW9kZSwgZnJlZXplIHRoZSBoaXN0b3J5IGNvbnRhaW5lciB0byBjYXRjaCBwdXNoL3NwbGljZS5cbiAgICAvLyBFbnRyaWVzIHJlbWFpbiBzaGFyZWQgY2FjaGVkIHNuYXBzaG90cyBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcmVhZC1vbmx5LlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGhpc3RvcnkpO1xuICAgIH1cblxuICAgIHJldHVybiBoaXN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyBnbyhuZXh0UG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgbmV4dFBvc2l0aW9uICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKG5leHRQb3NpdGlvbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ28gdG8gaW52YWxpZCBwb3NpdGlvbiAke25leHRQb3NpdGlvbn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobmV4dFBvc2l0aW9uKSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBvc2l0aW9uID0gTWF0aC50cnVuYyhuZXh0UG9zaXRpb24pO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgQ2FuJ3QgZ28gdG8gbm9uLWludGVnZXIgcG9zaXRpb24gJHtuZXh0UG9zaXRpb259LiBVc2luZyAke25vcm1hbGl6ZWRQb3NpdGlvbn0gaW5zdGVhZC5gXG4gICAgICApO1xuICAgICAgbmV4dFBvc2l0aW9uID0gbm9ybWFsaXplZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZEFyY2hpdmUgPVxuICAgICAgIXRoaXMuYXV0b0FyY2hpdmUgJiYgISF0aGlzLnRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoO1xuXG4gICAgaWYgKHNob3VsZEFyY2hpdmUpIHtcbiAgICAgIHRoaXMuYXJjaGl2ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IF9hbGxQYXRjaGVzID0gdGhpcy5nZXRBbGxQYXRjaGVzKCk7XG4gICAgY29uc3QgYmFjayA9IG5leHRQb3NpdGlvbiA8IHRoaXMucG9zaXRpb247XG5cbiAgICBpZiAobmV4dFBvc2l0aW9uID4gX2FsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ28gZm9yd2FyZCB0byBwb3NpdGlvbiAke25leHRQb3NpdGlvbn1gKTtcbiAgICAgIG5leHRQb3NpdGlvbiA9IF9hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChuZXh0UG9zaXRpb24gPCAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbid0IGdvIGJhY2sgdG8gcG9zaXRpb24gJHtuZXh0UG9zaXRpb259YCk7XG4gICAgICBuZXh0UG9zaXRpb24gPSAwO1xuICAgIH1cblxuICAgIGlmIChuZXh0UG9zaXRpb24gPT09IHRoaXMucG9zaXRpb24pIHJldHVybjtcblxuICAgIGNvbnN0IGludmVyc2VQYXRjaGVzRm9yTmF2aWdhdGlvbiA9XG4gICAgICBzaG91bGRBcmNoaXZlICYmIF9hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBfYWxsUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcy5tYXAoKHBhdGNoLCBpbmRleCwgYWxsUGF0Y2hlcykgPT5cbiAgICAgICAgICAgIGluZGV4ID09PSBhbGxQYXRjaGVzLmxlbmd0aCAtIDEgPyBbLi4ucGF0Y2hdLnJldmVyc2UoKSA6IHBhdGNoXG4gICAgICAgICAgKVxuICAgICAgICA6IF9hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzO1xuXG4gICAgY29uc3QgcGF0Y2hlc1RvQXBwbHkgPSBiYWNrXG4gICAgICA/IGludmVyc2VQYXRjaGVzRm9yTmF2aWdhdGlvblxuICAgICAgICAgIC5zbGljZSgtdGhpcy5tYXhIaXN0b3J5KVxuICAgICAgICAgIC5zbGljZShuZXh0UG9zaXRpb24sIHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgIDogX2FsbFBhdGNoZXMucGF0Y2hlc1xuICAgICAgICAgIC5zbGljZSgtdGhpcy5tYXhIaXN0b3J5KVxuICAgICAgICAgIC5zbGljZSh0aGlzLnBvc2l0aW9uLCBuZXh0UG9zaXRpb24pXG4gICAgICAgICAgLmZsYXQoKTtcblxuICAgIC8vIENhbiBvbmx5IHVzZSBtdXRhYmxlIG1vZGUgaWY6XG4gICAgLy8gMS4gbXV0YWJsZSBtb2RlIGlzIGVuYWJsZWRcbiAgICAvLyAyLiBjdXJyZW50IHN0YXRlIGlzIGFuIG9iamVjdFxuICAgIC8vIDMuIHBhdGNoZXMgZG9uJ3QgY29udGFpbiByb290LWxldmVsIHJlcGxhY2VtZW50cyAod2hpY2ggY2hhbmdlIHRoZSBlbnRpcmUgc3RhdGUpXG4gICAgY29uc3QgY2FuR29NdXRhYmx5ID1cbiAgICAgIHRoaXMubXV0YWJsZSAmJlxuICAgICAgaXNPYmplY3RMaWtlKHRoaXMuc3RhdGUpICYmXG4gICAgICAhdGhpcy5oYXNSb290UmVwbGFjZW1lbnQocGF0Y2hlc1RvQXBwbHkpO1xuXG4gICAgaWYgKGNhbkdvTXV0YWJseSkge1xuICAgICAgLy8gRm9yIG9ic2VydmFibGUgc3RhdGU6IG11dGF0ZSBpbiBwbGFjZVxuICAgICAgYXBwbHkodGhpcy5zdGF0ZSBhcyBvYmplY3QsIHBhdGNoZXNUb0FwcGx5LCB7IG11dGFibGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBpbW11dGFibGUgc3RhdGUgb3IgcHJpbWl0aXZlIHR5cGVzOiBjcmVhdGUgbmV3IHN0YXRlXG4gICAgICB0aGlzLnN0YXRlID0gYXBwbHkodGhpcy5zdGF0ZSBhcyBvYmplY3QsIHBhdGNoZXNUb0FwcGx5KSBhcyBTO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSBuZXh0UG9zaXRpb247XG4gICAgdGhpcy5pbnZhbGlkYXRlSGlzdG9yeUNhY2hlKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCdnbycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIGJhY2sgaW4gdGhlIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyBiYWNrKGFtb3VudDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIHRoaXMuZ28odGhpcy5wb3NpdGlvbiAtIGFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogR28gZm9yd2FyZCBpbiB0aGUgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGZvcndhcmQoYW1vdW50OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgdGhpcy5nbyh0aGlzLnBvc2l0aW9uICsgYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0byB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNhblJlc2V0TXV0YWJseSA9XG4gICAgICB0aGlzLm11dGFibGUgJiZcbiAgICAgIGlzT2JqZWN0TGlrZSh0aGlzLnN0YXRlKSAmJlxuICAgICAgaXNPYmplY3RMaWtlKHRoaXMuaW5pdGlhbFN0YXRlKTtcblxuICAgIGlmIChjYW5SZXNldE11dGFibHkpIHtcbiAgICAgIC8vIEZvciBvYnNlcnZhYmxlIHN0YXRlOiB1c2UgcGF0Y2ggc3lzdGVtIHRvIHJlc2V0IHRvIGluaXRpYWwgc3RhdGVcbiAgICAgIC8vIEdlbmVyYXRlIHBhdGNoZXMgZnJvbSBjdXJyZW50IHN0YXRlIHRvIGluaXRpYWwgc3RhdGVcbiAgICAgIGNvbnN0IFssIHBhdGNoZXNdID0gY3JlYXRlKFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGRyYWZ0IGFzIG9iamVjdCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSAoZHJhZnQgYXMgYW55KVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZWVwIGNvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSBpbml0aWFsU3RhdGVcbiAgICAgICAgICBkZWVwQ2xvbmUodGhpcy5pbml0aWFsU3RhdGUsIGRyYWZ0KTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkcmFmdCkgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmluaXRpYWxTdGF0ZSkpIHtcbiAgICAgICAgICAgIChkcmFmdCBhcyBhbnlbXSkubGVuZ3RoID0gKHRoaXMuaW5pdGlhbFN0YXRlIGFzIGFueVtdKS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGFwcGx5KHRoaXMuc3RhdGUgYXMgb2JqZWN0LCBwYXRjaGVzLCB7IG11dGFibGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBpbW11dGFibGUgc3RhdGU6IHJlc3RvcmUgZnJvbSBhIHNuYXBzaG90IGNsb25lLlxuICAgICAgdGhpcy5zdGF0ZSA9IGNsb25lSW5pdGlhbFNuYXBzaG90KHRoaXMuaW5pdGlhbFN0YXRlKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5pbml0aWFsUG9zaXRpb247XG4gICAgdGhpcy5hbGxQYXRjaGVzID0gY2xvbmVUcmF2ZWxQYXRjaGVzKHRoaXMuaW5pdGlhbFBhdGNoZXMpO1xuICAgIHRoaXMuYWxsTWV0YWRhdGEgPSB0aGlzLmluaXRpYWxNZXRhZGF0YVxuICAgICAgPyBjbG9uZVRyYXZlbE1ldGFkYXRhTGlzdCh0aGlzLmluaXRpYWxNZXRhZGF0YSlcbiAgICAgIDogW107XG4gICAgdGhpcy50ZW1wUGF0Y2hlcyA9IGNsb25lVHJhdmVsUGF0Y2hlcygpO1xuICAgIHRoaXMudGVtcE1ldGFkYXRhID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5pbnZhbGlkYXRlSGlzdG9yeUNhY2hlKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCdyZXNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgaGlzdG9yeSBhbmQgbWFrZSB0aGUgY3VycmVudCBzdGF0ZSAoaW5jbHVkaW5nIGFueSB1bmFyY2hpdmVkIHRlbXAgcGF0Y2hlcykgYXMgdGhlIG5ldyBpbml0aWFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgZGVzdHJ1Y3RpdmUgb3BlcmF0aW9uIHRoYXQgZGlzY2FyZHMgYWxsIGhpc3RvcnkgYW5kIG92ZXJ3cml0ZXNcbiAgICogdGhlIGludGVybmFsIGJhc2VsaW5lLiBGdXR1cmUgYHJlc2V0KClgIGNhbGxzIHdpbGwgcmV0dXJuIHRvIHRoaXMgc25hcHNob3QuXG4gICAqL1xuICBwdWJsaWMgcmViYXNlKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbFN0YXRlID0gY2xvbmVJbml0aWFsU25hcHNob3QodGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSAwO1xuICAgIHRoaXMuaW5pdGlhbFBhdGNoZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5pbml0aWFsTWV0YWRhdGEgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB0aGlzLmFsbFBhdGNoZXMgPSBjbG9uZVRyYXZlbFBhdGNoZXMoKTtcbiAgICB0aGlzLmFsbE1ldGFkYXRhID0gW107XG4gICAgdGhpcy50ZW1wUGF0Y2hlcyA9IGNsb25lVHJhdmVsUGF0Y2hlcygpO1xuICAgIHRoaXMudGVtcE1ldGFkYXRhID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5pbnZhbGlkYXRlSGlzdG9yeUNhY2hlKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCdyZWJhc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIGdvIGJhY2tcbiAgICovXG4gIHB1YmxpYyBjYW5CYWNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBpdCdzIHBvc3NpYmxlIHRvIGdvIGZvcndhcmRcbiAgICovXG4gIHB1YmxpYyBjYW5Gb3J3YXJkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNob3VsZEFyY2hpdmUgPVxuICAgICAgIXRoaXMuYXV0b0FyY2hpdmUgJiYgISF0aGlzLnRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoO1xuICAgIGNvbnN0IF9hbGxQYXRjaGVzID0gdGhpcy5nZXRBbGxQYXRjaGVzKCk7XG5cbiAgICAvLyBUZW1wb3JhcnkgcGF0Y2hlcyByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3RhdGUsIG5vdCBhIGZ1dHVyZSBzdGF0ZVxuICAgIHJldHVybiBzaG91bGRBcmNoaXZlXG4gICAgICA/IHRoaXMucG9zaXRpb24gPCBfYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCAtIDFcbiAgICAgIDogdGhpcy5wb3NpdGlvbiA8IF9hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8gYXJjaGl2ZSB0aGUgY3VycmVudCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGNhbkFyY2hpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmF1dG9BcmNoaXZlICYmICEhdGhpcy50ZW1wUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyBnZXRQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0Y2hlcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgZ2V0UGF0Y2hlcygpOiBUcmF2ZWxQYXRjaGVzPFA+IHtcbiAgICBjb25zdCBzaG91bGRBcmNoaXZlID1cbiAgICAgICF0aGlzLmF1dG9BcmNoaXZlICYmICEhdGhpcy50ZW1wUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aDtcbiAgICBjb25zdCBwYXRjaFNvdXJjZSA9IHNob3VsZEFyY2hpdmUgPyB0aGlzLmdldEFsbFBhdGNoZXMoKSA6IHRoaXMuYWxsUGF0Y2hlcztcbiAgICByZXR1cm4gY2xvbmVUcmF2ZWxQYXRjaGVzKHBhdGNoU291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIGN1cnJlbnQgc3RhdGUsIHBhdGNoIGhpc3RvcnksIGFuZCBwb3NpdGlvbiBmb3IgcGVyc2lzdGVuY2UuXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCk6IFRyYXZlbHNTZXJpYWxpemVkSGlzdG9yeTxTLCBQPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246IFRSQVZFTFNfSElTVE9SWV9TQ0hFTUFfVkVSU0lPTixcbiAgICAgIHN0YXRlOiBjbG9uZUluaXRpYWxTbmFwc2hvdCh0aGlzLnN0YXRlKSxcbiAgICAgIHBhdGNoZXM6IHRoaXMuZ2V0UGF0Y2hlcygpLFxuICAgICAgcG9zaXRpb246IHRoaXMuZ2V0UG9zaXRpb24oKSxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLmdldE1ldGFkYXRhKCksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNZXRhZGF0YSgpOiBBcnJheTxUcmF2ZWxNZXRhZGF0YSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gYWxpZ25NZXRhZGF0YVRvUGF0Y2hDb3VudChcbiAgICAgIHRoaXMuYWxsTWV0YWRhdGEsXG4gICAgICB0aGlzLmFsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGhcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9BcmNoaXZlICYmIHRoaXMudGVtcFBhdGNoZXMucGF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgIG1ldGFkYXRhLnB1c2goY2xvbmVUcmF2ZWxNZXRhZGF0YSh0aGlzLnRlbXBNZXRhZGF0YSkpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaXN0b3J5RW50cmllcygpOiBUcmF2ZWxIaXN0b3J5RW50cnk8UD5bXSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRyaWVzKHRoaXMuZ2V0UGF0Y2hlcygpLCB0aGlzLmdldE1ldGFkYXRhKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29udHJvbHMgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udHJvbHMoKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHNDYWNoZSBhcyBBIGV4dGVuZHMgdHJ1ZVxuICAgICAgICA/IFJlYmFzYWJsZVRyYXZlbHNDb250cm9sczxTLCBGLCBQPlxuICAgICAgICA6IFJlYmFzYWJsZU1hbnVhbFRyYXZlbHNDb250cm9sczxTLCBGLCBQPjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBjb250cm9sczpcbiAgICAgIHwgUmViYXNhYmxlVHJhdmVsc0NvbnRyb2xzPFMsIEYsIFA+XG4gICAgICB8IFJlYmFzYWJsZU1hbnVhbFRyYXZlbHNDb250cm9sczxTLCBGLCBQPiA9IHtcbiAgICAgIGdldCBwb3NpdGlvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRQb3NpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIGdldEhpc3Rvcnk6ICgpID0+IHNlbGYuZ2V0SGlzdG9yeSgpIGFzIFZhbHVlPFMsIEY+W10sXG4gICAgICBnZXQgcGF0Y2hlcygpOiBUcmF2ZWxQYXRjaGVzPFA+IHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0UGF0Y2hlcygpO1xuICAgICAgfSxcbiAgICAgIGJhY2s6IChhbW91bnQ/OiBudW1iZXIpOiB2b2lkID0+IHNlbGYuYmFjayhhbW91bnQpLFxuICAgICAgZm9yd2FyZDogKGFtb3VudD86IG51bWJlcik6IHZvaWQgPT4gc2VsZi5mb3J3YXJkKGFtb3VudCksXG4gICAgICByZXNldDogKCk6IHZvaWQgPT4gc2VsZi5yZXNldCgpLFxuICAgICAgZ286IChwb3NpdGlvbjogbnVtYmVyKTogdm9pZCA9PiBzZWxmLmdvKHBvc2l0aW9uKSxcbiAgICAgIGNhbkJhY2s6ICgpOiBib29sZWFuID0+IHNlbGYuY2FuQmFjaygpLFxuICAgICAgY2FuRm9yd2FyZDogKCk6IGJvb2xlYW4gPT4gc2VsZi5jYW5Gb3J3YXJkKCksXG4gICAgICByZWJhc2U6ICgpOiB2b2lkID0+IHNlbGYucmViYXNlKCksXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5hdXRvQXJjaGl2ZSkge1xuICAgICAgKGNvbnRyb2xzIGFzIFJlYmFzYWJsZU1hbnVhbFRyYXZlbHNDb250cm9sczxTLCBGLCBQPikuYXJjaGl2ZSA9XG4gICAgICAgIChtZXRhZGF0YT86IFRyYXZlbE1ldGFkYXRhKTogdm9pZCA9PiBzZWxmLmFyY2hpdmUobWV0YWRhdGEpO1xuICAgICAgKGNvbnRyb2xzIGFzIFJlYmFzYWJsZU1hbnVhbFRyYXZlbHNDb250cm9sczxTLCBGLCBQPikuY2FuQXJjaGl2ZSA9XG4gICAgICAgICgpOiBib29sZWFuID0+IHNlbGYuY2FuQXJjaGl2ZSgpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGNvbnRyb2xzKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2xzQ2FjaGUgPSBjb250cm9scztcblxuICAgIHJldHVybiBjb250cm9scyBhcyBBIGV4dGVuZHMgdHJ1ZVxuICAgICAgPyBSZWJhc2FibGVUcmF2ZWxzQ29udHJvbHM8UywgRiwgUD5cbiAgICAgIDogUmViYXNhYmxlTWFudWFsVHJhdmVsc0NvbnRyb2xzPFMsIEYsIFA+O1xuICB9XG59XG4iXX0=","import { Travels } from './travels';\n/**\n * Create a new Travels instance\n */\nexport function createTravels(initialState, options = {}) {\n    return new Travels(initialState, options);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHJhdmVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jcmVhdGVUcmF2ZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUErQnBDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FLM0IsWUFBZSxFQUFFLFVBQW1DLEVBQUU7SUFDdEQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGF0Y2hlc09wdGlvbiwgVHJhdmVsc09wdGlvbnMgfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHsgVHJhdmVscyB9IGZyb20gJy4vdHJhdmVscyc7XG5cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgVHJhdmVscyBpbnN0YW5jZSB3aXRoIGF1dG8gYXJjaGl2ZSBtb2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmF2ZWxzPFxuICBTLFxuICBGIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBQIGV4dGVuZHMgUGF0Y2hlc09wdGlvbiA9IHt9LFxuPihcbiAgaW5pdGlhbFN0YXRlOiBTLFxuICBvcHRpb25zPzogT21pdDxUcmF2ZWxzT3B0aW9uczxGLCB0cnVlLCBQPiwgJ2F1dG9BcmNoaXZlJz4gJiB7XG4gICAgYXV0b0FyY2hpdmU/OiB0cnVlO1xuICB9XG4pOiBUcmF2ZWxzPFMsIEYsIHRydWUsIFA+O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBUcmF2ZWxzIGluc3RhbmNlIHdpdGggbWFudWFsIGFyY2hpdmUgbW9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHJhdmVsczxcbiAgUyxcbiAgRiBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgUCBleHRlbmRzIFBhdGNoZXNPcHRpb24gPSB7fSxcbj4oXG4gIGluaXRpYWxTdGF0ZTogUyxcbiAgb3B0aW9uczogT21pdDxUcmF2ZWxzT3B0aW9uczxGLCBmYWxzZSwgUD4sICdhdXRvQXJjaGl2ZSc+ICYge1xuICAgIGF1dG9BcmNoaXZlOiBmYWxzZTtcbiAgfVxuKTogVHJhdmVsczxTLCBGLCBmYWxzZSwgUD47XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IFRyYXZlbHMgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRyYXZlbHM8XG4gIFMsXG4gIEYgZXh0ZW5kcyBib29sZWFuLFxuICBBIGV4dGVuZHMgYm9vbGVhbixcbiAgUCBleHRlbmRzIFBhdGNoZXNPcHRpb24gPSB7fSxcbj4oaW5pdGlhbFN0YXRlOiBTLCBvcHRpb25zOiBUcmF2ZWxzT3B0aW9uczxGLCBBLCBQPiA9IHt9KTogVHJhdmVsczxTLCBGLCBBLCBQPiB7XG4gIHJldHVybiBuZXcgVHJhdmVscyhpbml0aWFsU3RhdGUsIG9wdGlvbnMpO1xufVxuIl19"],"names":["SuppressedError","TravelsPersistenceError","Error","constructor","code","message","options","super","this","name","cause","isObjectRecord","value","isValidMetadataEntry","entry","Array","isArray","isValidPatchOperation","operation","op","path","startsWith","every","segment","length","isRootPatchPath","key","Object","prototype","hasOwnProperty","call","isPatchHistoryEntries","getTravelPatchesValidationError","patches","patchHistory","inversePatches","normalizeSnapshot","snapshot","version","String","patchValidationError","position","Number","isFinite","isInteger","metadataInput","metadata","undefined","metadataEntries","map","state","deserializeTravelsHistory","input","_a","parsed","JSON","parse","error","parseSnapshotInput","migrated","migrate","persistenceError","onError","fallback","resolveFallback","findStateCompatibilityIssues","maxIssues","seen","WeakSet","issues","addIssue","segments","push","reduce","visit","current","has","add","Date","WeakMap","Map","mutable","forEach","entryValue","entryKey","concat","Set","index","Node","isDomNode","item","proto","getPrototypeOf","isPlainObjectOrNullProto","Reflect","ownKeys","TravelsError","isObjectLike","isPlainObject","tryStructuredClone","globalThis","structuredClone","deepCloneValue","get","cloned","set","i","getTime","structuredCloneValue","cloneTravelPatches","base","patch","cloneTravelMetadata","cloneTravelMetadataList","alignMetadataToPatchCount","count","from","_","deepClone","source","target","cloneInitialSnapshot","containsDraft","isDraft","objectValue","hasOnlyArrayIndices","keys","Travels","deserialize","initialState","_b","listeners","pendingState","pendingStateVersion","controlsCache","historyCache","historyVersion","mutableFallbackWarned","mutableRootReplaceWarned","stateCompatibilityWarningKeys","trackingPauseDepth","transactionDepth","subscribe","listener","delete","getState","maxHistory","history","initialPatches","inputInitialPatches","initialPosition","inputInitialPosition","strictInitialPatches","autoArchive","warnOnUnsupportedState","process","env","NODE_ENV","onBranchDiscard","devtools","patchesOptions","mutativeOptions","s","e","t","p","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__rest","console","warn","initialPatchesValidationError","getInitialPatchesValidationError","assign","enablePatches","warnAboutStateCompatibility","normalizedPatches","normalizedPosition","normalizedMetadata","normalizeInitialHistory","allPatches","allMetadata","initialMetadata","slice","tempPatches","tempMetadata","issue","total","alignedMetadata","historyLimit","invalidInitialPosition","clampedPosition","Math","max","min","trim","windowStart","windowEnd","trimmedBase","trimmed","adjustedPosition","invalidateHistoryCache","getEventPatches","size","getPatches","notify","eventPatches","emitDevtools","type","emitChange","reportError","travelsError","toEntries","discardFutureFrom","discardedPatches","discardedMetadata","splice","discarded","trimHistoryToMax","resetHistoryToCurrentState","hasRecordedHistory","_c","restoreStateFromSnapshot","create","draft","apply","captureTransactionSnapshot","restoreTransactionSnapshot","hasRootReplacement","some","setState","updater","nextPendingState","canUseMutableRoot","isFunctionUpdater","stateIsArray","updaterIsArray","canMutatePlainObjects","canMutateArrays","useMutable","nextState","ip","draftIsArray","valueIsArray","draftKeys","overwriteDraftWith","result","rawReturn","Promise","resolve","then","notLast","archivePending","archiveMetadata","pendingArchive","getPendingArchiveEntry","archive","transaction","metadataOrFn","maybeFn","fn","previousAutoArchive","previousMetadata","transactionMetadata","isRootTransaction","transactionSnapshot","failed","batch","pauseTracking","resumeTracking","replaceStateWithoutHistory","historyVersionBefore","stateToUse","archivedState","flat","reverse","getAllPatches","getHistory","currentState","_allPatches","futureHistory","pastHistory","freeze","go","nextPosition","trunc","shouldArchive","back","inversePatchesForNavigation","patchesToApply","amount","forward","reset","rebase","canBack","canForward","canArchive","getPosition","patchSource","serialize","getMetadata","getHistoryEntries","getControls","self","controls"],"mappings":"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","x_google_ignoreList":[0]}