HEX
Server: nginx/1.28.1
System: Linux VM-0-12-opencloudos 6.6.117-45.oc9.x86_64 #1 SMP Thu Dec 4 10:26:39 CST 2025 x86_64
User: www (1000)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot/www.waciwang.com/wp-content/plugins/gutenberg/build/scripts/core-data/index.js.map
{
  "version": 3,
  "sources": ["package-external:@wordpress/data", "../../../node_modules/fast-deep-equal/es6/index.js", "package-external:@wordpress/compose", "package-external:@wordpress/undo-manager", "../../../node_modules/equivalent-key-map/equivalent-key-map.js", "package-external:@wordpress/url", "package-external:@wordpress/api-fetch", "package-external:@wordpress/blocks", "package-external:@wordpress/i18n", "../../../node_modules/diff/dist/diff.js", "package-external:@wordpress/hooks", "package-external:@wordpress/rich-text", "package-external:@wordpress/deprecated", "package-external:@wordpress/private-apis", "package-external:@wordpress/html-entities", "package-external:@wordpress/element", "vendor-external:react/jsx-runtime", "package-external:@wordpress/warning", "package-external:@wordpress/block-editor", "../../../packages/core-data/src/index.js", "../../../packages/core-data/src/reducer.js", "../../../packages/core-data/src/utils/conservative-map-item.js", "../../../packages/core-data/src/utils/get-normalized-comma-separable.js", "../../../packages/core-data/src/utils/if-matching-action.js", "../../../packages/core-data/src/utils/forward-resolver.js", "../../../packages/core-data/src/utils/on-sub-key.js", "../../../packages/core-data/src/utils/replace-action.js", "../../../packages/core-data/src/utils/with-weak-map-cache.js", "../../../packages/core-data/src/utils/is-raw-attribute.js", "../../../packages/core-data/src/utils/set-nested-value.js", "../../../packages/core-data/src/utils/get-nested-value.js", "../../../packages/core-data/src/utils/is-numeric-id.js", "../../../packages/core-data/src/utils/user-permissions.js", "../../../packages/core-data/src/utils/receive-intermediate-results.js", "../../../packages/core-data/src/queried-data/actions.js", "../../../packages/core-data/src/queried-data/selectors.js", "../../../packages/core-data/src/queried-data/get-query-parts.js", "../../../packages/core-data/src/queried-data/reducer.js", "../../../node_modules/tslib/tslib.es6.mjs", "../../../node_modules/lower-case/src/index.ts", "../../../node_modules/no-case/src/index.ts", "../../../node_modules/pascal-case/src/index.ts", "../../../node_modules/camel-case/src/index.ts", "../../../node_modules/upper-case-first/src/index.ts", "../../../node_modules/capital-case/src/index.ts", "../../../packages/core-data/src/entities.js", "../../../node_modules/lib0/map.js", "../../../node_modules/lib0/set.js", "../../../node_modules/lib0/array.js", "../../../node_modules/lib0/observable.js", "../../../node_modules/lib0/math.js", "../../../node_modules/lib0/string.js", "../../../node_modules/lib0/conditions.js", "../../../node_modules/lib0/storage.js", "../../../node_modules/lib0/object.js", "../../../node_modules/lib0/function.js", "../../../node_modules/lib0/environment.js", "../../../node_modules/lib0/binary.js", "../../../node_modules/lib0/number.js", "../../../node_modules/lib0/error.js", "../../../node_modules/lib0/decoding.js", "../../../node_modules/lib0/buffer.js", "../../../node_modules/lib0/encoding.js", "../../../node_modules/lib0/webcrypto.js", "../../../node_modules/lib0/random.js", "../../../node_modules/lib0/time.js", "../../../node_modules/lib0/promise.js", "../../../node_modules/lib0/pair.js", "../../../node_modules/lib0/dom.js", "../../../node_modules/lib0/symbol.js", "../../../node_modules/lib0/logging.common.js", "../../../node_modules/lib0/logging.js", "../../../node_modules/lib0/iterator.js", "../../../node_modules/yjs/src/utils/AbstractConnector.js", "../../../node_modules/yjs/src/utils/DeleteSet.js", "../../../node_modules/yjs/src/utils/Doc.js", "../../../node_modules/yjs/src/utils/UpdateDecoder.js", "../../../node_modules/yjs/src/utils/UpdateEncoder.js", "../../../node_modules/yjs/src/utils/encoding.js", "../../../node_modules/yjs/src/utils/EventHandler.js", "../../../node_modules/yjs/src/utils/ID.js", "../../../node_modules/yjs/src/utils/isParentOf.js", "../../../node_modules/yjs/src/utils/logging.js", "../../../node_modules/yjs/src/utils/PermanentUserData.js", "../../../node_modules/yjs/src/utils/RelativePosition.js", "../../../node_modules/yjs/src/utils/Snapshot.js", "../../../node_modules/yjs/src/utils/StructStore.js", "../../../node_modules/yjs/src/utils/Transaction.js", "../../../node_modules/yjs/src/utils/UndoManager.js", "../../../node_modules/yjs/src/utils/updates.js", "../../../node_modules/yjs/src/utils/YEvent.js", "../../../node_modules/yjs/src/types/AbstractType.js", "../../../node_modules/yjs/src/types/YArray.js", "../../../node_modules/yjs/src/types/YMap.js", "../../../node_modules/yjs/src/types/YText.js", "../../../node_modules/yjs/src/types/YXmlFragment.js", "../../../node_modules/yjs/src/types/YXmlElement.js", "../../../node_modules/yjs/src/types/YXmlEvent.js", "../../../node_modules/yjs/src/types/YXmlHook.js", "../../../node_modules/yjs/src/types/YXmlText.js", "../../../node_modules/yjs/src/structs/AbstractStruct.js", "../../../node_modules/yjs/src/structs/GC.js", "../../../node_modules/yjs/src/structs/ContentBinary.js", "../../../node_modules/yjs/src/structs/ContentDeleted.js", "../../../node_modules/yjs/src/structs/ContentDoc.js", "../../../node_modules/yjs/src/structs/ContentEmbed.js", "../../../node_modules/yjs/src/structs/ContentFormat.js", "../../../node_modules/yjs/src/structs/ContentJSON.js", "../../../node_modules/yjs/src/structs/ContentAny.js", "../../../node_modules/yjs/src/structs/ContentString.js", "../../../node_modules/yjs/src/structs/ContentType.js", "../../../node_modules/yjs/src/structs/Item.js", "../../../node_modules/yjs/src/structs/Skip.js", "../../../node_modules/yjs/src/index.js", "../../../packages/sync/src/quill-delta/Delta.ts", "../../../packages/sync/src/quill-delta/AttributeMap.ts", "../../../packages/sync/src/quill-delta/Op.ts", "../../../packages/sync/src/quill-delta/OpIterator.ts", "../../../packages/sync/src/config.ts", "../../../packages/sync/src/utils.ts", "../../../packages/sync/src/persistence.ts", "../../../packages/sync/src/providers/index.ts", "../../../packages/sync/src/y-utilities/y-multidoc-undomanager.js", "../../../packages/sync/src/undo-manager.ts", "../../../node_modules/y-protocols/awareness.js", "../../../packages/sync/src/awareness/awareness-types.ts", "../../../packages/sync/src/awareness/awareness-state.ts", "../../../packages/sync/src/awareness/post-editor-awareness-state.ts", "../../../packages/sync/src/awareness/awareness-manager.ts", "../../../packages/sync/src/manager.ts", "../../../packages/core-data/src/sync.ts", "../../../packages/core-data/src/utils/crdt.ts", "../../../node_modules/uuid/dist/esm-browser/rng.js", "../../../node_modules/uuid/dist/esm-browser/stringify.js", "../../../node_modules/uuid/dist/esm-browser/native.js", "../../../node_modules/uuid/dist/esm-browser/v4.js", "../../../packages/core-data/src/utils/crdt-blocks.ts", "../../../packages/core-data/src/utils/crdt-utils.ts", "../../../packages/core-data/src/selectors.ts", "../../../packages/core-data/src/name.js", "../../../packages/core-data/src/private-selectors.ts", "../../../packages/core-data/src/lock-unlock.ts", "../../../packages/core-data/src/utils/log-entity-deprecation.ts", "../../../packages/core-data/src/actions.js", "../../../packages/core-data/src/batch/default-processor.js", "../../../packages/core-data/src/batch/create-batch.js", "../../../packages/core-data/src/private-actions.js", "../../../packages/core-data/src/resolvers.js", "../../../packages/core-data/src/fetch/index.js", "../../../packages/core-data/src/fetch/__experimental-fetch-link-suggestions.ts", "../../../packages/core-data/src/fetch/__experimental-fetch-url-data.js", "../../../packages/core-data/src/locks/utils.js", "../../../packages/core-data/src/locks/reducer.js", "../../../packages/core-data/src/locks/selectors.js", "../../../packages/core-data/src/locks/engine.js", "../../../packages/core-data/src/locks/actions.js", "../../../packages/core-data/src/dynamic-entities.ts", "../../../packages/core-data/src/entity-provider.js", "../../../packages/core-data/src/entity-context.js", "../../../packages/core-data/src/hooks/use-entity-record.ts", "../../../packages/core-data/src/hooks/use-query-select.ts", "../../../node_modules/memize/dist/index.js", "../../../packages/core-data/src/hooks/memoize.js", "../../../packages/core-data/src/hooks/constants.ts", "../../../packages/core-data/src/hooks/use-entity-records.ts", "../../../packages/core-data/src/hooks/use-resource-permissions.ts", "../../../packages/core-data/src/hooks/use-entity-block-editor.js", "../../../packages/core-data/src/hooks/use-entity-id.js", "../../../packages/core-data/src/footnotes/index.js", "../../../packages/core-data/src/footnotes/get-rich-text-values-cached.js", "../../../packages/core-data/src/footnotes/get-footnotes-order.js", "../../../packages/core-data/src/hooks/use-entity-prop.js", "../../../packages/core-data/src/private-apis.js"],
  "sourcesContent": ["module.exports = window.wp.data;", "'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';\n\n\nmodule.exports = function equal(a, b) {\n  if (a === b) return true;\n\n  if (a && b && typeof a == 'object' && typeof b == 'object') {\n    if (a.constructor !== b.constructor) return false;\n\n    var length, i, keys;\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0;)\n        if (!equal(a[i], b[i])) return false;\n      return true;\n    }\n\n\n    if ((a instanceof Map) && (b instanceof Map)) {\n      if (a.size !== b.size) return false;\n      for (i of a.entries())\n        if (!b.has(i[0])) return false;\n      for (i of a.entries())\n        if (!equal(i[1], b.get(i[0]))) return false;\n      return true;\n    }\n\n    if ((a instanceof Set) && (b instanceof Set)) {\n      if (a.size !== b.size) return false;\n      for (i of a.entries())\n        if (!b.has(i[0])) return false;\n      return true;\n    }\n\n    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0;)\n        if (a[i] !== b[i]) return false;\n      return true;\n    }\n\n\n    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) return false;\n\n    for (i = length; i-- !== 0;)\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n    for (i = length; i-- !== 0;) {\n      var key = keys[i];\n\n      if (!equal(a[key], b[key])) return false;\n    }\n\n    return true;\n  }\n\n  // true if both NaN, false otherwise\n  return a!==a && b!==b;\n};\n", "module.exports = window.wp.compose;", "module.exports = window.wp.undoManager;", "'use strict';\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\n/**\n * Given an instance of EquivalentKeyMap, returns its internal value pair tuple\n * for a key, if one exists. The tuple members consist of the last reference\n * value for the key (used in efficient subsequent lookups) and the value\n * assigned for the key at the leaf node.\n *\n * @param {EquivalentKeyMap} instance EquivalentKeyMap instance.\n * @param {*} key                     The key for which to return value pair.\n *\n * @return {?Array} Value pair, if exists.\n */\nfunction getValuePair(instance, key) {\n  var _map = instance._map,\n      _arrayTreeMap = instance._arrayTreeMap,\n      _objectTreeMap = instance._objectTreeMap; // Map keeps a reference to the last object-like key used to set the\n  // value, which can be used to shortcut immediately to the value.\n\n  if (_map.has(key)) {\n    return _map.get(key);\n  } // Sort keys to ensure stable retrieval from tree.\n\n\n  var properties = Object.keys(key).sort(); // Tree by type to avoid conflicts on numeric object keys, empty value.\n\n  var map = Array.isArray(key) ? _arrayTreeMap : _objectTreeMap;\n\n  for (var i = 0; i < properties.length; i++) {\n    var property = properties[i];\n    map = map.get(property);\n\n    if (map === undefined) {\n      return;\n    }\n\n    var propertyValue = key[property];\n    map = map.get(propertyValue);\n\n    if (map === undefined) {\n      return;\n    }\n  }\n\n  var valuePair = map.get('_ekm_value');\n\n  if (!valuePair) {\n    return;\n  } // If reached, it implies that an object-like key was set with another\n  // reference, so delete the reference and replace with the current.\n\n\n  _map.delete(valuePair[0]);\n\n  valuePair[0] = key;\n  map.set('_ekm_value', valuePair);\n\n  _map.set(key, valuePair);\n\n  return valuePair;\n}\n/**\n * Variant of a Map object which enables lookup by equivalent (deeply equal)\n * object and array keys.\n */\n\n\nvar EquivalentKeyMap =\n/*#__PURE__*/\nfunction () {\n  /**\n   * Constructs a new instance of EquivalentKeyMap.\n   *\n   * @param {Iterable.<*>} iterable Initial pair of key, value for map.\n   */\n  function EquivalentKeyMap(iterable) {\n    _classCallCheck(this, EquivalentKeyMap);\n\n    this.clear();\n\n    if (iterable instanceof EquivalentKeyMap) {\n      // Map#forEach is only means of iterating with support for IE11.\n      var iterablePairs = [];\n      iterable.forEach(function (value, key) {\n        iterablePairs.push([key, value]);\n      });\n      iterable = iterablePairs;\n    }\n\n    if (iterable != null) {\n      for (var i = 0; i < iterable.length; i++) {\n        this.set(iterable[i][0], iterable[i][1]);\n      }\n    }\n  }\n  /**\n   * Accessor property returning the number of elements.\n   *\n   * @return {number} Number of elements.\n   */\n\n\n  _createClass(EquivalentKeyMap, [{\n    key: \"set\",\n\n    /**\n     * Add or update an element with a specified key and value.\n     *\n     * @param {*} key   The key of the element to add.\n     * @param {*} value The value of the element to add.\n     *\n     * @return {EquivalentKeyMap} Map instance.\n     */\n    value: function set(key, value) {\n      // Shortcut non-object-like to set on internal Map.\n      if (key === null || _typeof(key) !== 'object') {\n        this._map.set(key, value);\n\n        return this;\n      } // Sort keys to ensure stable assignment into tree.\n\n\n      var properties = Object.keys(key).sort();\n      var valuePair = [key, value]; // Tree by type to avoid conflicts on numeric object keys, empty value.\n\n      var map = Array.isArray(key) ? this._arrayTreeMap : this._objectTreeMap;\n\n      for (var i = 0; i < properties.length; i++) {\n        var property = properties[i];\n\n        if (!map.has(property)) {\n          map.set(property, new EquivalentKeyMap());\n        }\n\n        map = map.get(property);\n        var propertyValue = key[property];\n\n        if (!map.has(propertyValue)) {\n          map.set(propertyValue, new EquivalentKeyMap());\n        }\n\n        map = map.get(propertyValue);\n      } // If an _ekm_value exists, there was already an equivalent key. Before\n      // overriding, ensure that the old key reference is removed from map to\n      // avoid memory leak of accumulating equivalent keys. This is, in a\n      // sense, a poor man's WeakMap, while still enabling iterability.\n\n\n      var previousValuePair = map.get('_ekm_value');\n\n      if (previousValuePair) {\n        this._map.delete(previousValuePair[0]);\n      }\n\n      map.set('_ekm_value', valuePair);\n\n      this._map.set(key, valuePair);\n\n      return this;\n    }\n    /**\n     * Returns a specified element.\n     *\n     * @param {*} key The key of the element to return.\n     *\n     * @return {?*} The element associated with the specified key or undefined\n     *              if the key can't be found.\n     */\n\n  }, {\n    key: \"get\",\n    value: function get(key) {\n      // Shortcut non-object-like to get from internal Map.\n      if (key === null || _typeof(key) !== 'object') {\n        return this._map.get(key);\n      }\n\n      var valuePair = getValuePair(this, key);\n\n      if (valuePair) {\n        return valuePair[1];\n      }\n    }\n    /**\n     * Returns a boolean indicating whether an element with the specified key\n     * exists or not.\n     *\n     * @param {*} key The key of the element to test for presence.\n     *\n     * @return {boolean} Whether an element with the specified key exists.\n     */\n\n  }, {\n    key: \"has\",\n    value: function has(key) {\n      if (key === null || _typeof(key) !== 'object') {\n        return this._map.has(key);\n      } // Test on the _presence_ of the pair, not its value, as even undefined\n      // can be a valid member value for a key.\n\n\n      return getValuePair(this, key) !== undefined;\n    }\n    /**\n     * Removes the specified element.\n     *\n     * @param {*} key The key of the element to remove.\n     *\n     * @return {boolean} Returns true if an element existed and has been\n     *                   removed, or false if the element does not exist.\n     */\n\n  }, {\n    key: \"delete\",\n    value: function _delete(key) {\n      if (!this.has(key)) {\n        return false;\n      } // This naive implementation will leave orphaned child trees. A better\n      // implementation should traverse and remove orphans.\n\n\n      this.set(key, undefined);\n      return true;\n    }\n    /**\n     * Executes a provided function once per each key/value pair, in insertion\n     * order.\n     *\n     * @param {Function} callback Function to execute for each element.\n     * @param {*}        thisArg  Value to use as `this` when executing\n     *                            `callback`.\n     */\n\n  }, {\n    key: \"forEach\",\n    value: function forEach(callback) {\n      var _this = this;\n\n      var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this;\n\n      this._map.forEach(function (value, key) {\n        // Unwrap value from object-like value pair.\n        if (key !== null && _typeof(key) === 'object') {\n          value = value[1];\n        }\n\n        callback.call(thisArg, value, key, _this);\n      });\n    }\n    /**\n     * Removes all elements.\n     */\n\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      this._map = new Map();\n      this._arrayTreeMap = new Map();\n      this._objectTreeMap = new Map();\n    }\n  }, {\n    key: \"size\",\n    get: function get() {\n      return this._map.size;\n    }\n  }]);\n\n  return EquivalentKeyMap;\n}();\n\nmodule.exports = EquivalentKeyMap;\n", "module.exports = window.wp.url;", "module.exports = window.wp.apiFetch;", "module.exports = window.wp.blocks;", "module.exports = window.wp.i18n;", "/*!\n\n diff v4.0.1\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n  copyright notice, this list of conditions and the\n  following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n  copyright notice, this list of conditions and the\n  following disclaimer in the documentation and/or other\n  materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n  contributors may be used to endorse or promote products\n  derived from this software without specific prior\n  written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n@license\n*/\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = global || self, factory(global.Diff = {}));\n}(this, function (exports) { 'use strict';\n\n  function Diff() {}\n  Diff.prototype = {\n    diff: function diff(oldString, newString) {\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var callback = options.callback;\n\n      if (typeof options === 'function') {\n        callback = options;\n        options = {};\n      }\n\n      this.options = options;\n      var self = this;\n\n      function done(value) {\n        if (callback) {\n          setTimeout(function () {\n            callback(undefined, value);\n          }, 0);\n          return true;\n        } else {\n          return value;\n        }\n      } // Allow subclasses to massage the input prior to running\n\n\n      oldString = this.castInput(oldString);\n      newString = this.castInput(newString);\n      oldString = this.removeEmpty(this.tokenize(oldString));\n      newString = this.removeEmpty(this.tokenize(newString));\n      var newLen = newString.length,\n          oldLen = oldString.length;\n      var editLength = 1;\n      var maxEditLength = newLen + oldLen;\n      var bestPath = [{\n        newPos: -1,\n        components: []\n      }]; // Seed editLength = 0, i.e. the content starts with the same values\n\n      var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n\n      if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n        // Identity per the equality and tokenizer\n        return done([{\n          value: this.join(newString),\n          count: newString.length\n        }]);\n      } // Main worker method. checks all permutations of a given edit length for acceptance.\n\n\n      function execEditLength() {\n        for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n          var basePath = void 0;\n\n          var addPath = bestPath[diagonalPath - 1],\n              removePath = bestPath[diagonalPath + 1],\n              _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n\n          if (addPath) {\n            // No one else is going to attempt to use this value, clear it\n            bestPath[diagonalPath - 1] = undefined;\n          }\n\n          var canAdd = addPath && addPath.newPos + 1 < newLen,\n              canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n\n          if (!canAdd && !canRemove) {\n            // If this path is a terminal then prune\n            bestPath[diagonalPath] = undefined;\n            continue;\n          } // Select the diagonal that we want to branch from. We select the prior\n          // path whose position in the new string is the farthest from the origin\n          // and does not pass the bounds of the diff graph\n\n\n          if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n            basePath = clonePath(removePath);\n            self.pushComponent(basePath.components, undefined, true);\n          } else {\n            basePath = addPath; // No need to clone, we've pulled it from the list\n\n            basePath.newPos++;\n            self.pushComponent(basePath.components, true, undefined);\n          }\n\n          _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done\n\n          if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n            return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n          } else {\n            // Otherwise track this path as a potential candidate and continue.\n            bestPath[diagonalPath] = basePath;\n          }\n        }\n\n        editLength++;\n      } // Performs the length of edit iteration. Is a bit fugly as this has to support the\n      // sync and async mode which is never fun. Loops over execEditLength until a value\n      // is produced.\n\n\n      if (callback) {\n        (function exec() {\n          setTimeout(function () {\n            // This should not happen, but we want to be safe.\n\n            /* istanbul ignore next */\n            if (editLength > maxEditLength) {\n              return callback();\n            }\n\n            if (!execEditLength()) {\n              exec();\n            }\n          }, 0);\n        })();\n      } else {\n        while (editLength <= maxEditLength) {\n          var ret = execEditLength();\n\n          if (ret) {\n            return ret;\n          }\n        }\n      }\n    },\n    pushComponent: function pushComponent(components, added, removed) {\n      var last = components[components.length - 1];\n\n      if (last && last.added === added && last.removed === removed) {\n        // We need to clone here as the component clone operation is just\n        // as shallow array clone\n        components[components.length - 1] = {\n          count: last.count + 1,\n          added: added,\n          removed: removed\n        };\n      } else {\n        components.push({\n          count: 1,\n          added: added,\n          removed: removed\n        });\n      }\n    },\n    extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n      var newLen = newString.length,\n          oldLen = oldString.length,\n          newPos = basePath.newPos,\n          oldPos = newPos - diagonalPath,\n          commonCount = 0;\n\n      while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n        newPos++;\n        oldPos++;\n        commonCount++;\n      }\n\n      if (commonCount) {\n        basePath.components.push({\n          count: commonCount\n        });\n      }\n\n      basePath.newPos = newPos;\n      return oldPos;\n    },\n    equals: function equals(left, right) {\n      if (this.options.comparator) {\n        return this.options.comparator(left, right);\n      } else {\n        return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n      }\n    },\n    removeEmpty: function removeEmpty(array) {\n      var ret = [];\n\n      for (var i = 0; i < array.length; i++) {\n        if (array[i]) {\n          ret.push(array[i]);\n        }\n      }\n\n      return ret;\n    },\n    castInput: function castInput(value) {\n      return value;\n    },\n    tokenize: function tokenize(value) {\n      return value.split('');\n    },\n    join: function join(chars) {\n      return chars.join('');\n    }\n  };\n\n  function buildValues(diff, components, newString, oldString, useLongestToken) {\n    var componentPos = 0,\n        componentLen = components.length,\n        newPos = 0,\n        oldPos = 0;\n\n    for (; componentPos < componentLen; componentPos++) {\n      var component = components[componentPos];\n\n      if (!component.removed) {\n        if (!component.added && useLongestToken) {\n          var value = newString.slice(newPos, newPos + component.count);\n          value = value.map(function (value, i) {\n            var oldValue = oldString[oldPos + i];\n            return oldValue.length > value.length ? oldValue : value;\n          });\n          component.value = diff.join(value);\n        } else {\n          component.value = diff.join(newString.slice(newPos, newPos + component.count));\n        }\n\n        newPos += component.count; // Common case\n\n        if (!component.added) {\n          oldPos += component.count;\n        }\n      } else {\n        component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n        oldPos += component.count; // Reverse add and remove so removes are output first to match common convention\n        // The diffing algorithm is tied to add then remove output and this is the simplest\n        // route to get the desired output with minimal overhead.\n\n        if (componentPos && components[componentPos - 1].added) {\n          var tmp = components[componentPos - 1];\n          components[componentPos - 1] = components[componentPos];\n          components[componentPos] = tmp;\n        }\n      }\n    } // Special case handle for when one terminal is ignored (i.e. whitespace).\n    // For this case we merge the terminal into the prior string and drop the change.\n    // This is only available for string mode.\n\n\n    var lastComponent = components[componentLen - 1];\n\n    if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\n      components[componentLen - 2].value += lastComponent.value;\n      components.pop();\n    }\n\n    return components;\n  }\n\n  function clonePath(path) {\n    return {\n      newPos: path.newPos,\n      components: path.components.slice(0)\n    };\n  }\n\n  var characterDiff = new Diff();\n  function diffChars(oldStr, newStr, options) {\n    return characterDiff.diff(oldStr, newStr, options);\n  }\n\n  function generateOptions(options, defaults) {\n    if (typeof options === 'function') {\n      defaults.callback = options;\n    } else if (options) {\n      for (var name in options) {\n        /* istanbul ignore else */\n        if (options.hasOwnProperty(name)) {\n          defaults[name] = options[name];\n        }\n      }\n    }\n\n    return defaults;\n  }\n\n  //\n  // Ranges and exceptions:\n  // Latin-1 Supplement, 0080\u201300FF\n  //  - U+00D7  \u00D7 Multiplication sign\n  //  - U+00F7  \u00F7 Division sign\n  // Latin Extended-A, 0100\u2013017F\n  // Latin Extended-B, 0180\u2013024F\n  // IPA Extensions, 0250\u201302AF\n  // Spacing Modifier Letters, 02B0\u201302FF\n  //  - U+02C7  \u02C7 &#711;  Caron\n  //  - U+02D8  \u02D8 &#728;  Breve\n  //  - U+02D9  \u02D9 &#729;  Dot Above\n  //  - U+02DA  \u02DA &#730;  Ring Above\n  //  - U+02DB  \u02DB &#731;  Ogonek\n  //  - U+02DC  \u02DC &#732;  Small Tilde\n  //  - U+02DD  \u02DD &#733;  Double Acute Accent\n  // Latin Extended Additional, 1E00\u20131EFF\n\n  var extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\n  var reWhitespace = /\\S/;\n  var wordDiff = new Diff();\n\n  wordDiff.equals = function (left, right) {\n    if (this.options.ignoreCase) {\n      left = left.toLowerCase();\n      right = right.toLowerCase();\n    }\n\n    return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n  };\n\n  wordDiff.tokenize = function (value) {\n    var tokens = value.split(/(\\s+|[()[\\]{}'\"]|\\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\n\n    for (var i = 0; i < tokens.length - 1; i++) {\n      // If we have an empty string in the next field and we have only word chars before and after, merge\n      if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n        tokens[i] += tokens[i + 2];\n        tokens.splice(i + 1, 2);\n        i--;\n      }\n    }\n\n    return tokens;\n  };\n\n  function diffWords(oldStr, newStr, options) {\n    options = generateOptions(options, {\n      ignoreWhitespace: true\n    });\n    return wordDiff.diff(oldStr, newStr, options);\n  }\n  function diffWordsWithSpace(oldStr, newStr, options) {\n    return wordDiff.diff(oldStr, newStr, options);\n  }\n\n  var lineDiff = new Diff();\n\n  lineDiff.tokenize = function (value) {\n    var retLines = [],\n        linesAndNewlines = value.split(/(\\n|\\r\\n)/); // Ignore the final empty token that occurs if the string ends with a new line\n\n    if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n      linesAndNewlines.pop();\n    } // Merge the content and line separators into single tokens\n\n\n    for (var i = 0; i < linesAndNewlines.length; i++) {\n      var line = linesAndNewlines[i];\n\n      if (i % 2 && !this.options.newlineIsToken) {\n        retLines[retLines.length - 1] += line;\n      } else {\n        if (this.options.ignoreWhitespace) {\n          line = line.trim();\n        }\n\n        retLines.push(line);\n      }\n    }\n\n    return retLines;\n  };\n\n  function diffLines(oldStr, newStr, callback) {\n    return lineDiff.diff(oldStr, newStr, callback);\n  }\n  function diffTrimmedLines(oldStr, newStr, callback) {\n    var options = generateOptions(callback, {\n      ignoreWhitespace: true\n    });\n    return lineDiff.diff(oldStr, newStr, options);\n  }\n\n  var sentenceDiff = new Diff();\n\n  sentenceDiff.tokenize = function (value) {\n    return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n  };\n\n  function diffSentences(oldStr, newStr, callback) {\n    return sentenceDiff.diff(oldStr, newStr, callback);\n  }\n\n  var cssDiff = new Diff();\n\n  cssDiff.tokenize = function (value) {\n    return value.split(/([{}:;,]|\\s+)/);\n  };\n\n  function diffCss(oldStr, newStr, callback) {\n    return cssDiff.diff(oldStr, newStr, callback);\n  }\n\n  function _typeof(obj) {\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n  }\n\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) {\n      for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n      return arr2;\n    }\n  }\n\n  function _iterableToArray(iter) {\n    if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n  }\n\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n  }\n\n  var objectPrototypeToString = Object.prototype.toString;\n  var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n  // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n\n  jsonDiff.useLongestToken = true;\n  jsonDiff.tokenize = lineDiff.tokenize;\n\n  jsonDiff.castInput = function (value) {\n    var _this$options = this.options,\n        undefinedReplacement = _this$options.undefinedReplacement,\n        _this$options$stringi = _this$options.stringifyReplacer,\n        stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) {\n      return typeof v === 'undefined' ? undefinedReplacement : v;\n    } : _this$options$stringi;\n    return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, '  ');\n  };\n\n  jsonDiff.equals = function (left, right) {\n    return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'));\n  };\n\n  function diffJson(oldObj, newObj, options) {\n    return jsonDiff.diff(oldObj, newObj, options);\n  } // This function handles the presence of circular references by bailing out when encountering an\n  // object that is already on the \"stack\" of items being processed. Accepts an optional replacer\n\n  function canonicalize(obj, stack, replacementStack, replacer, key) {\n    stack = stack || [];\n    replacementStack = replacementStack || [];\n\n    if (replacer) {\n      obj = replacer(key, obj);\n    }\n\n    var i;\n\n    for (i = 0; i < stack.length; i += 1) {\n      if (stack[i] === obj) {\n        return replacementStack[i];\n      }\n    }\n\n    var canonicalizedObj;\n\n    if ('[object Array]' === objectPrototypeToString.call(obj)) {\n      stack.push(obj);\n      canonicalizedObj = new Array(obj.length);\n      replacementStack.push(canonicalizedObj);\n\n      for (i = 0; i < obj.length; i += 1) {\n        canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\n      }\n\n      stack.pop();\n      replacementStack.pop();\n      return canonicalizedObj;\n    }\n\n    if (obj && obj.toJSON) {\n      obj = obj.toJSON();\n    }\n\n    if (_typeof(obj) === 'object' && obj !== null) {\n      stack.push(obj);\n      canonicalizedObj = {};\n      replacementStack.push(canonicalizedObj);\n\n      var sortedKeys = [],\n          _key;\n\n      for (_key in obj) {\n        /* istanbul ignore else */\n        if (obj.hasOwnProperty(_key)) {\n          sortedKeys.push(_key);\n        }\n      }\n\n      sortedKeys.sort();\n\n      for (i = 0; i < sortedKeys.length; i += 1) {\n        _key = sortedKeys[i];\n        canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\n      }\n\n      stack.pop();\n      replacementStack.pop();\n    } else {\n      canonicalizedObj = obj;\n    }\n\n    return canonicalizedObj;\n  }\n\n  var arrayDiff = new Diff();\n\n  arrayDiff.tokenize = function (value) {\n    return value.slice();\n  };\n\n  arrayDiff.join = arrayDiff.removeEmpty = function (value) {\n    return value;\n  };\n\n  function diffArrays(oldArr, newArr, callback) {\n    return arrayDiff.diff(oldArr, newArr, callback);\n  }\n\n  function parsePatch(uniDiff) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n        delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n        list = [],\n        i = 0;\n\n    function parseIndex() {\n      var index = {};\n      list.push(index); // Parse diff metadata\n\n      while (i < diffstr.length) {\n        var line = diffstr[i]; // File header found, end parsing diff metadata\n\n        if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n          break;\n        } // Diff index\n\n\n        var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n\n        if (header) {\n          index.index = header[1];\n        }\n\n        i++;\n      } // Parse file headers if they are defined. Unified diff requires them, but\n      // there's no technical issues to have an isolated hunk without file header\n\n\n      parseFileHeader(index);\n      parseFileHeader(index); // Parse hunks\n\n      index.hunks = [];\n\n      while (i < diffstr.length) {\n        var _line = diffstr[i];\n\n        if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n          break;\n        } else if (/^@@/.test(_line)) {\n          index.hunks.push(parseHunk());\n        } else if (_line && options.strict) {\n          // Ignore unexpected content unless in strict mode\n          throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\n        } else {\n          i++;\n        }\n      }\n    } // Parses the --- and +++ headers, if none are found, no lines\n    // are consumed.\n\n\n    function parseFileHeader(index) {\n      var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\n\n      if (fileHeader) {\n        var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\n        var data = fileHeader[2].split('\\t', 2);\n        var fileName = data[0].replace(/\\\\\\\\/g, '\\\\');\n\n        if (/^\".*\"$/.test(fileName)) {\n          fileName = fileName.substr(1, fileName.length - 2);\n        }\n\n        index[keyPrefix + 'FileName'] = fileName;\n        index[keyPrefix + 'Header'] = (data[1] || '').trim();\n        i++;\n      }\n    } // Parses a hunk\n    // This assumes that we are at the start of a hunk.\n\n\n    function parseHunk() {\n      var chunkHeaderIndex = i,\n          chunkHeaderLine = diffstr[i++],\n          chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n      var hunk = {\n        oldStart: +chunkHeader[1],\n        oldLines: +chunkHeader[2] || 1,\n        newStart: +chunkHeader[3],\n        newLines: +chunkHeader[4] || 1,\n        lines: [],\n        linedelimiters: []\n      };\n      var addCount = 0,\n          removeCount = 0;\n\n      for (; i < diffstr.length; i++) {\n        // Lines starting with '---' could be mistaken for the \"remove line\" operation\n        // But they could be the header for the next file. Therefore prune such cases out.\n        if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\n          break;\n        }\n\n        var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];\n\n        if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n          hunk.lines.push(diffstr[i]);\n          hunk.linedelimiters.push(delimiters[i] || '\\n');\n\n          if (operation === '+') {\n            addCount++;\n          } else if (operation === '-') {\n            removeCount++;\n          } else if (operation === ' ') {\n            addCount++;\n            removeCount++;\n          }\n        } else {\n          break;\n        }\n      } // Handle the empty block count case\n\n\n      if (!addCount && hunk.newLines === 1) {\n        hunk.newLines = 0;\n      }\n\n      if (!removeCount && hunk.oldLines === 1) {\n        hunk.oldLines = 0;\n      } // Perform optional sanity checking\n\n\n      if (options.strict) {\n        if (addCount !== hunk.newLines) {\n          throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n        }\n\n        if (removeCount !== hunk.oldLines) {\n          throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n        }\n      }\n\n      return hunk;\n    }\n\n    while (i < diffstr.length) {\n      parseIndex();\n    }\n\n    return list;\n  }\n\n  // Iterator that traverses in the range of [min, max], stepping\n  // by distance from a given start position. I.e. for [0, 4], with\n  // start of 2, this will iterate 2, 3, 1, 4, 0.\n  function distanceIterator (start, minLine, maxLine) {\n    var wantForward = true,\n        backwardExhausted = false,\n        forwardExhausted = false,\n        localOffset = 1;\n    return function iterator() {\n      if (wantForward && !forwardExhausted) {\n        if (backwardExhausted) {\n          localOffset++;\n        } else {\n          wantForward = false;\n        } // Check if trying to fit beyond text length, and if not, check it fits\n        // after offset location (or desired location on first iteration)\n\n\n        if (start + localOffset <= maxLine) {\n          return localOffset;\n        }\n\n        forwardExhausted = true;\n      }\n\n      if (!backwardExhausted) {\n        if (!forwardExhausted) {\n          wantForward = true;\n        } // Check if trying to fit before text beginning, and if not, check it fits\n        // before offset location\n\n\n        if (minLine <= start - localOffset) {\n          return -localOffset++;\n        }\n\n        backwardExhausted = true;\n        return iterator();\n      } // We tried to fit hunk before text beginning and beyond text length, then\n      // hunk can't fit on the text. Return undefined\n\n    };\n  }\n\n  function applyPatch(source, uniDiff) {\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    if (typeof uniDiff === 'string') {\n      uniDiff = parsePatch(uniDiff);\n    }\n\n    if (Array.isArray(uniDiff)) {\n      if (uniDiff.length > 1) {\n        throw new Error('applyPatch only works with a single input.');\n      }\n\n      uniDiff = uniDiff[0];\n    } // Apply the diff to the input\n\n\n    var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n        delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n        hunks = uniDiff.hunks,\n        compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) {\n      return line === patchContent;\n    },\n        errorCount = 0,\n        fuzzFactor = options.fuzzFactor || 0,\n        minLine = 0,\n        offset = 0,\n        removeEOFNL,\n        addEOFNL;\n    /**\n     * Checks if the hunk exactly fits on the provided location\n     */\n\n\n    function hunkFits(hunk, toPos) {\n      for (var j = 0; j < hunk.lines.length; j++) {\n        var line = hunk.lines[j],\n            operation = line.length > 0 ? line[0] : ' ',\n            content = line.length > 0 ? line.substr(1) : line;\n\n        if (operation === ' ' || operation === '-') {\n          // Context sanity check\n          if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\n            errorCount++;\n\n            if (errorCount > fuzzFactor) {\n              return false;\n            }\n          }\n\n          toPos++;\n        }\n      }\n\n      return true;\n    } // Search best fit offsets for each hunk based on the previous ones\n\n\n    for (var i = 0; i < hunks.length; i++) {\n      var hunk = hunks[i],\n          maxLine = lines.length - hunk.oldLines,\n          localOffset = 0,\n          toPos = offset + hunk.oldStart - 1;\n      var iterator = distanceIterator(toPos, minLine, maxLine);\n\n      for (; localOffset !== undefined; localOffset = iterator()) {\n        if (hunkFits(hunk, toPos + localOffset)) {\n          hunk.offset = offset += localOffset;\n          break;\n        }\n      }\n\n      if (localOffset === undefined) {\n        return false;\n      } // Set lower text limit to end of the current hunk, so next ones don't try\n      // to fit over already patched text\n\n\n      minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n    } // Apply patch hunks\n\n\n    var diffOffset = 0;\n\n    for (var _i = 0; _i < hunks.length; _i++) {\n      var _hunk = hunks[_i],\n          _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n\n      diffOffset += _hunk.newLines - _hunk.oldLines;\n\n      if (_toPos < 0) {\n        // Creating a new file\n        _toPos = 0;\n      }\n\n      for (var j = 0; j < _hunk.lines.length; j++) {\n        var line = _hunk.lines[j],\n            operation = line.length > 0 ? line[0] : ' ',\n            content = line.length > 0 ? line.substr(1) : line,\n            delimiter = _hunk.linedelimiters[j];\n\n        if (operation === ' ') {\n          _toPos++;\n        } else if (operation === '-') {\n          lines.splice(_toPos, 1);\n          delimiters.splice(_toPos, 1);\n          /* istanbul ignore else */\n        } else if (operation === '+') {\n          lines.splice(_toPos, 0, content);\n          delimiters.splice(_toPos, 0, delimiter);\n          _toPos++;\n        } else if (operation === '\\\\') {\n          var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n\n          if (previousOperation === '+') {\n            removeEOFNL = true;\n          } else if (previousOperation === '-') {\n            addEOFNL = true;\n          }\n        }\n      }\n    } // Handle EOFNL insertion/removal\n\n\n    if (removeEOFNL) {\n      while (!lines[lines.length - 1]) {\n        lines.pop();\n        delimiters.pop();\n      }\n    } else if (addEOFNL) {\n      lines.push('');\n      delimiters.push('\\n');\n    }\n\n    for (var _k = 0; _k < lines.length - 1; _k++) {\n      lines[_k] = lines[_k] + delimiters[_k];\n    }\n\n    return lines.join('');\n  } // Wrapper that supports multiple file patches via callbacks.\n\n  function applyPatches(uniDiff, options) {\n    if (typeof uniDiff === 'string') {\n      uniDiff = parsePatch(uniDiff);\n    }\n\n    var currentIndex = 0;\n\n    function processIndex() {\n      var index = uniDiff[currentIndex++];\n\n      if (!index) {\n        return options.complete();\n      }\n\n      options.loadFile(index, function (err, data) {\n        if (err) {\n          return options.complete(err);\n        }\n\n        var updatedContent = applyPatch(data, index, options);\n        options.patched(index, updatedContent, function (err) {\n          if (err) {\n            return options.complete(err);\n          }\n\n          processIndex();\n        });\n      });\n    }\n\n    processIndex();\n  }\n\n  function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n    if (!options) {\n      options = {};\n    }\n\n    if (typeof options.context === 'undefined') {\n      options.context = 4;\n    }\n\n    var diff = diffLines(oldStr, newStr, options);\n    diff.push({\n      value: '',\n      lines: []\n    }); // Append an empty value to make cleanup easier\n\n    function contextLines(lines) {\n      return lines.map(function (entry) {\n        return ' ' + entry;\n      });\n    }\n\n    var hunks = [];\n    var oldRangeStart = 0,\n        newRangeStart = 0,\n        curRange = [],\n        oldLine = 1,\n        newLine = 1;\n\n    var _loop = function _loop(i) {\n      var current = diff[i],\n          lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n      current.lines = lines;\n\n      if (current.added || current.removed) {\n        var _curRange;\n\n        // If we have previous context, start with that\n        if (!oldRangeStart) {\n          var prev = diff[i - 1];\n          oldRangeStart = oldLine;\n          newRangeStart = newLine;\n\n          if (prev) {\n            curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n            oldRangeStart -= curRange.length;\n            newRangeStart -= curRange.length;\n          }\n        } // Output our changes\n\n\n        (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) {\n          return (current.added ? '+' : '-') + entry;\n        }))); // Track the updated file position\n\n\n        if (current.added) {\n          newLine += lines.length;\n        } else {\n          oldLine += lines.length;\n        }\n      } else {\n        // Identical context lines. Track line changes\n        if (oldRangeStart) {\n          // Close out any changes that have been output (or join overlapping)\n          if (lines.length <= options.context * 2 && i < diff.length - 2) {\n            var _curRange2;\n\n            // Overlapping\n            (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines)));\n          } else {\n            var _curRange3;\n\n            // end the range and output\n            var contextSize = Math.min(lines.length, options.context);\n\n            (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize))));\n\n            var hunk = {\n              oldStart: oldRangeStart,\n              oldLines: oldLine - oldRangeStart + contextSize,\n              newStart: newRangeStart,\n              newLines: newLine - newRangeStart + contextSize,\n              lines: curRange\n            };\n\n            if (i >= diff.length - 2 && lines.length <= options.context) {\n              // EOF is inside this hunk\n              var oldEOFNewline = /\\n$/.test(oldStr);\n              var newEOFNewline = /\\n$/.test(newStr);\n              var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;\n\n              if (!oldEOFNewline && noNlBeforeAdds) {\n                // special case: old has no eol and no trailing context; no-nl can end up before adds\n                curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\n              }\n\n              if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {\n                curRange.push('\\\\ No newline at end of file');\n              }\n            }\n\n            hunks.push(hunk);\n            oldRangeStart = 0;\n            newRangeStart = 0;\n            curRange = [];\n          }\n        }\n\n        oldLine += lines.length;\n        newLine += lines.length;\n      }\n    };\n\n    for (var i = 0; i < diff.length; i++) {\n      _loop(i);\n    }\n\n    return {\n      oldFileName: oldFileName,\n      newFileName: newFileName,\n      oldHeader: oldHeader,\n      newHeader: newHeader,\n      hunks: hunks\n    };\n  }\n  function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n    var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);\n    var ret = [];\n\n    if (oldFileName == newFileName) {\n      ret.push('Index: ' + oldFileName);\n    }\n\n    ret.push('===================================================================');\n    ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\n    ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\n\n    for (var i = 0; i < diff.hunks.length; i++) {\n      var hunk = diff.hunks[i];\n      ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\n      ret.push.apply(ret, hunk.lines);\n    }\n\n    return ret.join('\\n') + '\\n';\n  }\n  function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n    return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n  }\n\n  function arrayEqual(a, b) {\n    if (a.length !== b.length) {\n      return false;\n    }\n\n    return arrayStartsWith(a, b);\n  }\n  function arrayStartsWith(array, start) {\n    if (start.length > array.length) {\n      return false;\n    }\n\n    for (var i = 0; i < start.length; i++) {\n      if (start[i] !== array[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function calcLineCount(hunk) {\n    var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines),\n        oldLines = _calcOldNewLineCount.oldLines,\n        newLines = _calcOldNewLineCount.newLines;\n\n    if (oldLines !== undefined) {\n      hunk.oldLines = oldLines;\n    } else {\n      delete hunk.oldLines;\n    }\n\n    if (newLines !== undefined) {\n      hunk.newLines = newLines;\n    } else {\n      delete hunk.newLines;\n    }\n  }\n  function merge(mine, theirs, base) {\n    mine = loadPatch(mine, base);\n    theirs = loadPatch(theirs, base);\n    var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning.\n    // Leaving sanity checks on this to the API consumer that may know more about the\n    // meaning in their own context.\n\n    if (mine.index || theirs.index) {\n      ret.index = mine.index || theirs.index;\n    }\n\n    if (mine.newFileName || theirs.newFileName) {\n      if (!fileNameChanged(mine)) {\n        // No header or no change in ours, use theirs (and ours if theirs does not exist)\n        ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n        ret.newFileName = theirs.newFileName || mine.newFileName;\n        ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n        ret.newHeader = theirs.newHeader || mine.newHeader;\n      } else if (!fileNameChanged(theirs)) {\n        // No header or no change in theirs, use ours\n        ret.oldFileName = mine.oldFileName;\n        ret.newFileName = mine.newFileName;\n        ret.oldHeader = mine.oldHeader;\n        ret.newHeader = mine.newHeader;\n      } else {\n        // Both changed... figure it out\n        ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n        ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n        ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n        ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n      }\n    }\n\n    ret.hunks = [];\n    var mineIndex = 0,\n        theirsIndex = 0,\n        mineOffset = 0,\n        theirsOffset = 0;\n\n    while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n      var mineCurrent = mine.hunks[mineIndex] || {\n        oldStart: Infinity\n      },\n          theirsCurrent = theirs.hunks[theirsIndex] || {\n        oldStart: Infinity\n      };\n\n      if (hunkBefore(mineCurrent, theirsCurrent)) {\n        // This patch does not overlap with any of the others, yay.\n        ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n        mineIndex++;\n        theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n      } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n        // This patch does not overlap with any of the others, yay.\n        ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n        theirsIndex++;\n        mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n      } else {\n        // Overlap, merge as best we can\n        var mergedHunk = {\n          oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n          oldLines: 0,\n          newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n          newLines: 0,\n          lines: []\n        };\n        mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n        theirsIndex++;\n        mineIndex++;\n        ret.hunks.push(mergedHunk);\n      }\n    }\n\n    return ret;\n  }\n\n  function loadPatch(param, base) {\n    if (typeof param === 'string') {\n      if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n        return parsePatch(param)[0];\n      }\n\n      if (!base) {\n        throw new Error('Must provide a base reference or pass in a patch');\n      }\n\n      return structuredPatch(undefined, undefined, base, param);\n    }\n\n    return param;\n  }\n\n  function fileNameChanged(patch) {\n    return patch.newFileName && patch.newFileName !== patch.oldFileName;\n  }\n\n  function selectField(index, mine, theirs) {\n    if (mine === theirs) {\n      return mine;\n    } else {\n      index.conflict = true;\n      return {\n        mine: mine,\n        theirs: theirs\n      };\n    }\n  }\n\n  function hunkBefore(test, check) {\n    return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n  }\n\n  function cloneHunk(hunk, offset) {\n    return {\n      oldStart: hunk.oldStart,\n      oldLines: hunk.oldLines,\n      newStart: hunk.newStart + offset,\n      newLines: hunk.newLines,\n      lines: hunk.lines\n    };\n  }\n\n  function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n    // This will generally result in a conflicted hunk, but there are cases where the context\n    // is the only overlap where we can successfully merge the content here.\n    var mine = {\n      offset: mineOffset,\n      lines: mineLines,\n      index: 0\n    },\n        their = {\n      offset: theirOffset,\n      lines: theirLines,\n      index: 0\n    }; // Handle any leading content\n\n    insertLeading(hunk, mine, their);\n    insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each.\n\n    while (mine.index < mine.lines.length && their.index < their.lines.length) {\n      var mineCurrent = mine.lines[mine.index],\n          theirCurrent = their.lines[their.index];\n\n      if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\n        // Both modified ...\n        mutualChange(hunk, mine, their);\n      } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\n        var _hunk$lines;\n\n        // Mine inserted\n        (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine)));\n      } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\n        var _hunk$lines2;\n\n        // Theirs inserted\n        (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their)));\n      } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\n        // Mine removed or edited\n        removal(hunk, mine, their);\n      } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\n        // Their removed or edited\n        removal(hunk, their, mine, true);\n      } else if (mineCurrent === theirCurrent) {\n        // Context identity\n        hunk.lines.push(mineCurrent);\n        mine.index++;\n        their.index++;\n      } else {\n        // Context mismatch\n        conflict(hunk, collectChange(mine), collectChange(their));\n      }\n    } // Now push anything that may be remaining\n\n\n    insertTrailing(hunk, mine);\n    insertTrailing(hunk, their);\n    calcLineCount(hunk);\n  }\n\n  function mutualChange(hunk, mine, their) {\n    var myChanges = collectChange(mine),\n        theirChanges = collectChange(their);\n\n    if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n      // Special case for remove changes that are supersets of one another\n      if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n        var _hunk$lines3;\n\n        (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges));\n\n        return;\n      } else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n        var _hunk$lines4;\n\n        (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges));\n\n        return;\n      }\n    } else if (arrayEqual(myChanges, theirChanges)) {\n      var _hunk$lines5;\n\n      (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges));\n\n      return;\n    }\n\n    conflict(hunk, myChanges, theirChanges);\n  }\n\n  function removal(hunk, mine, their, swap) {\n    var myChanges = collectChange(mine),\n        theirChanges = collectContext(their, myChanges);\n\n    if (theirChanges.merged) {\n      var _hunk$lines6;\n\n      (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged));\n    } else {\n      conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n    }\n  }\n\n  function conflict(hunk, mine, their) {\n    hunk.conflict = true;\n    hunk.lines.push({\n      conflict: true,\n      mine: mine,\n      theirs: their\n    });\n  }\n\n  function insertLeading(hunk, insert, their) {\n    while (insert.offset < their.offset && insert.index < insert.lines.length) {\n      var line = insert.lines[insert.index++];\n      hunk.lines.push(line);\n      insert.offset++;\n    }\n  }\n\n  function insertTrailing(hunk, insert) {\n    while (insert.index < insert.lines.length) {\n      var line = insert.lines[insert.index++];\n      hunk.lines.push(line);\n    }\n  }\n\n  function collectChange(state) {\n    var ret = [],\n        operation = state.lines[state.index][0];\n\n    while (state.index < state.lines.length) {\n      var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\n\n      if (operation === '-' && line[0] === '+') {\n        operation = '+';\n      }\n\n      if (operation === line[0]) {\n        ret.push(line);\n        state.index++;\n      } else {\n        break;\n      }\n    }\n\n    return ret;\n  }\n\n  function collectContext(state, matchChanges) {\n    var changes = [],\n        merged = [],\n        matchIndex = 0,\n        contextChanges = false,\n        conflicted = false;\n\n    while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n      var change = state.lines[state.index],\n          match = matchChanges[matchIndex]; // Once we've hit our add, then we are done\n\n      if (match[0] === '+') {\n        break;\n      }\n\n      contextChanges = contextChanges || change[0] !== ' ';\n      merged.push(match);\n      matchIndex++; // Consume any additions in the other block as a conflict to attempt\n      // to pull in the remaining context after this\n\n      if (change[0] === '+') {\n        conflicted = true;\n\n        while (change[0] === '+') {\n          changes.push(change);\n          change = state.lines[++state.index];\n        }\n      }\n\n      if (match.substr(1) === change.substr(1)) {\n        changes.push(change);\n        state.index++;\n      } else {\n        conflicted = true;\n      }\n    }\n\n    if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\n      conflicted = true;\n    }\n\n    if (conflicted) {\n      return changes;\n    }\n\n    while (matchIndex < matchChanges.length) {\n      merged.push(matchChanges[matchIndex++]);\n    }\n\n    return {\n      merged: merged,\n      changes: changes\n    };\n  }\n\n  function allRemoves(changes) {\n    return changes.reduce(function (prev, change) {\n      return prev && change[0] === '-';\n    }, true);\n  }\n\n  function skipRemoveSuperset(state, removeChanges, delta) {\n    for (var i = 0; i < delta; i++) {\n      var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n\n      if (state.lines[state.index + i] !== ' ' + changeContent) {\n        return false;\n      }\n    }\n\n    state.index += delta;\n    return true;\n  }\n\n  function calcOldNewLineCount(lines) {\n    var oldLines = 0;\n    var newLines = 0;\n    lines.forEach(function (line) {\n      if (typeof line !== 'string') {\n        var myCount = calcOldNewLineCount(line.mine);\n        var theirCount = calcOldNewLineCount(line.theirs);\n\n        if (oldLines !== undefined) {\n          if (myCount.oldLines === theirCount.oldLines) {\n            oldLines += myCount.oldLines;\n          } else {\n            oldLines = undefined;\n          }\n        }\n\n        if (newLines !== undefined) {\n          if (myCount.newLines === theirCount.newLines) {\n            newLines += myCount.newLines;\n          } else {\n            newLines = undefined;\n          }\n        }\n      } else {\n        if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {\n          newLines++;\n        }\n\n        if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {\n          oldLines++;\n        }\n      }\n    });\n    return {\n      oldLines: oldLines,\n      newLines: newLines\n    };\n  }\n\n  // See: http://code.google.com/p/google-diff-match-patch/wiki/API\n  function convertChangesToDMP(changes) {\n    var ret = [],\n        change,\n        operation;\n\n    for (var i = 0; i < changes.length; i++) {\n      change = changes[i];\n\n      if (change.added) {\n        operation = 1;\n      } else if (change.removed) {\n        operation = -1;\n      } else {\n        operation = 0;\n      }\n\n      ret.push([operation, change.value]);\n    }\n\n    return ret;\n  }\n\n  function convertChangesToXML(changes) {\n    var ret = [];\n\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n\n      if (change.added) {\n        ret.push('<ins>');\n      } else if (change.removed) {\n        ret.push('<del>');\n      }\n\n      ret.push(escapeHTML(change.value));\n\n      if (change.added) {\n        ret.push('</ins>');\n      } else if (change.removed) {\n        ret.push('</del>');\n      }\n    }\n\n    return ret.join('');\n  }\n\n  function escapeHTML(s) {\n    var n = s;\n    n = n.replace(/&/g, '&amp;');\n    n = n.replace(/</g, '&lt;');\n    n = n.replace(/>/g, '&gt;');\n    n = n.replace(/\"/g, '&quot;');\n    return n;\n  }\n\n  /* See LICENSE file for terms of use */\n\n  exports.Diff = Diff;\n  exports.diffChars = diffChars;\n  exports.diffWords = diffWords;\n  exports.diffWordsWithSpace = diffWordsWithSpace;\n  exports.diffLines = diffLines;\n  exports.diffTrimmedLines = diffTrimmedLines;\n  exports.diffSentences = diffSentences;\n  exports.diffCss = diffCss;\n  exports.diffJson = diffJson;\n  exports.diffArrays = diffArrays;\n  exports.structuredPatch = structuredPatch;\n  exports.createTwoFilesPatch = createTwoFilesPatch;\n  exports.createPatch = createPatch;\n  exports.applyPatch = applyPatch;\n  exports.applyPatches = applyPatches;\n  exports.parsePatch = parsePatch;\n  exports.merge = merge;\n  exports.convertChangesToDMP = convertChangesToDMP;\n  exports.convertChangesToXML = convertChangesToXML;\n  exports.canonicalize = canonicalize;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n", "module.exports = window.wp.hooks;", "module.exports = window.wp.richText;", "module.exports = window.wp.deprecated;", "module.exports = window.wp.privateApis;", "module.exports = window.wp.htmlEntities;", "module.exports = window.wp.element;", "module.exports = window.ReactJSXRuntime;", "module.exports = window.wp.warning;", "module.exports = window.wp.blockEditor;", "/**\n * WordPress dependencies\n */\nimport { createReduxStore, register } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport reducer from './reducer';\nimport * as selectors from './selectors';\nimport * as privateSelectors from './private-selectors';\nimport * as actions from './actions';\nimport * as privateActions from './private-actions';\nimport * as resolvers from './resolvers';\nimport createLocksActions from './locks/actions';\nimport {\n\trootEntitiesConfig,\n\tadditionalEntityConfigLoaders,\n\tgetMethodName,\n} from './entities';\nimport { STORE_NAME } from './name';\nimport { unlock } from './lock-unlock';\nimport { dynamicActions, dynamicSelectors } from './dynamic-entities';\nimport logEntityDeprecation from './utils/log-entity-deprecation';\n\n// The entity selectors/resolvers and actions are shortcuts to their generic equivalents\n// (getEntityRecord, getEntityRecords, updateEntityRecord, updateEntityRecords)\n// Instead of getEntityRecord, the consumer could use more user-friendly named selector: getPostType, getTaxonomy...\n// The \"kind\" and the \"name\" of the entity are combined to generate these shortcuts.\nconst entitiesConfig = [\n\t...rootEntitiesConfig,\n\t...additionalEntityConfigLoaders.filter( ( config ) => !! config.name ),\n];\n\nconst entitySelectors = entitiesConfig.reduce( ( result, entity ) => {\n\tconst { kind, name, plural } = entity;\n\n\tconst getEntityRecordMethodName = getMethodName( kind, name );\n\tresult[ getEntityRecordMethodName ] = ( state, key, query ) => {\n\t\tlogEntityDeprecation( kind, name, getEntityRecordMethodName, {\n\t\t\tisShorthandSelector: true,\n\t\t\talternativeFunctionName: 'getEntityRecord',\n\t\t} );\n\t\treturn selectors.getEntityRecord( state, kind, name, key, query );\n\t};\n\n\tif ( plural ) {\n\t\tconst getEntityRecordsMethodName = getMethodName( kind, plural, 'get' );\n\t\tresult[ getEntityRecordsMethodName ] = ( state, query ) => {\n\t\t\tlogEntityDeprecation( kind, name, getEntityRecordsMethodName, {\n\t\t\t\tisShorthandSelector: true,\n\t\t\t\talternativeFunctionName: 'getEntityRecords',\n\t\t\t} );\n\t\t\treturn selectors.getEntityRecords( state, kind, name, query );\n\t\t};\n\t}\n\treturn result;\n}, {} );\n\nconst entityResolvers = entitiesConfig.reduce( ( result, entity ) => {\n\tconst { kind, name, plural } = entity;\n\tconst getEntityRecordMethodName = getMethodName( kind, name );\n\tresult[ getEntityRecordMethodName ] = ( key, query ) => {\n\t\tlogEntityDeprecation( kind, name, getEntityRecordMethodName, {\n\t\t\tisShorthandSelector: true,\n\t\t\talternativeFunctionName: 'getEntityRecord',\n\t\t} );\n\t\treturn resolvers.getEntityRecord( kind, name, key, query );\n\t};\n\n\tif ( plural ) {\n\t\tconst getEntityRecordsMethodName = getMethodName( kind, plural, 'get' );\n\t\tresult[ getEntityRecordsMethodName ] = ( ...args ) => {\n\t\t\tlogEntityDeprecation( kind, plural, getEntityRecordsMethodName, {\n\t\t\t\tisShorthandSelector: true,\n\t\t\t\talternativeFunctionName: 'getEntityRecords',\n\t\t\t} );\n\t\t\treturn resolvers.getEntityRecords( kind, name, ...args );\n\t\t};\n\t\tresult[ getEntityRecordsMethodName ].shouldInvalidate = ( action ) =>\n\t\t\tresolvers.getEntityRecords.shouldInvalidate( action, kind, name );\n\t}\n\treturn result;\n}, {} );\n\nconst entityActions = entitiesConfig.reduce( ( result, entity ) => {\n\tconst { kind, name } = entity;\n\n\tconst saveEntityRecordMethodName = getMethodName( kind, name, 'save' );\n\tresult[ saveEntityRecordMethodName ] = ( record, options ) => {\n\t\tlogEntityDeprecation( kind, name, saveEntityRecordMethodName, {\n\t\t\tisShorthandSelector: true,\n\t\t\talternativeFunctionName: 'saveEntityRecord',\n\t\t} );\n\t\treturn actions.saveEntityRecord( kind, name, record, options );\n\t};\n\n\tconst deleteEntityRecordMethodName = getMethodName( kind, name, 'delete' );\n\tresult[ deleteEntityRecordMethodName ] = ( key, query, options ) => {\n\t\tlogEntityDeprecation( kind, name, deleteEntityRecordMethodName, {\n\t\t\tisShorthandSelector: true,\n\t\t\talternativeFunctionName: 'deleteEntityRecord',\n\t\t} );\n\t\treturn actions.deleteEntityRecord( kind, name, key, query, options );\n\t};\n\n\treturn result;\n}, {} );\n\nconst storeConfig = () => ( {\n\treducer,\n\tactions: {\n\t\t...dynamicActions,\n\t\t...actions,\n\t\t...entityActions,\n\t\t...createLocksActions(),\n\t},\n\tselectors: {\n\t\t...dynamicSelectors,\n\t\t...selectors,\n\t\t...entitySelectors,\n\t},\n\tresolvers: { ...resolvers, ...entityResolvers },\n} );\n\n/**\n * Store definition for the code data namespace.\n *\n * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore\n */\nexport const store = createReduxStore( STORE_NAME, storeConfig() );\nunlock( store ).registerPrivateSelectors( privateSelectors );\nunlock( store ).registerPrivateActions( privateActions );\nregister( store ); // Register store after unlocking private selectors to allow resolvers to use them.\n\nexport { default as EntityProvider } from './entity-provider';\nexport * from './entity-provider';\nexport * from './entity-types';\nexport * from './fetch';\nexport * from './hooks';\nexport * from './private-apis';\n", "/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\nimport { compose } from '@wordpress/compose';\nimport { combineReducers } from '@wordpress/data';\nimport { createUndoManager } from '@wordpress/undo-manager';\n\n/**\n * Internal dependencies\n */\nimport { ifMatchingAction, replaceAction } from './utils';\nimport { reducer as queriedDataReducer } from './queried-data';\nimport { rootEntitiesConfig, DEFAULT_ENTITY_KEY } from './entities';\n\n/** @typedef {import('./types').AnyFunction} AnyFunction */\n\n/**\n * Reducer managing authors state. Keyed by id.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function users( state = { byId: {}, queries: {} }, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_USER_QUERY':\n\t\t\treturn {\n\t\t\t\tbyId: {\n\t\t\t\t\t...state.byId,\n\t\t\t\t\t// Key users by their ID.\n\t\t\t\t\t...action.users.reduce(\n\t\t\t\t\t\t( newUsers, user ) => ( {\n\t\t\t\t\t\t\t...newUsers,\n\t\t\t\t\t\t\t[ user.id ]: user,\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\t{}\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tqueries: {\n\t\t\t\t\t...state.queries,\n\t\t\t\t\t[ action.queryID ]: action.users.map( ( user ) => user.id ),\n\t\t\t\t},\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing current user state.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function currentUser( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_CURRENT_USER':\n\t\t\treturn action.currentUser;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing the current theme.\n *\n * @param {string|undefined} state  Current state.\n * @param {Object}           action Dispatched action.\n *\n * @return {string|undefined} Updated state.\n */\nexport function currentTheme( state = undefined, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_CURRENT_THEME':\n\t\t\treturn action.currentTheme.stylesheet;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing the current global styles id.\n *\n * @param {string|undefined} state  Current state.\n * @param {Object}           action Dispatched action.\n *\n * @return {string|undefined} Updated state.\n */\nexport function currentGlobalStylesId( state = undefined, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_CURRENT_GLOBAL_STYLES_ID':\n\t\t\treturn action.id;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing the theme base global styles.\n *\n * @param {Record<string, object>} state  Current state.\n * @param {Object}                 action Dispatched action.\n *\n * @return {Record<string, object>} Updated state.\n */\nexport function themeBaseGlobalStyles( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_THEME_GLOBAL_STYLES':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.stylesheet ]: action.globalStyles,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing the theme global styles variations.\n *\n * @param {Record<string, object>} state  Current state.\n * @param {Object}                 action Dispatched action.\n *\n * @return {Record<string, object>} Updated state.\n */\nexport function themeGlobalStyleVariations( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.stylesheet ]: action.variations,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\nconst withMultiEntityRecordEdits = ( reducer ) => ( state, action ) => {\n\tif ( action.type === 'UNDO' || action.type === 'REDO' ) {\n\t\tconst { record } = action;\n\n\t\tlet newState = state;\n\t\trecord.forEach( ( { id: { kind, name, recordId }, changes } ) => {\n\t\t\tnewState = reducer( newState, {\n\t\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t\tedits: Object.entries( changes ).reduce(\n\t\t\t\t\t( acc, [ key, value ] ) => {\n\t\t\t\t\t\tacc[ key ] =\n\t\t\t\t\t\t\taction.type === 'UNDO' ? value.from : value.to;\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t},\n\t\t\t\t\t{}\n\t\t\t\t),\n\t\t\t} );\n\t\t} );\n\t\treturn newState;\n\t}\n\n\treturn reducer( state, action );\n};\n\n/**\n * Higher Order Reducer for a given entity config. It supports:\n *\n *  - Fetching\n *  - Editing\n *  - Saving\n *\n * @param {Object} entityConfig Entity config.\n *\n * @return {AnyFunction} Reducer.\n */\nfunction entity( entityConfig ) {\n\treturn compose( [\n\t\twithMultiEntityRecordEdits,\n\n\t\t// Limit to matching action type so we don't attempt to replace action on\n\t\t// an unhandled action.\n\t\tifMatchingAction(\n\t\t\t( action ) =>\n\t\t\t\taction.name &&\n\t\t\t\taction.kind &&\n\t\t\t\taction.name === entityConfig.name &&\n\t\t\t\taction.kind === entityConfig.kind\n\t\t),\n\n\t\t// Inject the entity config into the action.\n\t\treplaceAction( ( action ) => {\n\t\t\treturn {\n\t\t\t\tkey: entityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t...action,\n\t\t\t};\n\t\t} ),\n\t] )(\n\t\tcombineReducers( {\n\t\t\tqueriedData: queriedDataReducer,\n\t\t\tedits: ( state = {}, action ) => {\n\t\t\t\tswitch ( action.type ) {\n\t\t\t\t\tcase 'RECEIVE_ITEMS':\n\t\t\t\t\t\tconst context = action?.query?.context ?? 'default';\n\t\t\t\t\t\tif ( context !== 'default' ) {\n\t\t\t\t\t\t\treturn state;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst nextState = { ...state };\n\n\t\t\t\t\t\tfor ( const record of action.items ) {\n\t\t\t\t\t\t\tconst recordId = record?.[ action.key ];\n\t\t\t\t\t\t\tconst edits = nextState[ recordId ];\n\t\t\t\t\t\t\tif ( ! edits ) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst nextEdits = Object.keys( edits ).reduce(\n\t\t\t\t\t\t\t\t( acc, key ) => {\n\t\t\t\t\t\t\t\t\t// If the edited value is still different to the persisted value,\n\t\t\t\t\t\t\t\t\t// keep the edited value in edits.\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t// Edits are the \"raw\" attribute values, but records may have\n\t\t\t\t\t\t\t\t\t\t// objects with more properties, so we use `get` here for the\n\t\t\t\t\t\t\t\t\t\t// comparison.\n\t\t\t\t\t\t\t\t\t\t! fastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\tedits[ key ],\n\t\t\t\t\t\t\t\t\t\t\trecord[ key ]?.raw ?? record[ key ]\n\t\t\t\t\t\t\t\t\t\t) &&\n\t\t\t\t\t\t\t\t\t\t// Sometimes the server alters the sent value which means\n\t\t\t\t\t\t\t\t\t\t// we need to also remove the edits before the api request.\n\t\t\t\t\t\t\t\t\t\t( ! action.persistedEdits ||\n\t\t\t\t\t\t\t\t\t\t\t! fastDeepEqual(\n\t\t\t\t\t\t\t\t\t\t\t\tedits[ key ],\n\t\t\t\t\t\t\t\t\t\t\t\taction.persistedEdits[ key ]\n\t\t\t\t\t\t\t\t\t\t\t) )\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tacc[ key ] = edits[ key ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( Object.keys( nextEdits ).length ) {\n\t\t\t\t\t\t\t\tnextState[ recordId ] = nextEdits;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdelete nextState[ recordId ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nextState;\n\n\t\t\t\t\tcase 'EDIT_ENTITY_RECORD':\n\t\t\t\t\t\tconst nextEdits = {\n\t\t\t\t\t\t\t...state[ action.recordId ],\n\t\t\t\t\t\t\t...action.edits,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tObject.keys( nextEdits ).forEach( ( key ) => {\n\t\t\t\t\t\t\t// Delete cleared edits so that the properties\n\t\t\t\t\t\t\t// are not considered dirty.\n\t\t\t\t\t\t\tif ( nextEdits[ key ] === undefined ) {\n\t\t\t\t\t\t\t\tdelete nextEdits[ key ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t[ action.recordId ]: nextEdits,\n\t\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn state;\n\t\t\t},\n\n\t\t\tsaving: ( state = {}, action ) => {\n\t\t\t\tswitch ( action.type ) {\n\t\t\t\t\tcase 'SAVE_ENTITY_RECORD_START':\n\t\t\t\t\tcase 'SAVE_ENTITY_RECORD_FINISH':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t[ action.recordId ]: {\n\t\t\t\t\t\t\t\tpending:\n\t\t\t\t\t\t\t\t\taction.type === 'SAVE_ENTITY_RECORD_START',\n\t\t\t\t\t\t\t\terror: action.error,\n\t\t\t\t\t\t\t\tisAutosave: action.isAutosave,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn state;\n\t\t\t},\n\n\t\t\tdeleting: ( state = {}, action ) => {\n\t\t\t\tswitch ( action.type ) {\n\t\t\t\t\tcase 'DELETE_ENTITY_RECORD_START':\n\t\t\t\t\tcase 'DELETE_ENTITY_RECORD_FINISH':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t[ action.recordId ]: {\n\t\t\t\t\t\t\t\tpending:\n\t\t\t\t\t\t\t\t\taction.type ===\n\t\t\t\t\t\t\t\t\t'DELETE_ENTITY_RECORD_START',\n\t\t\t\t\t\t\t\terror: action.error,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn state;\n\t\t\t},\n\n\t\t\trevisions: ( state = {}, action ) => {\n\t\t\t\t// Use the same queriedDataReducer shape for revisions.\n\t\t\t\tif ( action.type === 'RECEIVE_ITEM_REVISIONS' ) {\n\t\t\t\t\tconst recordKey = action.recordKey;\n\t\t\t\t\tdelete action.recordKey;\n\t\t\t\t\tconst newState = queriedDataReducer( state[ recordKey ], {\n\t\t\t\t\t\t...action,\n\t\t\t\t\t\ttype: 'RECEIVE_ITEMS',\n\t\t\t\t\t} );\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\t[ recordKey ]: newState,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif ( action.type === 'REMOVE_ITEMS' ) {\n\t\t\t\t\treturn Object.fromEntries(\n\t\t\t\t\t\tObject.entries( state ).filter(\n\t\t\t\t\t\t\t( [ id ] ) =>\n\t\t\t\t\t\t\t\t! action.itemIds.some( ( itemId ) => {\n\t\t\t\t\t\t\t\t\tif ( Number.isInteger( itemId ) ) {\n\t\t\t\t\t\t\t\t\t\treturn itemId === +id;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn itemId === id;\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn state;\n\t\t\t},\n\t\t} )\n\t);\n}\n\n/**\n * Reducer keeping track of the registered entities.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function entitiesConfig( state = rootEntitiesConfig, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'ADD_ENTITIES':\n\t\t\treturn [ ...state, ...action.entities ];\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer keeping track of the registered entities config and data.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport const entities = ( state = {}, action ) => {\n\tconst newConfig = entitiesConfig( state.config, action );\n\n\t// Generates a reducer for the entities nested by `kind` and `name`.\n\t// A config array with shape:\n\t// ```\n\t// [\n\t//   { kind: 'taxonomy', name: 'category' },\n\t//   { kind: 'taxonomy', name: 'post_tag' },\n\t//   { kind: 'postType', name: 'post' },\n\t//   { kind: 'postType', name: 'page' },\n\t// ]\n\t// ```\n\t// generates a reducer for state tree with shape:\n\t// ```\n\t// {\n\t//   taxonomy: {\n\t//     category,\n\t//     post_tag,\n\t//   },\n\t//   postType: {\n\t//     post,\n\t//     page,\n\t//   },\n\t// }\n\t// ```\n\tlet entitiesDataReducer = state.reducer;\n\tif ( ! entitiesDataReducer || newConfig !== state.config ) {\n\t\tconst entitiesByKind = newConfig.reduce( ( acc, record ) => {\n\t\t\tconst { kind } = record;\n\t\t\tif ( ! acc[ kind ] ) {\n\t\t\t\tacc[ kind ] = [];\n\t\t\t}\n\t\t\tacc[ kind ].push( record );\n\t\t\treturn acc;\n\t\t}, {} );\n\n\t\tentitiesDataReducer = combineReducers(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries( entitiesByKind ).map(\n\t\t\t\t\t( [ kind, subEntities ] ) => {\n\t\t\t\t\t\tconst kindReducer = combineReducers(\n\t\t\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\t\t\tsubEntities.map( ( entityConfig ) => [\n\t\t\t\t\t\t\t\t\tentityConfig.name,\n\t\t\t\t\t\t\t\t\tentity( entityConfig ),\n\t\t\t\t\t\t\t\t] )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn [ kind, kindReducer ];\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tconst newData = entitiesDataReducer( state.records, action );\n\n\tif (\n\t\tnewData === state.records &&\n\t\tnewConfig === state.config &&\n\t\tentitiesDataReducer === state.reducer\n\t) {\n\t\treturn state;\n\t}\n\n\treturn {\n\t\treducer: entitiesDataReducer,\n\t\trecords: newData,\n\t\tconfig: newConfig,\n\t};\n};\n\n/**\n * @type {UndoManager}\n */\nexport function undoManager( state = createUndoManager() ) {\n\treturn state;\n}\n\nexport function editsReference( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'EDIT_ENTITY_RECORD':\n\t\tcase 'UNDO':\n\t\tcase 'REDO':\n\t\t\treturn {};\n\t}\n\treturn state;\n}\n\n/**\n * Reducer managing embed preview data.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function embedPreviews( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_EMBED_PREVIEW':\n\t\t\tconst { url, preview } = action;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ url ]: preview,\n\t\t\t};\n\t}\n\treturn state;\n}\n\n/**\n * State which tracks whether the user can perform an action on a REST\n * resource.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function userPermissions( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_USER_PERMISSION':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.key ]: action.isAllowed,\n\t\t\t};\n\t\tcase 'RECEIVE_USER_PERMISSIONS':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t...action.permissions,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning autosaves keyed by their parent's post id.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function autosaves( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_AUTOSAVES':\n\t\t\tconst { postId, autosaves: autosavesData } = action;\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ postId ]: autosavesData,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\nexport function blockPatterns( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_BLOCK_PATTERNS':\n\t\t\treturn action.patterns;\n\t}\n\n\treturn state;\n}\n\nexport function blockPatternCategories( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_BLOCK_PATTERN_CATEGORIES':\n\t\t\treturn action.categories;\n\t}\n\n\treturn state;\n}\n\nexport function userPatternCategories( state = [], action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_USER_PATTERN_CATEGORIES':\n\t\t\treturn action.patternCategories;\n\t}\n\treturn state;\n}\n\nexport function navigationFallbackId( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_NAVIGATION_FALLBACK_ID':\n\t\t\treturn action.fallbackId;\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing the theme global styles revisions.\n *\n * @param {Record<string, object>} state  Current state.\n * @param {Object}                 action Dispatched action.\n *\n * @return {Record<string, object>} Updated state.\n */\nexport function themeGlobalStyleRevisions( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_THEME_GLOBAL_STYLE_REVISIONS':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.currentId ]: action.revisions,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer managing the template lookup per query.\n *\n * @param {Record<string, string>} state  Current state.\n * @param {Object}                 action Dispatched action.\n *\n * @return {Record<string, string>} Updated state.\n */\nexport function defaultTemplates( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_DEFAULT_TEMPLATE':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ JSON.stringify( action.query ) ]: action.templateId,\n\t\t\t};\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer returning an object of registered post meta.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport function registeredPostMeta( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_REGISTERED_POST_META':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.postType ]: action.registeredPostMeta,\n\t\t\t};\n\t}\n\treturn state;\n}\n\n/**\n * Reducer managing editor settings.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Action object.\n *\n * @return {Object} Updated state.\n */\nexport function editorSettings( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_EDITOR_SETTINGS':\n\t\t\treturn action.settings;\n\t}\n\treturn state;\n}\n\n/**\n * Reducer managing editor assets.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Action object.\n *\n * @return {Object} Updated state.\n */\nexport function editorAssets( state = null, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_EDITOR_ASSETS':\n\t\t\treturn action.assets;\n\t}\n\treturn state;\n}\n\nexport default combineReducers( {\n\tusers,\n\tcurrentTheme,\n\tcurrentGlobalStylesId,\n\tcurrentUser,\n\tthemeGlobalStyleVariations,\n\tthemeBaseGlobalStyles,\n\tthemeGlobalStyleRevisions,\n\tentities,\n\teditsReference,\n\tundoManager,\n\tembedPreviews,\n\tuserPermissions,\n\tautosaves,\n\tblockPatterns,\n\tblockPatternCategories,\n\tuserPatternCategories,\n\tnavigationFallbackId,\n\tdefaultTemplates,\n\tregisteredPostMeta,\n\teditorSettings,\n\teditorAssets,\n} );\n", "/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * Given the current and next item entity record, returns the minimally \"modified\"\n * result of the next item, preferring value references from the original item\n * if equal. If all values match, the original item is returned.\n *\n * @param {Object} item     Original item.\n * @param {Object} nextItem Next item.\n *\n * @return {Object} Minimally modified merged item.\n */\nexport default function conservativeMapItem( item, nextItem ) {\n\t// Return next item in its entirety if there is no original item.\n\tif ( ! item ) {\n\t\treturn nextItem;\n\t}\n\n\tlet hasChanges = false;\n\tconst result = {};\n\tfor ( const key in nextItem ) {\n\t\tif ( fastDeepEqual( item[ key ], nextItem[ key ] ) ) {\n\t\t\tresult[ key ] = item[ key ];\n\t\t} else {\n\t\t\thasChanges = true;\n\t\t\tresult[ key ] = nextItem[ key ];\n\t\t}\n\t}\n\n\tif ( ! hasChanges ) {\n\t\treturn item;\n\t}\n\n\t// Only at this point, backfill properties from the original item which\n\t// weren't explicitly set into the result above. This is an optimization\n\t// to allow `hasChanges` to return early.\n\tfor ( const key in item ) {\n\t\tif ( ! result.hasOwnProperty( key ) ) {\n\t\t\tresult[ key ] = item[ key ];\n\t\t}\n\t}\n\n\treturn result;\n}\n", "/**\n * Given a value which can be specified as one or the other of a comma-separated\n * string or an array, returns a value normalized to an array of strings, or\n * null if the value cannot be interpreted as either.\n *\n * @param {string|string[]|*} value\n *\n * @return {?(string[])} Normalized field value.\n */\nfunction getNormalizedCommaSeparable( value ) {\n\tif ( typeof value === 'string' ) {\n\t\treturn value.split( ',' );\n\t} else if ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\n\treturn null;\n}\n\nexport default getNormalizedCommaSeparable;\n", "/** @typedef {import('../types').AnyFunction} AnyFunction */\n\n/**\n * A higher-order reducer creator which invokes the original reducer only if\n * the dispatching action matches the given predicate, **OR** if state is\n * initializing (undefined).\n *\n * @param {AnyFunction} isMatch Function predicate for allowing reducer call.\n *\n * @return {AnyFunction} Higher-order reducer.\n */\nconst ifMatchingAction = ( isMatch ) => ( reducer ) => ( state, action ) => {\n\tif ( state === undefined || isMatch( action ) ) {\n\t\treturn reducer( state, action );\n\t}\n\n\treturn state;\n};\n\nexport default ifMatchingAction;\n", "/**\n * Higher-order function which forward the resolution to another resolver with the same arguments.\n *\n * @param {string} resolverName forwarded resolver.\n *\n * @return {Function} Enhanced resolver.\n */\nconst forwardResolver =\n\t( resolverName ) =>\n\t( ...args ) =>\n\tasync ( { resolveSelect } ) => {\n\t\tawait resolveSelect[ resolverName ]( ...args );\n\t};\n\nexport default forwardResolver;\n", "/** @typedef {import('../types').AnyFunction} AnyFunction */\n\n/**\n * Higher-order reducer creator which creates a combined reducer object, keyed\n * by a property on the action object.\n *\n * @param {string} actionProperty Action property by which to key object.\n *\n * @return {AnyFunction} Higher-order reducer.\n */\nexport const onSubKey =\n\t( actionProperty ) =>\n\t( reducer ) =>\n\t( state = {}, action ) => {\n\t\t// Retrieve subkey from action. Do not track if undefined; useful for cases\n\t\t// where reducer is scoped by action shape.\n\t\tconst key = action[ actionProperty ];\n\t\tif ( key === undefined ) {\n\t\t\treturn state;\n\t\t}\n\n\t\t// Avoid updating state if unchanged. Note that this also accounts for a\n\t\t// reducer which returns undefined on a key which is not yet tracked.\n\t\tconst nextKeyState = reducer( state[ key ], action );\n\t\tif ( nextKeyState === state[ key ] ) {\n\t\t\treturn state;\n\t\t}\n\n\t\treturn {\n\t\t\t...state,\n\t\t\t[ key ]: nextKeyState,\n\t\t};\n\t};\n\nexport default onSubKey;\n", "/** @typedef {import('../types').AnyFunction} AnyFunction */\n\n/**\n * Higher-order reducer creator which substitutes the action object before\n * passing to the original reducer.\n *\n * @param {AnyFunction} replacer Function mapping original action to replacement.\n *\n * @return {AnyFunction} Higher-order reducer.\n */\nconst replaceAction = ( replacer ) => ( reducer ) => ( state, action ) => {\n\treturn reducer( state, replacer( action ) );\n};\n\nexport default replaceAction;\n", "/**\n * Given a function, returns an enhanced function which caches the result and\n * tracks in WeakMap. The result is only cached if the original function is\n * passed a valid object-like argument (requirement for WeakMap key).\n *\n * @param {Function} fn Original function.\n *\n * @return {Function} Enhanced caching function.\n */\nfunction withWeakMapCache( fn ) {\n\tconst cache = new WeakMap();\n\n\treturn ( key ) => {\n\t\tlet value;\n\t\tif ( cache.has( key ) ) {\n\t\t\tvalue = cache.get( key );\n\t\t} else {\n\t\t\tvalue = fn( key );\n\n\t\t\t// Can reach here if key is not valid for WeakMap, since `has`\n\t\t\t// will return false for invalid key. Since `set` will throw,\n\t\t\t// ensure that key is valid before setting into cache.\n\t\t\tif ( key !== null && typeof key === 'object' ) {\n\t\t\t\tcache.set( key, value );\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n}\n\nexport default withWeakMapCache;\n", "/**\n * Checks whether the attribute is a \"raw\" attribute or not.\n *\n * @param {Object} entity    Entity record.\n * @param {string} attribute Attribute name.\n *\n * @return {boolean} Is the attribute raw\n */\nexport default function isRawAttribute( entity, attribute ) {\n\treturn ( entity.rawAttributes || [] ).includes( attribute );\n}\n", "/**\n * Sets the value at path of object.\n * If a portion of path doesn\u2019t exist, it\u2019s created.\n * Arrays are created for missing index properties while objects are created\n * for all other missing properties.\n *\n * Path is specified as either:\n * - a string of properties, separated by dots, for example: \"x.y\".\n * - an array of properties, for example `[ 'x', 'y' ]`.\n *\n * This function intentionally mutates the input object.\n *\n * Inspired by _.set().\n *\n * @see https://lodash.com/docs/4.17.15#set\n *\n * @todo Needs to be deduplicated with its copy in `@wordpress/edit-site`.\n *\n * @param {Object}       object Object to modify\n * @param {Array|string} path   Path of the property to set.\n * @param {*}            value  Value to set.\n */\nexport default function setNestedValue( object, path, value ) {\n\tif ( ! object || typeof object !== 'object' ) {\n\t\treturn object;\n\t}\n\n\tconst normalizedPath = Array.isArray( path ) ? path : path.split( '.' );\n\n\tnormalizedPath.reduce( ( acc, key, idx ) => {\n\t\tif ( acc[ key ] === undefined ) {\n\t\t\tif ( Number.isInteger( normalizedPath[ idx + 1 ] ) ) {\n\t\t\t\tacc[ key ] = [];\n\t\t\t} else {\n\t\t\t\tacc[ key ] = {};\n\t\t\t}\n\t\t}\n\t\tif ( idx === normalizedPath.length - 1 ) {\n\t\t\tacc[ key ] = value;\n\t\t}\n\t\treturn acc[ key ];\n\t}, object );\n\n\treturn object;\n}\n", "/**\n * Helper util to return a value from a certain path of the object.\n * Path is specified as either:\n * - a string of properties, separated by dots, for example: \"x.y\".\n * - an array of properties, for example `[ 'x', 'y' ]`.\n * You can also specify a default value in case the result is nullish.\n *\n * @param {Object}       object       Input object.\n * @param {string|Array} path         Path to the object property.\n * @param {*}            defaultValue Default value if the value at the specified path is undefined.\n * @return {*} Value of the object property at the specified path.\n */\nexport default function getNestedValue( object, path, defaultValue ) {\n\tif (\n\t\t! object ||\n\t\ttypeof object !== 'object' ||\n\t\t( typeof path !== 'string' && ! Array.isArray( path ) )\n\t) {\n\t\treturn object;\n\t}\n\tconst normalizedPath = Array.isArray( path ) ? path : path.split( '.' );\n\tlet value = object;\n\tnormalizedPath.forEach( ( fieldName ) => {\n\t\tvalue = value?.[ fieldName ];\n\t} );\n\treturn value !== undefined ? value : defaultValue;\n}\n", "/**\n * Checks argument to determine if it's a numeric ID.\n * For example, '123' is a numeric ID, but '123abc' is not.\n *\n * @param {any} id the argument to determine if it's a numeric ID.\n * @return {boolean} true if the string is a numeric ID, false otherwise.\n */\nexport default function isNumericID( id ) {\n\treturn /^\\s*\\d+\\s*$/.test( id );\n}\n", "export const ALLOWED_RESOURCE_ACTIONS = [\n\t'create',\n\t'read',\n\t'update',\n\t'delete',\n];\n\nexport function getUserPermissionsFromAllowHeader( allowedMethods ) {\n\tconst permissions = {};\n\tif ( ! allowedMethods ) {\n\t\treturn permissions;\n\t}\n\n\tconst methods = {\n\t\tcreate: 'POST',\n\t\tread: 'GET',\n\t\tupdate: 'PUT',\n\t\tdelete: 'DELETE',\n\t};\n\tfor ( const [ actionName, methodName ] of Object.entries( methods ) ) {\n\t\tpermissions[ actionName ] = allowedMethods.includes( methodName );\n\t}\n\n\treturn permissions;\n}\n\nexport function getUserPermissionCacheKey( action, resource, id ) {\n\tconst key = (\n\t\ttypeof resource === 'object'\n\t\t\t? [ action, resource.kind, resource.name, resource.id ]\n\t\t\t: [ action, resource, id ]\n\t)\n\t\t.filter( Boolean )\n\t\t.join( '/' );\n\n\treturn key;\n}\n", "export const RECEIVE_INTERMEDIATE_RESULTS = Symbol(\n\t'RECEIVE_INTERMEDIATE_RESULTS'\n);\n", "/**\n * Returns an action object used in signalling that items have been received.\n *\n * @param {Array}   items Items received.\n * @param {?Object} edits Optional edits to reset.\n * @param {?Object} meta  Meta information about pagination.\n *\n * @return {Object} Action object.\n */\nexport function receiveItems( items, edits, meta ) {\n\treturn {\n\t\ttype: 'RECEIVE_ITEMS',\n\t\titems: Array.isArray( items ) ? items : [ items ],\n\t\tpersistedEdits: edits,\n\t\tmeta,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that entity records have been\n * deleted and they need to be removed from entities state.\n *\n * @param {string}              kind            Kind of the removed entities.\n * @param {string}              name            Name of the removed entities.\n * @param {Array|number|string} records         Record IDs of the removed entities.\n * @param {boolean}             invalidateCache Controls whether we want to invalidate the cache.\n * @return {Object} Action object.\n */\nexport function removeItems( kind, name, records, invalidateCache = false ) {\n\treturn {\n\t\ttype: 'REMOVE_ITEMS',\n\t\titemIds: Array.isArray( records ) ? records : [ records ],\n\t\tkind,\n\t\tname,\n\t\tinvalidateCache,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that queried data has been\n * received.\n *\n * @param {Array}   items Queried items received.\n * @param {?Object} query Optional query object.\n * @param {?Object} edits Optional edits to reset.\n * @param {?Object} meta  Meta information about pagination.\n *\n * @return {Object} Action object.\n */\nexport function receiveQueriedItems( items, query = {}, edits, meta ) {\n\treturn {\n\t\t...receiveItems( items, edits, meta ),\n\t\tquery,\n\t};\n}\n", "/**\n * External dependencies\n */\nimport EquivalentKeyMap from 'equivalent-key-map';\n\n/**\n * WordPress dependencies\n */\nimport { createSelector } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport getQueryParts from './get-query-parts';\nimport { setNestedValue } from '../utils';\n\n/**\n * Cache of state keys to EquivalentKeyMap where the inner map tracks queries\n * to their resulting items set. WeakMap allows garbage collection on expired\n * state references.\n *\n * @type {WeakMap<Object,EquivalentKeyMap>}\n */\nconst queriedItemsCacheByState = new WeakMap();\n\n/**\n * Returns items for a given query, or null if the items are not known.\n *\n * @param {Object}  state State object.\n * @param {?Object} query Optional query.\n *\n * @return {?Array} Query items.\n */\nfunction getQueriedItemsUncached( state, query ) {\n\tconst { stableKey, page, perPage, include, fields, context } =\n\t\tgetQueryParts( query );\n\tlet itemIds;\n\n\tif ( state.queries?.[ context ]?.[ stableKey ] ) {\n\t\titemIds = state.queries[ context ][ stableKey ].itemIds;\n\t}\n\n\tif ( ! itemIds ) {\n\t\treturn null;\n\t}\n\n\tconst startOffset = perPage === -1 ? 0 : ( page - 1 ) * perPage;\n\tconst endOffset =\n\t\tperPage === -1\n\t\t\t? itemIds.length\n\t\t\t: Math.min( startOffset + perPage, itemIds.length );\n\n\tconst items = [];\n\tfor ( let i = startOffset; i < endOffset; i++ ) {\n\t\tconst itemId = itemIds[ i ];\n\t\tif ( Array.isArray( include ) && ! include.includes( itemId ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( itemId === undefined ) {\n\t\t\tcontinue;\n\t\t}\n\t\t// Having a target item ID doesn't guarantee that this object has been queried.\n\t\tif ( ! state.items[ context ]?.hasOwnProperty( itemId ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst item = state.items[ context ][ itemId ];\n\n\t\tlet filteredItem;\n\t\tif ( Array.isArray( fields ) ) {\n\t\t\tfilteredItem = {};\n\n\t\t\tfor ( let f = 0; f < fields.length; f++ ) {\n\t\t\t\tconst field = fields[ f ].split( '.' );\n\t\t\t\tlet value = item;\n\t\t\t\tfield.forEach( ( fieldName ) => {\n\t\t\t\t\tvalue = value?.[ fieldName ];\n\t\t\t\t} );\n\n\t\t\t\tsetNestedValue( filteredItem, field, value );\n\t\t\t}\n\t\t} else {\n\t\t\t// If expecting a complete item, validate that completeness, or\n\t\t\t// otherwise abort.\n\t\t\tif ( ! state.itemIsComplete[ context ]?.[ itemId ] ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tfilteredItem = item;\n\t\t}\n\n\t\titems.push( filteredItem );\n\t}\n\n\treturn items;\n}\n\n/**\n * Returns items for a given query, or null if the items are not known. Caches\n * result both per state (by reference) and per query (by deep equality).\n * The caching approach is intended to be durable to query objects which are\n * deeply but not referentially equal, since otherwise:\n *\n * `getQueriedItems( state, {} ) !== getQueriedItems( state, {} )`\n *\n * @param {Object}  state State object.\n * @param {?Object} query Optional query.\n *\n * @return {?Array} Query items.\n */\nexport const getQueriedItems = createSelector( ( state, query = {} ) => {\n\tlet queriedItemsCache = queriedItemsCacheByState.get( state );\n\tif ( queriedItemsCache ) {\n\t\tconst queriedItems = queriedItemsCache.get( query );\n\t\tif ( queriedItems !== undefined ) {\n\t\t\treturn queriedItems;\n\t\t}\n\t} else {\n\t\tqueriedItemsCache = new EquivalentKeyMap();\n\t\tqueriedItemsCacheByState.set( state, queriedItemsCache );\n\t}\n\n\tconst items = getQueriedItemsUncached( state, query );\n\tqueriedItemsCache.set( query, items );\n\treturn items;\n} );\n\nexport function getQueriedTotalItems( state, query = {} ) {\n\tconst { stableKey, context } = getQueryParts( query );\n\n\treturn state.queries?.[ context ]?.[ stableKey ]?.meta?.totalItems ?? null;\n}\n\nexport function getQueriedTotalPages( state, query = {} ) {\n\tconst { stableKey, context } = getQueryParts( query );\n\n\treturn state.queries?.[ context ]?.[ stableKey ]?.meta?.totalPages ?? null;\n}\n", "/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * Internal dependencies\n */\nimport { withWeakMapCache, getNormalizedCommaSeparable } from '../utils';\n\n/**\n * An object of properties describing a specific query.\n *\n * @typedef {Object} WPQueriedDataQueryParts\n *\n * @property {number}      page      The query page (1-based index, default 1).\n * @property {number}      perPage   Items per page for query (default 10).\n * @property {string}      stableKey An encoded stable string of all non-\n *                                   pagination, non-fields query parameters.\n * @property {?(string[])} fields    Target subset of fields to derive from\n *                                   item objects.\n * @property {?(number[])} include   Specific item IDs to include.\n * @property {string}      context   Scope under which the request is made;\n *                                   determines returned fields in response.\n */\n\n/**\n * Given a query object, returns an object of parts, including pagination\n * details (`page` and `perPage`, or default values). All other properties are\n * encoded into a stable (idempotent) `stableKey` value.\n *\n * @param {Object} query Optional query object.\n *\n * @return {WPQueriedDataQueryParts} Query parts.\n */\nexport function getQueryParts( query ) {\n\t/**\n\t * @type {WPQueriedDataQueryParts}\n\t */\n\tconst parts = {\n\t\tstableKey: '',\n\t\tpage: 1,\n\t\tperPage: 10,\n\t\tfields: null,\n\t\tinclude: null,\n\t\tcontext: 'default',\n\t};\n\n\t// Ensure stable key by sorting keys. Also more efficient for iterating.\n\tconst keys = Object.keys( query ).sort();\n\n\tfor ( let i = 0; i < keys.length; i++ ) {\n\t\tconst key = keys[ i ];\n\t\tlet value = query[ key ];\n\n\t\tswitch ( key ) {\n\t\t\tcase 'page':\n\t\t\t\tparts[ key ] = Number( value );\n\t\t\t\tbreak;\n\n\t\t\tcase 'per_page':\n\t\t\t\tparts.perPage = Number( value );\n\t\t\t\tbreak;\n\n\t\t\tcase 'context':\n\t\t\t\tparts.context = value;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// While in theory, we could exclude \"_fields\" from the stableKey\n\t\t\t\t// because two request with different fields have the same results\n\t\t\t\t// We're not able to ensure that because the server can decide to omit\n\t\t\t\t// fields from the response even if we explicitly asked for it.\n\t\t\t\t// Example: Asking for titles in posts without title support.\n\t\t\t\tif ( key === '_fields' ) {\n\t\t\t\t\tparts.fields = getNormalizedCommaSeparable( value ) ?? [];\n\t\t\t\t\t// Make sure to normalize value for `stableKey`\n\t\t\t\t\tvalue = parts.fields.join();\n\t\t\t\t}\n\n\t\t\t\t// Two requests with different include values cannot have same results.\n\t\t\t\tif ( key === 'include' ) {\n\t\t\t\t\tif ( typeof value === 'number' ) {\n\t\t\t\t\t\tvalue = value.toString();\n\t\t\t\t\t}\n\t\t\t\t\tparts.include = (\n\t\t\t\t\t\tgetNormalizedCommaSeparable( value ) ?? []\n\t\t\t\t\t).map( Number );\n\t\t\t\t\t// Normalize value for `stableKey`.\n\t\t\t\t\tvalue = parts.include.join();\n\t\t\t\t}\n\n\t\t\t\t// While it could be any deterministic string, for simplicity's\n\t\t\t\t// sake mimic querystring encoding for stable key.\n\t\t\t\t//\n\t\t\t\t// TODO: For consistency with PHP implementation, addQueryArgs\n\t\t\t\t// should accept a key value pair, which may optimize its\n\t\t\t\t// implementation for our use here, vs. iterating an object\n\t\t\t\t// with only a single key.\n\t\t\t\tparts.stableKey +=\n\t\t\t\t\t( parts.stableKey ? '&' : '' ) +\n\t\t\t\t\taddQueryArgs( '', { [ key ]: value } ).slice( 1 );\n\t\t}\n\t}\n\n\treturn parts;\n}\n\nexport default withWeakMapCache( getQueryParts );\n", "/**\n * WordPress dependencies\n */\nimport { combineReducers } from '@wordpress/data';\nimport { compose } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport {\n\tconservativeMapItem,\n\tifMatchingAction,\n\treplaceAction,\n\tonSubKey,\n} from '../utils';\nimport { DEFAULT_ENTITY_KEY } from '../entities';\nimport getQueryParts from './get-query-parts';\n\nfunction getContextFromAction( action ) {\n\tconst { query } = action;\n\tif ( ! query ) {\n\t\treturn 'default';\n\t}\n\n\tconst queryParts = getQueryParts( query );\n\treturn queryParts.context;\n}\n\n/**\n * Returns a merged array of item IDs, given details of the received paginated\n * items. The array is sparse-like with `undefined` entries where holes exist.\n *\n * @param {?Array<number>} itemIds     Original item IDs (default empty array).\n * @param {number[]}       nextItemIds Item IDs to merge.\n * @param {number}         page        Page of items merged.\n * @param {number}         perPage     Number of items per page.\n *\n * @return {number[]} Merged array of item IDs.\n */\nexport function getMergedItemIds( itemIds, nextItemIds, page, perPage ) {\n\tconst receivedAllIds = page === 1 && perPage === -1;\n\tif ( receivedAllIds ) {\n\t\treturn nextItemIds;\n\t}\n\tconst nextItemIdsStartIndex = ( page - 1 ) * perPage;\n\n\t// If later page has already been received, default to the larger known\n\t// size of the existing array, else calculate as extending the existing.\n\tconst size = Math.max(\n\t\titemIds?.length ?? 0,\n\t\tnextItemIdsStartIndex + nextItemIds.length\n\t);\n\n\t// Preallocate array since size is known.\n\tconst mergedItemIds = new Array( size );\n\n\tfor ( let i = 0; i < size; i++ ) {\n\t\t// Preserve existing item ID except for subset of range of next items.\n\t\t// We need to check against the possible maximum upper boundary because\n\t\t// a page could receive fewer than what was previously stored.\n\t\tconst isInNextItemsRange =\n\t\t\ti >= nextItemIdsStartIndex && i < nextItemIdsStartIndex + perPage;\n\t\tmergedItemIds[ i ] = isInNextItemsRange\n\t\t\t? nextItemIds[ i - nextItemIdsStartIndex ]\n\t\t\t: itemIds?.[ i ];\n\t}\n\n\treturn mergedItemIds;\n}\n\n/**\n * Helper function to filter out entities with certain IDs.\n * Entities are keyed by their ID.\n *\n * @param {Object} entities Entity objects, keyed by entity ID.\n * @param {Array}  ids      Entity IDs to filter out.\n *\n * @return {Object} Filtered entities.\n */\nfunction removeEntitiesById( entities, ids ) {\n\treturn Object.fromEntries(\n\t\tObject.entries( entities ).filter(\n\t\t\t( [ id ] ) =>\n\t\t\t\t! ids.some( ( itemId ) => {\n\t\t\t\t\tif ( Number.isInteger( itemId ) ) {\n\t\t\t\t\t\treturn itemId === +id;\n\t\t\t\t\t}\n\t\t\t\t\treturn itemId === id;\n\t\t\t\t} )\n\t\t)\n\t);\n}\n\n/**\n * Reducer tracking items state, keyed by ID. Items are assumed to be normal,\n * where identifiers are common across all queries.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Next state.\n */\nexport function items( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_ITEMS': {\n\t\t\tconst context = getContextFromAction( action );\n\t\t\tconst key = action.key || DEFAULT_ENTITY_KEY;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ context ]: {\n\t\t\t\t\t...state[ context ],\n\t\t\t\t\t...action.items.reduce( ( accumulator, value ) => {\n\t\t\t\t\t\tconst itemId = value?.[ key ];\n\n\t\t\t\t\t\taccumulator[ itemId ] = conservativeMapItem(\n\t\t\t\t\t\t\tstate?.[ context ]?.[ itemId ],\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn accumulator;\n\t\t\t\t\t}, {} ),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tcase 'REMOVE_ITEMS':\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).map( ( [ itemId, contextState ] ) => [\n\t\t\t\t\titemId,\n\t\t\t\t\tremoveEntitiesById( contextState, action.itemIds ),\n\t\t\t\t] )\n\t\t\t);\n\t}\n\treturn state;\n}\n\n/**\n * Reducer tracking item completeness, keyed by ID. A complete item is one for\n * which all fields are known. This is used in supporting `_fields` queries,\n * where not all properties associated with an entity are necessarily returned.\n * In such cases, completeness is used as an indication of whether it would be\n * safe to use queried data for a non-`_fields`-limited request.\n *\n * @param {Object<string,Object<string,boolean>>} state  Current state.\n * @param {Object}                                action Dispatched action.\n *\n * @return {Object<string,Object<string,boolean>>} Next state.\n */\nexport function itemIsComplete( state = {}, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_ITEMS': {\n\t\t\tconst context = getContextFromAction( action );\n\t\t\tconst { query, key = DEFAULT_ENTITY_KEY } = action;\n\n\t\t\t// An item is considered complete if it is received without an associated\n\t\t\t// fields query. Ideally, this would be implemented in such a way where the\n\t\t\t// complete aggregate of all fields would satisfy completeness. Since the\n\t\t\t// fields are not consistent across all entities, this would require\n\t\t\t// introspection on the REST schema for each entity to know which fields\n\t\t\t// compose a complete item for that entity.\n\t\t\tconst queryParts = query ? getQueryParts( query ) : {};\n\t\t\tconst isCompleteQuery =\n\t\t\t\t! query || ! Array.isArray( queryParts.fields );\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ context ]: {\n\t\t\t\t\t...state[ context ],\n\t\t\t\t\t...action.items.reduce( ( result, item ) => {\n\t\t\t\t\t\tconst itemId = item?.[ key ];\n\n\t\t\t\t\t\t// Defer to completeness if already assigned. Technically the\n\t\t\t\t\t\t// data may be outdated if receiving items for a field subset.\n\t\t\t\t\t\tresult[ itemId ] =\n\t\t\t\t\t\t\tstate?.[ context ]?.[ itemId ] || isCompleteQuery;\n\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}, {} ),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tcase 'REMOVE_ITEMS':\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).map( ( [ itemId, contextState ] ) => [\n\t\t\t\t\titemId,\n\t\t\t\t\tremoveEntitiesById( contextState, action.itemIds ),\n\t\t\t\t] )\n\t\t\t);\n\t}\n\n\treturn state;\n}\n\n/**\n * Reducer tracking queries state, keyed by stable query key. Each reducer\n * query object includes `itemIds` and `requestingPageByPerPage`.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Next state.\n */\nconst receiveQueries = compose( [\n\t// Limit to matching action type so we don't attempt to replace action on\n\t// an unhandled action.\n\tifMatchingAction( ( action ) => 'query' in action ),\n\n\t// Inject query parts into action for use both in `onSubKey` and reducer.\n\treplaceAction( ( action ) => {\n\t\t// `ifMatchingAction` still passes on initialization, where state is\n\t\t// undefined and a query is not assigned. Avoid attempting to parse\n\t\t// parts. `onSubKey` will omit by lack of `stableKey`.\n\t\tif ( action.query ) {\n\t\t\treturn {\n\t\t\t\t...action,\n\t\t\t\t...getQueryParts( action.query ),\n\t\t\t};\n\t\t}\n\n\t\treturn action;\n\t} ),\n\n\tonSubKey( 'context' ),\n\n\t// Queries shape is shared, but keyed by query `stableKey` part. Original\n\t// reducer tracks only a single query object.\n\tonSubKey( 'stableKey' ),\n] )( ( state = {}, action ) => {\n\tconst { type, page, perPage, key = DEFAULT_ENTITY_KEY } = action;\n\n\tif ( type !== 'RECEIVE_ITEMS' ) {\n\t\treturn state;\n\t}\n\n\treturn {\n\t\titemIds: getMergedItemIds(\n\t\t\tstate?.itemIds || [],\n\t\t\taction.items.map( ( item ) => item?.[ key ] ).filter( Boolean ),\n\t\t\tpage,\n\t\t\tperPage\n\t\t),\n\t\tmeta: action.meta,\n\t};\n} );\n\n/**\n * Reducer tracking queries state.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Next state.\n */\nconst queries = ( state = {}, action ) => {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_ITEMS':\n\t\t\treturn receiveQueries( state, action );\n\t\tcase 'REMOVE_ITEMS':\n\t\t\tconst removedItems = action.itemIds.reduce( ( result, itemId ) => {\n\t\t\t\tresult[ itemId ] = true;\n\t\t\t\treturn result;\n\t\t\t}, {} );\n\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.entries( state ).map(\n\t\t\t\t\t( [ queryGroup, contextQueries ] ) => [\n\t\t\t\t\t\tqueryGroup,\n\t\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\t\tObject.entries( contextQueries ).map(\n\t\t\t\t\t\t\t\t( [ query, queryItems ] ) => [\n\t\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t...queryItems,\n\t\t\t\t\t\t\t\t\t\titemIds: queryItems.itemIds.filter(\n\t\t\t\t\t\t\t\t\t\t\t( queryId ) =>\n\t\t\t\t\t\t\t\t\t\t\t\t! removedItems[ queryId ]\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t),\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t);\n\t\tdefault:\n\t\t\treturn state;\n\t}\n};\n\nexport default combineReducers( {\n\titems,\n\titemIsComplete,\n\tqueries,\n} );\n", "/******************************************************************************\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\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\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", "/**\n * Locale character mapping rules.\n */\ninterface Locale {\n  regexp: RegExp;\n  map: Record<string, string>;\n}\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\nconst SUPPORTED_LOCALE: Record<string, Locale> = {\n  tr: {\n    regexp: /\\u0130|\\u0049|\\u0049\\u0307/g,\n    map: {\n      İ: \"\\u0069\",\n      I: \"\\u0131\",\n      İ: \"\\u0069\",\n    },\n  },\n  az: {\n    regexp: /\\u0130/g,\n    map: {\n      İ: \"\\u0069\",\n      I: \"\\u0131\",\n      İ: \"\\u0069\",\n    },\n  },\n  lt: {\n    regexp: /\\u0049|\\u004A|\\u012E|\\u00CC|\\u00CD|\\u0128/g,\n    map: {\n      I: \"\\u0069\\u0307\",\n      J: \"\\u006A\\u0307\",\n      Į: \"\\u012F\\u0307\",\n      Ì: \"\\u0069\\u0307\\u0300\",\n      Í: \"\\u0069\\u0307\\u0301\",\n      Ĩ: \"\\u0069\\u0307\\u0303\",\n    },\n  },\n};\n\n/**\n * Localized lower case.\n */\nexport function localeLowerCase(str: string, locale: string) {\n  const lang = SUPPORTED_LOCALE[locale.toLowerCase()];\n  if (lang) return lowerCase(str.replace(lang.regexp, (m) => lang.map[m]));\n  return lowerCase(str);\n}\n\n/**\n * Lower case as a function.\n */\nexport function lowerCase(str: string) {\n  return str.toLowerCase();\n}\n", "import { lowerCase } from \"lower-case\";\n\nexport interface Options {\n  splitRegexp?: RegExp | RegExp[];\n  stripRegexp?: RegExp | RegExp[];\n  delimiter?: string;\n  transform?: (part: string, index: number, parts: string[]) => string;\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nconst DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n\n// Remove all non-word characters.\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nexport function noCase(input: string, options: Options = {}) {\n  const {\n    splitRegexp = DEFAULT_SPLIT_REGEXP,\n    stripRegexp = DEFAULT_STRIP_REGEXP,\n    transform = lowerCase,\n    delimiter = \" \",\n  } = options;\n\n  let result = replace(\n    replace(input, splitRegexp, \"$1\\0$2\"),\n    stripRegexp,\n    \"\\0\"\n  );\n  let start = 0;\n  let end = result.length;\n\n  // Trim the delimiter from around the output string.\n  while (result.charAt(start) === \"\\0\") start++;\n  while (result.charAt(end - 1) === \"\\0\") end--;\n\n  // Transform each token independently.\n  return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input: string, re: RegExp | RegExp[], value: string) {\n  if (re instanceof RegExp) return input.replace(re, value);\n  return re.reduce((input, re) => input.replace(re, value), input);\n}\n", "import { noCase, Options } from \"no-case\";\n\nexport { Options };\n\nexport function pascalCaseTransform(input: string, index: number) {\n  const firstChar = input.charAt(0);\n  const lowerChars = input.substr(1).toLowerCase();\n  if (index > 0 && firstChar >= \"0\" && firstChar <= \"9\") {\n    return `_${firstChar}${lowerChars}`;\n  }\n  return `${firstChar.toUpperCase()}${lowerChars}`;\n}\n\nexport function pascalCaseTransformMerge(input: string) {\n  return input.charAt(0).toUpperCase() + input.slice(1).toLowerCase();\n}\n\nexport function pascalCase(input: string, options: Options = {}) {\n  return noCase(input, {\n    delimiter: \"\",\n    transform: pascalCaseTransform,\n    ...options,\n  });\n}\n", "import {\n  pascalCase,\n  pascalCaseTransform,\n  pascalCaseTransformMerge,\n  Options,\n} from \"pascal-case\";\n\nexport { Options };\n\nexport function camelCaseTransform(input: string, index: number) {\n  if (index === 0) return input.toLowerCase();\n  return pascalCaseTransform(input, index);\n}\n\nexport function camelCaseTransformMerge(input: string, index: number) {\n  if (index === 0) return input.toLowerCase();\n  return pascalCaseTransformMerge(input);\n}\n\nexport function camelCase(input: string, options: Options = {}) {\n  return pascalCase(input, {\n    transform: camelCaseTransform,\n    ...options,\n  });\n}\n", "/**\n * Upper case the first character of an input string.\n */\nexport function upperCaseFirst(input: string) {\n  return input.charAt(0).toUpperCase() + input.substr(1);\n}\n", "import { noCase, Options } from \"no-case\";\nimport { upperCaseFirst } from \"upper-case-first\";\n\nexport { Options };\n\nexport function capitalCaseTransform(input: string) {\n  return upperCaseFirst(input.toLowerCase());\n}\n\nexport function capitalCase(input: string, options: Options = {}) {\n  return noCase(input, {\n    delimiter: \" \",\n    transform: capitalCaseTransform,\n    ...options,\n  });\n}\n", "/**\n * External dependencies\n */\nimport { capitalCase, pascalCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { __unstableSerializeAndClean, parse } from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { getSyncManager } from './sync';\nimport {\n\tapplyPostChangesToCRDTDoc,\n\tgetPostChangesFromCRDTDoc,\n} from './utils/crdt';\n\nexport const DEFAULT_ENTITY_KEY = 'id';\nconst POST_RAW_ATTRIBUTES = [ 'title', 'excerpt', 'content' ];\n\nconst blocksTransientEdits = {\n\tblocks: {\n\t\tread: ( record ) => parse( record.content?.raw ?? '' ),\n\t\twrite: ( record ) => ( {\n\t\t\tcontent: __unstableSerializeAndClean( record.blocks ),\n\t\t} ),\n\t},\n};\n\nexport const rootEntitiesConfig = [\n\t{\n\t\tlabel: __( 'Base' ),\n\t\tkind: 'root',\n\t\tkey: false,\n\t\tname: '__unstableBase',\n\t\tbaseURL: '/',\n\t\tbaseURLParams: {\n\t\t\t// Please also change the preload path when changing this.\n\t\t\t// @see lib/compat/wordpress-6.8/preload.php\n\t\t\t_fields: [\n\t\t\t\t'description',\n\t\t\t\t'gmt_offset',\n\t\t\t\t'home',\n\t\t\t\t'name',\n\t\t\t\t'site_icon',\n\t\t\t\t'site_icon_url',\n\t\t\t\t'site_logo',\n\t\t\t\t'timezone_string',\n\t\t\t\t'url',\n\t\t\t\t'page_for_posts',\n\t\t\t\t'page_on_front',\n\t\t\t\t'show_on_front',\n\t\t\t].join( ',' ),\n\t\t},\n\t\t// The entity doesn't support selecting multiple records.\n\t\t// The property is maintained for backward compatibility.\n\t\tplural: '__unstableBases',\n\t},\n\t{\n\t\tlabel: __( 'Post Type' ),\n\t\tname: 'postType',\n\t\tkind: 'root',\n\t\tkey: 'slug',\n\t\tbaseURL: '/wp/v2/types',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'postTypes',\n\t},\n\t{\n\t\tname: 'media',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/media',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'mediaItems',\n\t\tlabel: __( 'Media' ),\n\t\trawAttributes: [ 'caption', 'title', 'description' ],\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tname: 'taxonomy',\n\t\tkind: 'root',\n\t\tkey: 'slug',\n\t\tbaseURL: '/wp/v2/taxonomies',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'taxonomies',\n\t\tlabel: __( 'Taxonomy' ),\n\t},\n\t{\n\t\tname: 'sidebar',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/sidebars',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'sidebars',\n\t\ttransientEdits: { blocks: true },\n\t\tlabel: __( 'Widget areas' ),\n\t},\n\t{\n\t\tname: 'widget',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/widgets',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'widgets',\n\t\ttransientEdits: { blocks: true },\n\t\tlabel: __( 'Widgets' ),\n\t},\n\t{\n\t\tname: 'widgetType',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/widget-types',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'widgetTypes',\n\t\tlabel: __( 'Widget types' ),\n\t},\n\t{\n\t\tlabel: __( 'User' ),\n\t\tname: 'user',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/users',\n\t\tgetTitle: ( record ) => record?.name || record?.slug,\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'users',\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tname: 'comment',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/comments',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'comments',\n\t\tlabel: __( 'Comment' ),\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tname: 'menu',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/menus',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'menus',\n\t\tlabel: __( 'Menu' ),\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tname: 'menuItem',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/menu-items',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'menuItems',\n\t\tlabel: __( 'Menu Item' ),\n\t\trawAttributes: [ 'title' ],\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tname: 'menuLocation',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/menu-locations',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'menuLocations',\n\t\tlabel: __( 'Menu Location' ),\n\t\tkey: 'name',\n\t},\n\t{\n\t\tlabel: __( 'Global Styles' ),\n\t\tname: 'globalStyles',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/global-styles',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'globalStylesVariations', // Should be different from name.\n\t\tgetTitle: () => __( 'Custom Styles' ),\n\t\tgetRevisionsUrl: ( parentId, revisionId ) =>\n\t\t\t`/wp/v2/global-styles/${ parentId }/revisions${\n\t\t\t\trevisionId ? '/' + revisionId : ''\n\t\t\t}`,\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tlabel: __( 'Themes' ),\n\t\tname: 'theme',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/themes',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'themes',\n\t\tkey: 'stylesheet',\n\t},\n\t{\n\t\tlabel: __( 'Plugins' ),\n\t\tname: 'plugin',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/plugins',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'plugins',\n\t\tkey: 'plugin',\n\t},\n\t{\n\t\tlabel: __( 'Status' ),\n\t\tname: 'status',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/statuses',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'statuses',\n\t\tkey: 'slug',\n\t},\n\t{\n\t\tlabel: __( 'Registered Templates' ),\n\t\tname: 'registeredTemplate',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/registered-templates',\n\t\tkey: 'id',\n\t},\n\t{\n\t\tlabel: __( 'Font Collections' ),\n\t\tname: 'fontCollection',\n\t\tkind: 'root',\n\t\tbaseURL: '/wp/v2/font-collections',\n\t\tbaseURLParams: { context: 'view' },\n\t\tplural: 'fontCollections',\n\t\tkey: 'slug',\n\t},\n];\n\nexport const deprecatedEntities = {\n\troot: {\n\t\tmedia: {\n\t\t\tsince: '6.9',\n\t\t\talternative: {\n\t\t\t\tkind: 'postType',\n\t\t\t\tname: 'attachment',\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport const additionalEntityConfigLoaders = [\n\t{ kind: 'postType', loadEntities: loadPostTypeEntities },\n\t{ kind: 'taxonomy', loadEntities: loadTaxonomyEntities },\n\t{\n\t\tkind: 'root',\n\t\tname: 'site',\n\t\tplural: 'sites',\n\t\tloadEntities: loadSiteEntity,\n\t},\n];\n\n/**\n * Apply extra edits before persisting a post type.\n *\n * @param {Object}  persistedRecord Already persisted Post\n * @param {Object}  edits           Edits.\n * @param {string}  name            Post type name.\n * @param {boolean} isTemplate      Whether the post type is a template.\n * @return {Object} Updated edits.\n */\nexport const prePersistPostType = (\n\tpersistedRecord,\n\tedits,\n\tname,\n\tisTemplate\n) => {\n\tconst newEdits = {};\n\n\tif ( ! isTemplate && persistedRecord?.status === 'auto-draft' ) {\n\t\t// Saving an auto-draft should create a draft by default.\n\t\tif ( ! edits.status && ! newEdits.status ) {\n\t\t\tnewEdits.status = 'draft';\n\t\t}\n\n\t\t// Fix the auto-draft default title.\n\t\tif (\n\t\t\t( ! edits.title || edits.title === 'Auto Draft' ) &&\n\t\t\t! newEdits.title &&\n\t\t\t( ! persistedRecord?.title ||\n\t\t\t\tpersistedRecord?.title === 'Auto Draft' )\n\t\t) {\n\t\t\tnewEdits.title = '';\n\t\t}\n\t}\n\n\t// Add meta for persisted CRDT document.\n\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\tif ( persistedRecord ) {\n\t\t\tconst objectType = `postType/${ name }`;\n\t\t\tconst objectId = persistedRecord.id;\n\t\t\tconst meta = getSyncManager()?.createMeta( objectType, objectId );\n\t\t\tnewEdits.meta = {\n\t\t\t\t...edits.meta,\n\t\t\t\t...meta,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn newEdits;\n};\n\n/**\n * Returns the list of post type entities.\n *\n * @return {Promise} Entities promise\n */\nasync function loadPostTypeEntities() {\n\tconst postTypes = await apiFetch( {\n\t\tpath: '/wp/v2/types?context=view',\n\t} );\n\treturn Object.entries( postTypes ?? {} ).map( ( [ name, postType ] ) => {\n\t\tconst isTemplate = [ 'wp_template', 'wp_template_part' ].includes(\n\t\t\tname\n\t\t);\n\t\tconst namespace = postType?.rest_namespace ?? 'wp/v2';\n\n\t\tconst entity = {\n\t\t\tkind: 'postType',\n\t\t\tbaseURL: `/${ namespace }/${ postType.rest_base }`,\n\t\t\tbaseURLParams: { context: 'edit' },\n\t\t\tname,\n\t\t\tlabel: postType.name,\n\t\t\ttransientEdits: {\n\t\t\t\t...blocksTransientEdits,\n\t\t\t\tselection: true,\n\t\t\t},\n\t\t\tmergedEdits: { meta: true },\n\t\t\trawAttributes: POST_RAW_ATTRIBUTES,\n\t\t\tgetTitle: ( record ) =>\n\t\t\t\trecord?.title?.rendered ||\n\t\t\t\trecord?.title ||\n\t\t\t\t( isTemplate\n\t\t\t\t\t? capitalCase( record.slug ?? '' )\n\t\t\t\t\t: String( record.id ) ),\n\t\t\t__unstablePrePersist: ( persistedRecord, edits ) =>\n\t\t\t\tprePersistPostType( persistedRecord, edits, name, isTemplate ),\n\t\t\t__unstable_rest_base: postType.rest_base,\n\t\t\tsupportsPagination: true,\n\t\t\tgetRevisionsUrl: ( parentId, revisionId ) =>\n\t\t\t\t`/${ namespace }/${\n\t\t\t\t\tpostType.rest_base\n\t\t\t\t}/${ parentId }/revisions${\n\t\t\t\t\trevisionId ? '/' + revisionId : ''\n\t\t\t\t}`,\n\t\t\trevisionKey:\n\t\t\t\tisTemplate && ! window?.__experimentalTemplateActivate\n\t\t\t\t\t? 'wp_id'\n\t\t\t\t\t: DEFAULT_ENTITY_KEY,\n\t\t};\n\n\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t/**\n\t\t\t * @type {import('@wordpress/sync').SyncConfig}\n\t\t\t */\n\t\t\tentity.syncConfig = {\n\t\t\t\t/**\n\t\t\t\t * Apply changes from the local editor to the local CRDT document so\n\t\t\t\t * that those changes can be synced to other peers (via the provider).\n\t\t\t\t *\n\t\t\t\t * @param {import('@wordpress/sync').CRDTDoc}               crdtDoc\n\t\t\t\t * @param {Partial< import('@wordpress/sync').ObjectData >} changes\n\t\t\t\t * @return {void}\n\t\t\t\t */\n\t\t\t\tapplyChangesToCRDTDoc: ( crdtDoc, changes ) =>\n\t\t\t\t\tapplyPostChangesToCRDTDoc( crdtDoc, changes, postType ),\n\n\t\t\t\t/**\n\t\t\t\t * Extract changes from a CRDT document that can be used to update the\n\t\t\t\t * local editor state.\n\t\t\t\t *\n\t\t\t\t * @param {import('@wordpress/sync').CRDTDoc}    crdtDoc\n\t\t\t\t * @param {import('@wordpress/sync').ObjectData} editedRecord\n\t\t\t\t * @return {Partial< import('@wordpress/sync').ObjectData >} Changes to record\n\t\t\t\t */\n\t\t\t\tgetChangesFromCRDTDoc: ( crdtDoc, editedRecord ) =>\n\t\t\t\t\tgetPostChangesFromCRDTDoc(\n\t\t\t\t\t\tcrdtDoc,\n\t\t\t\t\t\teditedRecord,\n\t\t\t\t\t\tpostType\n\t\t\t\t\t),\n\n\t\t\t\t/**\n\t\t\t\t * Sync features supported by the entity.\n\t\t\t\t *\n\t\t\t\t * @type {Record< string, boolean >}\n\t\t\t\t */\n\t\t\t\tsupports: {\n\t\t\t\t\tcrdtPersistence: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn entity;\n\t} );\n}\n\n/**\n * Returns the list of the taxonomies entities.\n *\n * @return {Promise} Entities promise\n */\nasync function loadTaxonomyEntities() {\n\tconst taxonomies = await apiFetch( {\n\t\tpath: '/wp/v2/taxonomies?context=view',\n\t} );\n\treturn Object.entries( taxonomies ?? {} ).map( ( [ name, taxonomy ] ) => {\n\t\tconst namespace = taxonomy?.rest_namespace ?? 'wp/v2';\n\t\treturn {\n\t\t\tkind: 'taxonomy',\n\t\t\tbaseURL: `/${ namespace }/${ taxonomy.rest_base }`,\n\t\t\tbaseURLParams: { context: 'edit' },\n\t\t\tname,\n\t\t\tlabel: taxonomy.name,\n\t\t\tgetTitle: ( record ) => record?.name,\n\t\t\tsupportsPagination: true,\n\t\t};\n\t} );\n}\n\n/**\n * Returns the Site entity.\n *\n * @return {Promise} Entity promise\n */\nasync function loadSiteEntity() {\n\tconst entity = {\n\t\tlabel: __( 'Site' ),\n\t\tname: 'site',\n\t\tkind: 'root',\n\t\tkey: false,\n\t\tbaseURL: '/wp/v2/settings',\n\t\tmeta: {},\n\t};\n\n\tconst site = await apiFetch( {\n\t\tpath: entity.baseURL,\n\t\tmethod: 'OPTIONS',\n\t} );\n\n\tconst labels = {};\n\tObject.entries( site?.schema?.properties ?? {} ).forEach(\n\t\t( [ key, value ] ) => {\n\t\t\t// Ignore properties `title` and `type` keys.\n\t\t\tif ( typeof value === 'object' && value.title ) {\n\t\t\t\tlabels[ key ] = value.title;\n\t\t\t}\n\t\t}\n\t);\n\n\treturn [ { ...entity, meta: { labels } } ];\n}\n\n/**\n * Returns the entity's getter method name given its kind and name or plural name.\n *\n * @example\n * ```js\n * const nameSingular = getMethodName( 'root', 'theme', 'get' );\n * // nameSingular is getRootTheme\n *\n * const namePlural = getMethodName( 'root', 'themes', 'set' );\n * // namePlural is setRootThemes\n * ```\n *\n * @param {string} kind   Entity kind.\n * @param {string} name   Entity name or plural name.\n * @param {string} prefix Function prefix.\n *\n * @return {string} Method name\n */\nexport const getMethodName = ( kind, name, prefix = 'get' ) => {\n\tconst kindPrefix = kind === 'root' ? '' : pascalCase( kind );\n\tconst suffix = pascalCase( name );\n\treturn `${ prefix }${ kindPrefix }${ suffix }`;\n};\n", "/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template X,Y\n * @param {Map<X,Y>} m\n * @return {Map<X,Y>}\n */\nexport const copy = m => {\n  const r = create()\n  m.forEach((v, k) => { r.set(k, v) })\n  return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template V,K\n * @template {Map<K,V>} MAP\n * @param {MAP} map\n * @param {K} key\n * @param {function():V} createT\n * @return {V}\n */\nexport const setIfUndefined = (map, key, createT) => {\n  let set = map.get(key)\n  if (set === undefined) {\n    map.set(key, set = createT())\n  }\n  return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n  const res = []\n  for (const [key, value] of m) {\n    res.push(f(value, key))\n  }\n  return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n  for (const [key, value] of m) {\n    if (f(value, key)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n  for (const [key, value] of m) {\n    if (!f(value, key)) {\n      return false\n    }\n  }\n  return true\n}\n", "/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T}\n */\nexport const first = set =>\n  set.values().next().value || undefined\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n", "/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n  for (let i = 0; i < src.length; i++) {\n    dest.push(src[i])\n  }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n  for (let i = 0; i < arr.length; i++) {\n    if (!f(arr[i], i, arr)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n  for (let i = 0; i < arr.length; i++) {\n    if (f(arr[i], i, arr)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n  const array = new Array(len)\n  for (let i = 0; i < len; i++) {\n    array[i] = f(i, array)\n  }\n  return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n  /**\n   * @type {Set<M>}\n   */\n  const happened = set.create()\n  /**\n   * @type {Array<T>}\n   */\n  const result = []\n  for (let i = 0; i < arr.length; i++) {\n    const el = arr[i]\n    const mapped = mapper(el)\n    if (!happened.has(mapped)) {\n      happened.add(mapped)\n      result.push(el)\n    }\n  }\n  return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n  /**\n   * @type {Array<any>}\n   */\n  const res = Array(arr.length)\n  for (let i = 0; i < arr.length; i++) {\n    res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n  }\n  return /** @type {any} */ (res)\n}\n", "/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n *\n * @template N\n */\nexport class Observable {\n  constructor () {\n    /**\n     * Some desc.\n     * @type {Map<N, any>}\n     */\n    this._observers = map.create()\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  on (name, f) {\n    map.setIfUndefined(this._observers, name, set.create).add(f)\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  once (name, f) {\n    /**\n     * @param  {...any} args\n     */\n    const _f = (...args) => {\n      this.off(name, _f)\n      f(...args)\n    }\n    this.on(name, _f)\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  off (name, f) {\n    const observers = this._observers.get(name)\n    if (observers !== undefined) {\n      observers.delete(f)\n      if (observers.size === 0) {\n        this._observers.delete(name)\n      }\n    }\n  }\n\n  /**\n   * Emit a named event. All registered event listeners that listen to the\n   * specified name will receive the event.\n   *\n   * @todo This should catch exceptions\n   *\n   * @param {N} name The event name.\n   * @param {Array<any>} args The arguments that are applied to the event listener.\n   */\n  emit (name, args) {\n    // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n    return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n  }\n\n  destroy () {\n    this._observers = map.create()\n  }\n}\n", "/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also differentiates between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n", "import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Polyfill = str => {\n  const encodedString = unescape(encodeURIComponent(str))\n  const len = encodedString.length\n  const buf = new Uint8Array(len)\n  for (let i = 0; i < len; i++) {\n    buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n  }\n  return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n  let remainingLen = buf.length\n  let encodedString = ''\n  let bufPos = 0\n  while (remainingLen > 0) {\n    const nextLen = remainingLen < 10000 ? remainingLen : 10000\n    const bytes = buf.subarray(bufPos, bufPos + nextLen)\n    bufPos += nextLen\n    // Starting with ES5.1 we can supply a generic array-like object as arguments\n    encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n    remainingLen -= nextLen\n  }\n  return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n  // Safari doesn't handle BOM correctly.\n  // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n  // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n  // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n  // Another issue is that from then on no BOM chars are recognized anymore\n  /* c8 ignore next */\n  utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n", "/**\n * Often used conditions.\n *\n * @module conditions\n */\n\n/**\n * @template T\n * @param {T|null|undefined} v\n * @return {T|null}\n */\n/* c8 ignore next */\nexport const undefinedToNull = v => v === undefined ? null : v\n", "/* eslint-env browser */\n\n/**\n * Isomorphic variable storage.\n *\n * Uses LocalStorage in the browser and falls back to in-memory storage.\n *\n * @module storage\n */\n\n/* c8 ignore start */\nclass VarStoragePolyfill {\n  constructor () {\n    this.map = new Map()\n  }\n\n  /**\n   * @param {string} key\n   * @param {any} newValue\n   */\n  setItem (key, newValue) {\n    this.map.set(key, newValue)\n  }\n\n  /**\n   * @param {string} key\n   */\n  getItem (key) {\n    return this.map.get(key)\n  }\n}\n/* c8 ignore stop */\n\n/**\n * @type {any}\n */\nlet _localStorage = new VarStoragePolyfill()\nlet usePolyfill = true\n\n/* c8 ignore start */\ntry {\n  // if the same-origin rule is violated, accessing localStorage might thrown an error\n  if (typeof localStorage !== 'undefined') {\n    _localStorage = localStorage\n    usePolyfill = false\n  }\n} catch (e) { }\n/* c8 ignore stop */\n\n/**\n * This is basically localStorage in browser, or a polyfill in nodejs\n */\n/* c8 ignore next */\nexport const varStorage = _localStorage\n\n/**\n * A polyfill for `addEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const onChange = eventHandler => usePolyfill || addEventListener('storage', /** @type {any} */ (eventHandler))\n\n/**\n * A polyfill for `removeEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const offChange = eventHandler => usePolyfill || removeEventListener('storage', /** @type {any} */ (eventHandler))\n", "/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n  for (const key in obj) {\n    f(obj[key], key)\n  }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n  const results = []\n  for (const key in obj) {\n    results.push(f(obj[key], key))\n  }\n  return results\n}\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n  for (const key in obj) {\n    if (f(obj[key], key)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * @param {Object|undefined} obj\n */\nexport const isEmpty = obj => {\n  // eslint-disable-next-line\n  for (const _k in obj) {\n    return false\n  }\n  return true\n}\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n  for (const key in obj) {\n    if (!f(obj[key], key)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (length(a) === length(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && b[key] === val))\n", "/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n  try {\n    for (; i < fs.length; i++) {\n      fs[i](...args)\n    }\n  } finally {\n    if (i < fs.length) {\n      callAll(fs, args, i + 1)\n    }\n  }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n  if (a == null || b == null) {\n    return equalityStrict(a, b)\n  }\n  if (a.constructor !== b.constructor) {\n    return false\n  }\n  if (a === b) {\n    return true\n  }\n  switch (a.constructor) {\n    case ArrayBuffer:\n      a = new Uint8Array(a)\n      b = new Uint8Array(b)\n    // eslint-disable-next-line no-fallthrough\n    case Uint8Array: {\n      if (a.byteLength !== b.byteLength) {\n        return false\n      }\n      for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) {\n          return false\n        }\n      }\n      break\n    }\n    case Set: {\n      if (a.size !== b.size) {\n        return false\n      }\n      for (const value of a) {\n        if (!b.has(value)) {\n          return false\n        }\n      }\n      break\n    }\n    case Map: {\n      if (a.size !== b.size) {\n        return false\n      }\n      for (const key of a.keys()) {\n        if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n          return false\n        }\n      }\n      break\n    }\n    case Object:\n      if (object.length(a) !== object.length(b)) {\n        return false\n      }\n      for (const key in a) {\n        if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n          return false\n        }\n      }\n      break\n    case Array:\n      if (a.length !== b.length) {\n        return false\n      }\n      for (let i = 0; i < a.length; i++) {\n        if (!equalityDeep(a[i], b[i])) {\n          return false\n        }\n      }\n      break\n    default:\n      return false\n  }\n  return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n  /**\n   * @param {any} n\n   * @return {n is InstanceType<TYPE>}\n   **/\n  n => n && n.constructor === T\n", "/**\n * Isomorphic module to work access the environment (query params, env variables).\n *\n * @module map\n */\n\nimport * as map from './map.js'\nimport * as string from './string.js'\nimport * as conditions from './conditions.js'\nimport * as storage from './storage.js'\nimport * as f from './function.js'\n\n/* c8 ignore next */\n// @ts-ignore\nexport const isNode = typeof process !== 'undefined' && process.release &&\n  /node|io\\.js/.test(process.release.name)\n/* c8 ignore next */\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && !isNode\n/* c8 ignore next 3 */\nexport const isMac = typeof navigator !== 'undefined'\n  ? /Mac/.test(navigator.platform)\n  : false\n\n/**\n * @type {Map<string,string>}\n */\nlet params\nconst args = []\n\n/* c8 ignore start */\nconst computeParams = () => {\n  if (params === undefined) {\n    if (isNode) {\n      params = map.create()\n      const pargs = process.argv\n      let currParamName = null\n      for (let i = 0; i < pargs.length; i++) {\n        const parg = pargs[i]\n        if (parg[0] === '-') {\n          if (currParamName !== null) {\n            params.set(currParamName, '')\n          }\n          currParamName = parg\n        } else {\n          if (currParamName !== null) {\n            params.set(currParamName, parg)\n            currParamName = null\n          } else {\n            args.push(parg)\n          }\n        }\n      }\n      if (currParamName !== null) {\n        params.set(currParamName, '')\n      }\n      // in ReactNative for example this would not be true (unless connected to the Remote Debugger)\n    } else if (typeof location === 'object') {\n      params = map.create(); // eslint-disable-next-line no-undef\n      (location.search || '?').slice(1).split('&').forEach((kv) => {\n        if (kv.length !== 0) {\n          const [key, value] = kv.split('=')\n          params.set(`--${string.fromCamelCase(key, '-')}`, value)\n          params.set(`-${string.fromCamelCase(key, '-')}`, value)\n        }\n      })\n    } else {\n      params = map.create()\n    }\n  }\n  return params\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next */\nexport const hasParam = (name) => computeParams().has(name)\n\n/**\n * @param {string} name\n * @param {string} defaultVal\n * @return {string}\n */\n/* c8 ignore next 2 */\nexport const getParam = (name, defaultVal) =>\n  computeParams().get(name) || defaultVal\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 4 */\nexport const getVariable = (name) =>\n  isNode\n    ? conditions.undefinedToNull(process.env[name.toUpperCase()])\n    : conditions.undefinedToNull(storage.varStorage.getItem(name))\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 2 */\nexport const getConf = (name) =>\n  computeParams().get('--' + name) || getVariable(name)\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next 2 */\nexport const hasConf = (name) =>\n  hasParam('--' + name) || getVariable(name) !== null\n\n/* c8 ignore next */\nexport const production = hasConf('production')\n\n/* c8 ignore next 2 */\nconst forceColor = isNode &&\n  f.isOneOf(process.env.FORCE_COLOR, ['true', '1', '2'])\n\n/* c8 ignore start */\nexport const supportsColor = !hasParam('no-colors') &&\n  (!isNode || process.stdout.isTTY || forceColor) && (\n  !isNode || hasParam('color') || forceColor ||\n    getVariable('COLORTERM') !== null ||\n    (getVariable('TERM') || '').includes('color')\n)\n/* c8 ignore stop */\n", "/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n", "/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n  n &= binary.BITS32\n  let count = 0\n  while (n) {\n    n &= (n - 1)\n    count++\n  }\n  return count\n}\n", "/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n  throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n  throw create('Unexpected case')\n}\n", "/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as buffer from './buffer.js'\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n */\nexport class Decoder {\n  /**\n   * @param {Uint8Array} uint8Array Binary data to decode\n   */\n  constructor (uint8Array) {\n    /**\n     * Decoding target.\n     *\n     * @type {Uint8Array}\n     */\n    this.arr = uint8Array\n    /**\n     * Current decoding position.\n     *\n     * @type {number}\n     */\n    this.pos = 0\n  }\n}\n\n/**\n * @function\n * @param {Uint8Array} uint8Array\n * @return {Decoder}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n  const _decoder = createDecoder(decoder.arr)\n  _decoder.pos = newPos\n  return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n *            Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array}\n */\nexport const readUint8Array = (decoder, len) => {\n  const view = buffer.createUint8ArrayViewFromArrayBuffer(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n  decoder.pos += len\n  return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n *            Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n  const uint =\n    decoder.arr[decoder.pos] +\n    (decoder.arr[decoder.pos + 1] << 8)\n  decoder.pos += 2\n  return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n  const uint =\n    (decoder.arr[decoder.pos] +\n    (decoder.arr[decoder.pos + 1] << 8) +\n    (decoder.arr[decoder.pos + 2] << 16) +\n    (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n  decoder.pos += 4\n  return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n  const uint =\n    (decoder.arr[decoder.pos + 3] +\n    (decoder.arr[decoder.pos + 2] << 8) +\n    (decoder.arr[decoder.pos + 1] << 16) +\n    (decoder.arr[decoder.pos] << 24)) >>> 0\n  decoder.pos += 4\n  return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n  decoder.arr[decoder.pos] +\n  (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n  decoder.arr[decoder.pos] +\n  (decoder.arr[decoder.pos + 1] << 8) +\n  (decoder.arr[decoder.pos + 2] << 16) +\n  (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n *  * numbers < 2^7 is stored in one bytlength\n *  * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n  let num = 0\n  let mult = 1\n  const len = decoder.arr.length\n  while (decoder.pos < len) {\n    const r = decoder.arr[decoder.pos++]\n    // num = num | ((r & binary.BITS7) << len)\n    num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n    mult *= 128 // next iteration, shift 7 \"more\" to the left\n    if (r < binary.BIT8) {\n      return num\n    }\n    /* c8 ignore start */\n    if (num > number.MAX_SAFE_INTEGER) {\n      throw errorIntegerOutOfRange\n    }\n    /* c8 ignore stop */\n  }\n  throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n *  * numbers < 2^7 is stored in one bytlength\n *  * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n  let r = decoder.arr[decoder.pos++]\n  let num = r & binary.BITS6\n  let mult = 64\n  const sign = (r & binary.BIT7) > 0 ? -1 : 1\n  if ((r & binary.BIT8) === 0) {\n    // don't continue reading\n    return sign * num\n  }\n  const len = decoder.arr.length\n  while (decoder.pos < len) {\n    r = decoder.arr[decoder.pos++]\n    // num = num | ((r & binary.BITS7) << len)\n    num = num + (r & binary.BITS7) * mult\n    mult *= 128\n    if (r < binary.BIT8) {\n      return sign * num\n    }\n    /* c8 ignore start */\n    if (num > number.MAX_SAFE_INTEGER) {\n      throw errorIntegerOutOfRange\n    }\n    /* c8 ignore stop */\n  }\n  throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n  const pos = decoder.pos\n  const s = readVarUint(decoder)\n  decoder.pos = pos\n  return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n  const pos = decoder.pos\n  const s = readVarInt(decoder)\n  decoder.pos = pos\n  return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n  let remainingLen = readVarUint(decoder)\n  if (remainingLen === 0) {\n    return ''\n  } else {\n    let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n    if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n      while (remainingLen--) {\n        encodedString += String.fromCodePoint(readUint8(decoder))\n      }\n    } else {\n      while (remainingLen > 0) {\n        const nextLen = remainingLen < 10000 ? remainingLen : 10000\n        // this is dangerous, we create a fresh array view from the existing buffer\n        const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n        decoder.pos += nextLen\n        // Starting with ES5.1 we can supply a generic array-like object as arguments\n        encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n        remainingLen -= nextLen\n      }\n    }\n    return decodeURIComponent(escape(encodedString))\n  }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n  /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n  const encoder = encoding.createEncoder()\n  let b\n  while (true) {\n    b = readUint8(decoder)\n    if (b === 0) {\n      return encoding.toUint8Array(encoder)\n    }\n    if (b === 1) {\n      b = readUint8(decoder)\n    }\n    encoding.write(encoder, b)\n  }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n  const pos = decoder.pos\n  const s = readVarString(decoder)\n  decoder.pos = pos\n  return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n  const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n  decoder.pos += len\n  return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n  decoder => undefined, // CASE 127: undefined\n  decoder => null, // CASE 126: null\n  readVarInt, // CASE 125: integer\n  readFloat32, // CASE 124: float32\n  readFloat64, // CASE 123: float64\n  readBigInt64, // CASE 122: bigint\n  decoder => false, // CASE 121: boolean (false)\n  decoder => true, // CASE 120: boolean (true)\n  readVarString, // CASE 119: string\n  decoder => { // CASE 118: object<string,any>\n    const len = readVarUint(decoder)\n    /**\n     * @type {Object<string,any>}\n     */\n    const obj = {}\n    for (let i = 0; i < len; i++) {\n      const key = readVarString(decoder)\n      obj[key] = readAny(decoder)\n    }\n    return obj\n  },\n  decoder => { // CASE 117: array<any>\n    const len = readVarUint(decoder)\n    const arr = []\n    for (let i = 0; i < len; i++) {\n      arr.push(readAny(decoder))\n    }\n    return arr\n  },\n  readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   * @param {function(Decoder):T} reader\n   */\n  constructor (uint8Array, reader) {\n    super(uint8Array)\n    /**\n     * The reader\n     */\n    this.reader = reader\n    /**\n     * Current state\n     * @type {T|null}\n     */\n    this.s = null\n    this.count = 0\n  }\n\n  read () {\n    if (this.count === 0) {\n      this.s = this.reader(this)\n      if (hasContent(this)) {\n        this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n      } else {\n        this.count = -1 // read the current value forever\n      }\n    }\n    this.count--\n    return /** @type {T} */ (this.s)\n  }\n}\n\nexport class IntDiffDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   * @param {number} start\n   */\n  constructor (uint8Array, start) {\n    super(uint8Array)\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n  }\n\n  /**\n   * @return {number}\n   */\n  read () {\n    this.s += readVarInt(this)\n    return this.s\n  }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   * @param {number} start\n   */\n  constructor (uint8Array, start) {\n    super(uint8Array)\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n    this.count = 0\n  }\n\n  /**\n   * @return {number}\n   */\n  read () {\n    if (this.count === 0) {\n      this.s += readVarInt(this)\n      if (hasContent(this)) {\n        this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n      } else {\n        this.count = -1 // read the current value forever\n      }\n    }\n    this.count--\n    return /** @type {number} */ (this.s)\n  }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    super(uint8Array)\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  read () {\n    if (this.count === 0) {\n      this.s = readVarInt(this)\n      // if the sign is negative, we read the count too, otherwise count is 1\n      const isNegative = math.isNegativeZero(this.s)\n      this.count = 1\n      if (isNegative) {\n        this.s = -this.s\n        this.count = readVarUint(this) + 2\n      }\n    }\n    this.count--\n    return /** @type {number} */ (this.s)\n  }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    super(uint8Array)\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  read () {\n    if (this.count === 0) {\n      this.s = readVarInt(this)\n      // if the sign is negative, we read the count too, otherwise count is 1\n      const isNegative = math.isNegativeZero(this.s)\n      this.count = 1\n      if (isNegative) {\n        this.s = -this.s\n        this.count = readVarUint(this) + 2\n      }\n    }\n    this.count--\n    return /** @type {number} */ (this.s++)\n  }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    super(uint8Array)\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n    this.diff = 0\n  }\n\n  /**\n   * @return {number}\n   */\n  read () {\n    if (this.count === 0) {\n      const diff = readVarInt(this)\n      // if the first bit is set, we read more data\n      const hasCount = diff & 1\n      this.diff = math.floor(diff / 2) // shift >> 1\n      this.count = 1\n      if (hasCount) {\n        this.count = readVarUint(this) + 2\n      }\n    }\n    this.s += this.diff\n    this.count--\n    return this.s\n  }\n}\n\nexport class StringDecoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    this.decoder = new UintOptRleDecoder(uint8Array)\n    this.str = readVarString(this.decoder)\n    /**\n     * @type {number}\n     */\n    this.spos = 0\n  }\n\n  /**\n   * @return {string}\n   */\n  read () {\n    const end = this.spos + this.decoder.read()\n    const res = this.str.slice(this.spos, end)\n    this.spos = end\n    return res\n  }\n}\n", "/**\n * Utility functions to work with buffers (Uint8Array).\n *\n * @module buffer\n */\n\nimport * as string from './string.js'\nimport * as env from './environment.js'\nimport * as array from './array.js'\nimport * as math from './math.js'\nimport * as encoding from './encoding.js'\nimport * as decoding from './decoding.js'\n\n/**\n * @param {number} len\n */\nexport const createUint8ArrayFromLen = len => new Uint8Array(len)\n\n/**\n * Create Uint8Array with initial content from buffer\n *\n * @param {ArrayBuffer} buffer\n * @param {number} byteOffset\n * @param {number} length\n */\nexport const createUint8ArrayViewFromArrayBuffer = (buffer, byteOffset, length) => new Uint8Array(buffer, byteOffset, length)\n\n/**\n * Create Uint8Array with initial content from buffer\n *\n * @param {ArrayBuffer} buffer\n */\nexport const createUint8ArrayFromArrayBuffer = buffer => new Uint8Array(buffer)\n\n/* c8 ignore start */\n/**\n * @param {Uint8Array} bytes\n * @return {string}\n */\nconst toBase64Browser = bytes => {\n  let s = ''\n  for (let i = 0; i < bytes.byteLength; i++) {\n    s += string.fromCharCode(bytes[i])\n  }\n  // eslint-disable-next-line no-undef\n  return btoa(s)\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} bytes\n * @return {string}\n */\nconst toBase64Node = bytes => Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('base64')\n\n/* c8 ignore start */\n/**\n * @param {string} s\n * @return {Uint8Array}\n */\nconst fromBase64Browser = s => {\n  // eslint-disable-next-line no-undef\n  const a = atob(s)\n  const bytes = createUint8ArrayFromLen(a.length)\n  for (let i = 0; i < a.length; i++) {\n    bytes[i] = a.charCodeAt(i)\n  }\n  return bytes\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} s\n */\nconst fromBase64Node = s => {\n  const buf = Buffer.from(s, 'base64')\n  return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n}\n\n/* c8 ignore next */\nexport const toBase64 = env.isBrowser ? toBase64Browser : toBase64Node\n\n/* c8 ignore next */\nexport const fromBase64 = env.isBrowser ? fromBase64Browser : fromBase64Node\n\n/**\n * Base64 is always a more efficient choice. This exists for utility purposes only.\n *\n * @param {Uint8Array} buf\n */\nexport const toHexString = buf => array.map(buf, b => b.toString(16).padStart(2, '0')).join('')\n\n/**\n * Note: This function expects that the hex doesn't start with 0x..\n *\n * @param {string} hex\n */\nexport const fromHexString = hex => {\n  const hlen = hex.length\n  const buf = new Uint8Array(math.ceil(hlen / 2))\n  for (let i = 0; i < hlen; i += 2) {\n    buf[buf.length - i / 2 - 1] = Number.parseInt(hex.slice(hlen - i - 2, hlen - i), 16)\n  }\n  return buf\n}\n\n/**\n * Copy the content of an Uint8Array view to a new ArrayBuffer.\n *\n * @param {Uint8Array} uint8Array\n * @return {Uint8Array}\n */\nexport const copyUint8Array = uint8Array => {\n  const newBuf = createUint8ArrayFromLen(uint8Array.byteLength)\n  newBuf.set(uint8Array)\n  return newBuf\n}\n\n/**\n * Encode anything as a UInt8Array. It's a pun on typescripts's `any` type.\n * See encoding.writeAny for more information.\n *\n * @param {any} data\n * @return {Uint8Array}\n */\nexport const encodeAny = data => {\n  const encoder = encoding.createEncoder()\n  encoding.writeAny(encoder, data)\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * Decode an any-encoded value.\n *\n * @param {Uint8Array} buf\n * @return {any}\n */\nexport const decodeAny = buf => decoding.readAny(decoding.createDecoder(buf))\n\n/**\n * Shift Byte Array {N} bits to the left. Does not expand byte array.\n *\n * @param {Uint8Array} bs\n * @param {number} N should be in the range of [0-7]\n */\nexport const shiftNBitsLeft = (bs, N) => {\n  if (N === 0) return bs\n  bs = new Uint8Array(bs)\n  bs[0] <<= N\n  for (let i = 1; i < bs.length; i++) {\n    bs[i - 1] |= bs[i] >>> (8 - N)\n    bs[i] <<= N\n  }\n  return bs\n}\n", "/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as buffer from './buffer.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n  constructor () {\n    this.cpos = 0\n    this.cbuf = new Uint8Array(100)\n    /**\n     * @type {Array<Uint8Array>}\n     */\n    this.bufs = []\n  }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n  const encoder = createEncoder()\n  f(encoder)\n  return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n  let len = encoder.cpos\n  for (let i = 0; i < encoder.bufs.length; i++) {\n    len += encoder.bufs[i].length\n  }\n  return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n  const uint8arr = new Uint8Array(length(encoder))\n  let curPos = 0\n  for (let i = 0; i < encoder.bufs.length; i++) {\n    const d = encoder.bufs[i]\n    uint8arr.set(d, curPos)\n    curPos += d.length\n  }\n  uint8arr.set(buffer.createUint8ArrayViewFromArrayBuffer(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n  return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n  const bufferLen = encoder.cbuf.length\n  if (bufferLen - encoder.cpos < len) {\n    encoder.bufs.push(buffer.createUint8ArrayViewFromArrayBuffer(encoder.cbuf.buffer, 0, encoder.cpos))\n    encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n    encoder.cpos = 0\n  }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n  const bufferLen = encoder.cbuf.length\n  if (encoder.cpos === bufferLen) {\n    encoder.bufs.push(encoder.cbuf)\n    encoder.cbuf = new Uint8Array(bufferLen * 2)\n    encoder.cpos = 0\n  }\n  encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n  let buffer = null\n  // iterate all buffers and adjust position\n  for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n    const b = encoder.bufs[i]\n    if (pos < b.length) {\n      buffer = b // found buffer\n    } else {\n      pos -= b.length\n    }\n  }\n  if (buffer === null) {\n    // use current buffer\n    buffer = encoder.cbuf\n  }\n  buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n  write(encoder, num & binary.BITS8)\n  write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n  set(encoder, pos, num & binary.BITS8)\n  set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n  for (let i = 0; i < 4; i++) {\n    write(encoder, num & binary.BITS8)\n    num >>>= 8\n  }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n  for (let i = 3; i >= 0; i--) {\n    write(encoder, (num >>> (8 * i)) & binary.BITS8)\n  }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n  for (let i = 0; i < 4; i++) {\n    set(encoder, pos + i, num & binary.BITS8)\n    num >>>= 8\n  }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n  while (num > binary.BITS7) {\n    write(encoder, binary.BIT8 | (binary.BITS7 & num))\n    num = math.floor(num / 128) // shift >>> 7\n  }\n  write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n  const isNegative = math.isNegativeZero(num)\n  if (isNegative) {\n    num = -num\n  }\n  //             |- whether to continue reading         |- whether is negative     |- number\n  write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n  num = math.floor(num / 64) // shift >>> 6\n  // We don't need to consider the case of num === 0 so we can use a different\n  // pattern here than above.\n  while (num > 0) {\n    write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n    num = math.floor(num / 128) // shift >>> 7\n  }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n  if (str.length < _maxStrBSize) {\n    // We can encode the string into the existing buffer\n    /* c8 ignore next */\n    const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n    writeVarUint(encoder, written)\n    for (let i = 0; i < written; i++) {\n      write(encoder, _strBuffer[i])\n    }\n  } else {\n    writeVarUint8Array(encoder, string.encodeUtf8(str))\n  }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n  const encodedString = unescape(encodeURIComponent(str))\n  const len = encodedString.length\n  writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n  }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n  writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n  for (let i = 0; i < buf.length; i++) {\n    const b = buf[i]\n    if (b === 0 || b === 1) {\n      write(encoder, 1)\n    }\n    write(encoder, buf[i])\n  }\n  write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n *        - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n *                Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n  const bufferLen = encoder.cbuf.length\n  const cpos = encoder.cpos\n  const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n  const rightCopyLen = uint8Array.length - leftCopyLen\n  encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n  encoder.cpos += leftCopyLen\n  if (rightCopyLen > 0) {\n    // Still something to write, write right half..\n    // Append new buffer\n    encoder.bufs.push(encoder.cbuf)\n    // must have at least size of remaining buffer\n    encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n    // copy array\n    encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n    encoder.cpos = rightCopyLen\n  }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n  writeVarUint(encoder, uint8Array.byteLength)\n  writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n  verifyLen(encoder, len)\n  const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n  encoder.cpos += len\n  return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n  floatTestBed.setFloat32(0, num)\n  return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * \u2022 Transforms data to a binary format (not to a string)\n * \u2022 Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * \u2022 Numbers are efficiently encoded either as a variable length integer, as a\n *   32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type           | Prefix   | Encoding Method    | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined           | 127      |                    | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null                | 126      |                    | |\n * | integer             | 125      | writeVarInt        | Only encodes 32 bit signed integers |\n * | float32             | 124      | writeFloat32       | |\n * | float64             | 123      | writeFloat64       | |\n * | bigint              | 122      | writeBigInt64      | |\n * | boolean (false)     | 121      |                    | True and false are different data types so we save the following byte |\n * | boolean (true)      | 120      |                    | - 0b01111000 so the last bit determines whether true or false |\n * | string              | 119      | writeVarString     | |\n * | object<string,any>  | 118      | custom             | Writes {length} then {length} key-value pairs |\n * | array<any>          | 117      | custom             | Writes {length} then {length} json values |\n * | Uint8Array          | 116      | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30]   the beginning of the data range is used for custom purposes\n *          (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n *          lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {undefined|null|number|bigint|boolean|string|Object<string,any>|Array<any>|Uint8Array} data\n */\nexport const writeAny = (encoder, data) => {\n  switch (typeof data) {\n    case 'string':\n      // TYPE 119: STRING\n      write(encoder, 119)\n      writeVarString(encoder, data)\n      break\n    case 'number':\n      if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n        // TYPE 125: INTEGER\n        write(encoder, 125)\n        writeVarInt(encoder, data)\n      } else if (isFloat32(data)) {\n        // TYPE 124: FLOAT32\n        write(encoder, 124)\n        writeFloat32(encoder, data)\n      } else {\n        // TYPE 123: FLOAT64\n        write(encoder, 123)\n        writeFloat64(encoder, data)\n      }\n      break\n    case 'bigint':\n      // TYPE 122: BigInt\n      write(encoder, 122)\n      writeBigInt64(encoder, data)\n      break\n    case 'object':\n      if (data === null) {\n        // TYPE 126: null\n        write(encoder, 126)\n      } else if (array.isArray(data)) {\n        // TYPE 117: Array\n        write(encoder, 117)\n        writeVarUint(encoder, data.length)\n        for (let i = 0; i < data.length; i++) {\n          writeAny(encoder, data[i])\n        }\n      } else if (data instanceof Uint8Array) {\n        // TYPE 116: ArrayBuffer\n        write(encoder, 116)\n        writeVarUint8Array(encoder, data)\n      } else {\n        // TYPE 118: Object\n        write(encoder, 118)\n        const keys = Object.keys(data)\n        writeVarUint(encoder, keys.length)\n        for (let i = 0; i < keys.length; i++) {\n          const key = keys[i]\n          writeVarString(encoder, key)\n          writeAny(encoder, data[key])\n        }\n      }\n      break\n    case 'boolean':\n      // TYPE 120/121: boolean (true/false)\n      write(encoder, data ? 120 : 121)\n      break\n    default:\n      // TYPE 127: undefined\n      write(encoder, 127)\n  }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n  /**\n   * @param {function(Encoder, T):void} writer\n   */\n  constructor (writer) {\n    super()\n    /**\n     * The writer\n     */\n    this.w = writer\n    /**\n     * Current state\n     * @type {T|null}\n     */\n    this.s = null\n    this.count = 0\n  }\n\n  /**\n   * @param {T} v\n   */\n  write (v) {\n    if (this.s === v) {\n      this.count++\n    } else {\n      if (this.count > 0) {\n        // flush counter, unless this is the first value (count = 0)\n        writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n      }\n      this.count = 1\n      // write first value\n      this.w(this, v)\n      this.s = v\n    }\n  }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n  /**\n   * @param {number} start\n   */\n  constructor (start) {\n    super()\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    writeVarInt(this, v - this.s)\n    this.s = v\n  }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) \u21D2 RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n  /**\n   * @param {number} start\n   */\n  constructor (start) {\n    super()\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n    this.count = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.s === v && this.count > 0) {\n      this.count++\n    } else {\n      if (this.count > 0) {\n        // flush counter, unless this is the first value (count = 0)\n        writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n      }\n      this.count = 1\n      // write first value\n      writeVarInt(this, v - this.s)\n      this.s = v\n    }\n  }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n  if (encoder.count > 0) {\n    // flush counter, unless this is the first value (count = 0)\n    // case 1: just a single value. set sign to positive\n    // case 2: write several values. set sign to negative to indicate that there is a length coming\n    writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n    if (encoder.count > 1) {\n      writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n    }\n  }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n  constructor () {\n    this.encoder = new Encoder()\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.s === v) {\n      this.count++\n    } else {\n      flushUintOptRleEncoder(this)\n      this.count = 1\n      this.s = v\n    }\n  }\n\n  toUint8Array () {\n    flushUintOptRleEncoder(this)\n    return toUint8Array(this.encoder)\n  }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n  constructor () {\n    this.encoder = new Encoder()\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.s + this.count === v) {\n      this.count++\n    } else {\n      flushUintOptRleEncoder(this)\n      this.count = 1\n      this.s = v\n    }\n  }\n\n  toUint8Array () {\n    flushUintOptRleEncoder(this)\n    return toUint8Array(this.encoder)\n  }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n  if (encoder.count > 0) {\n    //          31 bit making up the diff | wether to write the counter\n    // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n    const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n    // flush counter, unless this is the first value (count = 0)\n    // case 1: just a single value. set first bit to positive\n    // case 2: write several values. set first bit to negative to indicate that there is a length coming\n    writeVarInt(encoder.encoder, encodedDiff)\n    if (encoder.count > 1) {\n      writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n    }\n  }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n  constructor () {\n    this.encoder = new Encoder()\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n    this.diff = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.diff === v - this.s) {\n      this.s = v\n      this.count++\n    } else {\n      flushIntDiffOptRleEncoder(this)\n      this.count = 1\n      this.diff = v - this.s\n      this.s = v\n    }\n  }\n\n  toUint8Array () {\n    flushIntDiffOptRleEncoder(this)\n    return toUint8Array(this.encoder)\n  }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n  constructor () {\n    /**\n     * @type {Array<string>}\n     */\n    this.sarr = []\n    this.s = ''\n    this.lensE = new UintOptRleEncoder()\n  }\n\n  /**\n   * @param {string} string\n   */\n  write (string) {\n    this.s += string\n    if (this.s.length > 19) {\n      this.sarr.push(this.s)\n      this.s = ''\n    }\n    this.lensE.write(string.length)\n  }\n\n  toUint8Array () {\n    const encoder = new Encoder()\n    this.sarr.push(this.s)\n    this.s = ''\n    writeVarString(encoder, this.sarr.join(''))\n    writeUint8Array(encoder, this.lensE.toUint8Array())\n    return toUint8Array(encoder)\n  }\n}\n", "/* eslint-env browser */\n\nexport const subtle = crypto.subtle\nexport const getRandomValues = crypto.getRandomValues.bind(crypto)\n", "/**\n * Isomorphic module for true random numbers / buffers / uuids.\n *\n * Attention: falls back to Math.random if the browser does not support crypto.\n *\n * @module random\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\nimport { getRandomValues } from 'lib0/webcrypto'\n\nexport const rand = Math.random\n\nexport const uint32 = () => getRandomValues(new Uint32Array(1))[0]\n\nexport const uint53 = () => {\n  const arr = getRandomValues(new Uint32Array(8))\n  return (arr[0] & binary.BITS21) * (binary.BITS32 + 1) + (arr[1] >>> 0)\n}\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {T}\n */\nexport const oneOf = arr => arr[math.floor(rand() * arr.length)]\n\n// @ts-ignore\nconst uuidv4Template = [1e7] + -1e3 + -4e3 + -8e3 + -1e11\n\n/**\n * @return {string}\n */\nexport const uuidv4 = () => uuidv4Template.replace(/[018]/g, /** @param {number} c */ c =>\n  (c ^ uint32() & 15 >> c / 4).toString(16)\n)\n", "/**\n * Utility module to work with time.\n *\n * @module time\n */\n\nimport * as metric from './metric.js'\nimport * as math from './math.js'\n\n/**\n * Return current time.\n *\n * @return {Date}\n */\nexport const getDate = () => new Date()\n\n/**\n * Return current unix time.\n *\n * @return {number}\n */\nexport const getUnixTime = Date.now\n\n/**\n * Transform time (in ms) to a human readable format. E.g. 1100 => 1.1s. 60s => 1min. .001 => 10\u03BCs.\n *\n * @param {number} d duration in milliseconds\n * @return {string} humanized approximation of time\n */\nexport const humanizeDuration = d => {\n  if (d < 60000) {\n    const p = metric.prefix(d, -1)\n    return math.round(p.n * 100) / 100 + p.prefix + 's'\n  }\n  d = math.floor(d / 1000)\n  const seconds = d % 60\n  const minutes = math.floor(d / 60) % 60\n  const hours = math.floor(d / 3600) % 24\n  const days = math.floor(d / 86400)\n  if (days > 0) {\n    return days + 'd' + ((hours > 0 || minutes > 30) ? ' ' + (minutes > 30 ? hours + 1 : hours) + 'h' : '')\n  }\n  if (hours > 0) {\n    /* c8 ignore next */\n    return hours + 'h' + ((minutes > 0 || seconds > 30) ? ' ' + (seconds > 30 ? minutes + 1 : minutes) + 'min' : '')\n  }\n  return minutes + 'min' + (seconds > 0 ? ' ' + seconds + 's' : '')\n}\n", "/**\n * Utility helpers to work with promises.\n *\n * @module promise\n */\n\nimport * as time from './time.js'\n\n/**\n * @template T\n * @callback PromiseResolve\n * @param {T|PromiseLike<T>} [result]\n */\n\n/**\n * @template T\n * @param {function(PromiseResolve<T>,function(Error):void):any} f\n * @return {Promise<T>}\n */\nexport const create = f => /** @type {Promise<T>} */ (new Promise(f))\n\n/**\n * @param {function(function():void,function(Error):void):void} f\n * @return {Promise<void>}\n */\nexport const createEmpty = f => new Promise(f)\n\n/**\n * `Promise.all` wait for all promises in the array to resolve and return the result\n * @template {unknown[] | []} PS\n *\n * @param {PS} ps\n * @return {Promise<{ -readonly [P in keyof PS]: Awaited<PS[P]> }>}\n */\nexport const all = Promise.all.bind(Promise)\n\n/**\n * @param {Error} [reason]\n * @return {Promise<never>}\n */\nexport const reject = reason => Promise.reject(reason)\n\n/**\n * @template T\n * @param {T|void} res\n * @return {Promise<T|void>}\n */\nexport const resolve = res => Promise.resolve(res)\n\n/**\n * @template T\n * @param {T} res\n * @return {Promise<T>}\n */\nexport const resolveWith = res => Promise.resolve(res)\n\n/**\n * @todo Next version, reorder parameters: check, [timeout, [intervalResolution]]\n *\n * @param {number} timeout\n * @param {function():boolean} check\n * @param {number} [intervalResolution]\n * @return {Promise<void>}\n */\nexport const until = (timeout, check, intervalResolution = 10) => create((resolve, reject) => {\n  const startTime = time.getUnixTime()\n  const hasTimeout = timeout > 0\n  const untilInterval = () => {\n    if (check()) {\n      clearInterval(intervalHandle)\n      resolve()\n    } else if (hasTimeout) {\n      /* c8 ignore else */\n      if (time.getUnixTime() - startTime > timeout) {\n        clearInterval(intervalHandle)\n        reject(new Error('Timeout'))\n      }\n    }\n  }\n  const intervalHandle = setInterval(untilInterval, intervalResolution)\n})\n\n/**\n * @param {number} timeout\n * @return {Promise<undefined>}\n */\nexport const wait = timeout => create((resolve, reject) => setTimeout(resolve, timeout))\n\n/**\n * Checks if an object is a promise using ducktyping.\n *\n * Promises are often polyfilled, so it makes sense to add some additional guarantees if the user of this\n * library has some insane environment where global Promise objects are overwritten.\n *\n * @param {any} p\n * @return {boolean}\n */\nexport const isPromise = p => p instanceof Promise || (p && p.then && p.catch && p.finally)\n", "/**\n * Working with value pairs.\n *\n * @module pair\n */\n\n/**\n * @template L,R\n */\nexport class Pair {\n  /**\n   * @param {L} left\n   * @param {R} right\n   */\n  constructor (left, right) {\n    this.left = left\n    this.right = right\n  }\n}\n\n/**\n * @template L,R\n * @param {L} left\n * @param {R} right\n * @return {Pair<L,R>}\n */\nexport const create = (left, right) => new Pair(left, right)\n\n/**\n * @template L,R\n * @param {R} right\n * @param {L} left\n * @return {Pair<L,R>}\n */\nexport const createReversed = (right, left) => new Pair(left, right)\n\n/**\n * @template L,R\n * @param {Array<Pair<L,R>>} arr\n * @param {function(L, R):any} f\n */\nexport const forEach = (arr, f) => arr.forEach(p => f(p.left, p.right))\n\n/**\n * @template L,R,X\n * @param {Array<Pair<L,R>>} arr\n * @param {function(L, R):X} f\n * @return {Array<X>}\n */\nexport const map = (arr, f) => arr.map(p => f(p.left, p.right))\n", "/* eslint-env browser */\n\n/**\n * Utility module to work with the DOM.\n *\n * @module dom\n */\n\nimport * as pair from './pair.js'\nimport * as map from './map.js'\n\n/* c8 ignore start */\n/**\n * @type {Document}\n */\nexport const doc = /** @type {Document} */ (typeof document !== 'undefined' ? document : {})\n\n/**\n * @param {string} name\n * @return {HTMLElement}\n */\nexport const createElement = name => doc.createElement(name)\n\n/**\n * @return {DocumentFragment}\n */\nexport const createDocumentFragment = () => doc.createDocumentFragment()\n\n/**\n * @param {string} text\n * @return {Text}\n */\nexport const createTextNode = text => doc.createTextNode(text)\n\nexport const domParser = /** @type {DOMParser} */ (typeof DOMParser !== 'undefined' ? new DOMParser() : null)\n\n/**\n * @param {HTMLElement} el\n * @param {string} name\n * @param {Object} opts\n */\nexport const emitCustomEvent = (el, name, opts) => el.dispatchEvent(new CustomEvent(name, opts))\n\n/**\n * @param {Element} el\n * @param {Array<pair.Pair<string,string|boolean>>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributes = (el, attrs) => {\n  pair.forEach(attrs, (key, value) => {\n    if (value === false) {\n      el.removeAttribute(key)\n    } else if (value === true) {\n      el.setAttribute(key, '')\n    } else {\n      // @ts-ignore\n      el.setAttribute(key, value)\n    }\n  })\n  return el\n}\n\n/**\n * @param {Element} el\n * @param {Map<string, string>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributesMap = (el, attrs) => {\n  attrs.forEach((value, key) => { el.setAttribute(key, value) })\n  return el\n}\n\n/**\n * @param {Array<Node>|HTMLCollection} children\n * @return {DocumentFragment}\n */\nexport const fragment = children => {\n  const fragment = createDocumentFragment()\n  for (let i = 0; i < children.length; i++) {\n    appendChild(fragment, children[i])\n  }\n  return fragment\n}\n\n/**\n * @param {Element} parent\n * @param {Array<Node>} nodes\n * @return {Element}\n */\nexport const append = (parent, nodes) => {\n  appendChild(parent, fragment(nodes))\n  return parent\n}\n\n/**\n * @param {HTMLElement} el\n */\nexport const remove = el => el.remove()\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const addEventListener = (el, name, f) => el.addEventListener(name, f)\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const removeEventListener = (el, name, f) => el.removeEventListener(name, f)\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const addEventListeners = (node, listeners) => {\n  pair.forEach(listeners, (name, f) => addEventListener(node, name, f))\n  return node\n}\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const removeEventListeners = (node, listeners) => {\n  pair.forEach(listeners, (name, f) => removeEventListener(node, name, f))\n  return node\n}\n\n/**\n * @param {string} name\n * @param {Array<pair.Pair<string,string>|pair.Pair<string,boolean>>} attrs Array of key-value pairs\n * @param {Array<Node>} children\n * @return {Element}\n */\nexport const element = (name, attrs = [], children = []) =>\n  append(setAttributes(createElement(name), attrs), children)\n\n/**\n * @param {number} width\n * @param {number} height\n */\nexport const canvas = (width, height) => {\n  const c = /** @type {HTMLCanvasElement} */ (createElement('canvas'))\n  c.height = height\n  c.width = width\n  return c\n}\n\n/**\n * @param {string} t\n * @return {Text}\n */\nexport const text = createTextNode\n\n/**\n * @param {pair.Pair<string,string>} pair\n */\nexport const pairToStyleString = pair => `${pair.left}:${pair.right};`\n\n/**\n * @param {Array<pair.Pair<string,string>>} pairs\n * @return {string}\n */\nexport const pairsToStyleString = pairs => pairs.map(pairToStyleString).join('')\n\n/**\n * @param {Map<string,string>} m\n * @return {string}\n */\nexport const mapToStyleString = m => map.map(m, (value, key) => `${key}:${value};`).join('')\n\n/**\n * @todo should always query on a dom element\n *\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {HTMLElement | null}\n */\nexport const querySelector = (el, query) => el.querySelector(query)\n\n/**\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {NodeListOf<HTMLElement>}\n */\nexport const querySelectorAll = (el, query) => el.querySelectorAll(query)\n\n/**\n * @param {string} id\n * @return {HTMLElement}\n */\nexport const getElementById = id => /** @type {HTMLElement} */ (doc.getElementById(id))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nconst _parse = html => domParser.parseFromString(`<html><body>${html}</body></html>`, 'text/html').body\n\n/**\n * @param {string} html\n * @return {DocumentFragment}\n */\nexport const parseFragment = html => fragment(/** @type {any} */ (_parse(html).childNodes))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nexport const parseElement = html => /** @type HTMLElement */ (_parse(html).firstElementChild)\n\n/**\n * @param {HTMLElement} oldEl\n * @param {HTMLElement|DocumentFragment} newEl\n */\nexport const replaceWith = (oldEl, newEl) => oldEl.replaceWith(newEl)\n\n/**\n * @param {HTMLElement} parent\n * @param {HTMLElement} el\n * @param {Node|null} ref\n * @return {HTMLElement}\n */\nexport const insertBefore = (parent, el, ref) => parent.insertBefore(el, ref)\n\n/**\n * @param {Node} parent\n * @param {Node} child\n * @return {Node}\n */\nexport const appendChild = (parent, child) => parent.appendChild(child)\n\nexport const ELEMENT_NODE = doc.ELEMENT_NODE\nexport const TEXT_NODE = doc.TEXT_NODE\nexport const CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE\nexport const COMMENT_NODE = doc.COMMENT_NODE\nexport const DOCUMENT_NODE = doc.DOCUMENT_NODE\nexport const DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE\nexport const DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE\n\n/**\n * @param {any} node\n * @param {number} type\n */\nexport const checkNodeType = (node, type) => node.nodeType === type\n\n/**\n * @param {Node} parent\n * @param {HTMLElement} child\n */\nexport const isParentOf = (parent, child) => {\n  let p = child.parentNode\n  while (p && p !== parent) {\n    p = p.parentNode\n  }\n  return p === parent\n}\n/* c8 ignore stop */\n", "/**\n * Utility module to work with EcmaScript Symbols.\n *\n * @module symbol\n */\n\n/**\n * Return fresh symbol.\n *\n * @return {Symbol}\n */\nexport const create = Symbol\n\n/**\n * @param {any} s\n * @return {boolean}\n */\nexport const isSymbol = s => typeof s === 'symbol'\n", "import * as symbol from './symbol.js'\nimport * as time from './time.js'\nimport * as env from './environment.js'\nimport * as func from './function.js'\n\nexport const BOLD = symbol.create()\nexport const UNBOLD = symbol.create()\nexport const BLUE = symbol.create()\nexport const GREY = symbol.create()\nexport const GREEN = symbol.create()\nexport const RED = symbol.create()\nexport const PURPLE = symbol.create()\nexport const ORANGE = symbol.create()\nexport const UNCOLOR = symbol.create()\n\n/* c8 ignore start */\n/**\n * @param {Array<string|Symbol|Object|number>} args\n * @return {Array<string|object|number>}\n */\nexport const computeNoColorLoggingArgs = args => {\n  const strBuilder = []\n  const logArgs = []\n  // try with formatting until we find something unsupported\n  let i = 0\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    if (arg.constructor === String || arg.constructor === Number) {\n      strBuilder.push(arg)\n    } else if (arg.constructor === Object) {\n      logArgs.push(JSON.stringify(arg))\n    }\n  }\n  return logArgs\n}\n/* c8 ignore stop */\n\nconst loggingColors = [GREEN, PURPLE, ORANGE, BLUE]\nlet nextColor = 0\nlet lastLoggingTime = time.getUnixTime()\n\n/* c8 ignore start */\n/**\n * @param {function(...any):void} _print\n * @param {string} moduleName\n * @return {function(...any):void}\n */\nexport const createModuleLogger = (_print, moduleName) => {\n  const color = loggingColors[nextColor]\n  const debugRegexVar = env.getVariable('log')\n  const doLogging = debugRegexVar !== null &&\n    (debugRegexVar === '*' || debugRegexVar === 'true' ||\n      new RegExp(debugRegexVar, 'gi').test(moduleName))\n  nextColor = (nextColor + 1) % loggingColors.length\n  moduleName += ': '\n  return !doLogging\n    ? func.nop\n    : (...args) => {\n        const timeNow = time.getUnixTime()\n        const timeDiff = timeNow - lastLoggingTime\n        lastLoggingTime = timeNow\n        _print(\n          color,\n          moduleName,\n          UNCOLOR,\n          ...args.map((arg) =>\n            (typeof arg === 'string' || typeof arg === 'symbol')\n              ? arg\n              : JSON.stringify(arg)\n          ),\n          color,\n          ' +' + timeDiff + 'ms'\n        )\n      }\n}\n/* c8 ignore stop */\n", "/**\n * Isomorphic logging module with support for colors!\n *\n * @module logging\n */\n\nimport * as env from './environment.js'\nimport * as set from './set.js'\nimport * as pair from './pair.js'\nimport * as dom from './dom.js'\nimport * as json from './json.js'\nimport * as map from './map.js'\nimport * as eventloop from './eventloop.js'\nimport * as math from './math.js'\nimport * as common from './logging.common.js'\n\nexport { BOLD, UNBOLD, BLUE, GREY, GREEN, RED, PURPLE, ORANGE, UNCOLOR } from './logging.common.js'\n\n/**\n * @type {Object<Symbol,pair.Pair<string,string>>}\n */\nconst _browserStyleMap = {\n  [common.BOLD]: pair.create('font-weight', 'bold'),\n  [common.UNBOLD]: pair.create('font-weight', 'normal'),\n  [common.BLUE]: pair.create('color', 'blue'),\n  [common.GREEN]: pair.create('color', 'green'),\n  [common.GREY]: pair.create('color', 'grey'),\n  [common.RED]: pair.create('color', 'red'),\n  [common.PURPLE]: pair.create('color', 'purple'),\n  [common.ORANGE]: pair.create('color', 'orange'), // not well supported in chrome when debugging node with inspector - TODO: deprecate\n  [common.UNCOLOR]: pair.create('color', 'black')\n}\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n * @return {Array<string|object|number>}\n */\n/* c8 ignore start */\nconst computeBrowserLoggingArgs = (args) => {\n  const strBuilder = []\n  const styles = []\n  const currentStyle = map.create()\n  /**\n   * @type {Array<string|Object|number>}\n   */\n  let logArgs = []\n  // try with formatting until we find something unsupported\n  let i = 0\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    // @ts-ignore\n    const style = _browserStyleMap[arg]\n    if (style !== undefined) {\n      currentStyle.set(style.left, style.right)\n    } else {\n      if (arg.constructor === String || arg.constructor === Number) {\n        const style = dom.mapToStyleString(currentStyle)\n        if (i > 0 || style.length > 0) {\n          strBuilder.push('%c' + arg)\n          styles.push(style)\n        } else {\n          strBuilder.push(arg)\n        }\n      } else {\n        break\n      }\n    }\n  }\n  if (i > 0) {\n    // create logArgs with what we have so far\n    logArgs = styles\n    logArgs.unshift(strBuilder.join(''))\n  }\n  // append the rest\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    if (!(arg instanceof Symbol)) {\n      logArgs.push(arg)\n    }\n  }\n  return logArgs\n}\n/* c8 ignore stop */\n\n/* c8 ignore start */\nconst computeLoggingArgs = env.supportsColor\n  ? computeBrowserLoggingArgs\n  : common.computeNoColorLoggingArgs\n/* c8 ignore stop */\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const print = (...args) => {\n  console.log(...computeLoggingArgs(args))\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.print(args))\n}\n\n/* c8 ignore start */\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const warn = (...args) => {\n  console.warn(...computeLoggingArgs(args))\n  args.unshift(common.ORANGE)\n  vconsoles.forEach((vc) => vc.print(args))\n}\n/* c8 ignore stop */\n\n/**\n * @param {Error} err\n */\n/* c8 ignore start */\nexport const printError = (err) => {\n  console.error(err)\n  vconsoles.forEach((vc) => vc.printError(err))\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} url image location\n * @param {number} height height of the image in pixel\n */\n/* c8 ignore start */\nexport const printImg = (url, height) => {\n  if (env.isBrowser) {\n    console.log(\n      '%c                      ',\n      `font-size: ${height}px; background-size: contain; background-repeat: no-repeat; background-image: url(${url})`\n    )\n    // console.log('%c                ', `font-size: ${height}x; background: url(${url}) no-repeat;`)\n  }\n  vconsoles.forEach((vc) => vc.printImg(url, height))\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} base64\n * @param {number} height\n */\n/* c8 ignore next 2 */\nexport const printImgBase64 = (base64, height) =>\n  printImg(`data:image/gif;base64,${base64}`, height)\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const group = (...args) => {\n  console.group(...computeLoggingArgs(args))\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.group(args))\n}\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const groupCollapsed = (...args) => {\n  console.groupCollapsed(...computeLoggingArgs(args))\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.groupCollapsed(args))\n}\n\nexport const groupEnd = () => {\n  console.groupEnd()\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.groupEnd())\n}\n\n/**\n * @param {function():Node} createNode\n */\n/* c8 ignore next 2 */\nexport const printDom = (createNode) =>\n  vconsoles.forEach((vc) => vc.printDom(createNode()))\n\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {number} height\n */\n/* c8 ignore next 2 */\nexport const printCanvas = (canvas, height) =>\n  printImg(canvas.toDataURL(), height)\n\nexport const vconsoles = set.create()\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n * @return {Array<Element>}\n */\n/* c8 ignore start */\nconst _computeLineSpans = (args) => {\n  const spans = []\n  const currentStyle = new Map()\n  // try with formatting until we find something unsupported\n  let i = 0\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    // @ts-ignore\n    const style = _browserStyleMap[arg]\n    if (style !== undefined) {\n      currentStyle.set(style.left, style.right)\n    } else {\n      if (arg.constructor === String || arg.constructor === Number) {\n        // @ts-ignore\n        const span = dom.element('span', [\n          pair.create('style', dom.mapToStyleString(currentStyle))\n        ], [dom.text(arg.toString())])\n        if (span.innerHTML === '') {\n          span.innerHTML = '&nbsp;'\n        }\n        spans.push(span)\n      } else {\n        break\n      }\n    }\n  }\n  // append the rest\n  for (; i < args.length; i++) {\n    let content = args[i]\n    if (!(content instanceof Symbol)) {\n      if (content.constructor !== String && content.constructor !== Number) {\n        content = ' ' + json.stringify(content) + ' '\n      }\n      spans.push(\n        dom.element('span', [], [dom.text(/** @type {string} */ (content))])\n      )\n    }\n  }\n  return spans\n}\n/* c8 ignore stop */\n\nconst lineStyle =\n  'font-family:monospace;border-bottom:1px solid #e2e2e2;padding:2px;'\n\n/* c8 ignore start */\nexport class VConsole {\n  /**\n   * @param {Element} dom\n   */\n  constructor (dom) {\n    this.dom = dom\n    /**\n     * @type {Element}\n     */\n    this.ccontainer = this.dom\n    this.depth = 0\n    vconsoles.add(this)\n  }\n\n  /**\n   * @param {Array<string|Symbol|Object|number>} args\n   * @param {boolean} collapsed\n   */\n  group (args, collapsed = false) {\n    eventloop.enqueue(() => {\n      const triangleDown = dom.element('span', [\n        pair.create('hidden', collapsed),\n        pair.create('style', 'color:grey;font-size:120%;')\n      ], [dom.text('\u25BC')])\n      const triangleRight = dom.element('span', [\n        pair.create('hidden', !collapsed),\n        pair.create('style', 'color:grey;font-size:125%;')\n      ], [dom.text('\u25B6')])\n      const content = dom.element(\n        'div',\n        [pair.create(\n          'style',\n          `${lineStyle};padding-left:${this.depth * 10}px`\n        )],\n        [triangleDown, triangleRight, dom.text(' ')].concat(\n          _computeLineSpans(args)\n        )\n      )\n      const nextContainer = dom.element('div', [\n        pair.create('hidden', collapsed)\n      ])\n      const nextLine = dom.element('div', [], [content, nextContainer])\n      dom.append(this.ccontainer, [nextLine])\n      this.ccontainer = nextContainer\n      this.depth++\n      // when header is clicked, collapse/uncollapse container\n      dom.addEventListener(content, 'click', (_event) => {\n        nextContainer.toggleAttribute('hidden')\n        triangleDown.toggleAttribute('hidden')\n        triangleRight.toggleAttribute('hidden')\n      })\n    })\n  }\n\n  /**\n   * @param {Array<string|Symbol|Object|number>} args\n   */\n  groupCollapsed (args) {\n    this.group(args, true)\n  }\n\n  groupEnd () {\n    eventloop.enqueue(() => {\n      if (this.depth > 0) {\n        this.depth--\n        // @ts-ignore\n        this.ccontainer = this.ccontainer.parentElement.parentElement\n      }\n    })\n  }\n\n  /**\n   * @param {Array<string|Symbol|Object|number>} args\n   */\n  print (args) {\n    eventloop.enqueue(() => {\n      dom.append(this.ccontainer, [\n        dom.element('div', [\n          pair.create(\n            'style',\n            `${lineStyle};padding-left:${this.depth * 10}px`\n          )\n        ], _computeLineSpans(args))\n      ])\n    })\n  }\n\n  /**\n   * @param {Error} err\n   */\n  printError (err) {\n    this.print([common.RED, common.BOLD, err.toString()])\n  }\n\n  /**\n   * @param {string} url\n   * @param {number} height\n   */\n  printImg (url, height) {\n    eventloop.enqueue(() => {\n      dom.append(this.ccontainer, [\n        dom.element('img', [\n          pair.create('src', url),\n          pair.create('height', `${math.round(height * 1.5)}px`)\n        ])\n      ])\n    })\n  }\n\n  /**\n   * @param {Node} node\n   */\n  printDom (node) {\n    eventloop.enqueue(() => {\n      dom.append(this.ccontainer, [node])\n    })\n  }\n\n  destroy () {\n    eventloop.enqueue(() => {\n      vconsoles.delete(this)\n    })\n  }\n}\n/* c8 ignore stop */\n\n/**\n * @param {Element} dom\n */\n/* c8 ignore next */\nexport const createVConsole = (dom) => new VConsole(dom)\n\n/**\n * @param {string} moduleName\n * @return {function(...any):void}\n */\nexport const createModuleLogger = (moduleName) => common.createModuleLogger(print, moduleName)\n", "/**\n * Utility module to create and manipulate Iterators.\n *\n * @module iterator\n */\n\n/**\n * @template T,R\n * @param {Iterator<T>} iterator\n * @param {function(T):R} f\n * @return {IterableIterator<R>}\n */\nexport const mapIterator = (iterator, f) => ({\n  [Symbol.iterator] () {\n    return this\n  },\n  // @ts-ignore\n  next () {\n    const r = iterator.next()\n    return { value: r.done ? undefined : f(r.value), done: r.done }\n  }\n})\n\n/**\n * @template T\n * @param {function():IteratorResult<T>} next\n * @return {IterableIterator<T>}\n */\nexport const createIterator = next => ({\n  /**\n   * @return {IterableIterator<T>}\n   */\n  [Symbol.iterator] () {\n    return this\n  },\n  // @ts-ignore\n  next\n})\n\n/**\n * @template T\n * @param {Iterator<T>} iterator\n * @param {function(T):boolean} filter\n */\nexport const iteratorFilter = (iterator, filter) => createIterator(() => {\n  let res\n  do {\n    res = iterator.next()\n  } while (!res.done && !filter(res.value))\n  return res\n})\n\n/**\n * @template T,M\n * @param {Iterator<T>} iterator\n * @param {function(T):M} fmap\n */\nexport const iteratorMap = (iterator, fmap) => createIterator(() => {\n  const { done, value } = iterator.next()\n  return { done, value: done ? undefined : fmap(value) }\n})\n", "\nimport { Observable } from 'lib0/observable'\n\nimport {\n  Doc // eslint-disable-line\n} from '../internals.js'\n\n/**\n * This is an abstract interface that all Connectors should implement to keep them interchangeable.\n *\n * @note This interface is experimental and it is not advised to actually inherit this class.\n *       It just serves as typing information.\n *\n * @extends {Observable<any>}\n */\nexport class AbstractConnector extends Observable {\n  /**\n   * @param {Doc} ydoc\n   * @param {any} awareness\n   */\n  constructor (ydoc, awareness) {\n    super()\n    this.doc = ydoc\n    this.awareness = awareness\n  }\n}\n", "\nimport {\n  findIndexSS,\n  getState,\n  splitItem,\n  iterateStructs,\n  UpdateEncoderV2,\n  DSDecoderV1, DSEncoderV1, DSDecoderV2, DSEncoderV2, Item, GC, StructStore, Transaction, ID // eslint-disable-line\n} from '../internals.js'\n\nimport * as array from 'lib0/array'\nimport * as math from 'lib0/math'\nimport * as map from 'lib0/map'\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\n\nexport class DeleteItem {\n  /**\n   * @param {number} clock\n   * @param {number} len\n   */\n  constructor (clock, len) {\n    /**\n     * @type {number}\n     */\n    this.clock = clock\n    /**\n     * @type {number}\n     */\n    this.len = len\n  }\n}\n\n/**\n * We no longer maintain a DeleteStore. DeleteSet is a temporary object that is created when needed.\n * - When created in a transaction, it must only be accessed after sorting, and merging\n *   - This DeleteSet is send to other clients\n * - We do not create a DeleteSet when we send a sync message. The DeleteSet message is created directly from StructStore\n * - We read a DeleteSet as part of a sync/update message. In this case the DeleteSet is already sorted and merged.\n */\nexport class DeleteSet {\n  constructor () {\n    /**\n     * @type {Map<number,Array<DeleteItem>>}\n     */\n    this.clients = new Map()\n  }\n}\n\n/**\n * Iterate over all structs that the DeleteSet gc's.\n *\n * @param {Transaction} transaction\n * @param {DeleteSet} ds\n * @param {function(GC|Item):void} f\n *\n * @function\n */\nexport const iterateDeletedStructs = (transaction, ds, f) =>\n  ds.clients.forEach((deletes, clientid) => {\n    const structs = /** @type {Array<GC|Item>} */ (transaction.doc.store.clients.get(clientid))\n    for (let i = 0; i < deletes.length; i++) {\n      const del = deletes[i]\n      iterateStructs(transaction, structs, del.clock, del.len, f)\n    }\n  })\n\n/**\n * @param {Array<DeleteItem>} dis\n * @param {number} clock\n * @return {number|null}\n *\n * @private\n * @function\n */\nexport const findIndexDS = (dis, clock) => {\n  let left = 0\n  let right = dis.length - 1\n  while (left <= right) {\n    const midindex = math.floor((left + right) / 2)\n    const mid = dis[midindex]\n    const midclock = mid.clock\n    if (midclock <= clock) {\n      if (clock < midclock + mid.len) {\n        return midindex\n      }\n      left = midindex + 1\n    } else {\n      right = midindex - 1\n    }\n  }\n  return null\n}\n\n/**\n * @param {DeleteSet} ds\n * @param {ID} id\n * @return {boolean}\n *\n * @private\n * @function\n */\nexport const isDeleted = (ds, id) => {\n  const dis = ds.clients.get(id.client)\n  return dis !== undefined && findIndexDS(dis, id.clock) !== null\n}\n\n/**\n * @param {DeleteSet} ds\n *\n * @private\n * @function\n */\nexport const sortAndMergeDeleteSet = ds => {\n  ds.clients.forEach(dels => {\n    dels.sort((a, b) => a.clock - b.clock)\n    // merge items without filtering or splicing the array\n    // i is the current pointer\n    // j refers to the current insert position for the pointed item\n    // try to merge dels[i] into dels[j-1] or set dels[j]=dels[i]\n    let i, j\n    for (i = 1, j = 1; i < dels.length; i++) {\n      const left = dels[j - 1]\n      const right = dels[i]\n      if (left.clock + left.len >= right.clock) {\n        left.len = math.max(left.len, right.clock + right.len - left.clock)\n      } else {\n        if (j < i) {\n          dels[j] = right\n        }\n        j++\n      }\n    }\n    dels.length = j\n  })\n}\n\n/**\n * @param {Array<DeleteSet>} dss\n * @return {DeleteSet} A fresh DeleteSet\n */\nexport const mergeDeleteSets = dss => {\n  const merged = new DeleteSet()\n  for (let dssI = 0; dssI < dss.length; dssI++) {\n    dss[dssI].clients.forEach((delsLeft, client) => {\n      if (!merged.clients.has(client)) {\n        // Write all missing keys from current ds and all following.\n        // If merged already contains `client` current ds has already been added.\n        /**\n         * @type {Array<DeleteItem>}\n         */\n        const dels = delsLeft.slice()\n        for (let i = dssI + 1; i < dss.length; i++) {\n          array.appendTo(dels, dss[i].clients.get(client) || [])\n        }\n        merged.clients.set(client, dels)\n      }\n    })\n  }\n  sortAndMergeDeleteSet(merged)\n  return merged\n}\n\n/**\n * @param {DeleteSet} ds\n * @param {number} client\n * @param {number} clock\n * @param {number} length\n *\n * @private\n * @function\n */\nexport const addToDeleteSet = (ds, client, clock, length) => {\n  map.setIfUndefined(ds.clients, client, () => /** @type {Array<DeleteItem>} */ ([])).push(new DeleteItem(clock, length))\n}\n\nexport const createDeleteSet = () => new DeleteSet()\n\n/**\n * @param {StructStore} ss\n * @return {DeleteSet} Merged and sorted DeleteSet\n *\n * @private\n * @function\n */\nexport const createDeleteSetFromStructStore = ss => {\n  const ds = createDeleteSet()\n  ss.clients.forEach((structs, client) => {\n    /**\n     * @type {Array<DeleteItem>}\n     */\n    const dsitems = []\n    for (let i = 0; i < structs.length; i++) {\n      const struct = structs[i]\n      if (struct.deleted) {\n        const clock = struct.id.clock\n        let len = struct.length\n        if (i + 1 < structs.length) {\n          for (let next = structs[i + 1]; i + 1 < structs.length && next.deleted; next = structs[++i + 1]) {\n            len += next.length\n          }\n        }\n        dsitems.push(new DeleteItem(clock, len))\n      }\n    }\n    if (dsitems.length > 0) {\n      ds.clients.set(client, dsitems)\n    }\n  })\n  return ds\n}\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {DeleteSet} ds\n *\n * @private\n * @function\n */\nexport const writeDeleteSet = (encoder, ds) => {\n  encoding.writeVarUint(encoder.restEncoder, ds.clients.size)\n\n  // Ensure that the delete set is written in a deterministic order\n  array.from(ds.clients.entries())\n    .sort((a, b) => b[0] - a[0])\n    .forEach(([client, dsitems]) => {\n      encoder.resetDsCurVal()\n      encoding.writeVarUint(encoder.restEncoder, client)\n      const len = dsitems.length\n      encoding.writeVarUint(encoder.restEncoder, len)\n      for (let i = 0; i < len; i++) {\n        const item = dsitems[i]\n        encoder.writeDsClock(item.clock)\n        encoder.writeDsLen(item.len)\n      }\n    })\n}\n\n/**\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @return {DeleteSet}\n *\n * @private\n * @function\n */\nexport const readDeleteSet = decoder => {\n  const ds = new DeleteSet()\n  const numClients = decoding.readVarUint(decoder.restDecoder)\n  for (let i = 0; i < numClients; i++) {\n    decoder.resetDsCurVal()\n    const client = decoding.readVarUint(decoder.restDecoder)\n    const numberOfDeletes = decoding.readVarUint(decoder.restDecoder)\n    if (numberOfDeletes > 0) {\n      const dsField = map.setIfUndefined(ds.clients, client, () => /** @type {Array<DeleteItem>} */ ([]))\n      for (let i = 0; i < numberOfDeletes; i++) {\n        dsField.push(new DeleteItem(decoder.readDsClock(), decoder.readDsLen()))\n      }\n    }\n  }\n  return ds\n}\n\n/**\n * @todo YDecoder also contains references to String and other Decoders. Would make sense to exchange YDecoder.toUint8Array for YDecoder.DsToUint8Array()..\n */\n\n/**\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @return {Uint8Array|null} Returns a v2 update containing all deletes that couldn't be applied yet; or null if all deletes were applied successfully.\n *\n * @private\n * @function\n */\nexport const readAndApplyDeleteSet = (decoder, transaction, store) => {\n  const unappliedDS = new DeleteSet()\n  const numClients = decoding.readVarUint(decoder.restDecoder)\n  for (let i = 0; i < numClients; i++) {\n    decoder.resetDsCurVal()\n    const client = decoding.readVarUint(decoder.restDecoder)\n    const numberOfDeletes = decoding.readVarUint(decoder.restDecoder)\n    const structs = store.clients.get(client) || []\n    const state = getState(store, client)\n    for (let i = 0; i < numberOfDeletes; i++) {\n      const clock = decoder.readDsClock()\n      const clockEnd = clock + decoder.readDsLen()\n      if (clock < state) {\n        if (state < clockEnd) {\n          addToDeleteSet(unappliedDS, client, state, clockEnd - state)\n        }\n        let index = findIndexSS(structs, clock)\n        /**\n         * We can ignore the case of GC and Delete structs, because we are going to skip them\n         * @type {Item}\n         */\n        // @ts-ignore\n        let struct = structs[index]\n        // split the first item if necessary\n        if (!struct.deleted && struct.id.clock < clock) {\n          structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock))\n          index++ // increase we now want to use the next struct\n        }\n        while (index < structs.length) {\n          // @ts-ignore\n          struct = structs[index++]\n          if (struct.id.clock < clockEnd) {\n            if (!struct.deleted) {\n              if (clockEnd < struct.id.clock + struct.length) {\n                structs.splice(index, 0, splitItem(transaction, struct, clockEnd - struct.id.clock))\n              }\n              struct.delete(transaction)\n            }\n          } else {\n            break\n          }\n        }\n      } else {\n        addToDeleteSet(unappliedDS, client, clock, clockEnd - clock)\n      }\n    }\n  }\n  if (unappliedDS.clients.size > 0) {\n    const ds = new UpdateEncoderV2()\n    encoding.writeVarUint(ds.restEncoder, 0) // encode 0 structs\n    writeDeleteSet(ds, unappliedDS)\n    return ds.toUint8Array()\n  }\n  return null\n}\n\n/**\n * @param {DeleteSet} ds1\n * @param {DeleteSet} ds2\n */\nexport const equalDeleteSets = (ds1, ds2) => {\n  if (ds1.clients.size !== ds2.clients.size) return false\n  for (const [client, deleteItems1] of ds1.clients.entries()) {\n    const deleteItems2 = /** @type {Array<import('../internals.js').DeleteItem>} */ (ds2.clients.get(client))\n    if (deleteItems2 === undefined || deleteItems1.length !== deleteItems2.length) return false\n    for (let i = 0; i < deleteItems1.length; i++) {\n      const di1 = deleteItems1[i]\n      const di2 = deleteItems2[i]\n      if (di1.clock !== di2.clock || di1.len !== di2.len) {\n        return false\n      }\n    }\n  }\n  return true\n}\n", "/**\n * @module Y\n */\n\nimport {\n  StructStore,\n  AbstractType,\n  YArray,\n  YText,\n  YMap,\n  YXmlFragment,\n  transact,\n  ContentDoc, Item, Transaction, YEvent // eslint-disable-line\n} from '../internals.js'\n\nimport { Observable } from 'lib0/observable'\nimport * as random from 'lib0/random'\nimport * as map from 'lib0/map'\nimport * as array from 'lib0/array'\nimport * as promise from 'lib0/promise'\n\nexport const generateNewClientId = random.uint32\n\n/**\n * @typedef {Object} DocOpts\n * @property {boolean} [DocOpts.gc=true] Disable garbage collection (default: gc=true)\n * @property {function(Item):boolean} [DocOpts.gcFilter] Will be called before an Item is garbage collected. Return false to keep the Item.\n * @property {string} [DocOpts.guid] Define a globally unique identifier for this document\n * @property {string | null} [DocOpts.collectionid] Associate this document with a collection. This only plays a role if your provider has a concept of collection.\n * @property {any} [DocOpts.meta] Any kind of meta information you want to associate with this document. If this is a subdocument, remote peers will store the meta information as well.\n * @property {boolean} [DocOpts.autoLoad] If a subdocument, automatically load document. If this is a subdocument, remote peers will load the document as well automatically.\n * @property {boolean} [DocOpts.shouldLoad] Whether the document should be synced by the provider now. This is toggled to true when you call ydoc.load()\n */\n\n/**\n * A Yjs instance handles the state of shared data.\n * @extends Observable<string>\n */\nexport class Doc extends Observable {\n  /**\n   * @param {DocOpts} opts configuration\n   */\n  constructor ({ guid = random.uuidv4(), collectionid = null, gc = true, gcFilter = () => true, meta = null, autoLoad = false, shouldLoad = true } = {}) {\n    super()\n    this.gc = gc\n    this.gcFilter = gcFilter\n    this.clientID = generateNewClientId()\n    this.guid = guid\n    this.collectionid = collectionid\n    /**\n     * @type {Map<string, AbstractType<YEvent<any>>>}\n     */\n    this.share = new Map()\n    this.store = new StructStore()\n    /**\n     * @type {Transaction | null}\n     */\n    this._transaction = null\n    /**\n     * @type {Array<Transaction>}\n     */\n    this._transactionCleanups = []\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocs = new Set()\n    /**\n     * If this document is a subdocument - a document integrated into another document - then _item is defined.\n     * @type {Item?}\n     */\n    this._item = null\n    this.shouldLoad = shouldLoad\n    this.autoLoad = autoLoad\n    this.meta = meta\n    /**\n     * This is set to true when the persistence provider loaded the document from the database or when the `sync` event fires.\n     * Note that not all providers implement this feature. Provider authors are encouraged to fire the `load` event when the doc content is loaded from the database.\n     *\n     * @type {boolean}\n     */\n    this.isLoaded = false\n    /**\n     * This is set to true when the connection provider has successfully synced with a backend.\n     * Note that when using peer-to-peer providers this event may not provide very useful.\n     * Also note that not all providers implement this feature. Provider authors are encouraged to fire\n     * the `sync` event when the doc has been synced (with `true` as a parameter) or if connection is\n     * lost (with false as a parameter).\n     */\n    this.isSynced = false\n    /**\n     * Promise that resolves once the document has been loaded from a presistence provider.\n     */\n    this.whenLoaded = promise.create(resolve => {\n      this.on('load', () => {\n        this.isLoaded = true\n        resolve(this)\n      })\n    })\n    const provideSyncedPromise = () => promise.create(resolve => {\n      /**\n       * @param {boolean} isSynced\n       */\n      const eventHandler = (isSynced) => {\n        if (isSynced === undefined || isSynced === true) {\n          this.off('sync', eventHandler)\n          resolve()\n        }\n      }\n      this.on('sync', eventHandler)\n    })\n    this.on('sync', isSynced => {\n      if (isSynced === false && this.isSynced) {\n        this.whenSynced = provideSyncedPromise()\n      }\n      this.isSynced = isSynced === undefined || isSynced === true\n      if (!this.isLoaded) {\n        this.emit('load', [])\n      }\n    })\n    /**\n     * Promise that resolves once the document has been synced with a backend.\n     * This promise is recreated when the connection is lost.\n     * Note the documentation about the `isSynced` property.\n     */\n    this.whenSynced = provideSyncedPromise()\n  }\n\n  /**\n   * Notify the parent document that you request to load data into this subdocument (if it is a subdocument).\n   *\n   * `load()` might be used in the future to request any provider to load the most current data.\n   *\n   * It is safe to call `load()` multiple times.\n   */\n  load () {\n    const item = this._item\n    if (item !== null && !this.shouldLoad) {\n      transact(/** @type {any} */ (item.parent).doc, transaction => {\n        transaction.subdocsLoaded.add(this)\n      }, null, true)\n    }\n    this.shouldLoad = true\n  }\n\n  getSubdocs () {\n    return this.subdocs\n  }\n\n  getSubdocGuids () {\n    return new Set(array.from(this.subdocs).map(doc => doc.guid))\n  }\n\n  /**\n   * Changes that happen inside of a transaction are bundled. This means that\n   * the observer fires _after_ the transaction is finished and that all changes\n   * that happened inside of the transaction are sent as one message to the\n   * other peers.\n   *\n   * @template T\n   * @param {function(Transaction):T} f The function that should be executed as a transaction\n   * @param {any} [origin] Origin of who started the transaction. Will be stored on transaction.origin\n   * @return T\n   *\n   * @public\n   */\n  transact (f, origin = null) {\n    return transact(this, f, origin)\n  }\n\n  /**\n   * Define a shared data type.\n   *\n   * Multiple calls of `y.get(name, TypeConstructor)` yield the same result\n   * and do not overwrite each other. I.e.\n   * `y.define(name, Y.Array) === y.define(name, Y.Array)`\n   *\n   * After this method is called, the type is also available on `y.share.get(name)`.\n   *\n   * *Best Practices:*\n   * Define all types right after the Yjs instance is created and store them in a separate object.\n   * Also use the typed methods `getText(name)`, `getArray(name)`, ..\n   *\n   * @example\n   *   const y = new Y(..)\n   *   const appState = {\n   *     document: y.getText('document')\n   *     comments: y.getArray('comments')\n   *   }\n   *\n   * @param {string} name\n   * @param {Function} TypeConstructor The constructor of the type definition. E.g. Y.Text, Y.Array, Y.Map, ...\n   * @return {AbstractType<any>} The created type. Constructed with TypeConstructor\n   *\n   * @public\n   */\n  get (name, TypeConstructor = AbstractType) {\n    const type = map.setIfUndefined(this.share, name, () => {\n      // @ts-ignore\n      const t = new TypeConstructor()\n      t._integrate(this, null)\n      return t\n    })\n    const Constr = type.constructor\n    if (TypeConstructor !== AbstractType && Constr !== TypeConstructor) {\n      if (Constr === AbstractType) {\n        // @ts-ignore\n        const t = new TypeConstructor()\n        t._map = type._map\n        type._map.forEach(/** @param {Item?} n */ n => {\n          for (; n !== null; n = n.left) {\n            // @ts-ignore\n            n.parent = t\n          }\n        })\n        t._start = type._start\n        for (let n = t._start; n !== null; n = n.right) {\n          n.parent = t\n        }\n        t._length = type._length\n        this.share.set(name, t)\n        t._integrate(this, null)\n        return t\n      } else {\n        throw new Error(`Type with the name ${name} has already been defined with a different constructor`)\n      }\n    }\n    return type\n  }\n\n  /**\n   * @template T\n   * @param {string} [name]\n   * @return {YArray<T>}\n   *\n   * @public\n   */\n  getArray (name = '') {\n    // @ts-ignore\n    return this.get(name, YArray)\n  }\n\n  /**\n   * @param {string} [name]\n   * @return {YText}\n   *\n   * @public\n   */\n  getText (name = '') {\n    // @ts-ignore\n    return this.get(name, YText)\n  }\n\n  /**\n   * @template T\n   * @param {string} [name]\n   * @return {YMap<T>}\n   *\n   * @public\n   */\n  getMap (name = '') {\n    // @ts-ignore\n    return this.get(name, YMap)\n  }\n\n  /**\n   * @param {string} [name]\n   * @return {YXmlFragment}\n   *\n   * @public\n   */\n  getXmlFragment (name = '') {\n    // @ts-ignore\n    return this.get(name, YXmlFragment)\n  }\n\n  /**\n   * Converts the entire document into a js object, recursively traversing each yjs type\n   * Doesn't log types that have not been defined (using ydoc.getType(..)).\n   *\n   * @deprecated Do not use this method and rather call toJSON directly on the shared types.\n   *\n   * @return {Object<string, any>}\n   */\n  toJSON () {\n    /**\n     * @type {Object<string, any>}\n     */\n    const doc = {}\n\n    this.share.forEach((value, key) => {\n      doc[key] = value.toJSON()\n    })\n\n    return doc\n  }\n\n  /**\n   * Emit `destroy` event and unregister all event handlers.\n   */\n  destroy () {\n    array.from(this.subdocs).forEach(subdoc => subdoc.destroy())\n    const item = this._item\n    if (item !== null) {\n      this._item = null\n      const content = /** @type {ContentDoc} */ (item.content)\n      content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false })\n      content.doc._item = item\n      transact(/** @type {any} */ (item).parent.doc, transaction => {\n        const doc = content.doc\n        if (!item.deleted) {\n          transaction.subdocsAdded.add(doc)\n        }\n        transaction.subdocsRemoved.add(this)\n      }, null, true)\n    }\n    this.emit('destroyed', [true])\n    this.emit('destroy', [this])\n    super.destroy()\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function(...any):any} f\n   */\n  on (eventName, f) {\n    super.on(eventName, f)\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} f\n   */\n  off (eventName, f) {\n    super.off(eventName, f)\n  }\n}\n", "import * as buffer from 'lib0/buffer'\nimport * as decoding from 'lib0/decoding'\nimport {\n  ID, createID\n} from '../internals.js'\n\nexport class DSDecoderV1 {\n  /**\n   * @param {decoding.Decoder} decoder\n   */\n  constructor (decoder) {\n    this.restDecoder = decoder\n  }\n\n  resetDsCurVal () {\n    // nop\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsClock () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsLen () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n}\n\nexport class UpdateDecoderV1 extends DSDecoderV1 {\n  /**\n   * @return {ID}\n   */\n  readLeftID () {\n    return createID(decoding.readVarUint(this.restDecoder), decoding.readVarUint(this.restDecoder))\n  }\n\n  /**\n   * @return {ID}\n   */\n  readRightID () {\n    return createID(decoding.readVarUint(this.restDecoder), decoding.readVarUint(this.restDecoder))\n  }\n\n  /**\n   * Read the next client id.\n   * Use this in favor of readID whenever possible to reduce the number of objects created.\n   */\n  readClient () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * @return {number} info An unsigned 8-bit integer\n   */\n  readInfo () {\n    return decoding.readUint8(this.restDecoder)\n  }\n\n  /**\n   * @return {string}\n   */\n  readString () {\n    return decoding.readVarString(this.restDecoder)\n  }\n\n  /**\n   * @return {boolean} isKey\n   */\n  readParentInfo () {\n    return decoding.readVarUint(this.restDecoder) === 1\n  }\n\n  /**\n   * @return {number} info An unsigned 8-bit integer\n   */\n  readTypeRef () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @return {number} len\n   */\n  readLen () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * @return {any}\n   */\n  readAny () {\n    return decoding.readAny(this.restDecoder)\n  }\n\n  /**\n   * @return {Uint8Array}\n   */\n  readBuf () {\n    return buffer.copyUint8Array(decoding.readVarUint8Array(this.restDecoder))\n  }\n\n  /**\n   * Legacy implementation uses JSON parse. We use any-decoding in v2.\n   *\n   * @return {any}\n   */\n  readJSON () {\n    return JSON.parse(decoding.readVarString(this.restDecoder))\n  }\n\n  /**\n   * @return {string}\n   */\n  readKey () {\n    return decoding.readVarString(this.restDecoder)\n  }\n}\n\nexport class DSDecoderV2 {\n  /**\n   * @param {decoding.Decoder} decoder\n   */\n  constructor (decoder) {\n    /**\n     * @private\n     */\n    this.dsCurrVal = 0\n    this.restDecoder = decoder\n  }\n\n  resetDsCurVal () {\n    this.dsCurrVal = 0\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsClock () {\n    this.dsCurrVal += decoding.readVarUint(this.restDecoder)\n    return this.dsCurrVal\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsLen () {\n    const diff = decoding.readVarUint(this.restDecoder) + 1\n    this.dsCurrVal += diff\n    return diff\n  }\n}\n\nexport class UpdateDecoderV2 extends DSDecoderV2 {\n  /**\n   * @param {decoding.Decoder} decoder\n   */\n  constructor (decoder) {\n    super(decoder)\n    /**\n     * List of cached keys. If the keys[id] does not exist, we read a new key\n     * from stringEncoder and push it to keys.\n     *\n     * @type {Array<string>}\n     */\n    this.keys = []\n    decoding.readVarUint(decoder) // read feature flag - currently unused\n    this.keyClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder))\n    this.clientDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder))\n    this.leftClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder))\n    this.rightClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder))\n    this.infoDecoder = new decoding.RleDecoder(decoding.readVarUint8Array(decoder), decoding.readUint8)\n    this.stringDecoder = new decoding.StringDecoder(decoding.readVarUint8Array(decoder))\n    this.parentInfoDecoder = new decoding.RleDecoder(decoding.readVarUint8Array(decoder), decoding.readUint8)\n    this.typeRefDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder))\n    this.lenDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder))\n  }\n\n  /**\n   * @return {ID}\n   */\n  readLeftID () {\n    return new ID(this.clientDecoder.read(), this.leftClockDecoder.read())\n  }\n\n  /**\n   * @return {ID}\n   */\n  readRightID () {\n    return new ID(this.clientDecoder.read(), this.rightClockDecoder.read())\n  }\n\n  /**\n   * Read the next client id.\n   * Use this in favor of readID whenever possible to reduce the number of objects created.\n   */\n  readClient () {\n    return this.clientDecoder.read()\n  }\n\n  /**\n   * @return {number} info An unsigned 8-bit integer\n   */\n  readInfo () {\n    return /** @type {number} */ (this.infoDecoder.read())\n  }\n\n  /**\n   * @return {string}\n   */\n  readString () {\n    return this.stringDecoder.read()\n  }\n\n  /**\n   * @return {boolean}\n   */\n  readParentInfo () {\n    return this.parentInfoDecoder.read() === 1\n  }\n\n  /**\n   * @return {number} An unsigned 8-bit integer\n   */\n  readTypeRef () {\n    return this.typeRefDecoder.read()\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @return {number}\n   */\n  readLen () {\n    return this.lenDecoder.read()\n  }\n\n  /**\n   * @return {any}\n   */\n  readAny () {\n    return decoding.readAny(this.restDecoder)\n  }\n\n  /**\n   * @return {Uint8Array}\n   */\n  readBuf () {\n    return decoding.readVarUint8Array(this.restDecoder)\n  }\n\n  /**\n   * This is mainly here for legacy purposes.\n   *\n   * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder.\n   *\n   * @return {any}\n   */\n  readJSON () {\n    return decoding.readAny(this.restDecoder)\n  }\n\n  /**\n   * @return {string}\n   */\n  readKey () {\n    const keyClock = this.keyClockDecoder.read()\n    if (keyClock < this.keys.length) {\n      return this.keys[keyClock]\n    } else {\n      const key = this.stringDecoder.read()\n      this.keys.push(key)\n      return key\n    }\n  }\n}\n", "\nimport * as error from 'lib0/error'\nimport * as encoding from 'lib0/encoding'\n\nimport {\n  ID // eslint-disable-line\n} from '../internals.js'\n\nexport class DSEncoderV1 {\n  constructor () {\n    this.restEncoder = encoding.createEncoder()\n  }\n\n  toUint8Array () {\n    return encoding.toUint8Array(this.restEncoder)\n  }\n\n  resetDsCurVal () {\n    // nop\n  }\n\n  /**\n   * @param {number} clock\n   */\n  writeDsClock (clock) {\n    encoding.writeVarUint(this.restEncoder, clock)\n  }\n\n  /**\n   * @param {number} len\n   */\n  writeDsLen (len) {\n    encoding.writeVarUint(this.restEncoder, len)\n  }\n}\n\nexport class UpdateEncoderV1 extends DSEncoderV1 {\n  /**\n   * @param {ID} id\n   */\n  writeLeftID (id) {\n    encoding.writeVarUint(this.restEncoder, id.client)\n    encoding.writeVarUint(this.restEncoder, id.clock)\n  }\n\n  /**\n   * @param {ID} id\n   */\n  writeRightID (id) {\n    encoding.writeVarUint(this.restEncoder, id.client)\n    encoding.writeVarUint(this.restEncoder, id.clock)\n  }\n\n  /**\n   * Use writeClient and writeClock instead of writeID if possible.\n   * @param {number} client\n   */\n  writeClient (client) {\n    encoding.writeVarUint(this.restEncoder, client)\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeInfo (info) {\n    encoding.writeUint8(this.restEncoder, info)\n  }\n\n  /**\n   * @param {string} s\n   */\n  writeString (s) {\n    encoding.writeVarString(this.restEncoder, s)\n  }\n\n  /**\n   * @param {boolean} isYKey\n   */\n  writeParentInfo (isYKey) {\n    encoding.writeVarUint(this.restEncoder, isYKey ? 1 : 0)\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeTypeRef (info) {\n    encoding.writeVarUint(this.restEncoder, info)\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @param {number} len\n   */\n  writeLen (len) {\n    encoding.writeVarUint(this.restEncoder, len)\n  }\n\n  /**\n   * @param {any} any\n   */\n  writeAny (any) {\n    encoding.writeAny(this.restEncoder, any)\n  }\n\n  /**\n   * @param {Uint8Array} buf\n   */\n  writeBuf (buf) {\n    encoding.writeVarUint8Array(this.restEncoder, buf)\n  }\n\n  /**\n   * @param {any} embed\n   */\n  writeJSON (embed) {\n    encoding.writeVarString(this.restEncoder, JSON.stringify(embed))\n  }\n\n  /**\n   * @param {string} key\n   */\n  writeKey (key) {\n    encoding.writeVarString(this.restEncoder, key)\n  }\n}\n\nexport class DSEncoderV2 {\n  constructor () {\n    this.restEncoder = encoding.createEncoder() // encodes all the rest / non-optimized\n    this.dsCurrVal = 0\n  }\n\n  toUint8Array () {\n    return encoding.toUint8Array(this.restEncoder)\n  }\n\n  resetDsCurVal () {\n    this.dsCurrVal = 0\n  }\n\n  /**\n   * @param {number} clock\n   */\n  writeDsClock (clock) {\n    const diff = clock - this.dsCurrVal\n    this.dsCurrVal = clock\n    encoding.writeVarUint(this.restEncoder, diff)\n  }\n\n  /**\n   * @param {number} len\n   */\n  writeDsLen (len) {\n    if (len === 0) {\n      error.unexpectedCase()\n    }\n    encoding.writeVarUint(this.restEncoder, len - 1)\n    this.dsCurrVal += len\n  }\n}\n\nexport class UpdateEncoderV2 extends DSEncoderV2 {\n  constructor () {\n    super()\n    /**\n     * @type {Map<string,number>}\n     */\n    this.keyMap = new Map()\n    /**\n     * Refers to the next uniqe key-identifier to me used.\n     * See writeKey method for more information.\n     *\n     * @type {number}\n     */\n    this.keyClock = 0\n    this.keyClockEncoder = new encoding.IntDiffOptRleEncoder()\n    this.clientEncoder = new encoding.UintOptRleEncoder()\n    this.leftClockEncoder = new encoding.IntDiffOptRleEncoder()\n    this.rightClockEncoder = new encoding.IntDiffOptRleEncoder()\n    this.infoEncoder = new encoding.RleEncoder(encoding.writeUint8)\n    this.stringEncoder = new encoding.StringEncoder()\n    this.parentInfoEncoder = new encoding.RleEncoder(encoding.writeUint8)\n    this.typeRefEncoder = new encoding.UintOptRleEncoder()\n    this.lenEncoder = new encoding.UintOptRleEncoder()\n  }\n\n  toUint8Array () {\n    const encoder = encoding.createEncoder()\n    encoding.writeVarUint(encoder, 0) // this is a feature flag that we might use in the future\n    encoding.writeVarUint8Array(encoder, this.keyClockEncoder.toUint8Array())\n    encoding.writeVarUint8Array(encoder, this.clientEncoder.toUint8Array())\n    encoding.writeVarUint8Array(encoder, this.leftClockEncoder.toUint8Array())\n    encoding.writeVarUint8Array(encoder, this.rightClockEncoder.toUint8Array())\n    encoding.writeVarUint8Array(encoder, encoding.toUint8Array(this.infoEncoder))\n    encoding.writeVarUint8Array(encoder, this.stringEncoder.toUint8Array())\n    encoding.writeVarUint8Array(encoder, encoding.toUint8Array(this.parentInfoEncoder))\n    encoding.writeVarUint8Array(encoder, this.typeRefEncoder.toUint8Array())\n    encoding.writeVarUint8Array(encoder, this.lenEncoder.toUint8Array())\n    // @note The rest encoder is appended! (note the missing var)\n    encoding.writeUint8Array(encoder, encoding.toUint8Array(this.restEncoder))\n    return encoding.toUint8Array(encoder)\n  }\n\n  /**\n   * @param {ID} id\n   */\n  writeLeftID (id) {\n    this.clientEncoder.write(id.client)\n    this.leftClockEncoder.write(id.clock)\n  }\n\n  /**\n   * @param {ID} id\n   */\n  writeRightID (id) {\n    this.clientEncoder.write(id.client)\n    this.rightClockEncoder.write(id.clock)\n  }\n\n  /**\n   * @param {number} client\n   */\n  writeClient (client) {\n    this.clientEncoder.write(client)\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeInfo (info) {\n    this.infoEncoder.write(info)\n  }\n\n  /**\n   * @param {string} s\n   */\n  writeString (s) {\n    this.stringEncoder.write(s)\n  }\n\n  /**\n   * @param {boolean} isYKey\n   */\n  writeParentInfo (isYKey) {\n    this.parentInfoEncoder.write(isYKey ? 1 : 0)\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeTypeRef (info) {\n    this.typeRefEncoder.write(info)\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @param {number} len\n   */\n  writeLen (len) {\n    this.lenEncoder.write(len)\n  }\n\n  /**\n   * @param {any} any\n   */\n  writeAny (any) {\n    encoding.writeAny(this.restEncoder, any)\n  }\n\n  /**\n   * @param {Uint8Array} buf\n   */\n  writeBuf (buf) {\n    encoding.writeVarUint8Array(this.restEncoder, buf)\n  }\n\n  /**\n   * This is mainly here for legacy purposes.\n   *\n   * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder.\n   *\n   * @param {any} embed\n   */\n  writeJSON (embed) {\n    encoding.writeAny(this.restEncoder, embed)\n  }\n\n  /**\n   * Property keys are often reused. For example, in y-prosemirror the key `bold` might\n   * occur very often. For a 3d application, the key `position` might occur very often.\n   *\n   * We cache these keys in a Map and refer to them via a unique number.\n   *\n   * @param {string} key\n   */\n  writeKey (key) {\n    const clock = this.keyMap.get(key)\n    if (clock === undefined) {\n      /**\n       * @todo uncomment to introduce this feature finally\n       *\n       * Background. The ContentFormat object was always encoded using writeKey, but the decoder used to use readString.\n       * Furthermore, I forgot to set the keyclock. So everything was working fine.\n       *\n       * However, this feature here is basically useless as it is not being used (it actually only consumes extra memory).\n       *\n       * I don't know yet how to reintroduce this feature..\n       *\n       * Older clients won't be able to read updates when we reintroduce this feature. So this should probably be done using a flag.\n       *\n       */\n      // this.keyMap.set(key, this.keyClock)\n      this.keyClockEncoder.write(this.keyClock++)\n      this.stringEncoder.write(key)\n    } else {\n      this.keyClockEncoder.write(clock)\n    }\n  }\n}\n", "\n/**\n * @module encoding\n */\n/*\n * We use the first five bits in the info flag for determining the type of the struct.\n *\n * 0: GC\n * 1: Item with Deleted content\n * 2: Item with JSON content\n * 3: Item with Binary content\n * 4: Item with String content\n * 5: Item with Embed content (for richtext content)\n * 6: Item with Format content (a formatting marker for richtext content)\n * 7: Item with Type\n */\n\nimport {\n  findIndexSS,\n  getState,\n  createID,\n  getStateVector,\n  readAndApplyDeleteSet,\n  writeDeleteSet,\n  createDeleteSetFromStructStore,\n  transact,\n  readItemContent,\n  UpdateDecoderV1,\n  UpdateDecoderV2,\n  UpdateEncoderV1,\n  UpdateEncoderV2,\n  DSEncoderV2,\n  DSDecoderV1,\n  DSEncoderV1,\n  mergeUpdates,\n  mergeUpdatesV2,\n  Skip,\n  diffUpdateV2,\n  convertUpdateFormatV2ToV1,\n  DSDecoderV2, Doc, Transaction, GC, Item, StructStore // eslint-disable-line\n} from '../internals.js'\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as binary from 'lib0/binary'\nimport * as map from 'lib0/map'\nimport * as math from 'lib0/math'\nimport * as array from 'lib0/array'\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Array<GC|Item>} structs All structs by `client`\n * @param {number} client\n * @param {number} clock write structs starting with `ID(client,clock)`\n *\n * @function\n */\nconst writeStructs = (encoder, structs, client, clock) => {\n  // write first id\n  clock = math.max(clock, structs[0].id.clock) // make sure the first id exists\n  const startNewStructs = findIndexSS(structs, clock)\n  // write # encoded structs\n  encoding.writeVarUint(encoder.restEncoder, structs.length - startNewStructs)\n  encoder.writeClient(client)\n  encoding.writeVarUint(encoder.restEncoder, clock)\n  const firstStruct = structs[startNewStructs]\n  // write first struct with an offset\n  firstStruct.write(encoder, clock - firstStruct.id.clock)\n  for (let i = startNewStructs + 1; i < structs.length; i++) {\n    structs[i].write(encoder, 0)\n  }\n}\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {StructStore} store\n * @param {Map<number,number>} _sm\n *\n * @private\n * @function\n */\nexport const writeClientsStructs = (encoder, store, _sm) => {\n  // we filter all valid _sm entries into sm\n  const sm = new Map()\n  _sm.forEach((clock, client) => {\n    // only write if new structs are available\n    if (getState(store, client) > clock) {\n      sm.set(client, clock)\n    }\n  })\n  getStateVector(store).forEach((_clock, client) => {\n    if (!_sm.has(client)) {\n      sm.set(client, 0)\n    }\n  })\n  // write # states that were updated\n  encoding.writeVarUint(encoder.restEncoder, sm.size)\n  // Write items with higher client ids first\n  // This heavily improves the conflict algorithm.\n  array.from(sm.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {\n    writeStructs(encoder, /** @type {Array<GC|Item>} */ (store.clients.get(client)), client, clock)\n  })\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder The decoder object to read data from.\n * @param {Doc} doc\n * @return {Map<number, { i: number, refs: Array<Item | GC> }>}\n *\n * @private\n * @function\n */\nexport const readClientsStructRefs = (decoder, doc) => {\n  /**\n   * @type {Map<number, { i: number, refs: Array<Item | GC> }>}\n   */\n  const clientRefs = map.create()\n  const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder)\n  for (let i = 0; i < numOfStateUpdates; i++) {\n    const numberOfStructs = decoding.readVarUint(decoder.restDecoder)\n    /**\n     * @type {Array<GC|Item>}\n     */\n    const refs = new Array(numberOfStructs)\n    const client = decoder.readClient()\n    let clock = decoding.readVarUint(decoder.restDecoder)\n    // const start = performance.now()\n    clientRefs.set(client, { i: 0, refs })\n    for (let i = 0; i < numberOfStructs; i++) {\n      const info = decoder.readInfo()\n      switch (binary.BITS5 & info) {\n        case 0: { // GC\n          const len = decoder.readLen()\n          refs[i] = new GC(createID(client, clock), len)\n          clock += len\n          break\n        }\n        case 10: { // Skip Struct (nothing to apply)\n          // @todo we could reduce the amount of checks by adding Skip struct to clientRefs so we know that something is missing.\n          const len = decoding.readVarUint(decoder.restDecoder)\n          refs[i] = new Skip(createID(client, clock), len)\n          clock += len\n          break\n        }\n        default: { // Item with content\n          /**\n           * The optimized implementation doesn't use any variables because inlining variables is faster.\n           * Below a non-optimized version is shown that implements the basic algorithm with\n           * a few comments\n           */\n          const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0\n          // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n          // and we read the next string as parentYKey.\n          // It indicates how we store/retrieve parent from `y.share`\n          // @type {string|null}\n          const struct = new Item(\n            createID(client, clock),\n            null, // leftd\n            (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null, // origin\n            null, // right\n            (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null, // right origin\n            cantCopyParentInfo ? (decoder.readParentInfo() ? doc.get(decoder.readString()) : decoder.readLeftID()) : null, // parent\n            cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n            readItemContent(decoder, info) // item content\n          )\n          /* A non-optimized implementation of the above algorithm:\n\n          // The item that was originally to the left of this item.\n          const origin = (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null\n          // The item that was originally to the right of this item.\n          const rightOrigin = (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null\n          const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0\n          const hasParentYKey = cantCopyParentInfo ? decoder.readParentInfo() : false\n          // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n          // and we read the next string as parentYKey.\n          // It indicates how we store/retrieve parent from `y.share`\n          // @type {string|null}\n          const parentYKey = cantCopyParentInfo && hasParentYKey ? decoder.readString() : null\n\n          const struct = new Item(\n            createID(client, clock),\n            null, // leftd\n            origin, // origin\n            null, // right\n            rightOrigin, // right origin\n            cantCopyParentInfo && !hasParentYKey ? decoder.readLeftID() : (parentYKey !== null ? doc.get(parentYKey) : null), // parent\n            cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n            readItemContent(decoder, info) // item content\n          )\n          */\n          refs[i] = struct\n          clock += struct.length\n        }\n      }\n    }\n    // console.log('time to read: ', performance.now() - start) // @todo remove\n  }\n  return clientRefs\n}\n\n/**\n * Resume computing structs generated by struct readers.\n *\n * While there is something to do, we integrate structs in this order\n * 1. top element on stack, if stack is not empty\n * 2. next element from current struct reader (if empty, use next struct reader)\n *\n * If struct causally depends on another struct (ref.missing), we put next reader of\n * `ref.id.client` on top of stack.\n *\n * At some point we find a struct that has no causal dependencies,\n * then we start emptying the stack.\n *\n * It is not possible to have circles: i.e. struct1 (from client1) depends on struct2 (from client2)\n * depends on struct3 (from client1). Therefore the max stack size is eqaul to `structReaders.length`.\n *\n * This method is implemented in a way so that we can resume computation if this update\n * causally depends on another update.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @param {Map<number, { i: number, refs: (GC | Item)[] }>} clientsStructRefs\n * @return { null | { update: Uint8Array, missing: Map<number,number> } }\n *\n * @private\n * @function\n */\nconst integrateStructs = (transaction, store, clientsStructRefs) => {\n  /**\n   * @type {Array<Item | GC>}\n   */\n  const stack = []\n  // sort them so that we take the higher id first, in case of conflicts the lower id will probably not conflict with the id from the higher user.\n  let clientsStructRefsIds = array.from(clientsStructRefs.keys()).sort((a, b) => a - b)\n  if (clientsStructRefsIds.length === 0) {\n    return null\n  }\n  const getNextStructTarget = () => {\n    if (clientsStructRefsIds.length === 0) {\n      return null\n    }\n    let nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ (clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]))\n    while (nextStructsTarget.refs.length === nextStructsTarget.i) {\n      clientsStructRefsIds.pop()\n      if (clientsStructRefsIds.length > 0) {\n        nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ (clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]))\n      } else {\n        return null\n      }\n    }\n    return nextStructsTarget\n  }\n  let curStructsTarget = getNextStructTarget()\n  if (curStructsTarget === null && stack.length === 0) {\n    return null\n  }\n\n  /**\n   * @type {StructStore}\n   */\n  const restStructs = new StructStore()\n  const missingSV = new Map()\n  /**\n   * @param {number} client\n   * @param {number} clock\n   */\n  const updateMissingSv = (client, clock) => {\n    const mclock = missingSV.get(client)\n    if (mclock == null || mclock > clock) {\n      missingSV.set(client, clock)\n    }\n  }\n  /**\n   * @type {GC|Item}\n   */\n  let stackHead = /** @type {any} */ (curStructsTarget).refs[/** @type {any} */ (curStructsTarget).i++]\n  // caching the state because it is used very often\n  const state = new Map()\n\n  const addStackToRestSS = () => {\n    for (const item of stack) {\n      const client = item.id.client\n      const unapplicableItems = clientsStructRefs.get(client)\n      if (unapplicableItems) {\n        // decrement because we weren't able to apply previous operation\n        unapplicableItems.i--\n        restStructs.clients.set(client, unapplicableItems.refs.slice(unapplicableItems.i))\n        clientsStructRefs.delete(client)\n        unapplicableItems.i = 0\n        unapplicableItems.refs = []\n      } else {\n        // item was the last item on clientsStructRefs and the field was already cleared. Add item to restStructs and continue\n        restStructs.clients.set(client, [item])\n      }\n      // remove client from clientsStructRefsIds to prevent users from applying the same update again\n      clientsStructRefsIds = clientsStructRefsIds.filter(c => c !== client)\n    }\n    stack.length = 0\n  }\n\n  // iterate over all struct readers until we are done\n  while (true) {\n    if (stackHead.constructor !== Skip) {\n      const localClock = map.setIfUndefined(state, stackHead.id.client, () => getState(store, stackHead.id.client))\n      const offset = localClock - stackHead.id.clock\n      if (offset < 0) {\n        // update from the same client is missing\n        stack.push(stackHead)\n        updateMissingSv(stackHead.id.client, stackHead.id.clock - 1)\n        // hid a dead wall, add all items from stack to restSS\n        addStackToRestSS()\n      } else {\n        const missing = stackHead.getMissing(transaction, store)\n        if (missing !== null) {\n          stack.push(stackHead)\n          // get the struct reader that has the missing struct\n          /**\n           * @type {{ refs: Array<GC|Item>, i: number }}\n           */\n          const structRefs = clientsStructRefs.get(/** @type {number} */ (missing)) || { refs: [], i: 0 }\n          if (structRefs.refs.length === structRefs.i) {\n            // This update message causally depends on another update message that doesn't exist yet\n            updateMissingSv(/** @type {number} */ (missing), getState(store, missing))\n            addStackToRestSS()\n          } else {\n            stackHead = structRefs.refs[structRefs.i++]\n            continue\n          }\n        } else if (offset === 0 || offset < stackHead.length) {\n          // all fine, apply the stackhead\n          stackHead.integrate(transaction, offset)\n          state.set(stackHead.id.client, stackHead.id.clock + stackHead.length)\n        }\n      }\n    }\n    // iterate to next stackHead\n    if (stack.length > 0) {\n      stackHead = /** @type {GC|Item} */ (stack.pop())\n    } else if (curStructsTarget !== null && curStructsTarget.i < curStructsTarget.refs.length) {\n      stackHead = /** @type {GC|Item} */ (curStructsTarget.refs[curStructsTarget.i++])\n    } else {\n      curStructsTarget = getNextStructTarget()\n      if (curStructsTarget === null) {\n        // we are done!\n        break\n      } else {\n        stackHead = /** @type {GC|Item} */ (curStructsTarget.refs[curStructsTarget.i++])\n      }\n    }\n  }\n  if (restStructs.clients.size > 0) {\n    const encoder = new UpdateEncoderV2()\n    writeClientsStructs(encoder, restStructs, new Map())\n    // write empty deleteset\n    // writeDeleteSet(encoder, new DeleteSet())\n    encoding.writeVarUint(encoder.restEncoder, 0) // => no need for an extra function call, just write 0 deletes\n    return { missing: missingSV, update: encoder.toUint8Array() }\n  }\n  return null\n}\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Transaction} transaction\n *\n * @private\n * @function\n */\nexport const writeStructsFromTransaction = (encoder, transaction) => writeClientsStructs(encoder, transaction.doc.store, transaction.beforeState)\n\n/**\n * Read and apply a document update.\n *\n * This function has the same effect as `applyUpdate` but accepts an decoder.\n *\n * @param {decoding.Decoder} decoder\n * @param {Doc} ydoc\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n * @param {UpdateDecoderV1 | UpdateDecoderV2} [structDecoder]\n *\n * @function\n */\nexport const readUpdateV2 = (decoder, ydoc, transactionOrigin, structDecoder = new UpdateDecoderV2(decoder)) =>\n  transact(ydoc, transaction => {\n    // force that transaction.local is set to non-local\n    transaction.local = false\n    let retry = false\n    const doc = transaction.doc\n    const store = doc.store\n    // let start = performance.now()\n    const ss = readClientsStructRefs(structDecoder, doc)\n    // console.log('time to read structs: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    // console.log('time to merge: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    const restStructs = integrateStructs(transaction, store, ss)\n    const pending = store.pendingStructs\n    if (pending) {\n      // check if we can apply something\n      for (const [client, clock] of pending.missing) {\n        if (clock < getState(store, client)) {\n          retry = true\n          break\n        }\n      }\n      if (restStructs) {\n        // merge restStructs into store.pending\n        for (const [client, clock] of restStructs.missing) {\n          const mclock = pending.missing.get(client)\n          if (mclock == null || mclock > clock) {\n            pending.missing.set(client, clock)\n          }\n        }\n        pending.update = mergeUpdatesV2([pending.update, restStructs.update])\n      }\n    } else {\n      store.pendingStructs = restStructs\n    }\n    // console.log('time to integrate: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    const dsRest = readAndApplyDeleteSet(structDecoder, transaction, store)\n    if (store.pendingDs) {\n      // @todo we could make a lower-bound state-vector check as we do above\n      const pendingDSUpdate = new UpdateDecoderV2(decoding.createDecoder(store.pendingDs))\n      decoding.readVarUint(pendingDSUpdate.restDecoder) // read 0 structs, because we only encode deletes in pendingdsupdate\n      const dsRest2 = readAndApplyDeleteSet(pendingDSUpdate, transaction, store)\n      if (dsRest && dsRest2) {\n        // case 1: ds1 != null && ds2 != null\n        store.pendingDs = mergeUpdatesV2([dsRest, dsRest2])\n      } else {\n        // case 2: ds1 != null\n        // case 3: ds2 != null\n        // case 4: ds1 == null && ds2 == null\n        store.pendingDs = dsRest || dsRest2\n      }\n    } else {\n      // Either dsRest == null && pendingDs == null OR dsRest != null\n      store.pendingDs = dsRest\n    }\n    // console.log('time to cleanup: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n\n    // console.log('time to resume delete readers: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    if (retry) {\n      const update = /** @type {{update: Uint8Array}} */ (store.pendingStructs).update\n      store.pendingStructs = null\n      applyUpdateV2(transaction.doc, update)\n    }\n  }, transactionOrigin, false)\n\n/**\n * Read and apply a document update.\n *\n * This function has the same effect as `applyUpdate` but accepts an decoder.\n *\n * @param {decoding.Decoder} decoder\n * @param {Doc} ydoc\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n *\n * @function\n */\nexport const readUpdate = (decoder, ydoc, transactionOrigin) => readUpdateV2(decoder, ydoc, transactionOrigin, new UpdateDecoderV1(decoder))\n\n/**\n * Apply a document update created by, for example, `y.on('update', update => ..)` or `update = encodeStateAsUpdate()`.\n *\n * This function has the same effect as `readUpdate` but accepts an Uint8Array instead of a Decoder.\n *\n * @param {Doc} ydoc\n * @param {Uint8Array} update\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n *\n * @function\n */\nexport const applyUpdateV2 = (ydoc, update, transactionOrigin, YDecoder = UpdateDecoderV2) => {\n  const decoder = decoding.createDecoder(update)\n  readUpdateV2(decoder, ydoc, transactionOrigin, new YDecoder(decoder))\n}\n\n/**\n * Apply a document update created by, for example, `y.on('update', update => ..)` or `update = encodeStateAsUpdate()`.\n *\n * This function has the same effect as `readUpdate` but accepts an Uint8Array instead of a Decoder.\n *\n * @param {Doc} ydoc\n * @param {Uint8Array} update\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n *\n * @function\n */\nexport const applyUpdate = (ydoc, update, transactionOrigin) => applyUpdateV2(ydoc, update, transactionOrigin, UpdateDecoderV1)\n\n/**\n * Write all the document as a single update message. If you specify the state of the remote client (`targetStateVector`) it will\n * only write the operations that are missing.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Doc} doc\n * @param {Map<number,number>} [targetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n *\n * @function\n */\nexport const writeStateAsUpdate = (encoder, doc, targetStateVector = new Map()) => {\n  writeClientsStructs(encoder, doc.store, targetStateVector)\n  writeDeleteSet(encoder, createDeleteSetFromStructStore(doc.store))\n}\n\n/**\n * Write all the document as a single update message that can be applied on the remote document. If you specify the state of the remote client (`targetState`) it will\n * only write the operations that are missing.\n *\n * Use `writeStateAsUpdate` instead if you are working with lib0/encoding.js#Encoder\n *\n * @param {Doc} doc\n * @param {Uint8Array} [encodedTargetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n * @param {UpdateEncoderV1 | UpdateEncoderV2} [encoder]\n * @return {Uint8Array}\n *\n * @function\n */\nexport const encodeStateAsUpdateV2 = (doc, encodedTargetStateVector = new Uint8Array([0]), encoder = new UpdateEncoderV2()) => {\n  const targetStateVector = decodeStateVector(encodedTargetStateVector)\n  writeStateAsUpdate(encoder, doc, targetStateVector)\n  const updates = [encoder.toUint8Array()]\n  // also add the pending updates (if there are any)\n  if (doc.store.pendingDs) {\n    updates.push(doc.store.pendingDs)\n  }\n  if (doc.store.pendingStructs) {\n    updates.push(diffUpdateV2(doc.store.pendingStructs.update, encodedTargetStateVector))\n  }\n  if (updates.length > 1) {\n    if (encoder.constructor === UpdateEncoderV1) {\n      return mergeUpdates(updates.map((update, i) => i === 0 ? update : convertUpdateFormatV2ToV1(update)))\n    } else if (encoder.constructor === UpdateEncoderV2) {\n      return mergeUpdatesV2(updates)\n    }\n  }\n  return updates[0]\n}\n\n/**\n * Write all the document as a single update message that can be applied on the remote document. If you specify the state of the remote client (`targetState`) it will\n * only write the operations that are missing.\n *\n * Use `writeStateAsUpdate` instead if you are working with lib0/encoding.js#Encoder\n *\n * @param {Doc} doc\n * @param {Uint8Array} [encodedTargetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n * @return {Uint8Array}\n *\n * @function\n */\nexport const encodeStateAsUpdate = (doc, encodedTargetStateVector) => encodeStateAsUpdateV2(doc, encodedTargetStateVector, new UpdateEncoderV1())\n\n/**\n * Read state vector from Decoder and return as Map\n *\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\nexport const readStateVector = decoder => {\n  const ss = new Map()\n  const ssLength = decoding.readVarUint(decoder.restDecoder)\n  for (let i = 0; i < ssLength; i++) {\n    const client = decoding.readVarUint(decoder.restDecoder)\n    const clock = decoding.readVarUint(decoder.restDecoder)\n    ss.set(client, clock)\n  }\n  return ss\n}\n\n/**\n * Read decodedState and return State as Map.\n *\n * @param {Uint8Array} decodedState\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\n// export const decodeStateVectorV2 = decodedState => readStateVector(new DSDecoderV2(decoding.createDecoder(decodedState)))\n\n/**\n * Read decodedState and return State as Map.\n *\n * @param {Uint8Array} decodedState\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\nexport const decodeStateVector = decodedState => readStateVector(new DSDecoderV1(decoding.createDecoder(decodedState)))\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {Map<number,number>} sv\n * @function\n */\nexport const writeStateVector = (encoder, sv) => {\n  encoding.writeVarUint(encoder.restEncoder, sv.size)\n  array.from(sv.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {\n    encoding.writeVarUint(encoder.restEncoder, client) // @todo use a special client decoder that is based on mapping\n    encoding.writeVarUint(encoder.restEncoder, clock)\n  })\n  return encoder\n}\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {Doc} doc\n *\n * @function\n */\nexport const writeDocumentStateVector = (encoder, doc) => writeStateVector(encoder, getStateVector(doc.store))\n\n/**\n * Encode State as Uint8Array.\n *\n * @param {Doc|Map<number,number>} doc\n * @param {DSEncoderV1 | DSEncoderV2} [encoder]\n * @return {Uint8Array}\n *\n * @function\n */\nexport const encodeStateVectorV2 = (doc, encoder = new DSEncoderV2()) => {\n  if (doc instanceof Map) {\n    writeStateVector(encoder, doc)\n  } else {\n    writeDocumentStateVector(encoder, doc)\n  }\n  return encoder.toUint8Array()\n}\n\n/**\n * Encode State as Uint8Array.\n *\n * @param {Doc|Map<number,number>} doc\n * @return {Uint8Array}\n *\n * @function\n */\nexport const encodeStateVector = doc => encodeStateVectorV2(doc, new DSEncoderV1())\n", "import * as f from 'lib0/function'\n\n/**\n * General event handler implementation.\n *\n * @template ARG0, ARG1\n *\n * @private\n */\nexport class EventHandler {\n  constructor () {\n    /**\n     * @type {Array<function(ARG0, ARG1):void>}\n     */\n    this.l = []\n  }\n}\n\n/**\n * @template ARG0,ARG1\n * @returns {EventHandler<ARG0,ARG1>}\n *\n * @private\n * @function\n */\nexport const createEventHandler = () => new EventHandler()\n\n/**\n * Adds an event listener that is called when\n * {@link EventHandler#callEventListeners} is called.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {function(ARG0,ARG1):void} f The event handler.\n *\n * @private\n * @function\n */\nexport const addEventHandlerListener = (eventHandler, f) =>\n  eventHandler.l.push(f)\n\n/**\n * Removes an event listener.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {function(ARG0,ARG1):void} f The event handler that was added with\n *                     {@link EventHandler#addEventListener}\n *\n * @private\n * @function\n */\nexport const removeEventHandlerListener = (eventHandler, f) => {\n  const l = eventHandler.l\n  const len = l.length\n  eventHandler.l = l.filter(g => f !== g)\n  if (len === eventHandler.l.length) {\n    console.error('[yjs] Tried to remove event handler that doesn\\'t exist.')\n  }\n}\n\n/**\n * Removes all event listeners.\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n *\n * @private\n * @function\n */\nexport const removeAllEventHandlerListeners = eventHandler => {\n  eventHandler.l.length = 0\n}\n\n/**\n * Call all event listeners that were added via\n * {@link EventHandler#addEventListener}.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {ARG0} arg0\n * @param {ARG1} arg1\n *\n * @private\n * @function\n */\nexport const callEventHandlerListeners = (eventHandler, arg0, arg1) =>\n  f.callAll(eventHandler.l, [arg0, arg1])\n", "\nimport { AbstractType } from '../internals.js' // eslint-disable-line\n\nimport * as decoding from 'lib0/decoding'\nimport * as encoding from 'lib0/encoding'\nimport * as error from 'lib0/error'\n\nexport class ID {\n  /**\n   * @param {number} client client id\n   * @param {number} clock unique per client id, continuous number\n   */\n  constructor (client, clock) {\n    /**\n     * Client id\n     * @type {number}\n     */\n    this.client = client\n    /**\n     * unique per client id, continuous number\n     * @type {number}\n     */\n    this.clock = clock\n  }\n}\n\n/**\n * @param {ID | null} a\n * @param {ID | null} b\n * @return {boolean}\n *\n * @function\n */\nexport const compareIDs = (a, b) => a === b || (a !== null && b !== null && a.client === b.client && a.clock === b.clock)\n\n/**\n * @param {number} client\n * @param {number} clock\n *\n * @private\n * @function\n */\nexport const createID = (client, clock) => new ID(client, clock)\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {ID} id\n *\n * @private\n * @function\n */\nexport const writeID = (encoder, id) => {\n  encoding.writeVarUint(encoder, id.client)\n  encoding.writeVarUint(encoder, id.clock)\n}\n\n/**\n * Read ID.\n * * If first varUint read is 0xFFFFFF a RootID is returned.\n * * Otherwise an ID is returned\n *\n * @param {decoding.Decoder} decoder\n * @return {ID}\n *\n * @private\n * @function\n */\nexport const readID = decoder =>\n  createID(decoding.readVarUint(decoder), decoding.readVarUint(decoder))\n\n/**\n * The top types are mapped from y.share.get(keyname) => type.\n * `type` does not store any information about the `keyname`.\n * This function finds the correct `keyname` for `type` and throws otherwise.\n *\n * @param {AbstractType<any>} type\n * @return {string}\n *\n * @private\n * @function\n */\nexport const findRootTypeKey = type => {\n  // @ts-ignore _y must be defined, otherwise unexpected case\n  for (const [key, value] of type.doc.share.entries()) {\n    if (value === type) {\n      return key\n    }\n  }\n  throw error.unexpectedCase()\n}\n", "\nimport { AbstractType, Item } from '../internals.js' // eslint-disable-line\n\n/**\n * Check if `parent` is a parent of `child`.\n *\n * @param {AbstractType<any>} parent\n * @param {Item|null} child\n * @return {Boolean} Whether `parent` is a parent of `child`.\n *\n * @private\n * @function\n */\nexport const isParentOf = (parent, child) => {\n  while (child !== null) {\n    if (child.parent === parent) {\n      return true\n    }\n    child = /** @type {AbstractType<any>} */ (child.parent)._item\n  }\n  return false\n}\n", "\nimport {\n  AbstractType // eslint-disable-line\n} from '../internals.js'\n\n/**\n * Convenient helper to log type information.\n *\n * Do not use in productive systems as the output can be immense!\n *\n * @param {AbstractType<any>} type\n */\nexport const logType = type => {\n  const res = []\n  let n = type._start\n  while (n) {\n    res.push(n)\n    n = n.right\n  }\n  console.log('Children: ', res)\n  console.log('Children content: ', res.filter(m => !m.deleted).map(m => m.content))\n}\n", "\nimport {\n  YArray,\n  YMap,\n  readDeleteSet,\n  writeDeleteSet,\n  createDeleteSet,\n  DSEncoderV1, DSDecoderV1, ID, DeleteSet, YArrayEvent, Transaction, Doc // eslint-disable-line\n} from '../internals.js'\n\nimport * as decoding from 'lib0/decoding'\n\nimport { mergeDeleteSets, isDeleted } from './DeleteSet.js'\n\nexport class PermanentUserData {\n  /**\n   * @param {Doc} doc\n   * @param {YMap<any>} [storeType]\n   */\n  constructor (doc, storeType = doc.getMap('users')) {\n    /**\n     * @type {Map<string,DeleteSet>}\n     */\n    const dss = new Map()\n    this.yusers = storeType\n    this.doc = doc\n    /**\n     * Maps from clientid to userDescription\n     *\n     * @type {Map<number,string>}\n     */\n    this.clients = new Map()\n    this.dss = dss\n    /**\n     * @param {YMap<any>} user\n     * @param {string} userDescription\n     */\n    const initUser = (user, userDescription) => {\n      /**\n       * @type {YArray<Uint8Array>}\n       */\n      const ds = user.get('ds')\n      const ids = user.get('ids')\n      const addClientId = /** @param {number} clientid */ clientid => this.clients.set(clientid, userDescription)\n      ds.observe(/** @param {YArrayEvent<any>} event */ event => {\n        event.changes.added.forEach(item => {\n          item.content.getContent().forEach(encodedDs => {\n            if (encodedDs instanceof Uint8Array) {\n              this.dss.set(userDescription, mergeDeleteSets([this.dss.get(userDescription) || createDeleteSet(), readDeleteSet(new DSDecoderV1(decoding.createDecoder(encodedDs)))]))\n            }\n          })\n        })\n      })\n      this.dss.set(userDescription, mergeDeleteSets(ds.map(encodedDs => readDeleteSet(new DSDecoderV1(decoding.createDecoder(encodedDs))))))\n      ids.observe(/** @param {YArrayEvent<any>} event */ event =>\n        event.changes.added.forEach(item => item.content.getContent().forEach(addClientId))\n      )\n      ids.forEach(addClientId)\n    }\n    // observe users\n    storeType.observe(event => {\n      event.keysChanged.forEach(userDescription =>\n        initUser(storeType.get(userDescription), userDescription)\n      )\n    })\n    // add intial data\n    storeType.forEach(initUser)\n  }\n\n  /**\n   * @param {Doc} doc\n   * @param {number} clientid\n   * @param {string} userDescription\n   * @param {Object} conf\n   * @param {function(Transaction, DeleteSet):boolean} [conf.filter]\n   */\n  setUserMapping (doc, clientid, userDescription, { filter = () => true } = {}) {\n    const users = this.yusers\n    let user = users.get(userDescription)\n    if (!user) {\n      user = new YMap()\n      user.set('ids', new YArray())\n      user.set('ds', new YArray())\n      users.set(userDescription, user)\n    }\n    user.get('ids').push([clientid])\n    users.observe(_event => {\n      setTimeout(() => {\n        const userOverwrite = users.get(userDescription)\n        if (userOverwrite !== user) {\n          // user was overwritten, port all data over to the next user object\n          // @todo Experiment with Y.Sets here\n          user = userOverwrite\n          // @todo iterate over old type\n          this.clients.forEach((_userDescription, clientid) => {\n            if (userDescription === _userDescription) {\n              user.get('ids').push([clientid])\n            }\n          })\n          const encoder = new DSEncoderV1()\n          const ds = this.dss.get(userDescription)\n          if (ds) {\n            writeDeleteSet(encoder, ds)\n            user.get('ds').push([encoder.toUint8Array()])\n          }\n        }\n      }, 0)\n    })\n    doc.on('afterTransaction', /** @param {Transaction} transaction */ transaction => {\n      setTimeout(() => {\n        const yds = user.get('ds')\n        const ds = transaction.deleteSet\n        if (transaction.local && ds.clients.size > 0 && filter(transaction, ds)) {\n          const encoder = new DSEncoderV1()\n          writeDeleteSet(encoder, ds)\n          yds.push([encoder.toUint8Array()])\n        }\n      })\n    })\n  }\n\n  /**\n   * @param {number} clientid\n   * @return {any}\n   */\n  getUserByClientId (clientid) {\n    return this.clients.get(clientid) || null\n  }\n\n  /**\n   * @param {ID} id\n   * @return {string | null}\n   */\n  getUserByDeletedId (id) {\n    for (const [userDescription, ds] of this.dss.entries()) {\n      if (isDeleted(ds, id)) {\n        return userDescription\n      }\n    }\n    return null\n  }\n}\n", "\nimport {\n  writeID,\n  readID,\n  compareIDs,\n  getState,\n  findRootTypeKey,\n  Item,\n  createID,\n  ContentType,\n  followRedone,\n  ID, Doc, AbstractType // eslint-disable-line\n} from '../internals.js'\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as error from 'lib0/error'\n\n/**\n * A relative position is based on the Yjs model and is not affected by document changes.\n * E.g. If you place a relative position before a certain character, it will always point to this character.\n * If you place a relative position at the end of a type, it will always point to the end of the type.\n *\n * A numeric position is often unsuited for user selections, because it does not change when content is inserted\n * before or after.\n *\n * ```Insert(0, 'x')('a|bc') = 'xa|bc'``` Where | is the relative position.\n *\n * One of the properties must be defined.\n *\n * @example\n *   // Current cursor position is at position 10\n *   const relativePosition = createRelativePositionFromIndex(yText, 10)\n *   // modify yText\n *   yText.insert(0, 'abc')\n *   yText.delete(3, 10)\n *   // Compute the cursor position\n *   const absolutePosition = createAbsolutePositionFromRelativePosition(y, relativePosition)\n *   absolutePosition.type === yText // => true\n *   console.log('cursor location is ' + absolutePosition.index) // => cursor location is 3\n *\n */\nexport class RelativePosition {\n  /**\n   * @param {ID|null} type\n   * @param {string|null} tname\n   * @param {ID|null} item\n   * @param {number} assoc\n   */\n  constructor (type, tname, item, assoc = 0) {\n    /**\n     * @type {ID|null}\n     */\n    this.type = type\n    /**\n     * @type {string|null}\n     */\n    this.tname = tname\n    /**\n     * @type {ID | null}\n     */\n    this.item = item\n    /**\n     * A relative position is associated to a specific character. By default\n     * assoc >= 0, the relative position is associated to the character\n     * after the meant position.\n     * I.e. position 1 in 'ab' is associated to character 'b'.\n     *\n     * If assoc < 0, then the relative position is associated to the caharacter\n     * before the meant position.\n     *\n     * @type {number}\n     */\n    this.assoc = assoc\n  }\n}\n\n/**\n * @param {RelativePosition} rpos\n * @return {any}\n */\nexport const relativePositionToJSON = rpos => {\n  const json = {}\n  if (rpos.type) {\n    json.type = rpos.type\n  }\n  if (rpos.tname) {\n    json.tname = rpos.tname\n  }\n  if (rpos.item) {\n    json.item = rpos.item\n  }\n  if (rpos.assoc != null) {\n    json.assoc = rpos.assoc\n  }\n  return json\n}\n\n/**\n * @param {any} json\n * @return {RelativePosition}\n *\n * @function\n */\nexport const createRelativePositionFromJSON = json => new RelativePosition(json.type == null ? null : createID(json.type.client, json.type.clock), json.tname || null, json.item == null ? null : createID(json.item.client, json.item.clock), json.assoc == null ? 0 : json.assoc)\n\nexport class AbsolutePosition {\n  /**\n   * @param {AbstractType<any>} type\n   * @param {number} index\n   * @param {number} [assoc]\n   */\n  constructor (type, index, assoc = 0) {\n    /**\n     * @type {AbstractType<any>}\n     */\n    this.type = type\n    /**\n     * @type {number}\n     */\n    this.index = index\n    this.assoc = assoc\n  }\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @param {number} [assoc]\n *\n * @function\n */\nexport const createAbsolutePosition = (type, index, assoc = 0) => new AbsolutePosition(type, index, assoc)\n\n/**\n * @param {AbstractType<any>} type\n * @param {ID|null} item\n * @param {number} [assoc]\n *\n * @function\n */\nexport const createRelativePosition = (type, item, assoc) => {\n  let typeid = null\n  let tname = null\n  if (type._item === null) {\n    tname = findRootTypeKey(type)\n  } else {\n    typeid = createID(type._item.id.client, type._item.id.clock)\n  }\n  return new RelativePosition(typeid, tname, item, assoc)\n}\n\n/**\n * Create a relativePosition based on a absolute position.\n *\n * @param {AbstractType<any>} type The base type (e.g. YText or YArray).\n * @param {number} index The absolute position.\n * @param {number} [assoc]\n * @return {RelativePosition}\n *\n * @function\n */\nexport const createRelativePositionFromTypeIndex = (type, index, assoc = 0) => {\n  let t = type._start\n  if (assoc < 0) {\n    // associated to the left character or the beginning of a type, increment index if possible.\n    if (index === 0) {\n      return createRelativePosition(type, null, assoc)\n    }\n    index--\n  }\n  while (t !== null) {\n    if (!t.deleted && t.countable) {\n      if (t.length > index) {\n        // case 1: found position somewhere in the linked list\n        return createRelativePosition(type, createID(t.id.client, t.id.clock + index), assoc)\n      }\n      index -= t.length\n    }\n    if (t.right === null && assoc < 0) {\n      // left-associated position, return last available id\n      return createRelativePosition(type, t.lastId, assoc)\n    }\n    t = t.right\n  }\n  return createRelativePosition(type, null, assoc)\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {RelativePosition} rpos\n *\n * @function\n */\nexport const writeRelativePosition = (encoder, rpos) => {\n  const { type, tname, item, assoc } = rpos\n  if (item !== null) {\n    encoding.writeVarUint(encoder, 0)\n    writeID(encoder, item)\n  } else if (tname !== null) {\n    // case 2: found position at the end of the list and type is stored in y.share\n    encoding.writeUint8(encoder, 1)\n    encoding.writeVarString(encoder, tname)\n  } else if (type !== null) {\n    // case 3: found position at the end of the list and type is attached to an item\n    encoding.writeUint8(encoder, 2)\n    writeID(encoder, type)\n  } else {\n    throw error.unexpectedCase()\n  }\n  encoding.writeVarInt(encoder, assoc)\n  return encoder\n}\n\n/**\n * @param {RelativePosition} rpos\n * @return {Uint8Array}\n */\nexport const encodeRelativePosition = rpos => {\n  const encoder = encoding.createEncoder()\n  writeRelativePosition(encoder, rpos)\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * @param {decoding.Decoder} decoder\n * @return {RelativePosition}\n *\n * @function\n */\nexport const readRelativePosition = decoder => {\n  let type = null\n  let tname = null\n  let itemID = null\n  switch (decoding.readVarUint(decoder)) {\n    case 0:\n      // case 1: found position somewhere in the linked list\n      itemID = readID(decoder)\n      break\n    case 1:\n      // case 2: found position at the end of the list and type is stored in y.share\n      tname = decoding.readVarString(decoder)\n      break\n    case 2: {\n      // case 3: found position at the end of the list and type is attached to an item\n      type = readID(decoder)\n    }\n  }\n  const assoc = decoding.hasContent(decoder) ? decoding.readVarInt(decoder) : 0\n  return new RelativePosition(type, tname, itemID, assoc)\n}\n\n/**\n * @param {Uint8Array} uint8Array\n * @return {RelativePosition}\n */\nexport const decodeRelativePosition = uint8Array => readRelativePosition(decoding.createDecoder(uint8Array))\n\n/**\n * @param {RelativePosition} rpos\n * @param {Doc} doc\n * @return {AbsolutePosition|null}\n *\n * @function\n */\nexport const createAbsolutePositionFromRelativePosition = (rpos, doc) => {\n  const store = doc.store\n  const rightID = rpos.item\n  const typeID = rpos.type\n  const tname = rpos.tname\n  const assoc = rpos.assoc\n  let type = null\n  let index = 0\n  if (rightID !== null) {\n    if (getState(store, rightID.client) <= rightID.clock) {\n      return null\n    }\n    const res = followRedone(store, rightID)\n    const right = res.item\n    if (!(right instanceof Item)) {\n      return null\n    }\n    type = /** @type {AbstractType<any>} */ (right.parent)\n    if (type._item === null || !type._item.deleted) {\n      index = (right.deleted || !right.countable) ? 0 : (res.diff + (assoc >= 0 ? 0 : 1)) // adjust position based on left association if necessary\n      let n = right.left\n      while (n !== null) {\n        if (!n.deleted && n.countable) {\n          index += n.length\n        }\n        n = n.left\n      }\n    }\n  } else {\n    if (tname !== null) {\n      type = doc.get(tname)\n    } else if (typeID !== null) {\n      if (getState(store, typeID.client) <= typeID.clock) {\n        // type does not exist yet\n        return null\n      }\n      const { item } = followRedone(store, typeID)\n      if (item instanceof Item && item.content instanceof ContentType) {\n        type = item.content.type\n      } else {\n        // struct is garbage collected\n        return null\n      }\n    } else {\n      throw error.unexpectedCase()\n    }\n    if (assoc >= 0) {\n      index = type._length\n    } else {\n      index = 0\n    }\n  }\n  return createAbsolutePosition(type, index, rpos.assoc)\n}\n\n/**\n * @param {RelativePosition|null} a\n * @param {RelativePosition|null} b\n * @return {boolean}\n *\n * @function\n */\nexport const compareRelativePositions = (a, b) => a === b || (\n  a !== null && b !== null && a.tname === b.tname && compareIDs(a.item, b.item) && compareIDs(a.type, b.type) && a.assoc === b.assoc\n)\n", "\nimport {\n  isDeleted,\n  createDeleteSetFromStructStore,\n  getStateVector,\n  getItemCleanStart,\n  iterateDeletedStructs,\n  writeDeleteSet,\n  writeStateVector,\n  readDeleteSet,\n  readStateVector,\n  createDeleteSet,\n  createID,\n  getState,\n  findIndexSS,\n  UpdateEncoderV2,\n  applyUpdateV2,\n  LazyStructReader,\n  equalDeleteSets,\n  UpdateDecoderV1, UpdateDecoderV2, DSEncoderV1, DSEncoderV2, DSDecoderV1, DSDecoderV2, Transaction, Doc, DeleteSet, Item, // eslint-disable-line\n  mergeDeleteSets\n} from '../internals.js'\n\nimport * as map from 'lib0/map'\nimport * as set from 'lib0/set'\nimport * as decoding from 'lib0/decoding'\nimport * as encoding from 'lib0/encoding'\n\nexport class Snapshot {\n  /**\n   * @param {DeleteSet} ds\n   * @param {Map<number,number>} sv state map\n   */\n  constructor (ds, sv) {\n    /**\n     * @type {DeleteSet}\n     */\n    this.ds = ds\n    /**\n     * State Map\n     * @type {Map<number,number>}\n     */\n    this.sv = sv\n  }\n}\n\n/**\n * @param {Snapshot} snap1\n * @param {Snapshot} snap2\n * @return {boolean}\n */\nexport const equalSnapshots = (snap1, snap2) => {\n  const ds1 = snap1.ds.clients\n  const ds2 = snap2.ds.clients\n  const sv1 = snap1.sv\n  const sv2 = snap2.sv\n  if (sv1.size !== sv2.size || ds1.size !== ds2.size) {\n    return false\n  }\n  for (const [key, value] of sv1.entries()) {\n    if (sv2.get(key) !== value) {\n      return false\n    }\n  }\n  for (const [client, dsitems1] of ds1.entries()) {\n    const dsitems2 = ds2.get(client) || []\n    if (dsitems1.length !== dsitems2.length) {\n      return false\n    }\n    for (let i = 0; i < dsitems1.length; i++) {\n      const dsitem1 = dsitems1[i]\n      const dsitem2 = dsitems2[i]\n      if (dsitem1.clock !== dsitem2.clock || dsitem1.len !== dsitem2.len) {\n        return false\n      }\n    }\n  }\n  return true\n}\n\n/**\n * @param {Snapshot} snapshot\n * @param {DSEncoderV1 | DSEncoderV2} [encoder]\n * @return {Uint8Array}\n */\nexport const encodeSnapshotV2 = (snapshot, encoder = new DSEncoderV2()) => {\n  writeDeleteSet(encoder, snapshot.ds)\n  writeStateVector(encoder, snapshot.sv)\n  return encoder.toUint8Array()\n}\n\n/**\n * @param {Snapshot} snapshot\n * @return {Uint8Array}\n */\nexport const encodeSnapshot = snapshot => encodeSnapshotV2(snapshot, new DSEncoderV1())\n\n/**\n * @param {Uint8Array} buf\n * @param {DSDecoderV1 | DSDecoderV2} [decoder]\n * @return {Snapshot}\n */\nexport const decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(decoding.createDecoder(buf))) => {\n  return new Snapshot(readDeleteSet(decoder), readStateVector(decoder))\n}\n\n/**\n * @param {Uint8Array} buf\n * @return {Snapshot}\n */\nexport const decodeSnapshot = buf => decodeSnapshotV2(buf, new DSDecoderV1(decoding.createDecoder(buf)))\n\n/**\n * @param {DeleteSet} ds\n * @param {Map<number,number>} sm\n * @return {Snapshot}\n */\nexport const createSnapshot = (ds, sm) => new Snapshot(ds, sm)\n\nexport const emptySnapshot = createSnapshot(createDeleteSet(), new Map())\n\n/**\n * @param {Doc} doc\n * @return {Snapshot}\n */\nexport const snapshot = doc => createSnapshot(createDeleteSetFromStructStore(doc.store), getStateVector(doc.store))\n\n/**\n * @param {Item} item\n * @param {Snapshot|undefined} snapshot\n *\n * @protected\n * @function\n */\nexport const isVisible = (item, snapshot) => snapshot === undefined\n  ? !item.deleted\n  : snapshot.sv.has(item.id.client) && (snapshot.sv.get(item.id.client) || 0) > item.id.clock && !isDeleted(snapshot.ds, item.id)\n\n/**\n * @param {Transaction} transaction\n * @param {Snapshot} snapshot\n */\nexport const splitSnapshotAffectedStructs = (transaction, snapshot) => {\n  const meta = map.setIfUndefined(transaction.meta, splitSnapshotAffectedStructs, set.create)\n  const store = transaction.doc.store\n  // check if we already split for this snapshot\n  if (!meta.has(snapshot)) {\n    snapshot.sv.forEach((clock, client) => {\n      if (clock < getState(store, client)) {\n        getItemCleanStart(transaction, createID(client, clock))\n      }\n    })\n    iterateDeletedStructs(transaction, snapshot.ds, _item => {})\n    meta.add(snapshot)\n  }\n}\n\n/**\n * @example\n *  const ydoc = new Y.Doc({ gc: false })\n *  ydoc.getText().insert(0, 'world!')\n *  const snapshot = Y.snapshot(ydoc)\n *  ydoc.getText().insert(0, 'hello ')\n *  const restored = Y.createDocFromSnapshot(ydoc, snapshot)\n *  assert(restored.getText().toString() === 'world!')\n *\n * @param {Doc} originDoc\n * @param {Snapshot} snapshot\n * @param {Doc} [newDoc] Optionally, you may define the Yjs document that receives the data from originDoc\n * @return {Doc}\n */\nexport const createDocFromSnapshot = (originDoc, snapshot, newDoc = new Doc()) => {\n  if (originDoc.gc) {\n    // we should not try to restore a GC-ed document, because some of the restored items might have their content deleted\n    throw new Error('Garbage-collection must be disabled in `originDoc`!')\n  }\n  const { sv, ds } = snapshot\n\n  const encoder = new UpdateEncoderV2()\n  originDoc.transact(transaction => {\n    let size = 0\n    sv.forEach(clock => {\n      if (clock > 0) {\n        size++\n      }\n    })\n    encoding.writeVarUint(encoder.restEncoder, size)\n    // splitting the structs before writing them to the encoder\n    for (const [client, clock] of sv) {\n      if (clock === 0) {\n        continue\n      }\n      if (clock < getState(originDoc.store, client)) {\n        getItemCleanStart(transaction, createID(client, clock))\n      }\n      const structs = originDoc.store.clients.get(client) || []\n      const lastStructIndex = findIndexSS(structs, clock - 1)\n      // write # encoded structs\n      encoding.writeVarUint(encoder.restEncoder, lastStructIndex + 1)\n      encoder.writeClient(client)\n      // first clock written is 0\n      encoding.writeVarUint(encoder.restEncoder, 0)\n      for (let i = 0; i <= lastStructIndex; i++) {\n        structs[i].write(encoder, 0)\n      }\n    }\n    writeDeleteSet(encoder, ds)\n  })\n\n  applyUpdateV2(newDoc, encoder.toUint8Array(), 'snapshot')\n  return newDoc\n}\n\n/**\n * @param {Snapshot} snapshot\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n */\nexport const snapshotContainsUpdateV2 = (snapshot, update, YDecoder = UpdateDecoderV2) => {\n  const structs = []\n  const updateDecoder = new YDecoder(decoding.createDecoder(update))\n  const lazyDecoder = new LazyStructReader(updateDecoder, false)\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    structs.push(curr)\n    if ((snapshot.sv.get(curr.id.client) || 0) < curr.id.clock + curr.length) {\n      return false\n    }\n  }\n  const mergedDS = mergeDeleteSets([snapshot.ds, readDeleteSet(updateDecoder)])\n  return equalDeleteSets(snapshot.ds, mergedDS)\n}\n\n/**\n * @param {Snapshot} snapshot\n * @param {Uint8Array} update\n */\nexport const snapshotContainsUpdate = (snapshot, update) => snapshotContainsUpdateV2(snapshot, update, UpdateDecoderV1)\n", "\nimport {\n  GC,\n  splitItem,\n  Transaction, ID, Item, DSDecoderV2 // eslint-disable-line\n} from '../internals.js'\n\nimport * as math from 'lib0/math'\nimport * as error from 'lib0/error'\n\nexport class StructStore {\n  constructor () {\n    /**\n     * @type {Map<number,Array<GC|Item>>}\n     */\n    this.clients = new Map()\n    /**\n     * @type {null | { missing: Map<number, number>, update: Uint8Array }}\n     */\n    this.pendingStructs = null\n    /**\n     * @type {null | Uint8Array}\n     */\n    this.pendingDs = null\n  }\n}\n\n/**\n * Return the states as a Map<client,clock>.\n * Note that clock refers to the next expected clock id.\n *\n * @param {StructStore} store\n * @return {Map<number,number>}\n *\n * @public\n * @function\n */\nexport const getStateVector = store => {\n  const sm = new Map()\n  store.clients.forEach((structs, client) => {\n    const struct = structs[structs.length - 1]\n    sm.set(client, struct.id.clock + struct.length)\n  })\n  return sm\n}\n\n/**\n * @param {StructStore} store\n * @param {number} client\n * @return {number}\n *\n * @public\n * @function\n */\nexport const getState = (store, client) => {\n  const structs = store.clients.get(client)\n  if (structs === undefined) {\n    return 0\n  }\n  const lastStruct = structs[structs.length - 1]\n  return lastStruct.id.clock + lastStruct.length\n}\n\n/**\n * @param {StructStore} store\n *\n * @private\n * @function\n */\nexport const integretyCheck = store => {\n  store.clients.forEach(structs => {\n    for (let i = 1; i < structs.length; i++) {\n      const l = structs[i - 1]\n      const r = structs[i]\n      if (l.id.clock + l.length !== r.id.clock) {\n        throw new Error('StructStore failed integrety check')\n      }\n    }\n  })\n}\n\n/**\n * @param {StructStore} store\n * @param {GC|Item} struct\n *\n * @private\n * @function\n */\nexport const addStruct = (store, struct) => {\n  let structs = store.clients.get(struct.id.client)\n  if (structs === undefined) {\n    structs = []\n    store.clients.set(struct.id.client, structs)\n  } else {\n    const lastStruct = structs[structs.length - 1]\n    if (lastStruct.id.clock + lastStruct.length !== struct.id.clock) {\n      throw error.unexpectedCase()\n    }\n  }\n  structs.push(struct)\n}\n\n/**\n * Perform a binary search on a sorted array\n * @param {Array<Item|GC>} structs\n * @param {number} clock\n * @return {number}\n *\n * @private\n * @function\n */\nexport const findIndexSS = (structs, clock) => {\n  let left = 0\n  let right = structs.length - 1\n  let mid = structs[right]\n  let midclock = mid.id.clock\n  if (midclock === clock) {\n    return right\n  }\n  // @todo does it even make sense to pivot the search?\n  // If a good split misses, it might actually increase the time to find the correct item.\n  // Currently, the only advantage is that search with pivoting might find the item on the first try.\n  let midindex = math.floor((clock / (midclock + mid.length - 1)) * right) // pivoting the search\n  while (left <= right) {\n    mid = structs[midindex]\n    midclock = mid.id.clock\n    if (midclock <= clock) {\n      if (clock < midclock + mid.length) {\n        return midindex\n      }\n      left = midindex + 1\n    } else {\n      right = midindex - 1\n    }\n    midindex = math.floor((left + right) / 2)\n  }\n  // Always check state before looking for a struct in StructStore\n  // Therefore the case of not finding a struct is unexpected\n  throw error.unexpectedCase()\n}\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {StructStore} store\n * @param {ID} id\n * @return {GC|Item}\n *\n * @private\n * @function\n */\nexport const find = (store, id) => {\n  /**\n   * @type {Array<GC|Item>}\n   */\n  // @ts-ignore\n  const structs = store.clients.get(id.client)\n  return structs[findIndexSS(structs, id.clock)]\n}\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n * @private\n * @function\n */\nexport const getItem = /** @type {function(StructStore,ID):Item} */ (find)\n\n/**\n * @param {Transaction} transaction\n * @param {Array<Item|GC>} structs\n * @param {number} clock\n */\nexport const findIndexCleanStart = (transaction, structs, clock) => {\n  const index = findIndexSS(structs, clock)\n  const struct = structs[index]\n  if (struct.id.clock < clock && struct instanceof Item) {\n    structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock))\n    return index + 1\n  }\n  return index\n}\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {Transaction} transaction\n * @param {ID} id\n * @return {Item}\n *\n * @private\n * @function\n */\nexport const getItemCleanStart = (transaction, id) => {\n  const structs = /** @type {Array<Item>} */ (transaction.doc.store.clients.get(id.client))\n  return structs[findIndexCleanStart(transaction, structs, id.clock)]\n}\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @param {ID} id\n * @return {Item}\n *\n * @private\n * @function\n */\nexport const getItemCleanEnd = (transaction, store, id) => {\n  /**\n   * @type {Array<Item>}\n   */\n  // @ts-ignore\n  const structs = store.clients.get(id.client)\n  const index = findIndexSS(structs, id.clock)\n  const struct = structs[index]\n  if (id.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) {\n    structs.splice(index + 1, 0, splitItem(transaction, struct, id.clock - struct.id.clock + 1))\n  }\n  return struct\n}\n\n/**\n * Replace `item` with `newitem` in store\n * @param {StructStore} store\n * @param {GC|Item} struct\n * @param {GC|Item} newStruct\n *\n * @private\n * @function\n */\nexport const replaceStruct = (store, struct, newStruct) => {\n  const structs = /** @type {Array<GC|Item>} */ (store.clients.get(struct.id.client))\n  structs[findIndexSS(structs, struct.id.clock)] = newStruct\n}\n\n/**\n * Iterate over a range of structs\n *\n * @param {Transaction} transaction\n * @param {Array<Item|GC>} structs\n * @param {number} clockStart Inclusive start\n * @param {number} len\n * @param {function(GC|Item):void} f\n *\n * @function\n */\nexport const iterateStructs = (transaction, structs, clockStart, len, f) => {\n  if (len === 0) {\n    return\n  }\n  const clockEnd = clockStart + len\n  let index = findIndexCleanStart(transaction, structs, clockStart)\n  let struct\n  do {\n    struct = structs[index++]\n    if (clockEnd < struct.id.clock + struct.length) {\n      findIndexCleanStart(transaction, structs, clockEnd)\n    }\n    f(struct)\n  } while (index < structs.length && structs[index].id.clock < clockEnd)\n}\n", "\nimport {\n  getState,\n  writeStructsFromTransaction,\n  writeDeleteSet,\n  DeleteSet,\n  sortAndMergeDeleteSet,\n  getStateVector,\n  findIndexSS,\n  callEventHandlerListeners,\n  Item,\n  generateNewClientId,\n  createID,\n  cleanupYTextAfterTransaction,\n  UpdateEncoderV1, UpdateEncoderV2, GC, StructStore, AbstractType, AbstractStruct, YEvent, Doc // eslint-disable-line\n} from '../internals.js'\n\nimport * as map from 'lib0/map'\nimport * as math from 'lib0/math'\nimport * as set from 'lib0/set'\nimport * as logging from 'lib0/logging'\nimport { callAll } from 'lib0/function'\n\n/**\n * A transaction is created for every change on the Yjs model. It is possible\n * to bundle changes on the Yjs model in a single transaction to\n * minimize the number on messages sent and the number of observer calls.\n * If possible the user of this library should bundle as many changes as\n * possible. Here is an example to illustrate the advantages of bundling:\n *\n * @example\n * const map = y.define('map', YMap)\n * // Log content when change is triggered\n * map.observe(() => {\n *   console.log('change triggered')\n * })\n * // Each change on the map type triggers a log message:\n * map.set('a', 0) // => \"change triggered\"\n * map.set('b', 0) // => \"change triggered\"\n * // When put in a transaction, it will trigger the log after the transaction:\n * y.transact(() => {\n *   map.set('a', 1)\n *   map.set('b', 1)\n * }) // => \"change triggered\"\n *\n * @public\n */\nexport class Transaction {\n  /**\n   * @param {Doc} doc\n   * @param {any} origin\n   * @param {boolean} local\n   */\n  constructor (doc, origin, local) {\n    /**\n     * The Yjs instance.\n     * @type {Doc}\n     */\n    this.doc = doc\n    /**\n     * Describes the set of deleted items by ids\n     * @type {DeleteSet}\n     */\n    this.deleteSet = new DeleteSet()\n    /**\n     * Holds the state before the transaction started.\n     * @type {Map<Number,Number>}\n     */\n    this.beforeState = getStateVector(doc.store)\n    /**\n     * Holds the state after the transaction.\n     * @type {Map<Number,Number>}\n     */\n    this.afterState = new Map()\n    /**\n     * All types that were directly modified (property added or child\n     * inserted/deleted). New types are not included in this Set.\n     * Maps from type to parentSubs (`item.parentSub = null` for YArray)\n     * @type {Map<AbstractType<YEvent<any>>,Set<String|null>>}\n     */\n    this.changed = new Map()\n    /**\n     * Stores the events for the types that observe also child elements.\n     * It is mainly used by `observeDeep`.\n     * @type {Map<AbstractType<YEvent<any>>,Array<YEvent<any>>>}\n     */\n    this.changedParentTypes = new Map()\n    /**\n     * @type {Array<AbstractStruct>}\n     */\n    this._mergeStructs = []\n    /**\n     * @type {any}\n     */\n    this.origin = origin\n    /**\n     * Stores meta information on the transaction\n     * @type {Map<any,any>}\n     */\n    this.meta = new Map()\n    /**\n     * Whether this change originates from this doc.\n     * @type {boolean}\n     */\n    this.local = local\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocsAdded = new Set()\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocsRemoved = new Set()\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocsLoaded = new Set()\n    /**\n     * @type {boolean}\n     */\n    this._needFormattingCleanup = false\n  }\n}\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Transaction} transaction\n * @return {boolean} Whether data was written.\n */\nexport const writeUpdateMessageFromTransaction = (encoder, transaction) => {\n  if (transaction.deleteSet.clients.size === 0 && !map.any(transaction.afterState, (clock, client) => transaction.beforeState.get(client) !== clock)) {\n    return false\n  }\n  sortAndMergeDeleteSet(transaction.deleteSet)\n  writeStructsFromTransaction(encoder, transaction)\n  writeDeleteSet(encoder, transaction.deleteSet)\n  return true\n}\n\n/**\n * @param {Transaction} transaction\n *\n * @private\n * @function\n */\nexport const nextID = transaction => {\n  const y = transaction.doc\n  return createID(y.clientID, getState(y.store, y.clientID))\n}\n\n/**\n * If `type.parent` was added in current transaction, `type` technically\n * did not change, it was just added and we should not fire events for `type`.\n *\n * @param {Transaction} transaction\n * @param {AbstractType<YEvent<any>>} type\n * @param {string|null} parentSub\n */\nexport const addChangedTypeToTransaction = (transaction, type, parentSub) => {\n  const item = type._item\n  if (item === null || (item.id.clock < (transaction.beforeState.get(item.id.client) || 0) && !item.deleted)) {\n    map.setIfUndefined(transaction.changed, type, set.create).add(parentSub)\n  }\n}\n\n/**\n * @param {Array<AbstractStruct>} structs\n * @param {number} pos\n * @return {number} # of merged structs\n */\nconst tryToMergeWithLefts = (structs, pos) => {\n  let right = structs[pos]\n  let left = structs[pos - 1]\n  let i = pos\n  for (; i > 0; right = left, left = structs[--i - 1]) {\n    if (left.deleted === right.deleted && left.constructor === right.constructor) {\n      if (left.mergeWith(right)) {\n        if (right instanceof Item && right.parentSub !== null && /** @type {AbstractType<any>} */ (right.parent)._map.get(right.parentSub) === right) {\n          /** @type {AbstractType<any>} */ (right.parent)._map.set(right.parentSub, /** @type {Item} */ (left))\n        }\n        continue\n      }\n    }\n    break\n  }\n  const merged = pos - i\n  if (merged) {\n    // remove all merged structs from the array\n    structs.splice(pos + 1 - merged, merged)\n  }\n  return merged\n}\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n * @param {function(Item):boolean} gcFilter\n */\nconst tryGcDeleteSet = (ds, store, gcFilter) => {\n  for (const [client, deleteItems] of ds.clients.entries()) {\n    const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client))\n    for (let di = deleteItems.length - 1; di >= 0; di--) {\n      const deleteItem = deleteItems[di]\n      const endDeleteItemClock = deleteItem.clock + deleteItem.len\n      for (\n        let si = findIndexSS(structs, deleteItem.clock), struct = structs[si];\n        si < structs.length && struct.id.clock < endDeleteItemClock;\n        struct = structs[++si]\n      ) {\n        const struct = structs[si]\n        if (deleteItem.clock + deleteItem.len <= struct.id.clock) {\n          break\n        }\n        if (struct instanceof Item && struct.deleted && !struct.keep && gcFilter(struct)) {\n          struct.gc(store, false)\n        }\n      }\n    }\n  }\n}\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n */\nconst tryMergeDeleteSet = (ds, store) => {\n  // try to merge deleted / gc'd items\n  // merge from right to left for better efficiecy and so we don't miss any merge targets\n  ds.clients.forEach((deleteItems, client) => {\n    const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client))\n    for (let di = deleteItems.length - 1; di >= 0; di--) {\n      const deleteItem = deleteItems[di]\n      // start with merging the item next to the last deleted item\n      const mostRightIndexToCheck = math.min(structs.length - 1, 1 + findIndexSS(structs, deleteItem.clock + deleteItem.len - 1))\n      for (\n        let si = mostRightIndexToCheck, struct = structs[si];\n        si > 0 && struct.id.clock >= deleteItem.clock;\n        struct = structs[si]\n      ) {\n        si -= 1 + tryToMergeWithLefts(structs, si)\n      }\n    }\n  })\n}\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n * @param {function(Item):boolean} gcFilter\n */\nexport const tryGc = (ds, store, gcFilter) => {\n  tryGcDeleteSet(ds, store, gcFilter)\n  tryMergeDeleteSet(ds, store)\n}\n\n/**\n * @param {Array<Transaction>} transactionCleanups\n * @param {number} i\n */\nconst cleanupTransactions = (transactionCleanups, i) => {\n  if (i < transactionCleanups.length) {\n    const transaction = transactionCleanups[i]\n    const doc = transaction.doc\n    const store = doc.store\n    const ds = transaction.deleteSet\n    const mergeStructs = transaction._mergeStructs\n    try {\n      sortAndMergeDeleteSet(ds)\n      transaction.afterState = getStateVector(transaction.doc.store)\n      doc.emit('beforeObserverCalls', [transaction, doc])\n      /**\n       * An array of event callbacks.\n       *\n       * Each callback is called even if the other ones throw errors.\n       *\n       * @type {Array<function():void>}\n       */\n      const fs = []\n      // observe events on changed types\n      transaction.changed.forEach((subs, itemtype) =>\n        fs.push(() => {\n          if (itemtype._item === null || !itemtype._item.deleted) {\n            itemtype._callObserver(transaction, subs)\n          }\n        })\n      )\n      fs.push(() => {\n        // deep observe events\n        transaction.changedParentTypes.forEach((events, type) => {\n          // We need to think about the possibility that the user transforms the\n          // Y.Doc in the event.\n          if (type._dEH.l.length > 0 && (type._item === null || !type._item.deleted)) {\n            events = events\n              .filter(event =>\n                event.target._item === null || !event.target._item.deleted\n              )\n            events\n              .forEach(event => {\n                event.currentTarget = type\n                // path is relative to the current target\n                event._path = null\n              })\n            // sort events by path length so that top-level events are fired first.\n            events\n              .sort((event1, event2) => event1.path.length - event2.path.length)\n            // We don't need to check for events.length\n            // because we know it has at least one element\n            callEventHandlerListeners(type._dEH, events, transaction)\n          }\n        })\n      })\n      fs.push(() => doc.emit('afterTransaction', [transaction, doc]))\n      callAll(fs, [])\n      if (transaction._needFormattingCleanup) {\n        cleanupYTextAfterTransaction(transaction)\n      }\n    } finally {\n      // Replace deleted items with ItemDeleted / GC.\n      // This is where content is actually remove from the Yjs Doc.\n      if (doc.gc) {\n        tryGcDeleteSet(ds, store, doc.gcFilter)\n      }\n      tryMergeDeleteSet(ds, store)\n\n      // on all affected store.clients props, try to merge\n      transaction.afterState.forEach((clock, client) => {\n        const beforeClock = transaction.beforeState.get(client) || 0\n        if (beforeClock !== clock) {\n          const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client))\n          // we iterate from right to left so we can safely remove entries\n          const firstChangePos = math.max(findIndexSS(structs, beforeClock), 1)\n          for (let i = structs.length - 1; i >= firstChangePos;) {\n            i -= 1 + tryToMergeWithLefts(structs, i)\n          }\n        }\n      })\n      // try to merge mergeStructs\n      // @todo: it makes more sense to transform mergeStructs to a DS, sort it, and merge from right to left\n      //        but at the moment DS does not handle duplicates\n      for (let i = mergeStructs.length - 1; i >= 0; i--) {\n        const { client, clock } = mergeStructs[i].id\n        const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client))\n        const replacedStructPos = findIndexSS(structs, clock)\n        if (replacedStructPos + 1 < structs.length) {\n          if (tryToMergeWithLefts(structs, replacedStructPos + 1) > 1) {\n            continue // no need to perform next check, both are already merged\n          }\n        }\n        if (replacedStructPos > 0) {\n          tryToMergeWithLefts(structs, replacedStructPos)\n        }\n      }\n      if (!transaction.local && transaction.afterState.get(doc.clientID) !== transaction.beforeState.get(doc.clientID)) {\n        logging.print(logging.ORANGE, logging.BOLD, '[yjs] ', logging.UNBOLD, logging.RED, 'Changed the client-id because another client seems to be using it.')\n        doc.clientID = generateNewClientId()\n      }\n      // @todo Merge all the transactions into one and provide send the data as a single update message\n      doc.emit('afterTransactionCleanup', [transaction, doc])\n      if (doc._observers.has('update')) {\n        const encoder = new UpdateEncoderV1()\n        const hasContent = writeUpdateMessageFromTransaction(encoder, transaction)\n        if (hasContent) {\n          doc.emit('update', [encoder.toUint8Array(), transaction.origin, doc, transaction])\n        }\n      }\n      if (doc._observers.has('updateV2')) {\n        const encoder = new UpdateEncoderV2()\n        const hasContent = writeUpdateMessageFromTransaction(encoder, transaction)\n        if (hasContent) {\n          doc.emit('updateV2', [encoder.toUint8Array(), transaction.origin, doc, transaction])\n        }\n      }\n      const { subdocsAdded, subdocsLoaded, subdocsRemoved } = transaction\n      if (subdocsAdded.size > 0 || subdocsRemoved.size > 0 || subdocsLoaded.size > 0) {\n        subdocsAdded.forEach(subdoc => {\n          subdoc.clientID = doc.clientID\n          if (subdoc.collectionid == null) {\n            subdoc.collectionid = doc.collectionid\n          }\n          doc.subdocs.add(subdoc)\n        })\n        subdocsRemoved.forEach(subdoc => doc.subdocs.delete(subdoc))\n        doc.emit('subdocs', [{ loaded: subdocsLoaded, added: subdocsAdded, removed: subdocsRemoved }, doc, transaction])\n        subdocsRemoved.forEach(subdoc => subdoc.destroy())\n      }\n\n      if (transactionCleanups.length <= i + 1) {\n        doc._transactionCleanups = []\n        doc.emit('afterAllTransactions', [doc, transactionCleanups])\n      } else {\n        cleanupTransactions(transactionCleanups, i + 1)\n      }\n    }\n  }\n}\n\n/**\n * Implements the functionality of `y.transact(()=>{..})`\n *\n * @template T\n * @param {Doc} doc\n * @param {function(Transaction):T} f\n * @param {any} [origin=true]\n * @return {T}\n *\n * @function\n */\nexport const transact = (doc, f, origin = null, local = true) => {\n  const transactionCleanups = doc._transactionCleanups\n  let initialCall = false\n  /**\n   * @type {any}\n   */\n  let result = null\n  if (doc._transaction === null) {\n    initialCall = true\n    doc._transaction = new Transaction(doc, origin, local)\n    transactionCleanups.push(doc._transaction)\n    if (transactionCleanups.length === 1) {\n      doc.emit('beforeAllTransactions', [doc])\n    }\n    doc.emit('beforeTransaction', [doc._transaction, doc])\n  }\n  try {\n    result = f(doc._transaction)\n  } finally {\n    if (initialCall) {\n      const finishCleanup = doc._transaction === transactionCleanups[0]\n      doc._transaction = null\n      if (finishCleanup) {\n        // The first transaction ended, now process observer calls.\n        // Observer call may create new transactions for which we need to call the observers and do cleanup.\n        // We don't want to nest these calls, so we execute these calls one after\n        // another.\n        // Also we need to ensure that all cleanups are called, even if the\n        // observes throw errors.\n        // This file is full of hacky try {} finally {} blocks to ensure that an\n        // event can throw errors and also that the cleanup is called.\n        cleanupTransactions(transactionCleanups, 0)\n      }\n    }\n  }\n  return result\n}\n", "import {\n  mergeDeleteSets,\n  iterateDeletedStructs,\n  keepItem,\n  transact,\n  createID,\n  redoItem,\n  isParentOf,\n  followRedone,\n  getItemCleanStart,\n  isDeleted,\n  addToDeleteSet,\n  Transaction, Doc, Item, GC, DeleteSet, AbstractType // eslint-disable-line\n} from '../internals.js'\n\nimport * as time from 'lib0/time'\nimport * as array from 'lib0/array'\nimport { Observable } from 'lib0/observable'\n\nexport class StackItem {\n  /**\n   * @param {DeleteSet} deletions\n   * @param {DeleteSet} insertions\n   */\n  constructor (deletions, insertions) {\n    this.insertions = insertions\n    this.deletions = deletions\n    /**\n     * Use this to save and restore metadata like selection range\n     */\n    this.meta = new Map()\n  }\n}\n/**\n * @param {Transaction} tr\n * @param {UndoManager} um\n * @param {StackItem} stackItem\n */\nconst clearUndoManagerStackItem = (tr, um, stackItem) => {\n  iterateDeletedStructs(tr, stackItem.deletions, item => {\n    if (item instanceof Item && um.scope.some(type => isParentOf(type, item))) {\n      keepItem(item, false)\n    }\n  })\n}\n\n/**\n * @param {UndoManager} undoManager\n * @param {Array<StackItem>} stack\n * @param {string} eventType\n * @return {StackItem?}\n */\nconst popStackItem = (undoManager, stack, eventType) => {\n  /**\n   * Whether a change happened\n   * @type {StackItem?}\n   */\n  let result = null\n  /**\n   * Keep a reference to the transaction so we can fire the event with the changedParentTypes\n   * @type {any}\n   */\n  let _tr = null\n  const doc = undoManager.doc\n  const scope = undoManager.scope\n  transact(doc, transaction => {\n    while (stack.length > 0 && result === null) {\n      const store = doc.store\n      const stackItem = /** @type {StackItem} */ (stack.pop())\n      /**\n       * @type {Set<Item>}\n       */\n      const itemsToRedo = new Set()\n      /**\n       * @type {Array<Item>}\n       */\n      const itemsToDelete = []\n      let performedChange = false\n      iterateDeletedStructs(transaction, stackItem.insertions, struct => {\n        if (struct instanceof Item) {\n          if (struct.redone !== null) {\n            let { item, diff } = followRedone(store, struct.id)\n            if (diff > 0) {\n              item = getItemCleanStart(transaction, createID(item.id.client, item.id.clock + diff))\n            }\n            struct = item\n          }\n          if (!struct.deleted && scope.some(type => isParentOf(type, /** @type {Item} */ (struct)))) {\n            itemsToDelete.push(struct)\n          }\n        }\n      })\n      iterateDeletedStructs(transaction, stackItem.deletions, struct => {\n        if (\n          struct instanceof Item &&\n          scope.some(type => isParentOf(type, struct)) &&\n          // Never redo structs in stackItem.insertions because they were created and deleted in the same capture interval.\n          !isDeleted(stackItem.insertions, struct.id)\n        ) {\n          itemsToRedo.add(struct)\n        }\n      })\n      itemsToRedo.forEach(struct => {\n        performedChange = redoItem(transaction, struct, itemsToRedo, stackItem.insertions, undoManager.ignoreRemoteMapChanges, undoManager) !== null || performedChange\n      })\n      // We want to delete in reverse order so that children are deleted before\n      // parents, so we have more information available when items are filtered.\n      for (let i = itemsToDelete.length - 1; i >= 0; i--) {\n        const item = itemsToDelete[i]\n        if (undoManager.deleteFilter(item)) {\n          item.delete(transaction)\n          performedChange = true\n        }\n      }\n      result = performedChange ? stackItem : null\n    }\n    transaction.changed.forEach((subProps, type) => {\n      // destroy search marker if necessary\n      if (subProps.has(null) && type._searchMarker) {\n        type._searchMarker.length = 0\n      }\n    })\n    _tr = transaction\n  }, undoManager)\n  if (result != null) {\n    const changedParentTypes = _tr.changedParentTypes\n    undoManager.emit('stack-item-popped', [{ stackItem: result, type: eventType, changedParentTypes }, undoManager])\n  }\n  return result\n}\n\n/**\n * @typedef {Object} UndoManagerOptions\n * @property {number} [UndoManagerOptions.captureTimeout=500]\n * @property {function(Transaction):boolean} [UndoManagerOptions.captureTransaction] Do not capture changes of a Transaction if result false.\n * @property {function(Item):boolean} [UndoManagerOptions.deleteFilter=()=>true] Sometimes\n * it is necessary to filter what an Undo/Redo operation can delete. If this\n * filter returns false, the type/item won't be deleted even it is in the\n * undo/redo scope.\n * @property {Set<any>} [UndoManagerOptions.trackedOrigins=new Set([null])]\n * @property {boolean} [ignoreRemoteMapChanges] Experimental. By default, the UndoManager will never overwrite remote changes. Enable this property to enable overwriting remote changes on key-value changes (Y.Map, properties on Y.Xml, etc..).\n * @property {Doc} [doc] The document that this UndoManager operates on. Only needed if typeScope is empty.\n */\n\n/**\n * Fires 'stack-item-added' event when a stack item was added to either the undo- or\n * the redo-stack. You may store additional stack information via the\n * metadata property on `event.stackItem.meta` (it is a `Map` of metadata properties).\n * Fires 'stack-item-popped' event when a stack item was popped from either the\n * undo- or the redo-stack. You may restore the saved stack information from `event.stackItem.meta`.\n *\n * @extends {Observable<'stack-item-added'|'stack-item-popped'|'stack-cleared'|'stack-item-updated'>}\n */\nexport class UndoManager extends Observable {\n  /**\n   * @param {AbstractType<any>|Array<AbstractType<any>>} typeScope Accepts either a single type, or an array of types\n   * @param {UndoManagerOptions} options\n   */\n  constructor (typeScope, {\n    captureTimeout = 500,\n    captureTransaction = _tr => true,\n    deleteFilter = () => true,\n    trackedOrigins = new Set([null]),\n    ignoreRemoteMapChanges = false,\n    doc = /** @type {Doc} */ (array.isArray(typeScope) ? typeScope[0].doc : typeScope.doc)\n  } = {}) {\n    super()\n    /**\n     * @type {Array<AbstractType<any>>}\n     */\n    this.scope = []\n    this.addToScope(typeScope)\n    this.deleteFilter = deleteFilter\n    trackedOrigins.add(this)\n    this.trackedOrigins = trackedOrigins\n    this.captureTransaction = captureTransaction\n    /**\n     * @type {Array<StackItem>}\n     */\n    this.undoStack = []\n    /**\n     * @type {Array<StackItem>}\n     */\n    this.redoStack = []\n    /**\n     * Whether the client is currently undoing (calling UndoManager.undo)\n     *\n     * @type {boolean}\n     */\n    this.undoing = false\n    this.redoing = false\n    this.doc = doc\n    this.lastChange = 0\n    this.ignoreRemoteMapChanges = ignoreRemoteMapChanges\n    this.captureTimeout = captureTimeout\n    /**\n     * @param {Transaction} transaction\n     */\n    this.afterTransactionHandler = transaction => {\n      // Only track certain transactions\n      if (\n        !this.captureTransaction(transaction) ||\n        !this.scope.some(type => transaction.changedParentTypes.has(type)) ||\n        (!this.trackedOrigins.has(transaction.origin) && (!transaction.origin || !this.trackedOrigins.has(transaction.origin.constructor)))\n      ) {\n        return\n      }\n      const undoing = this.undoing\n      const redoing = this.redoing\n      const stack = undoing ? this.redoStack : this.undoStack\n      if (undoing) {\n        this.stopCapturing() // next undo should not be appended to last stack item\n      } else if (!redoing) {\n        // neither undoing nor redoing: delete redoStack\n        this.clear(false, true)\n      }\n      const insertions = new DeleteSet()\n      transaction.afterState.forEach((endClock, client) => {\n        const startClock = transaction.beforeState.get(client) || 0\n        const len = endClock - startClock\n        if (len > 0) {\n          addToDeleteSet(insertions, client, startClock, len)\n        }\n      })\n      const now = time.getUnixTime()\n      let didAdd = false\n      if (this.lastChange > 0 && now - this.lastChange < this.captureTimeout && stack.length > 0 && !undoing && !redoing) {\n        // append change to last stack op\n        const lastOp = stack[stack.length - 1]\n        lastOp.deletions = mergeDeleteSets([lastOp.deletions, transaction.deleteSet])\n        lastOp.insertions = mergeDeleteSets([lastOp.insertions, insertions])\n      } else {\n        // create a new stack op\n        stack.push(new StackItem(transaction.deleteSet, insertions))\n        didAdd = true\n      }\n      if (!undoing && !redoing) {\n        this.lastChange = now\n      }\n      // make sure that deleted structs are not gc'd\n      iterateDeletedStructs(transaction, transaction.deleteSet, /** @param {Item|GC} item */ item => {\n        if (item instanceof Item && this.scope.some(type => isParentOf(type, item))) {\n          keepItem(item, true)\n        }\n      })\n      const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? 'redo' : 'undo', changedParentTypes: transaction.changedParentTypes }, this]\n      if (didAdd) {\n        this.emit('stack-item-added', changeEvent)\n      } else {\n        this.emit('stack-item-updated', changeEvent)\n      }\n    }\n    this.doc.on('afterTransaction', this.afterTransactionHandler)\n    this.doc.on('destroy', () => {\n      this.destroy()\n    })\n  }\n\n  /**\n   * @param {Array<AbstractType<any>> | AbstractType<any>} ytypes\n   */\n  addToScope (ytypes) {\n    ytypes = array.isArray(ytypes) ? ytypes : [ytypes]\n    ytypes.forEach(ytype => {\n      if (this.scope.every(yt => yt !== ytype)) {\n        this.scope.push(ytype)\n      }\n    })\n  }\n\n  /**\n   * @param {any} origin\n   */\n  addTrackedOrigin (origin) {\n    this.trackedOrigins.add(origin)\n  }\n\n  /**\n   * @param {any} origin\n   */\n  removeTrackedOrigin (origin) {\n    this.trackedOrigins.delete(origin)\n  }\n\n  clear (clearUndoStack = true, clearRedoStack = true) {\n    if ((clearUndoStack && this.canUndo()) || (clearRedoStack && this.canRedo())) {\n      this.doc.transact(tr => {\n        if (clearUndoStack) {\n          this.undoStack.forEach(item => clearUndoManagerStackItem(tr, this, item))\n          this.undoStack = []\n        }\n        if (clearRedoStack) {\n          this.redoStack.forEach(item => clearUndoManagerStackItem(tr, this, item))\n          this.redoStack = []\n        }\n        this.emit('stack-cleared', [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }])\n      })\n    }\n  }\n\n  /**\n   * UndoManager merges Undo-StackItem if they are created within time-gap\n   * smaller than `options.captureTimeout`. Call `um.stopCapturing()` so that the next\n   * StackItem won't be merged.\n   *\n   *\n   * @example\n   *     // without stopCapturing\n   *     ytext.insert(0, 'a')\n   *     ytext.insert(1, 'b')\n   *     um.undo()\n   *     ytext.toString() // => '' (note that 'ab' was removed)\n   *     // with stopCapturing\n   *     ytext.insert(0, 'a')\n   *     um.stopCapturing()\n   *     ytext.insert(0, 'b')\n   *     um.undo()\n   *     ytext.toString() // => 'a' (note that only 'b' was removed)\n   *\n   */\n  stopCapturing () {\n    this.lastChange = 0\n  }\n\n  /**\n   * Undo last changes on type.\n   *\n   * @return {StackItem?} Returns StackItem if a change was applied\n   */\n  undo () {\n    this.undoing = true\n    let res\n    try {\n      res = popStackItem(this, this.undoStack, 'undo')\n    } finally {\n      this.undoing = false\n    }\n    return res\n  }\n\n  /**\n   * Redo last undo operation.\n   *\n   * @return {StackItem?} Returns StackItem if a change was applied\n   */\n  redo () {\n    this.redoing = true\n    let res\n    try {\n      res = popStackItem(this, this.redoStack, 'redo')\n    } finally {\n      this.redoing = false\n    }\n    return res\n  }\n\n  /**\n   * Are undo steps available?\n   *\n   * @return {boolean} `true` if undo is possible\n   */\n  canUndo () {\n    return this.undoStack.length > 0\n  }\n\n  /**\n   * Are redo steps available?\n   *\n   * @return {boolean} `true` if redo is possible\n   */\n  canRedo () {\n    return this.redoStack.length > 0\n  }\n\n  destroy () {\n    this.trackedOrigins.delete(this)\n    this.doc.off('afterTransaction', this.afterTransactionHandler)\n    super.destroy()\n  }\n}\n", "\nimport * as binary from 'lib0/binary'\nimport * as decoding from 'lib0/decoding'\nimport * as encoding from 'lib0/encoding'\nimport * as error from 'lib0/error'\nimport * as f from 'lib0/function'\nimport * as logging from 'lib0/logging'\nimport * as map from 'lib0/map'\nimport * as math from 'lib0/math'\nimport * as string from 'lib0/string'\n\nimport {\n  ContentAny,\n  ContentBinary,\n  ContentDeleted,\n  ContentDoc,\n  ContentEmbed,\n  ContentFormat,\n  ContentJSON,\n  ContentString,\n  ContentType,\n  createID,\n  decodeStateVector,\n  DSEncoderV1,\n  DSEncoderV2,\n  GC,\n  Item,\n  mergeDeleteSets,\n  readDeleteSet,\n  readItemContent,\n  Skip,\n  UpdateDecoderV1,\n  UpdateDecoderV2,\n  UpdateEncoderV1,\n  UpdateEncoderV2,\n  writeDeleteSet,\n  YXmlElement,\n  YXmlHook\n} from '../internals.js'\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n */\nfunction * lazyStructReaderGenerator (decoder) {\n  const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder)\n  for (let i = 0; i < numOfStateUpdates; i++) {\n    const numberOfStructs = decoding.readVarUint(decoder.restDecoder)\n    const client = decoder.readClient()\n    let clock = decoding.readVarUint(decoder.restDecoder)\n    for (let i = 0; i < numberOfStructs; i++) {\n      const info = decoder.readInfo()\n      // @todo use switch instead of ifs\n      if (info === 10) {\n        const len = decoding.readVarUint(decoder.restDecoder)\n        yield new Skip(createID(client, clock), len)\n        clock += len\n      } else if ((binary.BITS5 & info) !== 0) {\n        const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0\n        // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n        // and we read the next string as parentYKey.\n        // It indicates how we store/retrieve parent from `y.share`\n        // @type {string|null}\n        const struct = new Item(\n          createID(client, clock),\n          null, // left\n          (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null, // origin\n          null, // right\n          (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null, // right origin\n          // @ts-ignore Force writing a string here.\n          cantCopyParentInfo ? (decoder.readParentInfo() ? decoder.readString() : decoder.readLeftID()) : null, // parent\n          cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n          readItemContent(decoder, info) // item content\n        )\n        yield struct\n        clock += struct.length\n      } else {\n        const len = decoder.readLen()\n        yield new GC(createID(client, clock), len)\n        clock += len\n      }\n    }\n  }\n}\n\nexport class LazyStructReader {\n  /**\n   * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n   * @param {boolean} filterSkips\n   */\n  constructor (decoder, filterSkips) {\n    this.gen = lazyStructReaderGenerator(decoder)\n    /**\n     * @type {null | Item | Skip | GC}\n     */\n    this.curr = null\n    this.done = false\n    this.filterSkips = filterSkips\n    this.next()\n  }\n\n  /**\n   * @return {Item | GC | Skip |null}\n   */\n  next () {\n    // ignore \"Skip\" structs\n    do {\n      this.curr = this.gen.next().value || null\n    } while (this.filterSkips && this.curr !== null && this.curr.constructor === Skip)\n    return this.curr\n  }\n}\n\n/**\n * @param {Uint8Array} update\n *\n */\nexport const logUpdate = update => logUpdateV2(update, UpdateDecoderV1)\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n *\n */\nexport const logUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {\n  const structs = []\n  const updateDecoder = new YDecoder(decoding.createDecoder(update))\n  const lazyDecoder = new LazyStructReader(updateDecoder, false)\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    structs.push(curr)\n  }\n  logging.print('Structs: ', structs)\n  const ds = readDeleteSet(updateDecoder)\n  logging.print('DeleteSet: ', ds)\n}\n\n/**\n * @param {Uint8Array} update\n *\n */\nexport const decodeUpdate = (update) => decodeUpdateV2(update, UpdateDecoderV1)\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n *\n */\nexport const decodeUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {\n  const structs = []\n  const updateDecoder = new YDecoder(decoding.createDecoder(update))\n  const lazyDecoder = new LazyStructReader(updateDecoder, false)\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    structs.push(curr)\n  }\n  return {\n    structs,\n    ds: readDeleteSet(updateDecoder)\n  }\n}\n\nexport class LazyStructWriter {\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  constructor (encoder) {\n    this.currClient = 0\n    this.startClock = 0\n    this.written = 0\n    this.encoder = encoder\n    /**\n     * We want to write operations lazily, but also we need to know beforehand how many operations we want to write for each client.\n     *\n     * This kind of meta-information (#clients, #structs-per-client-written) is written to the restEncoder.\n     *\n     * We fragment the restEncoder and store a slice of it per-client until we know how many clients there are.\n     * When we flush (toUint8Array) we write the restEncoder using the fragments and the meta-information.\n     *\n     * @type {Array<{ written: number, restEncoder: Uint8Array }>}\n     */\n    this.clientStructs = []\n  }\n}\n\n/**\n * @param {Array<Uint8Array>} updates\n * @return {Uint8Array}\n */\nexport const mergeUpdates = updates => mergeUpdatesV2(updates, UpdateDecoderV1, UpdateEncoderV1)\n\n/**\n * @param {Uint8Array} update\n * @param {typeof DSEncoderV1 | typeof DSEncoderV2} YEncoder\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} YDecoder\n * @return {Uint8Array}\n */\nexport const encodeStateVectorFromUpdateV2 = (update, YEncoder = DSEncoderV2, YDecoder = UpdateDecoderV2) => {\n  const encoder = new YEncoder()\n  const updateDecoder = new LazyStructReader(new YDecoder(decoding.createDecoder(update)), false)\n  let curr = updateDecoder.curr\n  if (curr !== null) {\n    let size = 0\n    let currClient = curr.id.client\n    let stopCounting = curr.id.clock !== 0 // must start at 0\n    let currClock = stopCounting ? 0 : curr.id.clock + curr.length\n    for (; curr !== null; curr = updateDecoder.next()) {\n      if (currClient !== curr.id.client) {\n        if (currClock !== 0) {\n          size++\n          // We found a new client\n          // write what we have to the encoder\n          encoding.writeVarUint(encoder.restEncoder, currClient)\n          encoding.writeVarUint(encoder.restEncoder, currClock)\n        }\n        currClient = curr.id.client\n        currClock = 0\n        stopCounting = curr.id.clock !== 0\n      }\n      // we ignore skips\n      if (curr.constructor === Skip) {\n        stopCounting = true\n      }\n      if (!stopCounting) {\n        currClock = curr.id.clock + curr.length\n      }\n    }\n    // write what we have\n    if (currClock !== 0) {\n      size++\n      encoding.writeVarUint(encoder.restEncoder, currClient)\n      encoding.writeVarUint(encoder.restEncoder, currClock)\n    }\n    // prepend the size of the state vector\n    const enc = encoding.createEncoder()\n    encoding.writeVarUint(enc, size)\n    encoding.writeBinaryEncoder(enc, encoder.restEncoder)\n    encoder.restEncoder = enc\n    return encoder.toUint8Array()\n  } else {\n    encoding.writeVarUint(encoder.restEncoder, 0)\n    return encoder.toUint8Array()\n  }\n}\n\n/**\n * @param {Uint8Array} update\n * @return {Uint8Array}\n */\nexport const encodeStateVectorFromUpdate = update => encodeStateVectorFromUpdateV2(update, DSEncoderV1, UpdateDecoderV1)\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} YDecoder\n * @return {{ from: Map<number,number>, to: Map<number,number> }}\n */\nexport const parseUpdateMetaV2 = (update, YDecoder = UpdateDecoderV2) => {\n  /**\n   * @type {Map<number, number>}\n   */\n  const from = new Map()\n  /**\n   * @type {Map<number, number>}\n   */\n  const to = new Map()\n  const updateDecoder = new LazyStructReader(new YDecoder(decoding.createDecoder(update)), false)\n  let curr = updateDecoder.curr\n  if (curr !== null) {\n    let currClient = curr.id.client\n    let currClock = curr.id.clock\n    // write the beginning to `from`\n    from.set(currClient, currClock)\n    for (; curr !== null; curr = updateDecoder.next()) {\n      if (currClient !== curr.id.client) {\n        // We found a new client\n        // write the end to `to`\n        to.set(currClient, currClock)\n        // write the beginning to `from`\n        from.set(curr.id.client, curr.id.clock)\n        // update currClient\n        currClient = curr.id.client\n      }\n      currClock = curr.id.clock + curr.length\n    }\n    // write the end to `to`\n    to.set(currClient, currClock)\n  }\n  return { from, to }\n}\n\n/**\n * @param {Uint8Array} update\n * @return {{ from: Map<number,number>, to: Map<number,number> }}\n */\nexport const parseUpdateMeta = update => parseUpdateMetaV2(update, UpdateDecoderV1)\n\n/**\n * This method is intended to slice any kind of struct and retrieve the right part.\n * It does not handle side-effects, so it should only be used by the lazy-encoder.\n *\n * @param {Item | GC | Skip} left\n * @param {number} diff\n * @return {Item | GC}\n */\nconst sliceStruct = (left, diff) => {\n  if (left.constructor === GC) {\n    const { client, clock } = left.id\n    return new GC(createID(client, clock + diff), left.length - diff)\n  } else if (left.constructor === Skip) {\n    const { client, clock } = left.id\n    return new Skip(createID(client, clock + diff), left.length - diff)\n  } else {\n    const leftItem = /** @type {Item} */ (left)\n    const { client, clock } = leftItem.id\n    return new Item(\n      createID(client, clock + diff),\n      null,\n      createID(client, clock + diff - 1),\n      null,\n      leftItem.rightOrigin,\n      leftItem.parent,\n      leftItem.parentSub,\n      leftItem.content.splice(diff)\n    )\n  }\n}\n\n/**\n *\n * This function works similarly to `readUpdateV2`.\n *\n * @param {Array<Uint8Array>} updates\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} [YEncoder]\n * @return {Uint8Array}\n */\nexport const mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {\n  if (updates.length === 1) {\n    return updates[0]\n  }\n  const updateDecoders = updates.map(update => new YDecoder(decoding.createDecoder(update)))\n  let lazyStructDecoders = updateDecoders.map(decoder => new LazyStructReader(decoder, true))\n\n  /**\n   * @todo we don't need offset because we always slice before\n   * @type {null | { struct: Item | GC | Skip, offset: number }}\n   */\n  let currWrite = null\n\n  const updateEncoder = new YEncoder()\n  // write structs lazily\n  const lazyStructEncoder = new LazyStructWriter(updateEncoder)\n\n  // Note: We need to ensure that all lazyStructDecoders are fully consumed\n  // Note: Should merge document updates whenever possible - even from different updates\n  // Note: Should handle that some operations cannot be applied yet ()\n\n  while (true) {\n    // Write higher clients first ⇒ sort by clientID & clock and remove decoders without content\n    lazyStructDecoders = lazyStructDecoders.filter(dec => dec.curr !== null)\n    lazyStructDecoders.sort(\n      /** @type {function(any,any):number} */ (dec1, dec2) => {\n        if (dec1.curr.id.client === dec2.curr.id.client) {\n          const clockDiff = dec1.curr.id.clock - dec2.curr.id.clock\n          if (clockDiff === 0) {\n            // @todo remove references to skip since the structDecoders must filter Skips.\n            return dec1.curr.constructor === dec2.curr.constructor\n              ? 0\n              : dec1.curr.constructor === Skip ? 1 : -1 // we are filtering skips anyway.\n          } else {\n            return clockDiff\n          }\n        } else {\n          return dec2.curr.id.client - dec1.curr.id.client\n        }\n      }\n    )\n    if (lazyStructDecoders.length === 0) {\n      break\n    }\n    const currDecoder = lazyStructDecoders[0]\n    // write from currDecoder until the next operation is from another client or if filler-struct\n    // then we need to reorder the decoders and find the next operation to write\n    const firstClient = /** @type {Item | GC} */ (currDecoder.curr).id.client\n\n    if (currWrite !== null) {\n      let curr = /** @type {Item | GC | null} */ (currDecoder.curr)\n      let iterated = false\n\n      // iterate until we find something that we haven't written already\n      // remember: first the high client-ids are written\n      while (curr !== null && curr.id.clock + curr.length <= currWrite.struct.id.clock + currWrite.struct.length && curr.id.client >= currWrite.struct.id.client) {\n        curr = currDecoder.next()\n        iterated = true\n      }\n      if (\n        curr === null || // current decoder is empty\n        curr.id.client !== firstClient || // check whether there is another decoder that has has updates from `firstClient`\n        (iterated && curr.id.clock > currWrite.struct.id.clock + currWrite.struct.length) // the above while loop was used and we are potentially missing updates\n      ) {\n        continue\n      }\n\n      if (firstClient !== currWrite.struct.id.client) {\n        writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset)\n        currWrite = { struct: curr, offset: 0 }\n        currDecoder.next()\n      } else {\n        if (currWrite.struct.id.clock + currWrite.struct.length < curr.id.clock) {\n          // @todo write currStruct & set currStruct = Skip(clock = currStruct.id.clock + currStruct.length, length = curr.id.clock - self.clock)\n          if (currWrite.struct.constructor === Skip) {\n            // extend existing skip\n            currWrite.struct.length = curr.id.clock + curr.length - currWrite.struct.id.clock\n          } else {\n            writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset)\n            const diff = curr.id.clock - currWrite.struct.id.clock - currWrite.struct.length\n            /**\n             * @type {Skip}\n             */\n            const struct = new Skip(createID(firstClient, currWrite.struct.id.clock + currWrite.struct.length), diff)\n            currWrite = { struct, offset: 0 }\n          }\n        } else { // if (currWrite.struct.id.clock + currWrite.struct.length >= curr.id.clock) {\n          const diff = currWrite.struct.id.clock + currWrite.struct.length - curr.id.clock\n          if (diff > 0) {\n            if (currWrite.struct.constructor === Skip) {\n              // prefer to slice Skip because the other struct might contain more information\n              currWrite.struct.length -= diff\n            } else {\n              curr = sliceStruct(curr, diff)\n            }\n          }\n          if (!currWrite.struct.mergeWith(/** @type {any} */ (curr))) {\n            writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset)\n            currWrite = { struct: curr, offset: 0 }\n            currDecoder.next()\n          }\n        }\n      }\n    } else {\n      currWrite = { struct: /** @type {Item | GC} */ (currDecoder.curr), offset: 0 }\n      currDecoder.next()\n    }\n    for (\n      let next = currDecoder.curr;\n      next !== null && next.id.client === firstClient && next.id.clock === currWrite.struct.id.clock + currWrite.struct.length && next.constructor !== Skip;\n      next = currDecoder.next()\n    ) {\n      writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset)\n      currWrite = { struct: next, offset: 0 }\n    }\n  }\n  if (currWrite !== null) {\n    writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset)\n    currWrite = null\n  }\n  finishLazyStructWriting(lazyStructEncoder)\n\n  const dss = updateDecoders.map(decoder => readDeleteSet(decoder))\n  const ds = mergeDeleteSets(dss)\n  writeDeleteSet(updateEncoder, ds)\n  return updateEncoder.toUint8Array()\n}\n\n/**\n * @param {Uint8Array} update\n * @param {Uint8Array} sv\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} [YEncoder]\n */\nexport const diffUpdateV2 = (update, sv, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {\n  const state = decodeStateVector(sv)\n  const encoder = new YEncoder()\n  const lazyStructWriter = new LazyStructWriter(encoder)\n  const decoder = new YDecoder(decoding.createDecoder(update))\n  const reader = new LazyStructReader(decoder, false)\n  while (reader.curr) {\n    const curr = reader.curr\n    const currClient = curr.id.client\n    const svClock = state.get(currClient) || 0\n    if (reader.curr.constructor === Skip) {\n      // the first written struct shouldn't be a skip\n      reader.next()\n      continue\n    }\n    if (curr.id.clock + curr.length > svClock) {\n      writeStructToLazyStructWriter(lazyStructWriter, curr, math.max(svClock - curr.id.clock, 0))\n      reader.next()\n      while (reader.curr && reader.curr.id.client === currClient) {\n        writeStructToLazyStructWriter(lazyStructWriter, reader.curr, 0)\n        reader.next()\n      }\n    } else {\n      // read until something new comes up\n      while (reader.curr && reader.curr.id.client === currClient && reader.curr.id.clock + reader.curr.length <= svClock) {\n        reader.next()\n      }\n    }\n  }\n  finishLazyStructWriting(lazyStructWriter)\n  // write ds\n  const ds = readDeleteSet(decoder)\n  writeDeleteSet(encoder, ds)\n  return encoder.toUint8Array()\n}\n\n/**\n * @param {Uint8Array} update\n * @param {Uint8Array} sv\n */\nexport const diffUpdate = (update, sv) => diffUpdateV2(update, sv, UpdateDecoderV1, UpdateEncoderV1)\n\n/**\n * @param {LazyStructWriter} lazyWriter\n */\nconst flushLazyStructWriter = lazyWriter => {\n  if (lazyWriter.written > 0) {\n    lazyWriter.clientStructs.push({ written: lazyWriter.written, restEncoder: encoding.toUint8Array(lazyWriter.encoder.restEncoder) })\n    lazyWriter.encoder.restEncoder = encoding.createEncoder()\n    lazyWriter.written = 0\n  }\n}\n\n/**\n * @param {LazyStructWriter} lazyWriter\n * @param {Item | GC} struct\n * @param {number} offset\n */\nconst writeStructToLazyStructWriter = (lazyWriter, struct, offset) => {\n  // flush curr if we start another client\n  if (lazyWriter.written > 0 && lazyWriter.currClient !== struct.id.client) {\n    flushLazyStructWriter(lazyWriter)\n  }\n  if (lazyWriter.written === 0) {\n    lazyWriter.currClient = struct.id.client\n    // write next client\n    lazyWriter.encoder.writeClient(struct.id.client)\n    // write startClock\n    encoding.writeVarUint(lazyWriter.encoder.restEncoder, struct.id.clock + offset)\n  }\n  struct.write(lazyWriter.encoder, offset)\n  lazyWriter.written++\n}\n/**\n * Call this function when we collected all parts and want to\n * put all the parts together. After calling this method,\n * you can continue using the UpdateEncoder.\n *\n * @param {LazyStructWriter} lazyWriter\n */\nconst finishLazyStructWriting = (lazyWriter) => {\n  flushLazyStructWriter(lazyWriter)\n\n  // this is a fresh encoder because we called flushCurr\n  const restEncoder = lazyWriter.encoder.restEncoder\n\n  /**\n   * Now we put all the fragments together.\n   * This works similarly to `writeClientsStructs`\n   */\n\n  // write # states that were updated - i.e. the clients\n  encoding.writeVarUint(restEncoder, lazyWriter.clientStructs.length)\n\n  for (let i = 0; i < lazyWriter.clientStructs.length; i++) {\n    const partStructs = lazyWriter.clientStructs[i]\n    /**\n     * Works similarly to `writeStructs`\n     */\n    // write # encoded structs\n    encoding.writeVarUint(restEncoder, partStructs.written)\n    // write the rest of the fragment\n    encoding.writeUint8Array(restEncoder, partStructs.restEncoder)\n  }\n}\n\n/**\n * @param {Uint8Array} update\n * @param {function(Item|GC|Skip):Item|GC|Skip} blockTransformer\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} YDecoder\n * @param {typeof UpdateEncoderV2 | typeof UpdateEncoderV1 } YEncoder\n */\nexport const convertUpdateFormat = (update, blockTransformer, YDecoder, YEncoder) => {\n  const updateDecoder = new YDecoder(decoding.createDecoder(update))\n  const lazyDecoder = new LazyStructReader(updateDecoder, false)\n  const updateEncoder = new YEncoder()\n  const lazyWriter = new LazyStructWriter(updateEncoder)\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    writeStructToLazyStructWriter(lazyWriter, blockTransformer(curr), 0)\n  }\n  finishLazyStructWriting(lazyWriter)\n  const ds = readDeleteSet(updateDecoder)\n  writeDeleteSet(updateEncoder, ds)\n  return updateEncoder.toUint8Array()\n}\n\n/**\n * @typedef {Object} ObfuscatorOptions\n * @property {boolean} [ObfuscatorOptions.formatting=true]\n * @property {boolean} [ObfuscatorOptions.subdocs=true]\n * @property {boolean} [ObfuscatorOptions.yxml=true] Whether to obfuscate nodeName / hookName\n */\n\n/**\n * @param {ObfuscatorOptions} obfuscator\n */\nconst createObfuscator = ({ formatting = true, subdocs = true, yxml = true } = {}) => {\n  let i = 0\n  const mapKeyCache = map.create()\n  const nodeNameCache = map.create()\n  const formattingKeyCache = map.create()\n  const formattingValueCache = map.create()\n  formattingValueCache.set(null, null) // end of a formatting range should always be the end of a formatting range\n  /**\n   * @param {Item|GC|Skip} block\n   * @return {Item|GC|Skip}\n   */\n  return block => {\n    switch (block.constructor) {\n      case GC:\n      case Skip:\n        return block\n      case Item: {\n        const item = /** @type {Item} */ (block)\n        const content = item.content\n        switch (content.constructor) {\n          case ContentDeleted:\n            break\n          case ContentType: {\n            if (yxml) {\n              const type = /** @type {ContentType} */ (content).type\n              if (type instanceof YXmlElement) {\n                type.nodeName = map.setIfUndefined(nodeNameCache, type.nodeName, () => 'node-' + i)\n              }\n              if (type instanceof YXmlHook) {\n                type.hookName = map.setIfUndefined(nodeNameCache, type.hookName, () => 'hook-' + i)\n              }\n            }\n            break\n          }\n          case ContentAny: {\n            const c = /** @type {ContentAny} */ (content)\n            c.arr = c.arr.map(() => i)\n            break\n          }\n          case ContentBinary: {\n            const c = /** @type {ContentBinary} */ (content)\n            c.content = new Uint8Array([i])\n            break\n          }\n          case ContentDoc: {\n            const c = /** @type {ContentDoc} */ (content)\n            if (subdocs) {\n              c.opts = {}\n              c.doc.guid = i + ''\n            }\n            break\n          }\n          case ContentEmbed: {\n            const c = /** @type {ContentEmbed} */ (content)\n            c.embed = {}\n            break\n          }\n          case ContentFormat: {\n            const c = /** @type {ContentFormat} */ (content)\n            if (formatting) {\n              c.key = map.setIfUndefined(formattingKeyCache, c.key, () => i + '')\n              c.value = map.setIfUndefined(formattingValueCache, c.value, () => ({ i }))\n            }\n            break\n          }\n          case ContentJSON: {\n            const c = /** @type {ContentJSON} */ (content)\n            c.arr = c.arr.map(() => i)\n            break\n          }\n          case ContentString: {\n            const c = /** @type {ContentString} */ (content)\n            c.str = string.repeat((i % 10) + '', c.str.length)\n            break\n          }\n          default:\n            // unknown content type\n            error.unexpectedCase()\n        }\n        if (item.parentSub) {\n          item.parentSub = map.setIfUndefined(mapKeyCache, item.parentSub, () => i + '')\n        }\n        i++\n        return block\n      }\n      default:\n        // unknown block-type\n        error.unexpectedCase()\n    }\n  }\n}\n\n/**\n * This function obfuscates the content of a Yjs update. This is useful to share\n * buggy Yjs documents while significantly limiting the possibility that a\n * developer can on the user. Note that it might still be possible to deduce\n * some information by analyzing the \"structure\" of the document or by analyzing\n * the typing behavior using the CRDT-related metadata that is still kept fully\n * intact.\n *\n * @param {Uint8Array} update\n * @param {ObfuscatorOptions} [opts]\n */\nexport const obfuscateUpdate = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV1, UpdateEncoderV1)\n\n/**\n * @param {Uint8Array} update\n * @param {ObfuscatorOptions} [opts]\n */\nexport const obfuscateUpdateV2 = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV2, UpdateEncoderV2)\n\n/**\n * @param {Uint8Array} update\n */\nexport const convertUpdateFormatV1ToV2 = update => convertUpdateFormat(update, f.id, UpdateDecoderV1, UpdateEncoderV2)\n\n/**\n * @param {Uint8Array} update\n */\nexport const convertUpdateFormatV2ToV1 = update => convertUpdateFormat(update, f.id, UpdateDecoderV2, UpdateEncoderV1)\n", "\nimport {\n  isDeleted,\n  Item, AbstractType, Transaction, AbstractStruct // eslint-disable-line\n} from '../internals.js'\n\nimport * as set from 'lib0/set'\nimport * as array from 'lib0/array'\nimport * as error from 'lib0/error'\n\nconst errorComputeChanges = 'You must not compute changes after the event-handler fired.'\n\n/**\n * @template {AbstractType<any>} T\n * YEvent describes the changes on a YType.\n */\nexport class YEvent {\n  /**\n   * @param {T} target The changed type.\n   * @param {Transaction} transaction\n   */\n  constructor (target, transaction) {\n    /**\n     * The type on which this event was created on.\n     * @type {T}\n     */\n    this.target = target\n    /**\n     * The current target on which the observe callback is called.\n     * @type {AbstractType<any>}\n     */\n    this.currentTarget = target\n    /**\n     * The transaction that triggered this event.\n     * @type {Transaction}\n     */\n    this.transaction = transaction\n    /**\n     * @type {Object|null}\n     */\n    this._changes = null\n    /**\n     * @type {null | Map<string, { action: 'add' | 'update' | 'delete', oldValue: any, newValue: any }>}\n     */\n    this._keys = null\n    /**\n     * @type {null | Array<{ insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any> }>}\n     */\n    this._delta = null\n    /**\n     * @type {Array<string|number>|null}\n     */\n    this._path = null\n  }\n\n  /**\n   * Computes the path from `y` to the changed type.\n   *\n   * @todo v14 should standardize on path: Array<{parent, index}> because that is easier to work with.\n   *\n   * The following property holds:\n   * @example\n   *   let type = y\n   *   event.path.forEach(dir => {\n   *     type = type.get(dir)\n   *   })\n   *   type === event.target // => true\n   */\n  get path () {\n    return this._path || (this._path = getPathTo(this.currentTarget, this.target))\n  }\n\n  /**\n   * Check if a struct is deleted by this event.\n   *\n   * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.\n   *\n   * @param {AbstractStruct} struct\n   * @return {boolean}\n   */\n  deletes (struct) {\n    return isDeleted(this.transaction.deleteSet, struct.id)\n  }\n\n  /**\n   * @type {Map<string, { action: 'add' | 'update' | 'delete', oldValue: any, newValue: any }>}\n   */\n  get keys () {\n    if (this._keys === null) {\n      if (this.transaction.doc._transactionCleanups.length === 0) {\n        throw error.create(errorComputeChanges)\n      }\n      const keys = new Map()\n      const target = this.target\n      const changed = /** @type Set<string|null> */ (this.transaction.changed.get(target))\n      changed.forEach(key => {\n        if (key !== null) {\n          const item = /** @type {Item} */ (target._map.get(key))\n          /**\n           * @type {'delete' | 'add' | 'update'}\n           */\n          let action\n          let oldValue\n          if (this.adds(item)) {\n            let prev = item.left\n            while (prev !== null && this.adds(prev)) {\n              prev = prev.left\n            }\n            if (this.deletes(item)) {\n              if (prev !== null && this.deletes(prev)) {\n                action = 'delete'\n                oldValue = array.last(prev.content.getContent())\n              } else {\n                return\n              }\n            } else {\n              if (prev !== null && this.deletes(prev)) {\n                action = 'update'\n                oldValue = array.last(prev.content.getContent())\n              } else {\n                action = 'add'\n                oldValue = undefined\n              }\n            }\n          } else {\n            if (this.deletes(item)) {\n              action = 'delete'\n              oldValue = array.last(/** @type {Item} */ item.content.getContent())\n            } else {\n              return // nop\n            }\n          }\n          keys.set(key, { action, oldValue })\n        }\n      })\n      this._keys = keys\n    }\n    return this._keys\n  }\n\n  /**\n   * This is a computed property. Note that this can only be safely computed during the\n   * event call. Computing this property after other changes happened might result in\n   * unexpected behavior (incorrect computation of deltas). A safe way to collect changes\n   * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.\n   *\n   * @type {Array<{insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any>}>}\n   */\n  get delta () {\n    return this.changes.delta\n  }\n\n  /**\n   * Check if a struct is added by this event.\n   *\n   * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.\n   *\n   * @param {AbstractStruct} struct\n   * @return {boolean}\n   */\n  adds (struct) {\n    return struct.id.clock >= (this.transaction.beforeState.get(struct.id.client) || 0)\n  }\n\n  /**\n   * This is a computed property. Note that this can only be safely computed during the\n   * event call. Computing this property after other changes happened might result in\n   * unexpected behavior (incorrect computation of deltas). A safe way to collect changes\n   * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.\n   *\n   * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}}\n   */\n  get changes () {\n    let changes = this._changes\n    if (changes === null) {\n      if (this.transaction.doc._transactionCleanups.length === 0) {\n        throw error.create(errorComputeChanges)\n      }\n      const target = this.target\n      const added = set.create()\n      const deleted = set.create()\n      /**\n       * @type {Array<{insert:Array<any>}|{delete:number}|{retain:number}>}\n       */\n      const delta = []\n      changes = {\n        added,\n        deleted,\n        delta,\n        keys: this.keys\n      }\n      const changed = /** @type Set<string|null> */ (this.transaction.changed.get(target))\n      if (changed.has(null)) {\n        /**\n         * @type {any}\n         */\n        let lastOp = null\n        const packOp = () => {\n          if (lastOp) {\n            delta.push(lastOp)\n          }\n        }\n        for (let item = target._start; item !== null; item = item.right) {\n          if (item.deleted) {\n            if (this.deletes(item) && !this.adds(item)) {\n              if (lastOp === null || lastOp.delete === undefined) {\n                packOp()\n                lastOp = { delete: 0 }\n              }\n              lastOp.delete += item.length\n              deleted.add(item)\n            } // else nop\n          } else {\n            if (this.adds(item)) {\n              if (lastOp === null || lastOp.insert === undefined) {\n                packOp()\n                lastOp = { insert: [] }\n              }\n              lastOp.insert = lastOp.insert.concat(item.content.getContent())\n              added.add(item)\n            } else {\n              if (lastOp === null || lastOp.retain === undefined) {\n                packOp()\n                lastOp = { retain: 0 }\n              }\n              lastOp.retain += item.length\n            }\n          }\n        }\n        if (lastOp !== null && lastOp.retain === undefined) {\n          packOp()\n        }\n      }\n      this._changes = changes\n    }\n    return /** @type {any} */ (changes)\n  }\n}\n\n/**\n * Compute the path from this type to the specified target.\n *\n * @example\n *   // `child` should be accessible via `type.get(path[0]).get(path[1])..`\n *   const path = type.getPathTo(child)\n *   // assuming `type instanceof YArray`\n *   console.log(path) // might look like => [2, 'key1']\n *   child === type.get(path[0]).get(path[1])\n *\n * @param {AbstractType<any>} parent\n * @param {AbstractType<any>} child target\n * @return {Array<string|number>} Path to the target\n *\n * @private\n * @function\n */\nconst getPathTo = (parent, child) => {\n  const path = []\n  while (child._item !== null && child !== parent) {\n    if (child._item.parentSub !== null) {\n      // parent is map-ish\n      path.unshift(child._item.parentSub)\n    } else {\n      // parent is array-ish\n      let i = 0\n      let c = /** @type {AbstractType<any>} */ (child._item.parent)._start\n      while (c !== child._item && c !== null) {\n        if (!c.deleted) {\n          i++\n        }\n        c = c.right\n      }\n      path.unshift(i)\n    }\n    child = /** @type {AbstractType<any>} */ (child._item.parent)\n  }\n  return path\n}\n", "\nimport {\n  removeEventHandlerListener,\n  callEventHandlerListeners,\n  addEventHandlerListener,\n  createEventHandler,\n  getState,\n  isVisible,\n  ContentType,\n  createID,\n  ContentAny,\n  ContentBinary,\n  getItemCleanStart,\n  ContentDoc, YText, YArray, UpdateEncoderV1, UpdateEncoderV2, Doc, Snapshot, Transaction, EventHandler, YEvent, Item, // eslint-disable-line\n} from '../internals.js'\n\nimport * as map from 'lib0/map'\nimport * as iterator from 'lib0/iterator'\nimport * as error from 'lib0/error'\nimport * as math from 'lib0/math'\n\nconst maxSearchMarker = 80\n\n/**\n * A unique timestamp that identifies each marker.\n *\n * Time is relative,.. this is more like an ever-increasing clock.\n *\n * @type {number}\n */\nlet globalSearchMarkerTimestamp = 0\n\nexport class ArraySearchMarker {\n  /**\n   * @param {Item} p\n   * @param {number} index\n   */\n  constructor (p, index) {\n    p.marker = true\n    this.p = p\n    this.index = index\n    this.timestamp = globalSearchMarkerTimestamp++\n  }\n}\n\n/**\n * @param {ArraySearchMarker} marker\n */\nconst refreshMarkerTimestamp = marker => { marker.timestamp = globalSearchMarkerTimestamp++ }\n\n/**\n * This is rather complex so this function is the only thing that should overwrite a marker\n *\n * @param {ArraySearchMarker} marker\n * @param {Item} p\n * @param {number} index\n */\nconst overwriteMarker = (marker, p, index) => {\n  marker.p.marker = false\n  marker.p = p\n  p.marker = true\n  marker.index = index\n  marker.timestamp = globalSearchMarkerTimestamp++\n}\n\n/**\n * @param {Array<ArraySearchMarker>} searchMarker\n * @param {Item} p\n * @param {number} index\n */\nconst markPosition = (searchMarker, p, index) => {\n  if (searchMarker.length >= maxSearchMarker) {\n    // override oldest marker (we don't want to create more objects)\n    const marker = searchMarker.reduce((a, b) => a.timestamp < b.timestamp ? a : b)\n    overwriteMarker(marker, p, index)\n    return marker\n  } else {\n    // create new marker\n    const pm = new ArraySearchMarker(p, index)\n    searchMarker.push(pm)\n    return pm\n  }\n}\n\n/**\n * Search marker help us to find positions in the associative array faster.\n *\n * They speed up the process of finding a position without much bookkeeping.\n *\n * A maximum of `maxSearchMarker` objects are created.\n *\n * This function always returns a refreshed marker (updated timestamp)\n *\n * @param {AbstractType<any>} yarray\n * @param {number} index\n */\nexport const findMarker = (yarray, index) => {\n  if (yarray._start === null || index === 0 || yarray._searchMarker === null) {\n    return null\n  }\n  const marker = yarray._searchMarker.length === 0 ? null : yarray._searchMarker.reduce((a, b) => math.abs(index - a.index) < math.abs(index - b.index) ? a : b)\n  let p = yarray._start\n  let pindex = 0\n  if (marker !== null) {\n    p = marker.p\n    pindex = marker.index\n    refreshMarkerTimestamp(marker) // we used it, we might need to use it again\n  }\n  // iterate to right if possible\n  while (p.right !== null && pindex < index) {\n    if (!p.deleted && p.countable) {\n      if (index < pindex + p.length) {\n        break\n      }\n      pindex += p.length\n    }\n    p = p.right\n  }\n  // iterate to left if necessary (might be that pindex > index)\n  while (p.left !== null && pindex > index) {\n    p = p.left\n    if (!p.deleted && p.countable) {\n      pindex -= p.length\n    }\n  }\n  // we want to make sure that p can't be merged with left, because that would screw up everything\n  // in that cas just return what we have (it is most likely the best marker anyway)\n  // iterate to left until p can't be merged with left\n  while (p.left !== null && p.left.id.client === p.id.client && p.left.id.clock + p.left.length === p.id.clock) {\n    p = p.left\n    if (!p.deleted && p.countable) {\n      pindex -= p.length\n    }\n  }\n\n  // @todo remove!\n  // assure position\n  // {\n  //   let start = yarray._start\n  //   let pos = 0\n  //   while (start !== p) {\n  //     if (!start.deleted && start.countable) {\n  //       pos += start.length\n  //     }\n  //     start = /** @type {Item} */ (start.right)\n  //   }\n  //   if (pos !== pindex) {\n  //     debugger\n  //     throw new Error('Gotcha position fail!')\n  //   }\n  // }\n  // if (marker) {\n  //   if (window.lengthes == null) {\n  //     window.lengthes = []\n  //     window.getLengthes = () => window.lengthes.sort((a, b) => a - b)\n  //   }\n  //   window.lengthes.push(marker.index - pindex)\n  //   console.log('distance', marker.index - pindex, 'len', p && p.parent.length)\n  // }\n  if (marker !== null && math.abs(marker.index - pindex) < /** @type {YText|YArray<any>} */ (p.parent).length / maxSearchMarker) {\n    // adjust existing marker\n    overwriteMarker(marker, p, pindex)\n    return marker\n  } else {\n    // create new marker\n    return markPosition(yarray._searchMarker, p, pindex)\n  }\n}\n\n/**\n * Update markers when a change happened.\n *\n * This should be called before doing a deletion!\n *\n * @param {Array<ArraySearchMarker>} searchMarker\n * @param {number} index\n * @param {number} len If insertion, len is positive. If deletion, len is negative.\n */\nexport const updateMarkerChanges = (searchMarker, index, len) => {\n  for (let i = searchMarker.length - 1; i >= 0; i--) {\n    const m = searchMarker[i]\n    if (len > 0) {\n      /**\n       * @type {Item|null}\n       */\n      let p = m.p\n      p.marker = false\n      // Ideally we just want to do a simple position comparison, but this will only work if\n      // search markers don't point to deleted items for formats.\n      // Iterate marker to prev undeleted countable position so we know what to do when updating a position\n      while (p && (p.deleted || !p.countable)) {\n        p = p.left\n        if (p && !p.deleted && p.countable) {\n          // adjust position. the loop should break now\n          m.index -= p.length\n        }\n      }\n      if (p === null || p.marker === true) {\n        // remove search marker if updated position is null or if position is already marked\n        searchMarker.splice(i, 1)\n        continue\n      }\n      m.p = p\n      p.marker = true\n    }\n    if (index < m.index || (len > 0 && index === m.index)) { // a simple index <= m.index check would actually suffice\n      m.index = math.max(index, m.index + len)\n    }\n  }\n}\n\n/**\n * Accumulate all (list) children of a type and return them as an Array.\n *\n * @param {AbstractType<any>} t\n * @return {Array<Item>}\n */\nexport const getTypeChildren = t => {\n  let s = t._start\n  const arr = []\n  while (s) {\n    arr.push(s)\n    s = s.right\n  }\n  return arr\n}\n\n/**\n * Call event listeners with an event. This will also add an event to all\n * parents (for `.observeDeep` handlers).\n *\n * @template EventType\n * @param {AbstractType<EventType>} type\n * @param {Transaction} transaction\n * @param {EventType} event\n */\nexport const callTypeObservers = (type, transaction, event) => {\n  const changedType = type\n  const changedParentTypes = transaction.changedParentTypes\n  while (true) {\n    // @ts-ignore\n    map.setIfUndefined(changedParentTypes, type, () => []).push(event)\n    if (type._item === null) {\n      break\n    }\n    type = /** @type {AbstractType<any>} */ (type._item.parent)\n  }\n  callEventHandlerListeners(changedType._eH, event, transaction)\n}\n\n/**\n * @template EventType\n * Abstract Yjs Type class\n */\nexport class AbstractType {\n  constructor () {\n    /**\n     * @type {Item|null}\n     */\n    this._item = null\n    /**\n     * @type {Map<string,Item>}\n     */\n    this._map = new Map()\n    /**\n     * @type {Item|null}\n     */\n    this._start = null\n    /**\n     * @type {Doc|null}\n     */\n    this.doc = null\n    this._length = 0\n    /**\n     * Event handlers\n     * @type {EventHandler<EventType,Transaction>}\n     */\n    this._eH = createEventHandler()\n    /**\n     * Deep event handlers\n     * @type {EventHandler<Array<YEvent<any>>,Transaction>}\n     */\n    this._dEH = createEventHandler()\n    /**\n     * @type {null | Array<ArraySearchMarker>}\n     */\n    this._searchMarker = null\n  }\n\n  /**\n   * @return {AbstractType<any>|null}\n   */\n  get parent () {\n    return this._item ? /** @type {AbstractType<any>} */ (this._item.parent) : null\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item|null} item\n   */\n  _integrate (y, item) {\n    this.doc = y\n    this._item = item\n  }\n\n  /**\n   * @return {AbstractType<EventType>}\n   */\n  _copy () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @return {AbstractType<EventType>}\n   */\n  clone () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder\n   */\n  _write (_encoder) { }\n\n  /**\n   * The first non-deleted item\n   */\n  get _first () {\n    let n = this._start\n    while (n !== null && n.deleted) {\n      n = n.right\n    }\n    return n\n  }\n\n  /**\n   * Creates YEvent and calls all type observers.\n   * Must be implemented by each type.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} _parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, _parentSubs) {\n    if (!transaction.local && this._searchMarker) {\n      this._searchMarker.length = 0\n    }\n  }\n\n  /**\n   * Observe all events that are created on this type.\n   *\n   * @param {function(EventType, Transaction):void} f Observer function\n   */\n  observe (f) {\n    addEventHandlerListener(this._eH, f)\n  }\n\n  /**\n   * Observe all events that are created by this type and its children.\n   *\n   * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function\n   */\n  observeDeep (f) {\n    addEventHandlerListener(this._dEH, f)\n  }\n\n  /**\n   * Unregister an observer function.\n   *\n   * @param {function(EventType,Transaction):void} f Observer function\n   */\n  unobserve (f) {\n    removeEventHandlerListener(this._eH, f)\n  }\n\n  /**\n   * Unregister an observer function.\n   *\n   * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function\n   */\n  unobserveDeep (f) {\n    removeEventHandlerListener(this._dEH, f)\n  }\n\n  /**\n   * @abstract\n   * @return {any}\n   */\n  toJSON () {}\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} start\n * @param {number} end\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nexport const typeListSlice = (type, start, end) => {\n  if (start < 0) {\n    start = type._length + start\n  }\n  if (end < 0) {\n    end = type._length + end\n  }\n  let len = end - start\n  const cs = []\n  let n = type._start\n  while (n !== null && len > 0) {\n    if (n.countable && !n.deleted) {\n      const c = n.content.getContent()\n      if (c.length <= start) {\n        start -= c.length\n      } else {\n        for (let i = start; i < c.length && len > 0; i++) {\n          cs.push(c[i])\n          len--\n        }\n        start = 0\n      }\n    }\n    n = n.right\n  }\n  return cs\n}\n\n/**\n * @param {AbstractType<any>} type\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nexport const typeListToArray = type => {\n  const cs = []\n  let n = type._start\n  while (n !== null) {\n    if (n.countable && !n.deleted) {\n      const c = n.content.getContent()\n      for (let i = 0; i < c.length; i++) {\n        cs.push(c[i])\n      }\n    }\n    n = n.right\n  }\n  return cs\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {Snapshot} snapshot\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nexport const typeListToArraySnapshot = (type, snapshot) => {\n  const cs = []\n  let n = type._start\n  while (n !== null) {\n    if (n.countable && isVisible(n, snapshot)) {\n      const c = n.content.getContent()\n      for (let i = 0; i < c.length; i++) {\n        cs.push(c[i])\n      }\n    }\n    n = n.right\n  }\n  return cs\n}\n\n/**\n * Executes a provided function on once on overy element of this YArray.\n *\n * @param {AbstractType<any>} type\n * @param {function(any,number,any):void} f A function to execute on every element of this YArray.\n *\n * @private\n * @function\n */\nexport const typeListForEach = (type, f) => {\n  let index = 0\n  let n = type._start\n  while (n !== null) {\n    if (n.countable && !n.deleted) {\n      const c = n.content.getContent()\n      for (let i = 0; i < c.length; i++) {\n        f(c[i], index++, type)\n      }\n    }\n    n = n.right\n  }\n}\n\n/**\n * @template C,R\n * @param {AbstractType<any>} type\n * @param {function(C,number,AbstractType<any>):R} f\n * @return {Array<R>}\n *\n * @private\n * @function\n */\nexport const typeListMap = (type, f) => {\n  /**\n   * @type {Array<any>}\n   */\n  const result = []\n  typeListForEach(type, (c, i) => {\n    result.push(f(c, i, type))\n  })\n  return result\n}\n\n/**\n * @param {AbstractType<any>} type\n * @return {IterableIterator<any>}\n *\n * @private\n * @function\n */\nexport const typeListCreateIterator = type => {\n  let n = type._start\n  /**\n   * @type {Array<any>|null}\n   */\n  let currentContent = null\n  let currentContentIndex = 0\n  return {\n    [Symbol.iterator] () {\n      return this\n    },\n    next: () => {\n      // find some content\n      if (currentContent === null) {\n        while (n !== null && n.deleted) {\n          n = n.right\n        }\n        // check if we reached the end, no need to check currentContent, because it does not exist\n        if (n === null) {\n          return {\n            done: true,\n            value: undefined\n          }\n        }\n        // we found n, so we can set currentContent\n        currentContent = n.content.getContent()\n        currentContentIndex = 0\n        n = n.right // we used the content of n, now iterate to next\n      }\n      const value = currentContent[currentContentIndex++]\n      // check if we need to empty currentContent\n      if (currentContent.length <= currentContentIndex) {\n        currentContent = null\n      }\n      return {\n        done: false,\n        value\n      }\n    }\n  }\n}\n\n/**\n * Executes a provided function on once on overy element of this YArray.\n * Operates on a snapshotted state of the document.\n *\n * @param {AbstractType<any>} type\n * @param {function(any,number,AbstractType<any>):void} f A function to execute on every element of this YArray.\n * @param {Snapshot} snapshot\n *\n * @private\n * @function\n */\nexport const typeListForEachSnapshot = (type, f, snapshot) => {\n  let index = 0\n  let n = type._start\n  while (n !== null) {\n    if (n.countable && isVisible(n, snapshot)) {\n      const c = n.content.getContent()\n      for (let i = 0; i < c.length; i++) {\n        f(c[i], index++, type)\n      }\n    }\n    n = n.right\n  }\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @return {any}\n *\n * @private\n * @function\n */\nexport const typeListGet = (type, index) => {\n  const marker = findMarker(type, index)\n  let n = type._start\n  if (marker !== null) {\n    n = marker.p\n    index -= marker.index\n  }\n  for (; n !== null; n = n.right) {\n    if (!n.deleted && n.countable) {\n      if (index < n.length) {\n        return n.content.getContent()[index]\n      }\n      index -= n.length\n    }\n  }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {Item?} referenceItem\n * @param {Array<Object<string,any>|Array<any>|boolean|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nexport const typeListInsertGenericsAfter = (transaction, parent, referenceItem, content) => {\n  let left = referenceItem\n  const doc = transaction.doc\n  const ownClientId = doc.clientID\n  const store = doc.store\n  const right = referenceItem === null ? parent._start : referenceItem.right\n  /**\n   * @type {Array<Object|Array<any>|number|null>}\n   */\n  let jsonContent = []\n  const packJsonContent = () => {\n    if (jsonContent.length > 0) {\n      left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentAny(jsonContent))\n      left.integrate(transaction, 0)\n      jsonContent = []\n    }\n  }\n  content.forEach(c => {\n    if (c === null) {\n      jsonContent.push(c)\n    } else {\n      switch (c.constructor) {\n        case Number:\n        case Object:\n        case Boolean:\n        case Array:\n        case String:\n          jsonContent.push(c)\n          break\n        default:\n          packJsonContent()\n          switch (c.constructor) {\n            case Uint8Array:\n            case ArrayBuffer:\n              left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentBinary(new Uint8Array(/** @type {Uint8Array} */ (c))))\n              left.integrate(transaction, 0)\n              break\n            case Doc:\n              left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentDoc(/** @type {Doc} */ (c)))\n              left.integrate(transaction, 0)\n              break\n            default:\n              if (c instanceof AbstractType) {\n                left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentType(c))\n                left.integrate(transaction, 0)\n              } else {\n                throw new Error('Unexpected content type in insert operation')\n              }\n          }\n      }\n    }\n  })\n  packJsonContent()\n}\n\nconst lengthExceeded = error.create('Length exceeded!')\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {Array<Object<string,any>|Array<any>|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nexport const typeListInsertGenerics = (transaction, parent, index, content) => {\n  if (index > parent._length) {\n    throw lengthExceeded\n  }\n  if (index === 0) {\n    if (parent._searchMarker) {\n      updateMarkerChanges(parent._searchMarker, index, content.length)\n    }\n    return typeListInsertGenericsAfter(transaction, parent, null, content)\n  }\n  const startIndex = index\n  const marker = findMarker(parent, index)\n  let n = parent._start\n  if (marker !== null) {\n    n = marker.p\n    index -= marker.index\n    // we need to iterate one to the left so that the algorithm works\n    if (index === 0) {\n      // @todo refactor this as it actually doesn't consider formats\n      n = n.prev // important! get the left undeleted item so that we can actually decrease index\n      index += (n && n.countable && !n.deleted) ? n.length : 0\n    }\n  }\n  for (; n !== null; n = n.right) {\n    if (!n.deleted && n.countable) {\n      if (index <= n.length) {\n        if (index < n.length) {\n          // insert in-between\n          getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index))\n        }\n        break\n      }\n      index -= n.length\n    }\n  }\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, startIndex, content.length)\n  }\n  return typeListInsertGenericsAfter(transaction, parent, n, content)\n}\n\n/**\n * Pushing content is special as we generally want to push after the last item. So we don't have to update\n * the serach marker.\n *\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {Array<Object<string,any>|Array<any>|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nexport const typeListPushGenerics = (transaction, parent, content) => {\n  // Use the marker with the highest index and iterate to the right.\n  const marker = (parent._searchMarker || []).reduce((maxMarker, currMarker) => currMarker.index > maxMarker.index ? currMarker : maxMarker, { index: 0, p: parent._start })\n  let n = marker.p\n  if (n) {\n    while (n.right) {\n      n = n.right\n    }\n  }\n  return typeListInsertGenericsAfter(transaction, parent, n, content)\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {number} length\n *\n * @private\n * @function\n */\nexport const typeListDelete = (transaction, parent, index, length) => {\n  if (length === 0) { return }\n  const startIndex = index\n  const startLength = length\n  const marker = findMarker(parent, index)\n  let n = parent._start\n  if (marker !== null) {\n    n = marker.p\n    index -= marker.index\n  }\n  // compute the first item to be deleted\n  for (; n !== null && index > 0; n = n.right) {\n    if (!n.deleted && n.countable) {\n      if (index < n.length) {\n        getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index))\n      }\n      index -= n.length\n    }\n  }\n  // delete all items until done\n  while (length > 0 && n !== null) {\n    if (!n.deleted) {\n      if (length < n.length) {\n        getItemCleanStart(transaction, createID(n.id.client, n.id.clock + length))\n      }\n      n.delete(transaction)\n      length -= n.length\n    }\n    n = n.right\n  }\n  if (length > 0) {\n    throw lengthExceeded\n  }\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, startIndex, -startLength + length /* in case we remove the above exception */)\n  }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {string} key\n *\n * @private\n * @function\n */\nexport const typeMapDelete = (transaction, parent, key) => {\n  const c = parent._map.get(key)\n  if (c !== undefined) {\n    c.delete(transaction)\n  }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @param {Object|number|null|Array<any>|string|Uint8Array|AbstractType<any>} value\n *\n * @private\n * @function\n */\nexport const typeMapSet = (transaction, parent, key, value) => {\n  const left = parent._map.get(key) || null\n  const doc = transaction.doc\n  const ownClientId = doc.clientID\n  let content\n  if (value == null) {\n    content = new ContentAny([value])\n  } else {\n    switch (value.constructor) {\n      case Number:\n      case Object:\n      case Boolean:\n      case Array:\n      case String:\n        content = new ContentAny([value])\n        break\n      case Uint8Array:\n        content = new ContentBinary(/** @type {Uint8Array} */ (value))\n        break\n      case Doc:\n        content = new ContentDoc(/** @type {Doc} */ (value))\n        break\n      default:\n        if (value instanceof AbstractType) {\n          content = new ContentType(value)\n        } else {\n          throw new Error('Unexpected content type')\n        }\n    }\n  }\n  new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, null, null, parent, key, content).integrate(transaction, 0)\n}\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @return {Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined}\n *\n * @private\n * @function\n */\nexport const typeMapGet = (parent, key) => {\n  const val = parent._map.get(key)\n  return val !== undefined && !val.deleted ? val.content.getContent()[val.length - 1] : undefined\n}\n\n/**\n * @param {AbstractType<any>} parent\n * @return {Object<string,Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined>}\n *\n * @private\n * @function\n */\nexport const typeMapGetAll = (parent) => {\n  /**\n   * @type {Object<string,any>}\n   */\n  const res = {}\n  parent._map.forEach((value, key) => {\n    if (!value.deleted) {\n      res[key] = value.content.getContent()[value.length - 1]\n    }\n  })\n  return res\n}\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @return {boolean}\n *\n * @private\n * @function\n */\nexport const typeMapHas = (parent, key) => {\n  const val = parent._map.get(key)\n  return val !== undefined && !val.deleted\n}\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @param {Snapshot} snapshot\n * @return {Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined}\n *\n * @private\n * @function\n */\nexport const typeMapGetSnapshot = (parent, key, snapshot) => {\n  let v = parent._map.get(key) || null\n  while (v !== null && (!snapshot.sv.has(v.id.client) || v.id.clock >= (snapshot.sv.get(v.id.client) || 0))) {\n    v = v.left\n  }\n  return v !== null && isVisible(v, snapshot) ? v.content.getContent()[v.length - 1] : undefined\n}\n\n/**\n * @param {Map<string,Item>} map\n * @return {IterableIterator<Array<any>>}\n *\n * @private\n * @function\n */\nexport const createMapIterator = map => iterator.iteratorFilter(map.entries(), /** @param {any} entry */ entry => !entry[1].deleted)\n", "/**\n * @module YArray\n */\n\nimport {\n  YEvent,\n  AbstractType,\n  typeListGet,\n  typeListToArray,\n  typeListForEach,\n  typeListCreateIterator,\n  typeListInsertGenerics,\n  typeListPushGenerics,\n  typeListDelete,\n  typeListMap,\n  YArrayRefID,\n  callTypeObservers,\n  transact,\n  ArraySearchMarker, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Transaction, Item // eslint-disable-line\n} from '../internals.js'\nimport { typeListSlice } from './AbstractType.js'\n\n/**\n * Event that describes the changes on a YArray\n * @template T\n * @extends YEvent<YArray<T>>\n */\nexport class YArrayEvent extends YEvent {\n  /**\n   * @param {YArray<T>} yarray The changed type\n   * @param {Transaction} transaction The transaction object\n   */\n  constructor (yarray, transaction) {\n    super(yarray, transaction)\n    this._transaction = transaction\n  }\n}\n\n/**\n * A shared Array implementation.\n * @template T\n * @extends AbstractType<YArrayEvent<T>>\n * @implements {Iterable<T>}\n */\nexport class YArray extends AbstractType {\n  constructor () {\n    super()\n    /**\n     * @type {Array<any>?}\n     * @private\n     */\n    this._prelimContent = []\n    /**\n     * @type {Array<ArraySearchMarker>}\n     */\n    this._searchMarker = []\n  }\n\n  /**\n   * Construct a new YArray containing the specified items.\n   * @template {Object<string,any>|Array<any>|number|null|string|Uint8Array} T\n   * @param {Array<T>} items\n   * @return {YArray<T>}\n   */\n  static from (items) {\n    /**\n     * @type {YArray<T>}\n     */\n    const a = new YArray()\n    a.push(items)\n    return a\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    this.insert(0, /** @type {Array<any>} */ (this._prelimContent))\n    this._prelimContent = null\n  }\n\n  /**\n   * @return {YArray<T>}\n   */\n  _copy () {\n    return new YArray()\n  }\n\n  /**\n   * @return {YArray<T>}\n   */\n  clone () {\n    /**\n     * @type {YArray<T>}\n     */\n    const arr = new YArray()\n    arr.insert(0, this.toArray().map(el =>\n      el instanceof AbstractType ? /** @type {typeof el} */ (el.clone()) : el\n    ))\n    return arr\n  }\n\n  get length () {\n    return this._prelimContent === null ? this._length : this._prelimContent.length\n  }\n\n  /**\n   * Creates YArrayEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    super._callObserver(transaction, parentSubs)\n    callTypeObservers(this, transaction, new YArrayEvent(this, transaction))\n  }\n\n  /**\n   * Inserts new content at an index.\n   *\n   * Important: This function expects an array of content. Not just a content\n   * object. The reason for this \"weirdness\" is that inserting several elements\n   * is very efficient when it is done as a single operation.\n   *\n   * @example\n   *  // Insert character 'a' at position 0\n   *  yarray.insert(0, ['a'])\n   *  // Insert numbers 1, 2 at position 1\n   *  yarray.insert(1, [1, 2])\n   *\n   * @param {number} index The index to insert content at.\n   * @param {Array<T>} content The array of content\n   */\n  insert (index, content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListInsertGenerics(transaction, this, index, /** @type {any} */ (content))\n      })\n    } else {\n      /** @type {Array<any>} */ (this._prelimContent).splice(index, 0, ...content)\n    }\n  }\n\n  /**\n   * Appends content to this YArray.\n   *\n   * @param {Array<T>} content Array of content to append.\n   *\n   * @todo Use the following implementation in all types.\n   */\n  push (content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListPushGenerics(transaction, this, /** @type {any} */ (content))\n      })\n    } else {\n      /** @type {Array<any>} */ (this._prelimContent).push(...content)\n    }\n  }\n\n  /**\n   * Preppends content to this YArray.\n   *\n   * @param {Array<T>} content Array of content to preppend.\n   */\n  unshift (content) {\n    this.insert(0, content)\n  }\n\n  /**\n   * Deletes elements starting from an index.\n   *\n   * @param {number} index Index at which to start deleting elements\n   * @param {number} length The number of elements to remove. Defaults to 1.\n   */\n  delete (index, length = 1) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListDelete(transaction, this, index, length)\n      })\n    } else {\n      /** @type {Array<any>} */ (this._prelimContent).splice(index, length)\n    }\n  }\n\n  /**\n   * Returns the i-th element from a YArray.\n   *\n   * @param {number} index The index of the element to return from the YArray\n   * @return {T}\n   */\n  get (index) {\n    return typeListGet(this, index)\n  }\n\n  /**\n   * Transforms this YArray to a JavaScript Array.\n   *\n   * @return {Array<T>}\n   */\n  toArray () {\n    return typeListToArray(this)\n  }\n\n  /**\n   * Transforms this YArray to a JavaScript Array.\n   *\n   * @param {number} [start]\n   * @param {number} [end]\n   * @return {Array<T>}\n   */\n  slice (start = 0, end = this.length) {\n    return typeListSlice(this, start, end)\n  }\n\n  /**\n   * Transforms this Shared Type to a JSON object.\n   *\n   * @return {Array<any>}\n   */\n  toJSON () {\n    return this.map(c => c instanceof AbstractType ? c.toJSON() : c)\n  }\n\n  /**\n   * Returns an Array with the result of calling a provided function on every\n   * element of this YArray.\n   *\n   * @template M\n   * @param {function(T,number,YArray<T>):M} f Function that produces an element of the new Array\n   * @return {Array<M>} A new array with each element being the result of the\n   *                 callback function\n   */\n  map (f) {\n    return typeListMap(this, /** @type {any} */ (f))\n  }\n\n  /**\n   * Executes a provided function once on overy element of this YArray.\n   *\n   * @param {function(T,number,YArray<T>):void} f A function to execute on every element of this YArray.\n   */\n  forEach (f) {\n    typeListForEach(this, f)\n  }\n\n  /**\n   * @return {IterableIterator<T>}\n   */\n  [Symbol.iterator] () {\n    return typeListCreateIterator(this)\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YArrayRefID)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n *\n * @private\n * @function\n */\nexport const readYArray = _decoder => new YArray()\n", "\n/**\n * @module YMap\n */\n\nimport {\n  YEvent,\n  AbstractType,\n  typeMapDelete,\n  typeMapSet,\n  typeMapGet,\n  typeMapHas,\n  createMapIterator,\n  YMapRefID,\n  callTypeObservers,\n  transact,\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Transaction, Item // eslint-disable-line\n} from '../internals.js'\n\nimport * as iterator from 'lib0/iterator'\n\n/**\n * @template T\n * @extends YEvent<YMap<T>>\n * Event that describes the changes on a YMap.\n */\nexport class YMapEvent extends YEvent {\n  /**\n   * @param {YMap<T>} ymap The YArray that changed.\n   * @param {Transaction} transaction\n   * @param {Set<any>} subs The keys that changed.\n   */\n  constructor (ymap, transaction, subs) {\n    super(ymap, transaction)\n    this.keysChanged = subs\n  }\n}\n\n/**\n * @template MapType\n * A shared Map implementation.\n *\n * @extends AbstractType<YMapEvent<MapType>>\n * @implements {Iterable<MapType>}\n */\nexport class YMap extends AbstractType {\n  /**\n   *\n   * @param {Iterable<readonly [string, any]>=} entries - an optional iterable to initialize the YMap\n   */\n  constructor (entries) {\n    super()\n    /**\n     * @type {Map<string,any>?}\n     * @private\n     */\n    this._prelimContent = null\n\n    if (entries === undefined) {\n      this._prelimContent = new Map()\n    } else {\n      this._prelimContent = new Map(entries)\n    }\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    ;/** @type {Map<string, any>} */ (this._prelimContent).forEach((value, key) => {\n      this.set(key, value)\n    })\n    this._prelimContent = null\n  }\n\n  /**\n   * @return {YMap<MapType>}\n   */\n  _copy () {\n    return new YMap()\n  }\n\n  /**\n   * @return {YMap<MapType>}\n   */\n  clone () {\n    /**\n     * @type {YMap<MapType>}\n     */\n    const map = new YMap()\n    this.forEach((value, key) => {\n      map.set(key, value instanceof AbstractType ? /** @type {typeof value} */ (value.clone()) : value)\n    })\n    return map\n  }\n\n  /**\n   * Creates YMapEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    callTypeObservers(this, transaction, new YMapEvent(this, transaction, parentSubs))\n  }\n\n  /**\n   * Transforms this Shared Type to a JSON object.\n   *\n   * @return {Object<string,any>}\n   */\n  toJSON () {\n    /**\n     * @type {Object<string,MapType>}\n     */\n    const map = {}\n    this._map.forEach((item, key) => {\n      if (!item.deleted) {\n        const v = item.content.getContent()[item.length - 1]\n        map[key] = v instanceof AbstractType ? v.toJSON() : v\n      }\n    })\n    return map\n  }\n\n  /**\n   * Returns the size of the YMap (count of key/value pairs)\n   *\n   * @return {number}\n   */\n  get size () {\n    return [...createMapIterator(this._map)].length\n  }\n\n  /**\n   * Returns the keys for each element in the YMap Type.\n   *\n   * @return {IterableIterator<string>}\n   */\n  keys () {\n    return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => v[0])\n  }\n\n  /**\n   * Returns the values for each element in the YMap Type.\n   *\n   * @return {IterableIterator<any>}\n   */\n  values () {\n    return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => v[1].content.getContent()[v[1].length - 1])\n  }\n\n  /**\n   * Returns an Iterator of [key, value] pairs\n   *\n   * @return {IterableIterator<any>}\n   */\n  entries () {\n    return iterator.iteratorMap(createMapIterator(this._map), /** @param {any} v */ v => [v[0], v[1].content.getContent()[v[1].length - 1]])\n  }\n\n  /**\n   * Executes a provided function on once on every key-value pair.\n   *\n   * @param {function(MapType,string,YMap<MapType>):void} f A function to execute on every element of this YArray.\n   */\n  forEach (f) {\n    this._map.forEach((item, key) => {\n      if (!item.deleted) {\n        f(item.content.getContent()[item.length - 1], key, this)\n      }\n    })\n  }\n\n  /**\n   * Returns an Iterator of [key, value] pairs\n   *\n   * @return {IterableIterator<any>}\n   */\n  [Symbol.iterator] () {\n    return this.entries()\n  }\n\n  /**\n   * Remove a specified element from this YMap.\n   *\n   * @param {string} key The key of the element to remove.\n   */\n  delete (key) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapDelete(transaction, this, key)\n      })\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimContent).delete(key)\n    }\n  }\n\n  /**\n   * Adds or updates an element with a specified key and value.\n   * @template {MapType} VAL\n   *\n   * @param {string} key The key of the element to add to this YMap\n   * @param {VAL} value The value of the element to add\n   * @return {VAL}\n   */\n  set (key, value) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapSet(transaction, this, key, /** @type {any} */ (value))\n      })\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimContent).set(key, value)\n    }\n    return value\n  }\n\n  /**\n   * Returns a specified element from this YMap.\n   *\n   * @param {string} key\n   * @return {MapType|undefined}\n   */\n  get (key) {\n    return /** @type {any} */ (typeMapGet(this, key))\n  }\n\n  /**\n   * Returns a boolean indicating whether the specified key exists or not.\n   *\n   * @param {string} key The key to test.\n   * @return {boolean}\n   */\n  has (key) {\n    return typeMapHas(this, key)\n  }\n\n  /**\n   * Removes all elements from this YMap.\n   */\n  clear () {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        this.forEach(function (_value, key, map) {\n          typeMapDelete(transaction, map, key)\n        })\n      })\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimContent).clear()\n    }\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YMapRefID)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n *\n * @private\n * @function\n */\nexport const readYMap = _decoder => new YMap()\n", "\n/**\n * @module YText\n */\n\nimport {\n  YEvent,\n  AbstractType,\n  getItemCleanStart,\n  getState,\n  isVisible,\n  createID,\n  YTextRefID,\n  callTypeObservers,\n  transact,\n  ContentEmbed,\n  GC,\n  ContentFormat,\n  ContentString,\n  splitSnapshotAffectedStructs,\n  iterateDeletedStructs,\n  iterateStructs,\n  findMarker,\n  typeMapDelete,\n  typeMapSet,\n  typeMapGet,\n  typeMapGetAll,\n  updateMarkerChanges,\n  ContentType,\n  ArraySearchMarker, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, ID, Doc, Item, Snapshot, Transaction // eslint-disable-line\n} from '../internals.js'\n\nimport * as object from 'lib0/object'\nimport * as map from 'lib0/map'\nimport * as error from 'lib0/error'\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nconst equalAttrs = (a, b) => a === b || (typeof a === 'object' && typeof b === 'object' && a && b && object.equalFlat(a, b))\n\nexport class ItemTextListPosition {\n  /**\n   * @param {Item|null} left\n   * @param {Item|null} right\n   * @param {number} index\n   * @param {Map<string,any>} currentAttributes\n   */\n  constructor (left, right, index, currentAttributes) {\n    this.left = left\n    this.right = right\n    this.index = index\n    this.currentAttributes = currentAttributes\n  }\n\n  /**\n   * Only call this if you know that this.right is defined\n   */\n  forward () {\n    if (this.right === null) {\n      error.unexpectedCase()\n    }\n    switch (this.right.content.constructor) {\n      case ContentFormat:\n        if (!this.right.deleted) {\n          updateCurrentAttributes(this.currentAttributes, /** @type {ContentFormat} */ (this.right.content))\n        }\n        break\n      default:\n        if (!this.right.deleted) {\n          this.index += this.right.length\n        }\n        break\n    }\n    this.left = this.right\n    this.right = this.right.right\n  }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {ItemTextListPosition} pos\n * @param {number} count steps to move forward\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst findNextPosition = (transaction, pos, count) => {\n  while (pos.right !== null && count > 0) {\n    switch (pos.right.content.constructor) {\n      case ContentFormat:\n        if (!pos.right.deleted) {\n          updateCurrentAttributes(pos.currentAttributes, /** @type {ContentFormat} */ (pos.right.content))\n        }\n        break\n      default:\n        if (!pos.right.deleted) {\n          if (count < pos.right.length) {\n            // split right\n            getItemCleanStart(transaction, createID(pos.right.id.client, pos.right.id.clock + count))\n          }\n          pos.index += pos.right.length\n          count -= pos.right.length\n        }\n        break\n    }\n    pos.left = pos.right\n    pos.right = pos.right.right\n    // pos.forward() - we don't forward because that would halve the performance because we already do the checks above\n  }\n  return pos\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst findPosition = (transaction, parent, index) => {\n  const currentAttributes = new Map()\n  const marker = findMarker(parent, index)\n  if (marker) {\n    const pos = new ItemTextListPosition(marker.p.left, marker.p, marker.index, currentAttributes)\n    return findNextPosition(transaction, pos, index - marker.index)\n  } else {\n    const pos = new ItemTextListPosition(null, parent._start, 0, currentAttributes)\n    return findNextPosition(transaction, pos, index)\n  }\n}\n\n/**\n * Negate applied formats\n *\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {Map<string,any>} negatedAttributes\n *\n * @private\n * @function\n */\nconst insertNegatedAttributes = (transaction, parent, currPos, negatedAttributes) => {\n  // check if we really need to remove attributes\n  while (\n    currPos.right !== null && (\n      currPos.right.deleted === true || (\n        currPos.right.content.constructor === ContentFormat &&\n        equalAttrs(negatedAttributes.get(/** @type {ContentFormat} */ (currPos.right.content).key), /** @type {ContentFormat} */ (currPos.right.content).value)\n      )\n    )\n  ) {\n    if (!currPos.right.deleted) {\n      negatedAttributes.delete(/** @type {ContentFormat} */ (currPos.right.content).key)\n    }\n    currPos.forward()\n  }\n  const doc = transaction.doc\n  const ownClientId = doc.clientID\n  negatedAttributes.forEach((val, key) => {\n    const left = currPos.left\n    const right = currPos.right\n    const nextFormat = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val))\n    nextFormat.integrate(transaction, 0)\n    currPos.right = nextFormat\n    currPos.forward()\n  })\n}\n\n/**\n * @param {Map<string,any>} currentAttributes\n * @param {ContentFormat} format\n *\n * @private\n * @function\n */\nconst updateCurrentAttributes = (currentAttributes, format) => {\n  const { key, value } = format\n  if (value === null) {\n    currentAttributes.delete(key)\n  } else {\n    currentAttributes.set(key, value)\n  }\n}\n\n/**\n * @param {ItemTextListPosition} currPos\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n */\nconst minimizeAttributeChanges = (currPos, attributes) => {\n  // go right while attributes[right.key] === right.value (or right is deleted)\n  while (true) {\n    if (currPos.right === null) {\n      break\n    } else if (currPos.right.deleted || (currPos.right.content.constructor === ContentFormat && equalAttrs(attributes[(/** @type {ContentFormat} */ (currPos.right.content)).key] || null, /** @type {ContentFormat} */ (currPos.right.content).value))) {\n      //\n    } else {\n      break\n    }\n    currPos.forward()\n  }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {Object<string,any>} attributes\n * @return {Map<string,any>}\n *\n * @private\n * @function\n **/\nconst insertAttributes = (transaction, parent, currPos, attributes) => {\n  const doc = transaction.doc\n  const ownClientId = doc.clientID\n  const negatedAttributes = new Map()\n  // insert format-start items\n  for (const key in attributes) {\n    const val = attributes[key]\n    const currentVal = currPos.currentAttributes.get(key) || null\n    if (!equalAttrs(currentVal, val)) {\n      // save negated attribute (set null if currentVal undefined)\n      negatedAttributes.set(key, currentVal)\n      const { left, right } = currPos\n      currPos.right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val))\n      currPos.right.integrate(transaction, 0)\n      currPos.forward()\n    }\n  }\n  return negatedAttributes\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {string|object|AbstractType<any>} text\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n **/\nconst insertText = (transaction, parent, currPos, text, attributes) => {\n  currPos.currentAttributes.forEach((_val, key) => {\n    if (attributes[key] === undefined) {\n      attributes[key] = null\n    }\n  })\n  const doc = transaction.doc\n  const ownClientId = doc.clientID\n  minimizeAttributeChanges(currPos, attributes)\n  const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes)\n  // insert content\n  const content = text.constructor === String ? new ContentString(/** @type {string} */ (text)) : (text instanceof AbstractType ? new ContentType(text) : new ContentEmbed(text))\n  let { left, right, index } = currPos\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, currPos.index, content.getLength())\n  }\n  right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, content)\n  right.integrate(transaction, 0)\n  currPos.right = right\n  currPos.index = index\n  currPos.forward()\n  insertNegatedAttributes(transaction, parent, currPos, negatedAttributes)\n}\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {number} length\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n */\nconst formatText = (transaction, parent, currPos, length, attributes) => {\n  const doc = transaction.doc\n  const ownClientId = doc.clientID\n  minimizeAttributeChanges(currPos, attributes)\n  const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes)\n  // iterate until first non-format or null is found\n  // delete all formats with attributes[format.key] != null\n  // also check the attributes after the first non-format as we do not want to insert redundant negated attributes there\n  // eslint-disable-next-line no-labels\n  iterationLoop: while (\n    currPos.right !== null &&\n    (length > 0 ||\n      (\n        negatedAttributes.size > 0 &&\n        (currPos.right.deleted || currPos.right.content.constructor === ContentFormat)\n      )\n    )\n  ) {\n    if (!currPos.right.deleted) {\n      switch (currPos.right.content.constructor) {\n        case ContentFormat: {\n          const { key, value } = /** @type {ContentFormat} */ (currPos.right.content)\n          const attr = attributes[key]\n          if (attr !== undefined) {\n            if (equalAttrs(attr, value)) {\n              negatedAttributes.delete(key)\n            } else {\n              if (length === 0) {\n                // no need to further extend negatedAttributes\n                // eslint-disable-next-line no-labels\n                break iterationLoop\n              }\n              negatedAttributes.set(key, value)\n            }\n            currPos.right.delete(transaction)\n          } else {\n            currPos.currentAttributes.set(key, value)\n          }\n          break\n        }\n        default:\n          if (length < currPos.right.length) {\n            getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length))\n          }\n          length -= currPos.right.length\n          break\n      }\n    }\n    currPos.forward()\n  }\n  // Quill just assumes that the editor starts with a newline and that it always\n  // ends with a newline. We only insert that newline when a new newline is\n  // inserted - i.e when length is bigger than type.length\n  if (length > 0) {\n    let newlines = ''\n    for (; length > 0; length--) {\n      newlines += '\\n'\n    }\n    currPos.right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), currPos.left, currPos.left && currPos.left.lastId, currPos.right, currPos.right && currPos.right.id, parent, null, new ContentString(newlines))\n    currPos.right.integrate(transaction, 0)\n    currPos.forward()\n  }\n  insertNegatedAttributes(transaction, parent, currPos, negatedAttributes)\n}\n\n/**\n * Call this function after string content has been deleted in order to\n * clean up formatting Items.\n *\n * @param {Transaction} transaction\n * @param {Item} start\n * @param {Item|null} curr exclusive end, automatically iterates to the next Content Item\n * @param {Map<string,any>} startAttributes\n * @param {Map<string,any>} currAttributes\n * @return {number} The amount of formatting Items deleted.\n *\n * @function\n */\nconst cleanupFormattingGap = (transaction, start, curr, startAttributes, currAttributes) => {\n  /**\n   * @type {Item|null}\n   */\n  let end = start\n  /**\n   * @type {Map<string,ContentFormat>}\n   */\n  const endFormats = map.create()\n  while (end && (!end.countable || end.deleted)) {\n    if (!end.deleted && end.content.constructor === ContentFormat) {\n      const cf = /** @type {ContentFormat} */ (end.content)\n      endFormats.set(cf.key, cf)\n    }\n    end = end.right\n  }\n  let cleanups = 0\n  let reachedCurr = false\n  while (start !== end) {\n    if (curr === start) {\n      reachedCurr = true\n    }\n    if (!start.deleted) {\n      const content = start.content\n      switch (content.constructor) {\n        case ContentFormat: {\n          const { key, value } = /** @type {ContentFormat} */ (content)\n          const startAttrValue = startAttributes.get(key) || null\n          if (endFormats.get(key) !== content || startAttrValue === value) {\n            // Either this format is overwritten or it is not necessary because the attribute already existed.\n            start.delete(transaction)\n            cleanups++\n            if (!reachedCurr && (currAttributes.get(key) || null) === value && startAttrValue !== value) {\n              if (startAttrValue === null) {\n                currAttributes.delete(key)\n              } else {\n                currAttributes.set(key, startAttrValue)\n              }\n            }\n          }\n          if (!reachedCurr && !start.deleted) {\n            updateCurrentAttributes(currAttributes, /** @type {ContentFormat} */ (content))\n          }\n          break\n        }\n      }\n    }\n    start = /** @type {Item} */ (start.right)\n  }\n  return cleanups\n}\n\n/**\n * @param {Transaction} transaction\n * @param {Item | null} item\n */\nconst cleanupContextlessFormattingGap = (transaction, item) => {\n  // iterate until item.right is null or content\n  while (item && item.right && (item.right.deleted || !item.right.countable)) {\n    item = item.right\n  }\n  const attrs = new Set()\n  // iterate back until a content item is found\n  while (item && (item.deleted || !item.countable)) {\n    if (!item.deleted && item.content.constructor === ContentFormat) {\n      const key = /** @type {ContentFormat} */ (item.content).key\n      if (attrs.has(key)) {\n        item.delete(transaction)\n      } else {\n        attrs.add(key)\n      }\n    }\n    item = item.left\n  }\n}\n\n/**\n * This function is experimental and subject to change / be removed.\n *\n * Ideally, we don't need this function at all. Formatting attributes should be cleaned up\n * automatically after each change. This function iterates twice over the complete YText type\n * and removes unnecessary formatting attributes. This is also helpful for testing.\n *\n * This function won't be exported anymore as soon as there is confidence that the YText type works as intended.\n *\n * @param {YText} type\n * @return {number} How many formatting attributes have been cleaned up.\n */\nexport const cleanupYTextFormatting = type => {\n  let res = 0\n  transact(/** @type {Doc} */ (type.doc), transaction => {\n    let start = /** @type {Item} */ (type._start)\n    let end = type._start\n    let startAttributes = map.create()\n    const currentAttributes = map.copy(startAttributes)\n    while (end) {\n      if (end.deleted === false) {\n        switch (end.content.constructor) {\n          case ContentFormat:\n            updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (end.content))\n            break\n          default:\n            res += cleanupFormattingGap(transaction, start, end, startAttributes, currentAttributes)\n            startAttributes = map.copy(currentAttributes)\n            start = end\n            break\n        }\n      }\n      end = end.right\n    }\n  })\n  return res\n}\n\n/**\n * This will be called by the transction once the event handlers are called to potentially cleanup\n * formatting attributes.\n *\n * @param {Transaction} transaction\n */\nexport const cleanupYTextAfterTransaction = transaction => {\n  /**\n   * @type {Set<YText>}\n   */\n  const needFullCleanup = new Set()\n  // check if another formatting item was inserted\n  const doc = transaction.doc\n  for (const [client, afterClock] of transaction.afterState.entries()) {\n    const clock = transaction.beforeState.get(client) || 0\n    if (afterClock === clock) {\n      continue\n    }\n    iterateStructs(transaction, /** @type {Array<Item|GC>} */ (doc.store.clients.get(client)), clock, afterClock, item => {\n      if (\n        !item.deleted && /** @type {Item} */ (item).content.constructor === ContentFormat && item.constructor !== GC\n      ) {\n        needFullCleanup.add(/** @type {any} */ (item).parent)\n      }\n    })\n  }\n  // cleanup in a new transaction\n  transact(doc, (t) => {\n    iterateDeletedStructs(transaction, transaction.deleteSet, item => {\n      if (item instanceof GC || !(/** @type {YText} */ (item.parent)._hasFormatting) || needFullCleanup.has(/** @type {YText} */ (item.parent))) {\n        return\n      }\n      const parent = /** @type {YText} */ (item.parent)\n      if (item.content.constructor === ContentFormat) {\n        needFullCleanup.add(parent)\n      } else {\n        // If no formatting attribute was inserted or deleted, we can make due with contextless\n        // formatting cleanups.\n        // Contextless: it is not necessary to compute currentAttributes for the affected position.\n        cleanupContextlessFormattingGap(t, item)\n      }\n    })\n    // If a formatting item was inserted, we simply clean the whole type.\n    // We need to compute currentAttributes for the current position anyway.\n    for (const yText of needFullCleanup) {\n      cleanupYTextFormatting(yText)\n    }\n  })\n}\n\n/**\n * @param {Transaction} transaction\n * @param {ItemTextListPosition} currPos\n * @param {number} length\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst deleteText = (transaction, currPos, length) => {\n  const startLength = length\n  const startAttrs = map.copy(currPos.currentAttributes)\n  const start = currPos.right\n  while (length > 0 && currPos.right !== null) {\n    if (currPos.right.deleted === false) {\n      switch (currPos.right.content.constructor) {\n        case ContentType:\n        case ContentEmbed:\n        case ContentString:\n          if (length < currPos.right.length) {\n            getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length))\n          }\n          length -= currPos.right.length\n          currPos.right.delete(transaction)\n          break\n      }\n    }\n    currPos.forward()\n  }\n  if (start) {\n    cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes)\n  }\n  const parent = /** @type {AbstractType<any>} */ (/** @type {Item} */ (currPos.left || currPos.right).parent)\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, currPos.index, -startLength + length)\n  }\n  return currPos\n}\n\n/**\n * The Quill Delta format represents changes on a text document with\n * formatting information. For mor information visit {@link https://quilljs.com/docs/delta/|Quill Delta}\n *\n * @example\n *   {\n *     ops: [\n *       { insert: 'Gandalf', attributes: { bold: true } },\n *       { insert: ' the ' },\n *       { insert: 'Grey', attributes: { color: '#cccccc' } }\n *     ]\n *   }\n *\n */\n\n/**\n  * Attributes that can be assigned to a selection of text.\n  *\n  * @example\n  *   {\n  *     bold: true,\n  *     font-size: '40px'\n  *   }\n  *\n  * @typedef {Object} TextAttributes\n  */\n\n/**\n * @extends YEvent<YText>\n * Event that describes the changes on a YText type.\n */\nexport class YTextEvent extends YEvent {\n  /**\n   * @param {YText} ytext\n   * @param {Transaction} transaction\n   * @param {Set<any>} subs The keys that changed\n   */\n  constructor (ytext, transaction, subs) {\n    super(ytext, transaction)\n    /**\n     * Whether the children changed.\n     * @type {Boolean}\n     * @private\n     */\n    this.childListChanged = false\n    /**\n     * Set of all changed attributes.\n     * @type {Set<string>}\n     */\n    this.keysChanged = new Set()\n    subs.forEach((sub) => {\n      if (sub === null) {\n        this.childListChanged = true\n      } else {\n        this.keysChanged.add(sub)\n      }\n    })\n  }\n\n  /**\n   * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}}\n   */\n  get changes () {\n    if (this._changes === null) {\n      /**\n       * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string|AbstractType<any>|object, delete?:number, retain?:number}>}}\n       */\n      const changes = {\n        keys: this.keys,\n        delta: this.delta,\n        added: new Set(),\n        deleted: new Set()\n      }\n      this._changes = changes\n    }\n    return /** @type {any} */ (this._changes)\n  }\n\n  /**\n   * Compute the changes in the delta format.\n   * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document.\n   *\n   * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}\n   *\n   * @public\n   */\n  get delta () {\n    if (this._delta === null) {\n      const y = /** @type {Doc} */ (this.target.doc)\n      /**\n       * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}\n       */\n      const delta = []\n      transact(y, transaction => {\n        const currentAttributes = new Map() // saves all current attributes for insert\n        const oldAttributes = new Map()\n        let item = this.target._start\n        /**\n         * @type {string?}\n         */\n        let action = null\n        /**\n         * @type {Object<string,any>}\n         */\n        const attributes = {} // counts added or removed new attributes for retain\n        /**\n         * @type {string|object}\n         */\n        let insert = ''\n        let retain = 0\n        let deleteLen = 0\n        const addOp = () => {\n          if (action !== null) {\n            /**\n             * @type {any}\n             */\n            let op = null\n            switch (action) {\n              case 'delete':\n                if (deleteLen > 0) {\n                  op = { delete: deleteLen }\n                }\n                deleteLen = 0\n                break\n              case 'insert':\n                if (typeof insert === 'object' || insert.length > 0) {\n                  op = { insert }\n                  if (currentAttributes.size > 0) {\n                    op.attributes = {}\n                    currentAttributes.forEach((value, key) => {\n                      if (value !== null) {\n                        op.attributes[key] = value\n                      }\n                    })\n                  }\n                }\n                insert = ''\n                break\n              case 'retain':\n                if (retain > 0) {\n                  op = { retain }\n                  if (!object.isEmpty(attributes)) {\n                    op.attributes = object.assign({}, attributes)\n                  }\n                }\n                retain = 0\n                break\n            }\n            if (op) delta.push(op)\n            action = null\n          }\n        }\n        while (item !== null) {\n          switch (item.content.constructor) {\n            case ContentType:\n            case ContentEmbed:\n              if (this.adds(item)) {\n                if (!this.deletes(item)) {\n                  addOp()\n                  action = 'insert'\n                  insert = item.content.getContent()[0]\n                  addOp()\n                }\n              } else if (this.deletes(item)) {\n                if (action !== 'delete') {\n                  addOp()\n                  action = 'delete'\n                }\n                deleteLen += 1\n              } else if (!item.deleted) {\n                if (action !== 'retain') {\n                  addOp()\n                  action = 'retain'\n                }\n                retain += 1\n              }\n              break\n            case ContentString:\n              if (this.adds(item)) {\n                if (!this.deletes(item)) {\n                  if (action !== 'insert') {\n                    addOp()\n                    action = 'insert'\n                  }\n                  insert += /** @type {ContentString} */ (item.content).str\n                }\n              } else if (this.deletes(item)) {\n                if (action !== 'delete') {\n                  addOp()\n                  action = 'delete'\n                }\n                deleteLen += item.length\n              } else if (!item.deleted) {\n                if (action !== 'retain') {\n                  addOp()\n                  action = 'retain'\n                }\n                retain += item.length\n              }\n              break\n            case ContentFormat: {\n              const { key, value } = /** @type {ContentFormat} */ (item.content)\n              if (this.adds(item)) {\n                if (!this.deletes(item)) {\n                  const curVal = currentAttributes.get(key) || null\n                  if (!equalAttrs(curVal, value)) {\n                    if (action === 'retain') {\n                      addOp()\n                    }\n                    if (equalAttrs(value, (oldAttributes.get(key) || null))) {\n                      delete attributes[key]\n                    } else {\n                      attributes[key] = value\n                    }\n                  } else if (value !== null) {\n                    item.delete(transaction)\n                  }\n                }\n              } else if (this.deletes(item)) {\n                oldAttributes.set(key, value)\n                const curVal = currentAttributes.get(key) || null\n                if (!equalAttrs(curVal, value)) {\n                  if (action === 'retain') {\n                    addOp()\n                  }\n                  attributes[key] = curVal\n                }\n              } else if (!item.deleted) {\n                oldAttributes.set(key, value)\n                const attr = attributes[key]\n                if (attr !== undefined) {\n                  if (!equalAttrs(attr, value)) {\n                    if (action === 'retain') {\n                      addOp()\n                    }\n                    if (value === null) {\n                      delete attributes[key]\n                    } else {\n                      attributes[key] = value\n                    }\n                  } else if (attr !== null) { // this will be cleaned up automatically by the contextless cleanup function\n                    item.delete(transaction)\n                  }\n                }\n              }\n              if (!item.deleted) {\n                if (action === 'insert') {\n                  addOp()\n                }\n                updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (item.content))\n              }\n              break\n            }\n          }\n          item = item.right\n        }\n        addOp()\n        while (delta.length > 0) {\n          const lastOp = delta[delta.length - 1]\n          if (lastOp.retain !== undefined && lastOp.attributes === undefined) {\n            // retain delta's if they don't assign attributes\n            delta.pop()\n          } else {\n            break\n          }\n        }\n      })\n      this._delta = delta\n    }\n    return /** @type {any} */ (this._delta)\n  }\n}\n\n/**\n * Type that represents text with formatting information.\n *\n * This type replaces y-richtext as this implementation is able to handle\n * block formats (format information on a paragraph), embeds (complex elements\n * like pictures and videos), and text formats (**bold**, *italic*).\n *\n * @extends AbstractType<YTextEvent>\n */\nexport class YText extends AbstractType {\n  /**\n   * @param {String} [string] The initial value of the YText.\n   */\n  constructor (string) {\n    super()\n    /**\n     * Array of pending operations on this type\n     * @type {Array<function():void>?}\n     */\n    this._pending = string !== undefined ? [() => this.insert(0, string)] : []\n    /**\n     * @type {Array<ArraySearchMarker>|null}\n     */\n    this._searchMarker = []\n    /**\n     * Whether this YText contains formatting attributes.\n     * This flag is updated when a formatting item is integrated (see ContentFormat.integrate)\n     */\n    this._hasFormatting = false\n  }\n\n  /**\n   * Number of characters of this text type.\n   *\n   * @type {number}\n   */\n  get length () {\n    return this._length\n  }\n\n  /**\n   * @param {Doc} y\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    try {\n      /** @type {Array<function>} */ (this._pending).forEach(f => f())\n    } catch (e) {\n      console.error(e)\n    }\n    this._pending = null\n  }\n\n  _copy () {\n    return new YText()\n  }\n\n  /**\n   * @return {YText}\n   */\n  clone () {\n    const text = new YText()\n    text.applyDelta(this.toDelta())\n    return text\n  }\n\n  /**\n   * Creates YTextEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    super._callObserver(transaction, parentSubs)\n    const event = new YTextEvent(this, transaction, parentSubs)\n    callTypeObservers(this, transaction, event)\n    // If a remote change happened, we try to cleanup potential formatting duplicates.\n    if (!transaction.local && this._hasFormatting) {\n      transaction._needFormattingCleanup = true\n    }\n  }\n\n  /**\n   * Returns the unformatted string representation of this YText type.\n   *\n   * @public\n   */\n  toString () {\n    let str = ''\n    /**\n     * @type {Item|null}\n     */\n    let n = this._start\n    while (n !== null) {\n      if (!n.deleted && n.countable && n.content.constructor === ContentString) {\n        str += /** @type {ContentString} */ (n.content).str\n      }\n      n = n.right\n    }\n    return str\n  }\n\n  /**\n   * Returns the unformatted string representation of this YText type.\n   *\n   * @return {string}\n   * @public\n   */\n  toJSON () {\n    return this.toString()\n  }\n\n  /**\n   * Apply a {@link Delta} on this shared YText type.\n   *\n   * @param {any} delta The changes to apply on this element.\n   * @param {object}  opts\n   * @param {boolean} [opts.sanitize] Sanitize input delta. Removes ending newlines if set to true.\n   *\n   *\n   * @public\n   */\n  applyDelta (delta, { sanitize = true } = {}) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        const currPos = new ItemTextListPosition(null, this._start, 0, new Map())\n        for (let i = 0; i < delta.length; i++) {\n          const op = delta[i]\n          if (op.insert !== undefined) {\n            // Quill assumes that the content starts with an empty paragraph.\n            // Yjs/Y.Text assumes that it starts empty. We always hide that\n            // there is a newline at the end of the content.\n            // If we omit this step, clients will see a different number of\n            // paragraphs, but nothing bad will happen.\n            const ins = (!sanitize && typeof op.insert === 'string' && i === delta.length - 1 && currPos.right === null && op.insert.slice(-1) === '\\n') ? op.insert.slice(0, -1) : op.insert\n            if (typeof ins !== 'string' || ins.length > 0) {\n              insertText(transaction, this, currPos, ins, op.attributes || {})\n            }\n          } else if (op.retain !== undefined) {\n            formatText(transaction, this, currPos, op.retain, op.attributes || {})\n          } else if (op.delete !== undefined) {\n            deleteText(transaction, currPos, op.delete)\n          }\n        }\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.applyDelta(delta))\n    }\n  }\n\n  /**\n   * Returns the Delta representation of this YText type.\n   *\n   * @param {Snapshot} [snapshot]\n   * @param {Snapshot} [prevSnapshot]\n   * @param {function('removed' | 'added', ID):any} [computeYChange]\n   * @return {any} The Delta representation of this type.\n   *\n   * @public\n   */\n  toDelta (snapshot, prevSnapshot, computeYChange) {\n    /**\n     * @type{Array<any>}\n     */\n    const ops = []\n    const currentAttributes = new Map()\n    const doc = /** @type {Doc} */ (this.doc)\n    let str = ''\n    let n = this._start\n    function packStr () {\n      if (str.length > 0) {\n        // pack str with attributes to ops\n        /**\n         * @type {Object<string,any>}\n         */\n        const attributes = {}\n        let addAttributes = false\n        currentAttributes.forEach((value, key) => {\n          addAttributes = true\n          attributes[key] = value\n        })\n        /**\n         * @type {Object<string,any>}\n         */\n        const op = { insert: str }\n        if (addAttributes) {\n          op.attributes = attributes\n        }\n        ops.push(op)\n        str = ''\n      }\n    }\n    const computeDelta = () => {\n      while (n !== null) {\n        if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) {\n          switch (n.content.constructor) {\n            case ContentString: {\n              const cur = currentAttributes.get('ychange')\n              if (snapshot !== undefined && !isVisible(n, snapshot)) {\n                if (cur === undefined || cur.user !== n.id.client || cur.type !== 'removed') {\n                  packStr()\n                  currentAttributes.set('ychange', computeYChange ? computeYChange('removed', n.id) : { type: 'removed' })\n                }\n              } else if (prevSnapshot !== undefined && !isVisible(n, prevSnapshot)) {\n                if (cur === undefined || cur.user !== n.id.client || cur.type !== 'added') {\n                  packStr()\n                  currentAttributes.set('ychange', computeYChange ? computeYChange('added', n.id) : { type: 'added' })\n                }\n              } else if (cur !== undefined) {\n                packStr()\n                currentAttributes.delete('ychange')\n              }\n              str += /** @type {ContentString} */ (n.content).str\n              break\n            }\n            case ContentType:\n            case ContentEmbed: {\n              packStr()\n              /**\n               * @type {Object<string,any>}\n               */\n              const op = {\n                insert: n.content.getContent()[0]\n              }\n              if (currentAttributes.size > 0) {\n                const attrs = /** @type {Object<string,any>} */ ({})\n                op.attributes = attrs\n                currentAttributes.forEach((value, key) => {\n                  attrs[key] = value\n                })\n              }\n              ops.push(op)\n              break\n            }\n            case ContentFormat:\n              if (isVisible(n, snapshot)) {\n                packStr()\n                updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (n.content))\n              }\n              break\n          }\n        }\n        n = n.right\n      }\n      packStr()\n    }\n    if (snapshot || prevSnapshot) {\n      // snapshots are merged again after the transaction, so we need to keep the\n      // transaction alive until we are done\n      transact(doc, transaction => {\n        if (snapshot) {\n          splitSnapshotAffectedStructs(transaction, snapshot)\n        }\n        if (prevSnapshot) {\n          splitSnapshotAffectedStructs(transaction, prevSnapshot)\n        }\n        computeDelta()\n      }, 'cleanup')\n    } else {\n      computeDelta()\n    }\n    return ops\n  }\n\n  /**\n   * Insert text at a given index.\n   *\n   * @param {number} index The index at which to start inserting.\n   * @param {String} text The text to insert at the specified position.\n   * @param {TextAttributes} [attributes] Optionally define some formatting\n   *                                    information to apply on the inserted\n   *                                    Text.\n   * @public\n   */\n  insert (index, text, attributes) {\n    if (text.length <= 0) {\n      return\n    }\n    const y = this.doc\n    if (y !== null) {\n      transact(y, transaction => {\n        const pos = findPosition(transaction, this, index)\n        if (!attributes) {\n          attributes = {}\n          // @ts-ignore\n          pos.currentAttributes.forEach((v, k) => { attributes[k] = v })\n        }\n        insertText(transaction, this, pos, text, attributes)\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.insert(index, text, attributes))\n    }\n  }\n\n  /**\n   * Inserts an embed at a index.\n   *\n   * @param {number} index The index to insert the embed at.\n   * @param {Object | AbstractType<any>} embed The Object that represents the embed.\n   * @param {TextAttributes} attributes Attribute information to apply on the\n   *                                    embed\n   *\n   * @public\n   */\n  insertEmbed (index, embed, attributes = {}) {\n    const y = this.doc\n    if (y !== null) {\n      transact(y, transaction => {\n        const pos = findPosition(transaction, this, index)\n        insertText(transaction, this, pos, embed, attributes)\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.insertEmbed(index, embed, attributes))\n    }\n  }\n\n  /**\n   * Deletes text starting from an index.\n   *\n   * @param {number} index Index at which to start deleting.\n   * @param {number} length The number of characters to remove. Defaults to 1.\n   *\n   * @public\n   */\n  delete (index, length) {\n    if (length === 0) {\n      return\n    }\n    const y = this.doc\n    if (y !== null) {\n      transact(y, transaction => {\n        deleteText(transaction, findPosition(transaction, this, index), length)\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.delete(index, length))\n    }\n  }\n\n  /**\n   * Assigns properties to a range of text.\n   *\n   * @param {number} index The position where to start formatting.\n   * @param {number} length The amount of characters to assign properties to.\n   * @param {TextAttributes} attributes Attribute information to apply on the\n   *                                    text.\n   *\n   * @public\n   */\n  format (index, length, attributes) {\n    if (length === 0) {\n      return\n    }\n    const y = this.doc\n    if (y !== null) {\n      transact(y, transaction => {\n        const pos = findPosition(transaction, this, index)\n        if (pos.right === null) {\n          return\n        }\n        formatText(transaction, this, pos, length, attributes)\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.format(index, length, attributes))\n    }\n  }\n\n  /**\n   * Removes an attribute.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @param {String} attributeName The attribute name that is to be removed.\n   *\n   * @public\n   */\n  removeAttribute (attributeName) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapDelete(transaction, this, attributeName)\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.removeAttribute(attributeName))\n    }\n  }\n\n  /**\n   * Sets or updates an attribute.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @param {String} attributeName The attribute name that is to be set.\n   * @param {any} attributeValue The attribute value that is to be set.\n   *\n   * @public\n   */\n  setAttribute (attributeName, attributeValue) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapSet(transaction, this, attributeName, attributeValue)\n      })\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.setAttribute(attributeName, attributeValue))\n    }\n  }\n\n  /**\n   * Returns an attribute value that belongs to the attribute name.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @param {String} attributeName The attribute name that identifies the\n   *                               queried value.\n   * @return {any} The queried attribute value.\n   *\n   * @public\n   */\n  getAttribute (attributeName) {\n    return /** @type {any} */ (typeMapGet(this, attributeName))\n  }\n\n  /**\n   * Returns all attribute name/value pairs in a JSON Object.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @return {Object<string, any>} A JSON Object that describes the attributes.\n   *\n   * @public\n   */\n  getAttributes () {\n    return typeMapGetAll(this)\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YTextRefID)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n * @return {YText}\n *\n * @private\n * @function\n */\nexport const readYText = _decoder => new YText()\n", "/**\n * @module YXml\n */\n\nimport {\n  YXmlEvent,\n  YXmlElement,\n  AbstractType,\n  typeListMap,\n  typeListForEach,\n  typeListInsertGenerics,\n  typeListInsertGenericsAfter,\n  typeListDelete,\n  typeListToArray,\n  YXmlFragmentRefID,\n  callTypeObservers,\n  transact,\n  typeListGet,\n  typeListSlice,\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, ContentType, Transaction, Item, YXmlText, YXmlHook // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\nimport * as array from 'lib0/array'\n\n/**\n * Define the elements to which a set of CSS queries apply.\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors|CSS_Selectors}\n *\n * @example\n *   query = '.classSelector'\n *   query = 'nodeSelector'\n *   query = '#idSelector'\n *\n * @typedef {string} CSS_Selector\n */\n\n/**\n * Dom filter function.\n *\n * @callback domFilter\n * @param {string} nodeName The nodeName of the element\n * @param {Map} attributes The map of attributes.\n * @return {boolean} Whether to include the Dom node in the YXmlElement.\n */\n\n/**\n * Represents a subset of the nodes of a YXmlElement / YXmlFragment and a\n * position within them.\n *\n * Can be created with {@link YXmlFragment#createTreeWalker}\n *\n * @public\n * @implements {Iterable<YXmlElement|YXmlText|YXmlElement|YXmlHook>}\n */\nexport class YXmlTreeWalker {\n  /**\n   * @param {YXmlFragment | YXmlElement} root\n   * @param {function(AbstractType<any>):boolean} [f]\n   */\n  constructor (root, f = () => true) {\n    this._filter = f\n    this._root = root\n    /**\n     * @type {Item}\n     */\n    this._currentNode = /** @type {Item} */ (root._start)\n    this._firstCall = true\n  }\n\n  [Symbol.iterator] () {\n    return this\n  }\n\n  /**\n   * Get the next node.\n   *\n   * @return {IteratorResult<YXmlElement|YXmlText|YXmlHook>} The next node.\n   *\n   * @public\n   */\n  next () {\n    /**\n     * @type {Item|null}\n     */\n    let n = this._currentNode\n    let type = n && n.content && /** @type {any} */ (n.content).type\n    if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) { // if first call, we check if we can use the first item\n      do {\n        type = /** @type {any} */ (n.content).type\n        if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) {\n          // walk down in the tree\n          n = type._start\n        } else {\n          // walk right or up in the tree\n          while (n !== null) {\n            if (n.right !== null) {\n              n = n.right\n              break\n            } else if (n.parent === this._root) {\n              n = null\n            } else {\n              n = /** @type {AbstractType<any>} */ (n.parent)._item\n            }\n          }\n        }\n      } while (n !== null && (n.deleted || !this._filter(/** @type {ContentType} */ (n.content).type)))\n    }\n    this._firstCall = false\n    if (n === null) {\n      // @ts-ignore\n      return { value: undefined, done: true }\n    }\n    this._currentNode = n\n    return { value: /** @type {any} */ (n.content).type, done: false }\n  }\n}\n\n/**\n * Represents a list of {@link YXmlElement}.and {@link YXmlText} types.\n * A YxmlFragment is similar to a {@link YXmlElement}, but it does not have a\n * nodeName and it does not have attributes. Though it can be bound to a DOM\n * element - in this case the attributes and the nodeName are not shared.\n *\n * @public\n * @extends AbstractType<YXmlEvent>\n */\nexport class YXmlFragment extends AbstractType {\n  constructor () {\n    super()\n    /**\n     * @type {Array<any>|null}\n     */\n    this._prelimContent = []\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get firstChild () {\n    const first = this._first\n    return first ? first.content.getContent()[0] : null\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    this.insert(0, /** @type {Array<any>} */ (this._prelimContent))\n    this._prelimContent = null\n  }\n\n  _copy () {\n    return new YXmlFragment()\n  }\n\n  /**\n   * @return {YXmlFragment}\n   */\n  clone () {\n    const el = new YXmlFragment()\n    // @ts-ignore\n    el.insert(0, this.toArray().map(item => item instanceof AbstractType ? item.clone() : item))\n    return el\n  }\n\n  get length () {\n    return this._prelimContent === null ? this._length : this._prelimContent.length\n  }\n\n  /**\n   * Create a subtree of childNodes.\n   *\n   * @example\n   * const walker = elem.createTreeWalker(dom => dom.nodeName === 'div')\n   * for (let node in walker) {\n   *   // `node` is a div node\n   *   nop(node)\n   * }\n   *\n   * @param {function(AbstractType<any>):boolean} filter Function that is called on each child element and\n   *                          returns a Boolean indicating whether the child\n   *                          is to be included in the subtree.\n   * @return {YXmlTreeWalker} A subtree and a position within it.\n   *\n   * @public\n   */\n  createTreeWalker (filter) {\n    return new YXmlTreeWalker(this, filter)\n  }\n\n  /**\n   * Returns the first YXmlElement that matches the query.\n   * Similar to DOM's {@link querySelector}.\n   *\n   * Query support:\n   *   - tagname\n   * TODO:\n   *   - id\n   *   - attribute\n   *\n   * @param {CSS_Selector} query The query on the children.\n   * @return {YXmlElement|YXmlText|YXmlHook|null} The first element that matches the query or null.\n   *\n   * @public\n   */\n  querySelector (query) {\n    query = query.toUpperCase()\n    // @ts-ignore\n    const iterator = new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query)\n    const next = iterator.next()\n    if (next.done) {\n      return null\n    } else {\n      return next.value\n    }\n  }\n\n  /**\n   * Returns all YXmlElements that match the query.\n   * Similar to Dom's {@link querySelectorAll}.\n   *\n   * @todo Does not yet support all queries. Currently only query by tagName.\n   *\n   * @param {CSS_Selector} query The query on the children\n   * @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query.\n   *\n   * @public\n   */\n  querySelectorAll (query) {\n    query = query.toUpperCase()\n    // @ts-ignore\n    return array.from(new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query))\n  }\n\n  /**\n   * Creates YXmlEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    callTypeObservers(this, transaction, new YXmlEvent(this, parentSubs, transaction))\n  }\n\n  /**\n   * Get the string representation of all the children of this YXmlFragment.\n   *\n   * @return {string} The string representation of all children.\n   */\n  toString () {\n    return typeListMap(this, xml => xml.toString()).join('')\n  }\n\n  /**\n   * @return {string}\n   */\n  toJSON () {\n    return this.toString()\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlElement.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type.\n   * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks = {}, binding) {\n    const fragment = _document.createDocumentFragment()\n    if (binding !== undefined) {\n      binding._createAssociation(fragment, this)\n    }\n    typeListForEach(this, xmlType => {\n      fragment.insertBefore(xmlType.toDOM(_document, hooks, binding), null)\n    })\n    return fragment\n  }\n\n  /**\n   * Inserts new content at an index.\n   *\n   * @example\n   *  // Insert character 'a' at position 0\n   *  xml.insert(0, [new Y.XmlText('text')])\n   *\n   * @param {number} index The index to insert content at\n   * @param {Array<YXmlElement|YXmlText>} content The array of content\n   */\n  insert (index, content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListInsertGenerics(transaction, this, index, content)\n      })\n    } else {\n      // @ts-ignore _prelimContent is defined because this is not yet integrated\n      this._prelimContent.splice(index, 0, ...content)\n    }\n  }\n\n  /**\n   * Inserts new content at an index.\n   *\n   * @example\n   *  // Insert character 'a' at position 0\n   *  xml.insert(0, [new Y.XmlText('text')])\n   *\n   * @param {null|Item|YXmlElement|YXmlText} ref The index to insert content at\n   * @param {Array<YXmlElement|YXmlText>} content The array of content\n   */\n  insertAfter (ref, content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        const refItem = (ref && ref instanceof AbstractType) ? ref._item : ref\n        typeListInsertGenericsAfter(transaction, this, refItem, content)\n      })\n    } else {\n      const pc = /** @type {Array<any>} */ (this._prelimContent)\n      const index = ref === null ? 0 : pc.findIndex(el => el === ref) + 1\n      if (index === 0 && ref !== null) {\n        throw error.create('Reference item not found')\n      }\n      pc.splice(index, 0, ...content)\n    }\n  }\n\n  /**\n   * Deletes elements starting from an index.\n   *\n   * @param {number} index Index at which to start deleting elements\n   * @param {number} [length=1] The number of elements to remove. Defaults to 1.\n   */\n  delete (index, length = 1) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListDelete(transaction, this, index, length)\n      })\n    } else {\n      // @ts-ignore _prelimContent is defined because this is not yet integrated\n      this._prelimContent.splice(index, length)\n    }\n  }\n\n  /**\n   * Transforms this YArray to a JavaScript Array.\n   *\n   * @return {Array<YXmlElement|YXmlText|YXmlHook>}\n   */\n  toArray () {\n    return typeListToArray(this)\n  }\n\n  /**\n   * Appends content to this YArray.\n   *\n   * @param {Array<YXmlElement|YXmlText>} content Array of content to append.\n   */\n  push (content) {\n    this.insert(this.length, content)\n  }\n\n  /**\n   * Preppends content to this YArray.\n   *\n   * @param {Array<YXmlElement|YXmlText>} content Array of content to preppend.\n   */\n  unshift (content) {\n    this.insert(0, content)\n  }\n\n  /**\n   * Returns the i-th element from a YArray.\n   *\n   * @param {number} index The index of the element to return from the YArray\n   * @return {YXmlElement|YXmlText}\n   */\n  get (index) {\n    return typeListGet(this, index)\n  }\n\n  /**\n   * Transforms this YArray to a JavaScript Array.\n   *\n   * @param {number} [start]\n   * @param {number} [end]\n   * @return {Array<YXmlElement|YXmlText>}\n   */\n  slice (start = 0, end = this.length) {\n    return typeListSlice(this, start, end)\n  }\n\n  /**\n   * Executes a provided function on once on overy child element.\n   *\n   * @param {function(YXmlElement|YXmlText,number, typeof self):void} f A function to execute on every element of this YArray.\n   */\n  forEach (f) {\n    typeListForEach(this, f)\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlFragmentRefID)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n * @return {YXmlFragment}\n *\n * @private\n * @function\n */\nexport const readYXmlFragment = _decoder => new YXmlFragment()\n", "import * as object from 'lib0/object'\n\nimport {\n  YXmlFragment,\n  transact,\n  typeMapDelete,\n  typeMapHas,\n  typeMapSet,\n  typeMapGet,\n  typeMapGetAll,\n  typeListForEach,\n  YXmlElementRefID,\n  YXmlText, ContentType, AbstractType, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Doc, Item // eslint-disable-line\n} from '../internals.js'\n\n/**\n * @typedef {Object|number|null|Array<any>|string|Uint8Array|AbstractType<any>} ValueTypes\n */\n\n/**\n * An YXmlElement imitates the behavior of a\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}.\n *\n * * An YXmlElement has attributes (key value pairs)\n * * An YXmlElement has childElements that must inherit from YXmlElement\n *\n * @template {{ [key: string]: ValueTypes }} [KV={ [key: string]: string }]\n */\nexport class YXmlElement extends YXmlFragment {\n  constructor (nodeName = 'UNDEFINED') {\n    super()\n    this.nodeName = nodeName\n    /**\n     * @type {Map<string, any>|null}\n     */\n    this._prelimAttrs = new Map()\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get nextSibling () {\n    const n = this._item ? this._item.next : null\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get prevSibling () {\n    const n = this._item ? this._item.prev : null\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    ;(/** @type {Map<string, any>} */ (this._prelimAttrs)).forEach((value, key) => {\n      this.setAttribute(key, value)\n    })\n    this._prelimAttrs = null\n  }\n\n  /**\n   * Creates an Item with the same effect as this Item (without position effect)\n   *\n   * @return {YXmlElement}\n   */\n  _copy () {\n    return new YXmlElement(this.nodeName)\n  }\n\n  /**\n   * @return {YXmlElement<KV>}\n   */\n  clone () {\n    /**\n     * @type {YXmlElement<KV>}\n     */\n    const el = new YXmlElement(this.nodeName)\n    const attrs = this.getAttributes()\n    object.forEach(attrs, (value, key) => {\n      if (typeof value === 'string') {\n        el.setAttribute(key, value)\n      }\n    })\n    // @ts-ignore\n    el.insert(0, this.toArray().map(item => item instanceof AbstractType ? item.clone() : item))\n    return el\n  }\n\n  /**\n   * Returns the XML serialization of this YXmlElement.\n   * The attributes are ordered by attribute-name, so you can easily use this\n   * method to compare YXmlElements\n   *\n   * @return {string} The string representation of this type.\n   *\n   * @public\n   */\n  toString () {\n    const attrs = this.getAttributes()\n    const stringBuilder = []\n    const keys = []\n    for (const key in attrs) {\n      keys.push(key)\n    }\n    keys.sort()\n    const keysLen = keys.length\n    for (let i = 0; i < keysLen; i++) {\n      const key = keys[i]\n      stringBuilder.push(key + '=\"' + attrs[key] + '\"')\n    }\n    const nodeName = this.nodeName.toLocaleLowerCase()\n    const attrsString = stringBuilder.length > 0 ? ' ' + stringBuilder.join(' ') : ''\n    return `<${nodeName}${attrsString}>${super.toString()}</${nodeName}>`\n  }\n\n  /**\n   * Removes an attribute from this YXmlElement.\n   *\n   * @param {string} attributeName The attribute name that is to be removed.\n   *\n   * @public\n   */\n  removeAttribute (attributeName) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapDelete(transaction, this, attributeName)\n      })\n    } else {\n      /** @type {Map<string,any>} */ (this._prelimAttrs).delete(attributeName)\n    }\n  }\n\n  /**\n   * Sets or updates an attribute.\n   *\n   * @template {keyof KV & string} KEY\n   *\n   * @param {KEY} attributeName The attribute name that is to be set.\n   * @param {KV[KEY]} attributeValue The attribute value that is to be set.\n   *\n   * @public\n   */\n  setAttribute (attributeName, attributeValue) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapSet(transaction, this, attributeName, attributeValue)\n      })\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimAttrs).set(attributeName, attributeValue)\n    }\n  }\n\n  /**\n   * Returns an attribute value that belongs to the attribute name.\n   *\n   * @template {keyof KV & string} KEY\n   *\n   * @param {KEY} attributeName The attribute name that identifies the\n   *                               queried value.\n   * @return {KV[KEY]|undefined} The queried attribute value.\n   *\n   * @public\n   */\n  getAttribute (attributeName) {\n    return /** @type {any} */ (typeMapGet(this, attributeName))\n  }\n\n  /**\n   * Returns whether an attribute exists\n   *\n   * @param {string} attributeName The attribute name to check for existence.\n   * @return {boolean} whether the attribute exists.\n   *\n   * @public\n   */\n  hasAttribute (attributeName) {\n    return /** @type {any} */ (typeMapHas(this, attributeName))\n  }\n\n  /**\n   * Returns all attribute name/value pairs in a JSON Object.\n   *\n   * @return {{ [Key in Extract<keyof KV,string>]?: KV[Key]}} A JSON Object that describes the attributes.\n   *\n   * @public\n   */\n  getAttributes () {\n    return /** @type {any} */ (typeMapGetAll(this))\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlElement.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type.\n   * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks = {}, binding) {\n    const dom = _document.createElement(this.nodeName)\n    const attrs = this.getAttributes()\n    for (const key in attrs) {\n      const value = attrs[key]\n      if (typeof value === 'string') {\n        dom.setAttribute(key, value)\n      }\n    }\n    typeListForEach(this, yxml => {\n      dom.appendChild(yxml.toDOM(_document, hooks, binding))\n    })\n    if (binding !== undefined) {\n      binding._createAssociation(dom, this)\n    }\n    return dom\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlElementRefID)\n    encoder.writeKey(this.nodeName)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlElement}\n *\n * @function\n */\nexport const readYXmlElement = decoder => new YXmlElement(decoder.readKey())\n", "\nimport {\n  YEvent,\n  YXmlText, YXmlElement, YXmlFragment, Transaction // eslint-disable-line\n} from '../internals.js'\n\n/**\n * @extends YEvent<YXmlElement|YXmlText|YXmlFragment>\n * An Event that describes changes on a YXml Element or Yxml Fragment\n */\nexport class YXmlEvent extends YEvent {\n  /**\n   * @param {YXmlElement|YXmlText|YXmlFragment} target The target on which the event is created.\n   * @param {Set<string|null>} subs The set of changed attributes. `null` is included if the\n   *                   child list changed.\n   * @param {Transaction} transaction The transaction instance with wich the\n   *                                  change was created.\n   */\n  constructor (target, subs, transaction) {\n    super(target, transaction)\n    /**\n     * Whether the children changed.\n     * @type {Boolean}\n     * @private\n     */\n    this.childListChanged = false\n    /**\n     * Set of all changed attributes.\n     * @type {Set<string>}\n     */\n    this.attributesChanged = new Set()\n    subs.forEach((sub) => {\n      if (sub === null) {\n        this.childListChanged = true\n      } else {\n        this.attributesChanged.add(sub)\n      }\n    })\n  }\n}\n", "\nimport {\n  YMap,\n  YXmlHookRefID,\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2 // eslint-disable-line\n} from '../internals.js'\n\n/**\n * You can manage binding to a custom type with YXmlHook.\n *\n * @extends {YMap<any>}\n */\nexport class YXmlHook extends YMap {\n  /**\n   * @param {string} hookName nodeName of the Dom Node.\n   */\n  constructor (hookName) {\n    super()\n    /**\n     * @type {string}\n     */\n    this.hookName = hookName\n  }\n\n  /**\n   * Creates an Item with the same effect as this Item (without position effect)\n   */\n  _copy () {\n    return new YXmlHook(this.hookName)\n  }\n\n  /**\n   * @return {YXmlHook}\n   */\n  clone () {\n    const el = new YXmlHook(this.hookName)\n    this.forEach((value, key) => {\n      el.set(key, value)\n    })\n    return el\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlElement.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object.<string, any>} [hooks] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type\n   * @return {Element} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks = {}, binding) {\n    const hook = hooks[this.hookName]\n    let dom\n    if (hook !== undefined) {\n      dom = hook.createDom(this)\n    } else {\n      dom = document.createElement(this.hookName)\n    }\n    dom.setAttribute('data-yjs-hook', this.hookName)\n    if (binding !== undefined) {\n      binding._createAssociation(dom, this)\n    }\n    return dom\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlHookRefID)\n    encoder.writeKey(this.hookName)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlHook}\n *\n * @private\n * @function\n */\nexport const readYXmlHook = decoder =>\n  new YXmlHook(decoder.readKey())\n", "\nimport {\n  YText,\n  YXmlTextRefID,\n  ContentType, YXmlElement, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, // eslint-disable-line\n} from '../internals.js'\n\n/**\n * Represents text in a Dom Element. In the future this type will also handle\n * simple formatting information like bold and italic.\n */\nexport class YXmlText extends YText {\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get nextSibling () {\n    const n = this._item ? this._item.next : null\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get prevSibling () {\n    const n = this._item ? this._item.prev : null\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  _copy () {\n    return new YXmlText()\n  }\n\n  /**\n   * @return {YXmlText}\n   */\n  clone () {\n    const text = new YXmlText()\n    text.applyDelta(this.toDelta())\n    return text\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlText.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object<string, any>} [hooks] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type.\n   * @return {Text} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks, binding) {\n    const dom = _document.createTextNode(this.toString())\n    if (binding !== undefined) {\n      binding._createAssociation(dom, this)\n    }\n    return dom\n  }\n\n  toString () {\n    // @ts-ignore\n    return this.toDelta().map(delta => {\n      const nestedNodes = []\n      for (const nodeName in delta.attributes) {\n        const attrs = []\n        for (const key in delta.attributes[nodeName]) {\n          attrs.push({ key, value: delta.attributes[nodeName][key] })\n        }\n        // sort attributes to get a unique order\n        attrs.sort((a, b) => a.key < b.key ? -1 : 1)\n        nestedNodes.push({ nodeName, attrs })\n      }\n      // sort node order to get a unique order\n      nestedNodes.sort((a, b) => a.nodeName < b.nodeName ? -1 : 1)\n      // now convert to dom string\n      let str = ''\n      for (let i = 0; i < nestedNodes.length; i++) {\n        const node = nestedNodes[i]\n        str += `<${node.nodeName}`\n        for (let j = 0; j < node.attrs.length; j++) {\n          const attr = node.attrs[j]\n          str += ` ${attr.key}=\"${attr.value}\"`\n        }\n        str += '>'\n      }\n      str += delta.insert\n      for (let i = nestedNodes.length - 1; i >= 0; i--) {\n        str += `</${nestedNodes[i].nodeName}>`\n      }\n      return str\n    }).join('')\n  }\n\n  /**\n   * @return {string}\n   */\n  toJSON () {\n    return this.toString()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlTextRefID)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlText}\n *\n * @private\n * @function\n */\nexport const readYXmlText = decoder => new YXmlText()\n", "\nimport {\n  UpdateEncoderV1, UpdateEncoderV2, ID, Transaction // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\n\nexport class AbstractStruct {\n  /**\n   * @param {ID} id\n   * @param {number} length\n   */\n  constructor (id, length) {\n    this.id = id\n    this.length = length\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get deleted () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * Merge this struct with the item to the right.\n   * This method is already assuming that `this.id.clock + this.length === this.id.clock`.\n   * Also this method does *not* remove right from StructStore!\n   * @param {AbstractStruct} right\n   * @return {boolean} wether this merged with right\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   * @param {number} offset\n   * @param {number} encodingRef\n   */\n  write (encoder, offset, encodingRef) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    throw error.methodUnimplemented()\n  }\n}\n", "\nimport {\n  AbstractStruct,\n  addStruct,\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, ID // eslint-disable-line\n} from '../internals.js'\n\nexport const structGCRefNumber = 0\n\n/**\n * @private\n */\nexport class GC extends AbstractStruct {\n  get deleted () {\n    return true\n  }\n\n  delete () {}\n\n  /**\n   * @param {GC} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    if (this.constructor !== right.constructor) {\n      return false\n    }\n    this.length += right.length\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    if (offset > 0) {\n      this.id.clock += offset\n      this.length -= offset\n    }\n    addStruct(transaction.doc.store, this)\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeInfo(structGCRefNumber)\n    encoder.writeLen(this.length - offset)\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {StructStore} store\n   * @return {null | number}\n   */\n  getMissing (transaction, store) {\n    return null\n  }\n}\n", "import {\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\n\nexport class ContentBinary {\n  /**\n   * @param {Uint8Array} content\n   */\n  constructor (content) {\n    this.content = content\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.content]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentBinary}\n   */\n  copy () {\n    return new ContentBinary(this.content)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentBinary}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentBinary} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeBuf(this.content)\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 3\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder\n * @return {ContentBinary}\n */\nexport const readContentBinary = decoder => new ContentBinary(decoder.readBuf())\n", "\nimport {\n  addToDeleteSet,\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line\n} from '../internals.js'\n\nexport class ContentDeleted {\n  /**\n   * @param {number} len\n   */\n  constructor (len) {\n    this.len = len\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.len\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return []\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return false\n  }\n\n  /**\n   * @return {ContentDeleted}\n   */\n  copy () {\n    return new ContentDeleted(this.len)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentDeleted}\n   */\n  splice (offset) {\n    const right = new ContentDeleted(this.len - offset)\n    this.len = offset\n    return right\n  }\n\n  /**\n   * @param {ContentDeleted} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.len += right.len\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {\n    addToDeleteSet(transaction.deleteSet, item.id.client, item.id.clock, this.len)\n    item.markDeleted()\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeLen(this.len - offset)\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 1\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder\n * @return {ContentDeleted}\n */\nexport const readContentDeleted = decoder => new ContentDeleted(decoder.readLen())\n", "\nimport {\n  Doc, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, Item // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\n\n/**\n * @param {string} guid\n * @param {Object<string, any>} opts\n */\nconst createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false })\n\n/**\n * @private\n */\nexport class ContentDoc {\n  /**\n   * @param {Doc} doc\n   */\n  constructor (doc) {\n    if (doc._item) {\n      console.error('This document was already integrated as a sub-document. You should create a second instance instead with the same guid.')\n    }\n    /**\n     * @type {Doc}\n     */\n    this.doc = doc\n    /**\n     * @type {any}\n     */\n    const opts = {}\n    this.opts = opts\n    if (!doc.gc) {\n      opts.gc = false\n    }\n    if (doc.autoLoad) {\n      opts.autoLoad = true\n    }\n    if (doc.meta !== null) {\n      opts.meta = doc.meta\n    }\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.doc]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentDoc}\n   */\n  copy () {\n    return new ContentDoc(createDocFromOpts(this.doc.guid, this.opts))\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentDoc}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentDoc} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {\n    // this needs to be reflected in doc.destroy as well\n    this.doc._item = item\n    transaction.subdocsAdded.add(this.doc)\n    if (this.doc.shouldLoad) {\n      transaction.subdocsLoaded.add(this.doc)\n    }\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {\n    if (transaction.subdocsAdded.has(this.doc)) {\n      transaction.subdocsAdded.delete(this.doc)\n    } else {\n      transaction.subdocsRemoved.add(this.doc)\n    }\n  }\n\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) { }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeString(this.doc.guid)\n    encoder.writeAny(this.opts)\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 9\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentDoc}\n */\nexport const readContentDoc = decoder => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny()))\n", "\nimport {\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Item, Transaction // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\n\n/**\n * @private\n */\nexport class ContentEmbed {\n  /**\n   * @param {Object} embed\n   */\n  constructor (embed) {\n    this.embed = embed\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.embed]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentEmbed}\n   */\n  copy () {\n    return new ContentEmbed(this.embed)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentEmbed}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentEmbed} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeJSON(this.embed)\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 5\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentEmbed}\n */\nexport const readContentEmbed = decoder => new ContentEmbed(decoder.readJSON())\n", "\nimport {\n  YText, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Item, StructStore, Transaction // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\n\n/**\n * @private\n */\nexport class ContentFormat {\n  /**\n   * @param {string} key\n   * @param {Object} value\n   */\n  constructor (key, value) {\n    this.key = key\n    this.value = value\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return []\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return false\n  }\n\n  /**\n   * @return {ContentFormat}\n   */\n  copy () {\n    return new ContentFormat(this.key, this.value)\n  }\n\n  /**\n   * @param {number} _offset\n   * @return {ContentFormat}\n   */\n  splice (_offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentFormat} _right\n   * @return {boolean}\n   */\n  mergeWith (_right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} _transaction\n   * @param {Item} item\n   */\n  integrate (_transaction, item) {\n    // @todo searchmarker are currently unsupported for rich text documents\n    const p = /** @type {YText} */ (item.parent)\n    p._searchMarker = null\n    p._hasFormatting = true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeKey(this.key)\n    encoder.writeJSON(this.value)\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 6\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentFormat}\n */\nexport const readContentFormat = decoder => new ContentFormat(decoder.readKey(), decoder.readJSON())\n", "import {\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Transaction, Item, StructStore // eslint-disable-line\n} from '../internals.js'\n\n/**\n * @private\n */\nexport class ContentJSON {\n  /**\n   * @param {Array<any>} arr\n   */\n  constructor (arr) {\n    /**\n     * @type {Array<any>}\n     */\n    this.arr = arr\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.arr.length\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return this.arr\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentJSON}\n   */\n  copy () {\n    return new ContentJSON(this.arr)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentJSON}\n   */\n  splice (offset) {\n    const right = new ContentJSON(this.arr.slice(offset))\n    this.arr = this.arr.slice(0, offset)\n    return right\n  }\n\n  /**\n   * @param {ContentJSON} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.arr = this.arr.concat(right.arr)\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    const len = this.arr.length\n    encoder.writeLen(len - offset)\n    for (let i = offset; i < len; i++) {\n      const c = this.arr[i]\n      encoder.writeString(c === undefined ? 'undefined' : JSON.stringify(c))\n    }\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 2\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentJSON}\n */\nexport const readContentJSON = decoder => {\n  const len = decoder.readLen()\n  const cs = []\n  for (let i = 0; i < len; i++) {\n    const c = decoder.readString()\n    if (c === 'undefined') {\n      cs.push(undefined)\n    } else {\n      cs.push(JSON.parse(c))\n    }\n  }\n  return new ContentJSON(cs)\n}\n", "import {\n  UpdateEncoderV1, UpdateEncoderV2, UpdateDecoderV1, UpdateDecoderV2, Transaction, Item, StructStore // eslint-disable-line\n} from '../internals.js'\n\nexport class ContentAny {\n  /**\n   * @param {Array<any>} arr\n   */\n  constructor (arr) {\n    /**\n     * @type {Array<any>}\n     */\n    this.arr = arr\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.arr.length\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return this.arr\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentAny}\n   */\n  copy () {\n    return new ContentAny(this.arr)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentAny}\n   */\n  splice (offset) {\n    const right = new ContentAny(this.arr.slice(offset))\n    this.arr = this.arr.slice(0, offset)\n    return right\n  }\n\n  /**\n   * @param {ContentAny} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.arr = this.arr.concat(right.arr)\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    const len = this.arr.length\n    encoder.writeLen(len - offset)\n    for (let i = offset; i < len; i++) {\n      const c = this.arr[i]\n      encoder.writeAny(c)\n    }\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 8\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentAny}\n */\nexport const readContentAny = decoder => {\n  const len = decoder.readLen()\n  const cs = []\n  for (let i = 0; i < len; i++) {\n    cs.push(decoder.readAny())\n  }\n  return new ContentAny(cs)\n}\n", "import {\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, Transaction, Item, StructStore // eslint-disable-line\n} from '../internals.js'\n\n/**\n * @private\n */\nexport class ContentString {\n  /**\n   * @param {string} str\n   */\n  constructor (str) {\n    /**\n     * @type {string}\n     */\n    this.str = str\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.str.length\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return this.str.split('')\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentString}\n   */\n  copy () {\n    return new ContentString(this.str)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentString}\n   */\n  splice (offset) {\n    const right = new ContentString(this.str.slice(offset))\n    this.str = this.str.slice(0, offset)\n\n    // Prevent encoding invalid documents because of splitting of surrogate pairs: https://github.com/yjs/yjs/issues/248\n    const firstCharCode = this.str.charCodeAt(offset - 1)\n    if (firstCharCode >= 0xD800 && firstCharCode <= 0xDBFF) {\n      // Last character of the left split is the start of a surrogate utf16/ucs2 pair.\n      // We don't support splitting of surrogate pairs because this may lead to invalid documents.\n      // Replace the invalid character with a unicode replacement character (� / U+FFFD)\n      this.str = this.str.slice(0, offset - 1) + '�'\n      // replace right as well\n      right.str = '�' + right.str.slice(1)\n    }\n    return right\n  }\n\n  /**\n   * @param {ContentString} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.str += right.str\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeString(offset === 0 ? this.str : this.str.slice(offset))\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 4\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentString}\n */\nexport const readContentString = decoder => new ContentString(decoder.readString())\n", "\nimport {\n  readYArray,\n  readYMap,\n  readYText,\n  readYXmlElement,\n  readYXmlFragment,\n  readYXmlHook,\n  readYXmlText,\n  UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, Item, YEvent, AbstractType // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\n\n/**\n * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractType<any>>}\n * @private\n */\nexport const typeRefs = [\n  readYArray,\n  readYMap,\n  readYText,\n  readYXmlElement,\n  readYXmlFragment,\n  readYXmlHook,\n  readYXmlText\n]\n\nexport const YArrayRefID = 0\nexport const YMapRefID = 1\nexport const YTextRefID = 2\nexport const YXmlElementRefID = 3\nexport const YXmlFragmentRefID = 4\nexport const YXmlHookRefID = 5\nexport const YXmlTextRefID = 6\n\n/**\n * @private\n */\nexport class ContentType {\n  /**\n   * @param {AbstractType<any>} type\n   */\n  constructor (type) {\n    /**\n     * @type {AbstractType<any>}\n     */\n    this.type = type\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.type]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentType}\n   */\n  copy () {\n    return new ContentType(this.type._copy())\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentType}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentType} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {\n    this.type._integrate(transaction.doc, item)\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {\n    let item = this.type._start\n    while (item !== null) {\n      if (!item.deleted) {\n        item.delete(transaction)\n      } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {\n        // This will be gc'd later and we want to merge it if possible\n        // We try to merge all deleted items after each transaction,\n        // but we have no knowledge about that this needs to be merged\n        // since it is not in transaction.ds. Hence we add it to transaction._mergeStructs\n        transaction._mergeStructs.push(item)\n      }\n      item = item.right\n    }\n    this.type._map.forEach(item => {\n      if (!item.deleted) {\n        item.delete(transaction)\n      } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {\n        // same as above\n        transaction._mergeStructs.push(item)\n      }\n    })\n    transaction.changed.delete(this.type)\n  }\n\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {\n    let item = this.type._start\n    while (item !== null) {\n      item.gc(store, true)\n      item = item.right\n    }\n    this.type._start = null\n    this.type._map.forEach(/** @param {Item | null} item */ (item) => {\n      while (item !== null) {\n        item.gc(store, true)\n        item = item.left\n      }\n    })\n    this.type._map = new Map()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    this.type._write(encoder)\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 7\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentType}\n */\nexport const readContentType = decoder => new ContentType(typeRefs[decoder.readTypeRef()](decoder))\n", "\nimport {\n  GC,\n  getState,\n  AbstractStruct,\n  replaceStruct,\n  addStruct,\n  addToDeleteSet,\n  findRootTypeKey,\n  compareIDs,\n  getItem,\n  getItemCleanEnd,\n  getItemCleanStart,\n  readContentDeleted,\n  readContentBinary,\n  readContentJSON,\n  readContentAny,\n  readContentString,\n  readContentEmbed,\n  readContentDoc,\n  createID,\n  readContentFormat,\n  readContentType,\n  addChangedTypeToTransaction,\n  isDeleted,\n  StackItem, DeleteSet, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, ContentType, ContentDeleted, StructStore, ID, AbstractType, Transaction // eslint-disable-line\n} from '../internals.js'\n\nimport * as error from 'lib0/error'\nimport * as binary from 'lib0/binary'\nimport * as array from 'lib0/array'\n\n/**\n * @todo This should return several items\n *\n * @param {StructStore} store\n * @param {ID} id\n * @return {{item:Item, diff:number}}\n */\nexport const followRedone = (store, id) => {\n  /**\n   * @type {ID|null}\n   */\n  let nextID = id\n  let diff = 0\n  let item\n  do {\n    if (diff > 0) {\n      nextID = createID(nextID.client, nextID.clock + diff)\n    }\n    item = getItem(store, nextID)\n    diff = nextID.clock - item.id.clock\n    nextID = item.redone\n  } while (nextID !== null && item instanceof Item)\n  return {\n    item, diff\n  }\n}\n\n/**\n * Make sure that neither item nor any of its parents is ever deleted.\n *\n * This property does not persist when storing it into a database or when\n * sending it to other peers\n *\n * @param {Item|null} item\n * @param {boolean} keep\n */\nexport const keepItem = (item, keep) => {\n  while (item !== null && item.keep !== keep) {\n    item.keep = keep\n    item = /** @type {AbstractType<any>} */ (item.parent)._item\n  }\n}\n\n/**\n * Split leftItem into two items\n * @param {Transaction} transaction\n * @param {Item} leftItem\n * @param {number} diff\n * @return {Item}\n *\n * @function\n * @private\n */\nexport const splitItem = (transaction, leftItem, diff) => {\n  // create rightItem\n  const { client, clock } = leftItem.id\n  const rightItem = new Item(\n    createID(client, clock + diff),\n    leftItem,\n    createID(client, clock + diff - 1),\n    leftItem.right,\n    leftItem.rightOrigin,\n    leftItem.parent,\n    leftItem.parentSub,\n    leftItem.content.splice(diff)\n  )\n  if (leftItem.deleted) {\n    rightItem.markDeleted()\n  }\n  if (leftItem.keep) {\n    rightItem.keep = true\n  }\n  if (leftItem.redone !== null) {\n    rightItem.redone = createID(leftItem.redone.client, leftItem.redone.clock + diff)\n  }\n  // update left (do not set leftItem.rightOrigin as it will lead to problems when syncing)\n  leftItem.right = rightItem\n  // update right\n  if (rightItem.right !== null) {\n    rightItem.right.left = rightItem\n  }\n  // right is more specific.\n  transaction._mergeStructs.push(rightItem)\n  // update parent._map\n  if (rightItem.parentSub !== null && rightItem.right === null) {\n    /** @type {AbstractType<any>} */ (rightItem.parent)._map.set(rightItem.parentSub, rightItem)\n  }\n  leftItem.length = diff\n  return rightItem\n}\n\n/**\n * @param {Array<StackItem>} stack\n * @param {ID} id\n */\nconst isDeletedByUndoStack = (stack, id) => array.some(stack, /** @param {StackItem} s */ s => isDeleted(s.deletions, id))\n\n/**\n * Redoes the effect of this operation.\n *\n * @param {Transaction} transaction The Yjs instance.\n * @param {Item} item\n * @param {Set<Item>} redoitems\n * @param {DeleteSet} itemsToDelete\n * @param {boolean} ignoreRemoteMapChanges\n * @param {import('../utils/UndoManager.js').UndoManager} um\n *\n * @return {Item|null}\n *\n * @private\n */\nexport const redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) => {\n  const doc = transaction.doc\n  const store = doc.store\n  const ownClientID = doc.clientID\n  const redone = item.redone\n  if (redone !== null) {\n    return getItemCleanStart(transaction, redone)\n  }\n  let parentItem = /** @type {AbstractType<any>} */ (item.parent)._item\n  /**\n   * @type {Item|null}\n   */\n  let left = null\n  /**\n   * @type {Item|null}\n   */\n  let right\n  // make sure that parent is redone\n  if (parentItem !== null && parentItem.deleted === true) {\n    // try to undo parent if it will be undone anyway\n    if (parentItem.redone === null && (!redoitems.has(parentItem) || redoItem(transaction, parentItem, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) === null)) {\n      return null\n    }\n    while (parentItem.redone !== null) {\n      parentItem = getItemCleanStart(transaction, parentItem.redone)\n    }\n  }\n  const parentType = parentItem === null ? /** @type {AbstractType<any>} */ (item.parent) : /** @type {ContentType} */ (parentItem.content).type\n\n  if (item.parentSub === null) {\n    // Is an array item. Insert at the old position\n    left = item.left\n    right = item\n    // find next cloned_redo items\n    while (left !== null) {\n      /**\n       * @type {Item|null}\n       */\n      let leftTrace = left\n      // trace redone until parent matches\n      while (leftTrace !== null && /** @type {AbstractType<any>} */ (leftTrace.parent)._item !== parentItem) {\n        leftTrace = leftTrace.redone === null ? null : getItemCleanStart(transaction, leftTrace.redone)\n      }\n      if (leftTrace !== null && /** @type {AbstractType<any>} */ (leftTrace.parent)._item === parentItem) {\n        left = leftTrace\n        break\n      }\n      left = left.left\n    }\n    while (right !== null) {\n      /**\n       * @type {Item|null}\n       */\n      let rightTrace = right\n      // trace redone until parent matches\n      while (rightTrace !== null && /** @type {AbstractType<any>} */ (rightTrace.parent)._item !== parentItem) {\n        rightTrace = rightTrace.redone === null ? null : getItemCleanStart(transaction, rightTrace.redone)\n      }\n      if (rightTrace !== null && /** @type {AbstractType<any>} */ (rightTrace.parent)._item === parentItem) {\n        right = rightTrace\n        break\n      }\n      right = right.right\n    }\n  } else {\n    right = null\n    if (item.right && !ignoreRemoteMapChanges) {\n      left = item\n      // Iterate right while right is in itemsToDelete\n      // If it is intended to delete right while item is redone, we can expect that item should replace right.\n      while (left !== null && left.right !== null && (left.right.redone || isDeleted(itemsToDelete, left.right.id) || isDeletedByUndoStack(um.undoStack, left.right.id) || isDeletedByUndoStack(um.redoStack, left.right.id))) {\n        left = left.right\n        // follow redone\n        while (left.redone) left = getItemCleanStart(transaction, left.redone)\n      }\n      if (left && left.right !== null) {\n        // It is not possible to redo this item because it conflicts with a\n        // change from another client\n        return null\n      }\n    } else {\n      left = parentType._map.get(item.parentSub) || null\n    }\n  }\n  const nextClock = getState(store, ownClientID)\n  const nextId = createID(ownClientID, nextClock)\n  const redoneItem = new Item(\n    nextId,\n    left, left && left.lastId,\n    right, right && right.id,\n    parentType,\n    item.parentSub,\n    item.content.copy()\n  )\n  item.redone = nextId\n  keepItem(redoneItem, true)\n  redoneItem.integrate(transaction, 0)\n  return redoneItem\n}\n\n/**\n * Abstract class that represents any content.\n */\nexport class Item extends AbstractStruct {\n  /**\n   * @param {ID} id\n   * @param {Item | null} left\n   * @param {ID | null} origin\n   * @param {Item | null} right\n   * @param {ID | null} rightOrigin\n   * @param {AbstractType<any>|ID|null} parent Is a type if integrated, is null if it is possible to copy parent from left or right, is ID before integration to search for it.\n   * @param {string | null} parentSub\n   * @param {AbstractContent} content\n   */\n  constructor (id, left, origin, right, rightOrigin, parent, parentSub, content) {\n    super(id, content.getLength())\n    /**\n     * The item that was originally to the left of this item.\n     * @type {ID | null}\n     */\n    this.origin = origin\n    /**\n     * The item that is currently to the left of this item.\n     * @type {Item | null}\n     */\n    this.left = left\n    /**\n     * The item that is currently to the right of this item.\n     * @type {Item | null}\n     */\n    this.right = right\n    /**\n     * The item that was originally to the right of this item.\n     * @type {ID | null}\n     */\n    this.rightOrigin = rightOrigin\n    /**\n     * @type {AbstractType<any>|ID|null}\n     */\n    this.parent = parent\n    /**\n     * If the parent refers to this item with some kind of key (e.g. YMap, the\n     * key is specified here. The key is then used to refer to the list in which\n     * to insert this item. If `parentSub = null` type._start is the list in\n     * which to insert to. Otherwise it is `parent._map`.\n     * @type {String | null}\n     */\n    this.parentSub = parentSub\n    /**\n     * If this type's effect is redone this type refers to the type that undid\n     * this operation.\n     * @type {ID | null}\n     */\n    this.redone = null\n    /**\n     * @type {AbstractContent}\n     */\n    this.content = content\n    /**\n     * bit1: keep\n     * bit2: countable\n     * bit3: deleted\n     * bit4: mark - mark node as fast-search-marker\n     * @type {number} byte\n     */\n    this.info = this.content.isCountable() ? binary.BIT2 : 0\n  }\n\n  /**\n   * This is used to mark the item as an indexed fast-search marker\n   *\n   * @type {boolean}\n   */\n  set marker (isMarked) {\n    if (((this.info & binary.BIT4) > 0) !== isMarked) {\n      this.info ^= binary.BIT4\n    }\n  }\n\n  get marker () {\n    return (this.info & binary.BIT4) > 0\n  }\n\n  /**\n   * If true, do not garbage collect this Item.\n   */\n  get keep () {\n    return (this.info & binary.BIT1) > 0\n  }\n\n  set keep (doKeep) {\n    if (this.keep !== doKeep) {\n      this.info ^= binary.BIT1\n    }\n  }\n\n  get countable () {\n    return (this.info & binary.BIT2) > 0\n  }\n\n  /**\n   * Whether this item was deleted or not.\n   * @type {Boolean}\n   */\n  get deleted () {\n    return (this.info & binary.BIT3) > 0\n  }\n\n  set deleted (doDelete) {\n    if (this.deleted !== doDelete) {\n      this.info ^= binary.BIT3\n    }\n  }\n\n  markDeleted () {\n    this.info |= binary.BIT3\n  }\n\n  /**\n   * Return the creator clientID of the missing op or define missing items and return null.\n   *\n   * @param {Transaction} transaction\n   * @param {StructStore} store\n   * @return {null | number}\n   */\n  getMissing (transaction, store) {\n    if (this.origin && this.origin.client !== this.id.client && this.origin.clock >= getState(store, this.origin.client)) {\n      return this.origin.client\n    }\n    if (this.rightOrigin && this.rightOrigin.client !== this.id.client && this.rightOrigin.clock >= getState(store, this.rightOrigin.client)) {\n      return this.rightOrigin.client\n    }\n    if (this.parent && this.parent.constructor === ID && this.id.client !== this.parent.client && this.parent.clock >= getState(store, this.parent.client)) {\n      return this.parent.client\n    }\n\n    // We have all missing ids, now find the items\n\n    if (this.origin) {\n      this.left = getItemCleanEnd(transaction, store, this.origin)\n      this.origin = this.left.lastId\n    }\n    if (this.rightOrigin) {\n      this.right = getItemCleanStart(transaction, this.rightOrigin)\n      this.rightOrigin = this.right.id\n    }\n    if ((this.left && this.left.constructor === GC) || (this.right && this.right.constructor === GC)) {\n      this.parent = null\n    }\n    // only set parent if this shouldn't be garbage collected\n    if (!this.parent) {\n      if (this.left && this.left.constructor === Item) {\n        this.parent = this.left.parent\n        this.parentSub = this.left.parentSub\n      }\n      if (this.right && this.right.constructor === Item) {\n        this.parent = this.right.parent\n        this.parentSub = this.right.parentSub\n      }\n    } else if (this.parent.constructor === ID) {\n      const parentItem = getItem(store, this.parent)\n      if (parentItem.constructor === GC) {\n        this.parent = null\n      } else {\n        this.parent = /** @type {ContentType} */ (parentItem.content).type\n      }\n    }\n    return null\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    if (offset > 0) {\n      this.id.clock += offset\n      this.left = getItemCleanEnd(transaction, transaction.doc.store, createID(this.id.client, this.id.clock - 1))\n      this.origin = this.left.lastId\n      this.content = this.content.splice(offset)\n      this.length -= offset\n    }\n\n    if (this.parent) {\n      if ((!this.left && (!this.right || this.right.left !== null)) || (this.left && this.left.right !== this.right)) {\n        /**\n         * @type {Item|null}\n         */\n        let left = this.left\n\n        /**\n         * @type {Item|null}\n         */\n        let o\n        // set o to the first conflicting item\n        if (left !== null) {\n          o = left.right\n        } else if (this.parentSub !== null) {\n          o = /** @type {AbstractType<any>} */ (this.parent)._map.get(this.parentSub) || null\n          while (o !== null && o.left !== null) {\n            o = o.left\n          }\n        } else {\n          o = /** @type {AbstractType<any>} */ (this.parent)._start\n        }\n        // TODO: use something like DeleteSet here (a tree implementation would be best)\n        // @todo use global set definitions\n        /**\n         * @type {Set<Item>}\n         */\n        const conflictingItems = new Set()\n        /**\n         * @type {Set<Item>}\n         */\n        const itemsBeforeOrigin = new Set()\n        // Let c in conflictingItems, b in itemsBeforeOrigin\n        // ***{origin}bbbb{this}{c,b}{c,b}{o}***\n        // Note that conflictingItems is a subset of itemsBeforeOrigin\n        while (o !== null && o !== this.right) {\n          itemsBeforeOrigin.add(o)\n          conflictingItems.add(o)\n          if (compareIDs(this.origin, o.origin)) {\n            // case 1\n            if (o.id.client < this.id.client) {\n              left = o\n              conflictingItems.clear()\n            } else if (compareIDs(this.rightOrigin, o.rightOrigin)) {\n              // this and o are conflicting and point to the same integration points. The id decides which item comes first.\n              // Since this is to the left of o, we can break here\n              break\n            } // else, o might be integrated before an item that this conflicts with. If so, we will find it in the next iterations\n          } else if (o.origin !== null && itemsBeforeOrigin.has(getItem(transaction.doc.store, o.origin))) { // use getItem instead of getItemCleanEnd because we don't want / need to split items.\n            // case 2\n            if (!conflictingItems.has(getItem(transaction.doc.store, o.origin))) {\n              left = o\n              conflictingItems.clear()\n            }\n          } else {\n            break\n          }\n          o = o.right\n        }\n        this.left = left\n      }\n      // reconnect left/right + update parent map/start if necessary\n      if (this.left !== null) {\n        const right = this.left.right\n        this.right = right\n        this.left.right = this\n      } else {\n        let r\n        if (this.parentSub !== null) {\n          r = /** @type {AbstractType<any>} */ (this.parent)._map.get(this.parentSub) || null\n          while (r !== null && r.left !== null) {\n            r = r.left\n          }\n        } else {\n          r = /** @type {AbstractType<any>} */ (this.parent)._start\n          ;/** @type {AbstractType<any>} */ (this.parent)._start = this\n        }\n        this.right = r\n      }\n      if (this.right !== null) {\n        this.right.left = this\n      } else if (this.parentSub !== null) {\n        // set as current parent value if right === null and this is parentSub\n        /** @type {AbstractType<any>} */ (this.parent)._map.set(this.parentSub, this)\n        if (this.left !== null) {\n          // this is the current attribute value of parent. delete right\n          this.left.delete(transaction)\n        }\n      }\n      // adjust length of parent\n      if (this.parentSub === null && this.countable && !this.deleted) {\n        /** @type {AbstractType<any>} */ (this.parent)._length += this.length\n      }\n      addStruct(transaction.doc.store, this)\n      this.content.integrate(transaction, this)\n      // add parent to transaction.changed\n      addChangedTypeToTransaction(transaction, /** @type {AbstractType<any>} */ (this.parent), this.parentSub)\n      if ((/** @type {AbstractType<any>} */ (this.parent)._item !== null && /** @type {AbstractType<any>} */ (this.parent)._item.deleted) || (this.parentSub !== null && this.right !== null)) {\n        // delete if parent is deleted or if this is not the current attribute value of parent\n        this.delete(transaction)\n      }\n    } else {\n      // parent is not defined. Integrate GC struct instead\n      new GC(this.id, this.length).integrate(transaction, 0)\n    }\n  }\n\n  /**\n   * Returns the next non-deleted item\n   */\n  get next () {\n    let n = this.right\n    while (n !== null && n.deleted) {\n      n = n.right\n    }\n    return n\n  }\n\n  /**\n   * Returns the previous non-deleted item\n   */\n  get prev () {\n    let n = this.left\n    while (n !== null && n.deleted) {\n      n = n.left\n    }\n    return n\n  }\n\n  /**\n   * Computes the last content address of this Item.\n   */\n  get lastId () {\n    // allocating ids is pretty costly because of the amount of ids created, so we try to reuse whenever possible\n    return this.length === 1 ? this.id : createID(this.id.client, this.id.clock + this.length - 1)\n  }\n\n  /**\n   * Try to merge two items\n   *\n   * @param {Item} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    if (\n      this.constructor === right.constructor &&\n      compareIDs(right.origin, this.lastId) &&\n      this.right === right &&\n      compareIDs(this.rightOrigin, right.rightOrigin) &&\n      this.id.client === right.id.client &&\n      this.id.clock + this.length === right.id.clock &&\n      this.deleted === right.deleted &&\n      this.redone === null &&\n      right.redone === null &&\n      this.content.constructor === right.content.constructor &&\n      this.content.mergeWith(right.content)\n    ) {\n      const searchMarker = /** @type {AbstractType<any>} */ (this.parent)._searchMarker\n      if (searchMarker) {\n        searchMarker.forEach(marker => {\n          if (marker.p === right) {\n            // right is going to be \"forgotten\" so we need to update the marker\n            marker.p = this\n            // adjust marker index\n            if (!this.deleted && this.countable) {\n              marker.index -= this.length\n            }\n          }\n        })\n      }\n      if (right.keep) {\n        this.keep = true\n      }\n      this.right = right.right\n      if (this.right !== null) {\n        this.right.left = this\n      }\n      this.length += right.length\n      return true\n    }\n    return false\n  }\n\n  /**\n   * Mark this Item as deleted.\n   *\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {\n    if (!this.deleted) {\n      const parent = /** @type {AbstractType<any>} */ (this.parent)\n      // adjust the length of parent\n      if (this.countable && this.parentSub === null) {\n        parent._length -= this.length\n      }\n      this.markDeleted()\n      addToDeleteSet(transaction.deleteSet, this.id.client, this.id.clock, this.length)\n      addChangedTypeToTransaction(transaction, parent, this.parentSub)\n      this.content.delete(transaction)\n    }\n  }\n\n  /**\n   * @param {StructStore} store\n   * @param {boolean} parentGCd\n   */\n  gc (store, parentGCd) {\n    if (!this.deleted) {\n      throw error.unexpectedCase()\n    }\n    this.content.gc(store)\n    if (parentGCd) {\n      replaceStruct(store, this, new GC(this.id, this.length))\n    } else {\n      this.content = new ContentDeleted(this.length)\n    }\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    const origin = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin\n    const rightOrigin = this.rightOrigin\n    const parentSub = this.parentSub\n    const info = (this.content.getRef() & binary.BITS5) |\n      (origin === null ? 0 : binary.BIT8) | // origin is defined\n      (rightOrigin === null ? 0 : binary.BIT7) | // right origin is defined\n      (parentSub === null ? 0 : binary.BIT6) // parentSub is non-null\n    encoder.writeInfo(info)\n    if (origin !== null) {\n      encoder.writeLeftID(origin)\n    }\n    if (rightOrigin !== null) {\n      encoder.writeRightID(rightOrigin)\n    }\n    if (origin === null && rightOrigin === null) {\n      const parent = /** @type {AbstractType<any>} */ (this.parent)\n      if (parent._item !== undefined) {\n        const parentItem = parent._item\n        if (parentItem === null) {\n          // parent type on y._map\n          // find the correct key\n          const ykey = findRootTypeKey(parent)\n          encoder.writeParentInfo(true) // write parentYKey\n          encoder.writeString(ykey)\n        } else {\n          encoder.writeParentInfo(false) // write parent id\n          encoder.writeLeftID(parentItem.id)\n        }\n      } else if (parent.constructor === String) { // this edge case was added by differential updates\n        encoder.writeParentInfo(true) // write parentYKey\n        encoder.writeString(parent)\n      } else if (parent.constructor === ID) {\n        encoder.writeParentInfo(false) // write parent id\n        encoder.writeLeftID(parent)\n      } else {\n        error.unexpectedCase()\n      }\n      if (parentSub !== null) {\n        encoder.writeString(parentSub)\n      }\n    }\n    this.content.write(encoder, offset)\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @param {number} info\n */\nexport const readItemContent = (decoder, info) => contentRefs[info & binary.BITS5](decoder)\n\n/**\n * A lookup map for reading Item content.\n *\n * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractContent>}\n */\nexport const contentRefs = [\n  () => { error.unexpectedCase() }, // GC is not ItemContent\n  readContentDeleted, // 1\n  readContentJSON, // 2\n  readContentBinary, // 3\n  readContentString, // 4\n  readContentEmbed, // 5\n  readContentFormat, // 6\n  readContentType, // 7\n  readContentAny, // 8\n  readContentDoc, // 9\n  () => { error.unexpectedCase() } // 10 - Skip is not ItemContent\n]\n\n/**\n * Do not implement this class!\n */\nexport class AbstractContent {\n  /**\n   * @return {number}\n   */\n  getLength () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * Should return false if this Item is some kind of meta information\n   * (e.g. format information).\n   *\n   * * Whether this Item should be addressable via `yarray.get(i)`\n   * * Whether this Item should be counted when computing yarray.length\n   *\n   * @return {boolean}\n   */\n  isCountable () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @return {AbstractContent}\n   */\n  copy () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {number} _offset\n   * @return {AbstractContent}\n   */\n  splice (_offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {AbstractContent} _right\n   * @return {boolean}\n   */\n  mergeWith (_right) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {Transaction} _transaction\n   * @param {Item} _item\n   */\n  integrate (_transaction, _item) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {Transaction} _transaction\n   */\n  delete (_transaction) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {StructStore} _store\n   */\n  gc (_store) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder\n   * @param {number} _offset\n   */\n  write (_encoder, _offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    throw error.methodUnimplemented()\n  }\n}\n", "\nimport {\n  AbstractStruct,\n  UpdateEncoderV1, UpdateEncoderV2, StructStore, Transaction, ID // eslint-disable-line\n} from '../internals.js'\nimport * as error from 'lib0/error'\nimport * as encoding from 'lib0/encoding'\n\nexport const structSkipRefNumber = 10\n\n/**\n * @private\n */\nexport class Skip extends AbstractStruct {\n  get deleted () {\n    return true\n  }\n\n  delete () {}\n\n  /**\n   * @param {Skip} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    if (this.constructor !== right.constructor) {\n      return false\n    }\n    this.length += right.length\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    // skip structs cannot be integrated\n    error.unexpectedCase()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeInfo(structSkipRefNumber)\n    // write as VarUint because Skips can't make use of predictable length-encoding\n    encoding.writeVarUint(encoder.restEncoder, this.length - offset)\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {StructStore} store\n   * @return {null | number}\n   */\n  getMissing (transaction, store) {\n    return null\n  }\n}\n", "/** eslint-env browser */\n\nexport {\n  Doc,\n  Transaction,\n  YArray as Array,\n  YMap as Map,\n  YText as Text,\n  YXmlText as XmlText,\n  YXmlHook as XmlHook,\n  YXmlElement as XmlElement,\n  YXmlFragment as XmlFragment,\n  YXmlEvent,\n  YMapEvent,\n  YArrayEvent,\n  YTextEvent,\n  YEvent,\n  Item,\n  AbstractStruct,\n  GC,\n  ContentBinary,\n  ContentDeleted,\n  ContentEmbed,\n  ContentFormat,\n  ContentJSON,\n  ContentAny,\n  ContentString,\n  ContentType,\n  AbstractType,\n  getTypeChildren,\n  createRelativePositionFromTypeIndex,\n  createRelativePositionFromJSON,\n  createAbsolutePositionFromRelativePosition,\n  compareRelativePositions,\n  AbsolutePosition,\n  RelativePosition,\n  ID,\n  createID,\n  compareIDs,\n  getState,\n  Snapshot,\n  createSnapshot,\n  createDeleteSet,\n  createDeleteSetFromStructStore,\n  cleanupYTextFormatting,\n  snapshot,\n  emptySnapshot,\n  findRootTypeKey,\n  findIndexSS,\n  getItem,\n  typeListToArraySnapshot,\n  typeMapGetSnapshot,\n  createDocFromSnapshot,\n  iterateDeletedStructs,\n  applyUpdate,\n  applyUpdateV2,\n  readUpdate,\n  readUpdateV2,\n  encodeStateAsUpdate,\n  encodeStateAsUpdateV2,\n  encodeStateVector,\n  UndoManager,\n  decodeSnapshot,\n  encodeSnapshot,\n  decodeSnapshotV2,\n  encodeSnapshotV2,\n  decodeStateVector,\n  logUpdate,\n  logUpdateV2,\n  decodeUpdate,\n  decodeUpdateV2,\n  relativePositionToJSON,\n  isDeleted,\n  isParentOf,\n  equalSnapshots,\n  PermanentUserData, // @TODO experimental\n  tryGc,\n  transact,\n  AbstractConnector,\n  logType,\n  mergeUpdates,\n  mergeUpdatesV2,\n  parseUpdateMeta,\n  parseUpdateMetaV2,\n  encodeStateVectorFromUpdate,\n  encodeStateVectorFromUpdateV2,\n  encodeRelativePosition,\n  decodeRelativePosition,\n  diffUpdate,\n  diffUpdateV2,\n  convertUpdateFormatV1ToV2,\n  convertUpdateFormatV2ToV1,\n  obfuscateUpdate,\n  obfuscateUpdateV2,\n  UpdateEncoderV1,\n  equalDeleteSets,\n  snapshotContainsUpdate\n} from './internals.js'\n\nconst glo = /** @type {any} */ (typeof globalThis !== 'undefined'\n  ? globalThis\n  : typeof window !== 'undefined'\n    ? window\n    // @ts-ignore\n    : typeof global !== 'undefined' ? global : {})\n\nconst importIdentifier = '__ $YJS$ __'\n\nif (glo[importIdentifier] === true) {\n  /**\n   * Dear reader of this message. Please take this seriously.\n   *\n   * If you see this message, make sure that you only import one version of Yjs. In many cases,\n   * your package manager installs two versions of Yjs that are used by different packages within your project.\n   * Another reason for this message is that some parts of your project use the commonjs version of Yjs\n   * and others use the EcmaScript version of Yjs.\n   *\n   * This often leads to issues that are hard to debug. We often need to perform constructor checks,\n   * e.g. `struct instanceof GC`. If you imported different versions of Yjs, it is impossible for us to\n   * do the constructor checks anymore - which might break the CRDT algorithm.\n   *\n   * https://github.com/yjs/yjs/issues/438\n   */\n  console.error('Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438')\n}\nglo[importIdentifier] = true\n", "// File copied https://github.com/slab/delta/blob/main/src/Delta.ts with changes:\n// - fast-diff swapped out for 'diff',\n// - lodash.clonedeep is replaced with JSON parse / stringify\n// - lodash.isequal is replaced with fast-deep-equal.\n\n// @ts-ignore\n/**\n * External dependencies\n */\nimport type { Change } from 'diff';\nimport { diffChars } from 'diff';\nimport { default as isEqual } from 'fast-deep-equal/es6';\n\n/**\n * Internal dependencies\n */\nimport AttributeMap from './AttributeMap';\nimport Op from './Op';\nimport OpIterator from './OpIterator';\n\nfunction cloneDeep< T >( value: T ): T {\n\treturn JSON.parse( JSON.stringify( value ) ) as T;\n}\n\nconst NULL_CHARACTER = String.fromCharCode( 0 ); // Placeholder char for embed in diff()\n\ninterface EmbedHandler< T > {\n\tcompose: ( a: T, b: T, keepNull: boolean ) => T;\n\tinvert: ( a: T, b: T ) => T;\n\ttransform: ( a: T, b: T, priority: boolean ) => T;\n}\n\nconst getEmbedTypeAndData = (\n\ta: Op[ 'insert' ] | Op[ 'retain' ],\n\tb: Op[ 'insert' ]\n): [ string, unknown, unknown ] => {\n\tif ( typeof a !== 'object' || a === null ) {\n\t\tthrow new Error( `cannot retain a ${ typeof a }` );\n\t}\n\tif ( typeof b !== 'object' || b === null ) {\n\t\tthrow new Error( `cannot retain a ${ typeof b }` );\n\t}\n\tconst embedType = Object.keys( a )[ 0 ];\n\tif ( ! embedType || embedType !== Object.keys( b )[ 0 ] ) {\n\t\tthrow new Error(\n\t\t\t`embed types not matched: ${ embedType } != ${\n\t\t\t\tObject.keys( b )[ 0 ]\n\t\t\t}`\n\t\t);\n\t}\n\treturn [ embedType, a[ embedType ], b[ embedType ] ];\n};\n\nclass Delta {\n\tstatic Op = Op;\n\tstatic OpIterator = OpIterator;\n\tstatic AttributeMap = AttributeMap;\n\tprivate static handlers: {\n\t\t[ embedType: string ]: EmbedHandler< unknown >;\n\t} = {};\n\n\tstatic registerEmbed< T >(\n\t\tembedType: string,\n\t\thandler: EmbedHandler< T >\n\t): void {\n\t\tthis.handlers[ embedType ] = handler as EmbedHandler< unknown >;\n\t}\n\n\tstatic unregisterEmbed( embedType: string ): void {\n\t\tdelete this.handlers[ embedType ];\n\t}\n\n\tprivate static getHandler( embedType: string ): EmbedHandler< unknown > {\n\t\tconst handler = this.handlers[ embedType ];\n\t\tif ( ! handler ) {\n\t\t\tthrow new Error( `no handlers for embed type \"${ embedType }\"` );\n\t\t}\n\t\treturn handler;\n\t}\n\n\tops: Op[];\n\tconstructor( ops?: Op[] | { ops: Op[] } ) {\n\t\t// Assume we are given a well formed ops\n\t\tif ( Array.isArray( ops ) ) {\n\t\t\tthis.ops = ops;\n\t\t} else if (\n\t\t\tops !== null &&\n\t\t\tops !== undefined &&\n\t\t\tArray.isArray( ops.ops )\n\t\t) {\n\t\t\tthis.ops = ops.ops;\n\t\t} else {\n\t\t\tthis.ops = [];\n\t\t}\n\t}\n\n\tinsert(\n\t\targ: string | Record< string, unknown >,\n\t\tattributes?: AttributeMap | null\n\t): this {\n\t\tconst newOp: Op = {};\n\t\tif ( typeof arg === 'string' && arg.length === 0 ) {\n\t\t\treturn this;\n\t\t}\n\t\tnewOp.insert = arg;\n\t\tif (\n\t\t\tattributes !== null &&\n\t\t\tattributes !== undefined &&\n\t\t\ttypeof attributes === 'object' &&\n\t\t\tObject.keys( attributes ).length > 0\n\t\t) {\n\t\t\tnewOp.attributes = attributes;\n\t\t}\n\t\treturn this.push( newOp );\n\t}\n\n\tdelete( length: number ): this {\n\t\tif ( length <= 0 ) {\n\t\t\treturn this;\n\t\t}\n\t\treturn this.push( { delete: length } );\n\t}\n\n\tretain(\n\t\tlength: number | Record< string, unknown >,\n\t\tattributes?: AttributeMap | null\n\t): this {\n\t\tif ( typeof length === 'number' && length <= 0 ) {\n\t\t\treturn this;\n\t\t}\n\t\tconst newOp: Op = { retain: length };\n\t\tif (\n\t\t\tattributes !== null &&\n\t\t\tattributes !== undefined &&\n\t\t\ttypeof attributes === 'object' &&\n\t\t\tObject.keys( attributes ).length > 0\n\t\t) {\n\t\t\tnewOp.attributes = attributes;\n\t\t}\n\t\treturn this.push( newOp );\n\t}\n\n\tpush( newOp: Op ): this {\n\t\tlet index = this.ops.length;\n\t\tlet lastOp = this.ops[ index - 1 ];\n\t\tnewOp = cloneDeep( newOp );\n\t\tif ( typeof lastOp === 'object' ) {\n\t\t\tif (\n\t\t\t\ttypeof newOp.delete === 'number' &&\n\t\t\t\ttypeof lastOp.delete === 'number'\n\t\t\t) {\n\t\t\t\tthis.ops[ index - 1 ] = {\n\t\t\t\t\tdelete: lastOp.delete + newOp.delete,\n\t\t\t\t};\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t// Since it does not matter if we insert before or after deleting at the same index,\n\t\t\t// always prefer to insert first\n\t\t\tif (\n\t\t\t\ttypeof lastOp.delete === 'number' &&\n\t\t\t\tnewOp.insert !== null &&\n\t\t\t\tnewOp.insert !== undefined\n\t\t\t) {\n\t\t\t\tindex -= 1;\n\t\t\t\tlastOp = this.ops[ index - 1 ];\n\t\t\t\tif ( typeof lastOp !== 'object' ) {\n\t\t\t\t\tthis.ops.unshift( newOp );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( isEqual( newOp.attributes, lastOp.attributes ) ) {\n\t\t\t\tif (\n\t\t\t\t\ttypeof newOp.insert === 'string' &&\n\t\t\t\t\ttypeof lastOp.insert === 'string'\n\t\t\t\t) {\n\t\t\t\t\tthis.ops[ index - 1 ] = {\n\t\t\t\t\t\tinsert: lastOp.insert + newOp.insert,\n\t\t\t\t\t};\n\t\t\t\t\tif ( typeof newOp.attributes === 'object' ) {\n\t\t\t\t\t\tthis.ops[ index - 1 ].attributes = newOp.attributes;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof newOp.retain === 'number' &&\n\t\t\t\t\ttypeof lastOp.retain === 'number'\n\t\t\t\t) {\n\t\t\t\t\tthis.ops[ index - 1 ] = {\n\t\t\t\t\t\tretain: lastOp.retain + newOp.retain,\n\t\t\t\t\t};\n\t\t\t\t\tif ( typeof newOp.attributes === 'object' ) {\n\t\t\t\t\t\tthis.ops[ index - 1 ].attributes = newOp.attributes;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ( index === this.ops.length ) {\n\t\t\tthis.ops.push( newOp );\n\t\t} else {\n\t\t\tthis.ops.splice( index, 0, newOp );\n\t\t}\n\t\treturn this;\n\t}\n\n\tchop(): this {\n\t\tconst lastOp = this.ops[ this.ops.length - 1 ];\n\t\tif (\n\t\t\tlastOp &&\n\t\t\ttypeof lastOp.retain === 'number' &&\n\t\t\t! lastOp.attributes\n\t\t) {\n\t\t\tthis.ops.pop();\n\t\t}\n\t\treturn this;\n\t}\n\n\tfilter( predicate: ( op: Op, index: number ) => boolean ): Op[] {\n\t\treturn this.ops.filter( predicate );\n\t}\n\n\tforEach( predicate: ( op: Op, index: number ) => void ): void {\n\t\tthis.ops.forEach( predicate );\n\t}\n\n\tmap< T >( predicate: ( op: Op, index: number ) => T ): T[] {\n\t\treturn this.ops.map( predicate );\n\t}\n\n\tpartition( predicate: ( op: Op ) => boolean ): [ Op[], Op[] ] {\n\t\tconst passed: Op[] = [];\n\t\tconst failed: Op[] = [];\n\t\tthis.forEach( ( op ) => {\n\t\t\tconst target = predicate( op ) ? passed : failed;\n\t\t\ttarget.push( op );\n\t\t} );\n\t\treturn [ passed, failed ];\n\t}\n\n\treduce< T >(\n\t\tpredicate: ( accum: T, curr: Op, index: number ) => T,\n\t\tinitialValue: T\n\t): T {\n\t\treturn this.ops.reduce( predicate, initialValue );\n\t}\n\n\tchangeLength(): number {\n\t\treturn this.reduce( ( length, elem ) => {\n\t\t\tif ( elem.insert ) {\n\t\t\t\treturn length + Op.length( elem );\n\t\t\t} else if ( elem.delete ) {\n\t\t\t\treturn length - elem.delete;\n\t\t\t}\n\t\t\treturn length;\n\t\t}, 0 );\n\t}\n\n\tlength(): number {\n\t\treturn this.reduce( ( length, elem ) => {\n\t\t\treturn length + Op.length( elem );\n\t\t}, 0 );\n\t}\n\n\tslice( start = 0, end = Infinity ): Delta {\n\t\tconst ops = [];\n\t\tconst iter = new OpIterator( this.ops );\n\t\tlet index = 0;\n\t\twhile ( index < end && iter.hasNext() ) {\n\t\t\tlet nextOp;\n\t\t\tif ( index < start ) {\n\t\t\t\tnextOp = iter.next( start - index );\n\t\t\t} else {\n\t\t\t\tnextOp = iter.next( end - index );\n\t\t\t\tops.push( nextOp );\n\t\t\t}\n\t\t\tindex += Op.length( nextOp );\n\t\t}\n\t\treturn new Delta( ops );\n\t}\n\n\tcompose( other: Delta ): Delta {\n\t\tconst thisIter = new OpIterator( this.ops );\n\t\tconst otherIter = new OpIterator( other.ops );\n\t\tconst ops = [];\n\t\tconst firstOther = otherIter.peek();\n\t\tif (\n\t\t\tfirstOther !== null &&\n\t\t\tfirstOther !== undefined &&\n\t\t\ttypeof firstOther.retain === 'number' &&\n\t\t\t( firstOther.attributes === null ||\n\t\t\t\tfirstOther.attributes === undefined )\n\t\t) {\n\t\t\tlet firstLeft = firstOther.retain;\n\t\t\twhile (\n\t\t\t\tthisIter.peekType() === 'insert' &&\n\t\t\t\tthisIter.peekLength() <= firstLeft\n\t\t\t) {\n\t\t\t\tfirstLeft -= thisIter.peekLength();\n\t\t\t\tops.push( thisIter.next() );\n\t\t\t}\n\t\t\tif ( firstOther.retain - firstLeft > 0 ) {\n\t\t\t\totherIter.next( firstOther.retain - firstLeft );\n\t\t\t}\n\t\t}\n\t\tconst delta = new Delta( ops );\n\t\twhile ( thisIter.hasNext() || otherIter.hasNext() ) {\n\t\t\tif ( otherIter.peekType() === 'insert' ) {\n\t\t\t\tdelta.push( otherIter.next() );\n\t\t\t} else if ( thisIter.peekType() === 'delete' ) {\n\t\t\t\tdelta.push( thisIter.next() );\n\t\t\t} else {\n\t\t\t\tconst length = Math.min(\n\t\t\t\t\tthisIter.peekLength(),\n\t\t\t\t\totherIter.peekLength()\n\t\t\t\t);\n\t\t\t\tconst thisOp = thisIter.next( length );\n\t\t\t\tconst otherOp = otherIter.next( length );\n\t\t\t\tif ( otherOp.retain ) {\n\t\t\t\t\tconst newOp: Op = {};\n\t\t\t\t\tif ( typeof thisOp.retain === 'number' ) {\n\t\t\t\t\t\tnewOp.retain =\n\t\t\t\t\t\t\ttypeof otherOp.retain === 'number'\n\t\t\t\t\t\t\t\t? length\n\t\t\t\t\t\t\t\t: otherOp.retain;\n\t\t\t\t\t} else if ( typeof otherOp.retain === 'number' ) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthisOp.retain === null ||\n\t\t\t\t\t\t\tthisOp.retain === undefined\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnewOp.insert = thisOp.insert;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnewOp.retain = thisOp.retain;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst action =\n\t\t\t\t\t\t\tthisOp.retain === null ||\n\t\t\t\t\t\t\tthisOp.retain === undefined\n\t\t\t\t\t\t\t\t? 'insert'\n\t\t\t\t\t\t\t\t: 'retain';\n\t\t\t\t\t\tconst [ embedType, thisData, otherData ] =\n\t\t\t\t\t\t\tgetEmbedTypeAndData(\n\t\t\t\t\t\t\t\tthisOp[ action ],\n\t\t\t\t\t\t\t\totherOp.retain\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tconst handler = Delta.getHandler( embedType );\n\t\t\t\t\t\tnewOp[ action ] = {\n\t\t\t\t\t\t\t[ embedType ]: handler.compose(\n\t\t\t\t\t\t\t\tthisData,\n\t\t\t\t\t\t\t\totherData,\n\t\t\t\t\t\t\t\taction === 'retain'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\t// Preserve null when composing with a retain, otherwise remove it for inserts\n\t\t\t\t\tconst attributes = AttributeMap.compose(\n\t\t\t\t\t\tthisOp.attributes,\n\t\t\t\t\t\totherOp.attributes,\n\t\t\t\t\t\ttypeof thisOp.retain === 'number'\n\t\t\t\t\t);\n\t\t\t\t\tif ( attributes ) {\n\t\t\t\t\t\tnewOp.attributes = attributes;\n\t\t\t\t\t}\n\t\t\t\t\tdelta.push( newOp );\n\n\t\t\t\t\t// Optimization if rest of other is just retain\n\t\t\t\t\tif (\n\t\t\t\t\t\t! otherIter.hasNext() &&\n\t\t\t\t\t\tisEqual( delta.ops[ delta.ops.length - 1 ], newOp )\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst rest = new Delta( thisIter.rest() );\n\t\t\t\t\t\treturn delta.concat( rest ).chop();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Other op should be delete, we could be an insert or retain\n\t\t\t\t\t// Insert + delete cancels out\n\t\t\t\t} else if (\n\t\t\t\t\ttypeof otherOp.delete === 'number' &&\n\t\t\t\t\t( typeof thisOp.retain === 'number' ||\n\t\t\t\t\t\t( typeof thisOp.retain === 'object' &&\n\t\t\t\t\t\t\tthisOp.retain !== null ) )\n\t\t\t\t) {\n\t\t\t\t\tdelta.push( otherOp );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn delta.chop();\n\t}\n\n\tconcat( other: Delta ): Delta {\n\t\tconst delta = new Delta( this.ops.slice() );\n\t\tif ( other.ops.length > 0 ) {\n\t\t\tdelta.push( other.ops[ 0 ] );\n\t\t\tdelta.ops = delta.ops.concat( other.ops.slice( 1 ) );\n\t\t}\n\t\treturn delta;\n\t}\n\n\tdiff( other: Delta ): Delta {\n\t\tif ( this.ops === other.ops ) {\n\t\t\treturn new Delta();\n\t\t}\n\t\tconst strings = this.deltasToStrings( other );\n\t\tconst diffResult = diffChars( strings[ 0 ], strings[ 1 ] );\n\t\tconst thisIter = new OpIterator( this.ops );\n\t\tconst otherIter = new OpIterator( other.ops );\n\t\tconst retDelta = this.convertChangesToDelta(\n\t\t\tdiffResult,\n\t\t\tthisIter,\n\t\t\totherIter\n\t\t);\n\n\t\treturn retDelta.chop();\n\t}\n\n\teachLine(\n\t\tpredicate: (\n\t\t\tline: Delta,\n\t\t\tattributes: AttributeMap,\n\t\t\tindex: number\n\t\t) => boolean | void,\n\t\tnewline = '\\n'\n\t): void {\n\t\tconst iter = new OpIterator( this.ops );\n\t\tlet line = new Delta();\n\t\tlet i = 0;\n\t\twhile ( iter.hasNext() ) {\n\t\t\tif ( iter.peekType() !== 'insert' ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst thisOp = iter.peek();\n\t\t\tconst start = Op.length( thisOp ) - iter.peekLength();\n\t\t\tconst index =\n\t\t\t\ttypeof thisOp.insert === 'string'\n\t\t\t\t\t? thisOp.insert.indexOf( newline, start ) - start\n\t\t\t\t\t: -1;\n\t\t\tif ( index < 0 ) {\n\t\t\t\tline.push( iter.next() );\n\t\t\t} else if ( index > 0 ) {\n\t\t\t\tline.push( iter.next( index ) );\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tpredicate( line, iter.next( 1 ).attributes || {}, i ) ===\n\t\t\t\t\tfalse\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ti += 1;\n\t\t\t\tline = new Delta();\n\t\t\t}\n\t\t}\n\t\tif ( line.length() > 0 ) {\n\t\t\tpredicate( line, {}, i );\n\t\t}\n\t}\n\n\tinvert( base: Delta ): Delta {\n\t\tconst inverted = new Delta();\n\t\tthis.reduce( ( baseIndex, op ) => {\n\t\t\tif ( op.insert ) {\n\t\t\t\tinverted.delete( Op.length( op ) );\n\t\t\t} else if (\n\t\t\t\ttypeof op.retain === 'number' &&\n\t\t\t\t( op.attributes === null || op.attributes === undefined )\n\t\t\t) {\n\t\t\t\tinverted.retain( op.retain );\n\t\t\t\treturn baseIndex + op.retain;\n\t\t\t} else if ( op.delete || typeof op.retain === 'number' ) {\n\t\t\t\tconst length = ( op.delete || op.retain ) as number;\n\t\t\t\tconst slice = base.slice( baseIndex, baseIndex + length );\n\t\t\t\tslice.forEach( ( baseOp ) => {\n\t\t\t\t\tif ( op.delete ) {\n\t\t\t\t\t\tinverted.push( baseOp );\n\t\t\t\t\t} else if ( op.retain && op.attributes ) {\n\t\t\t\t\t\tinverted.retain(\n\t\t\t\t\t\t\tOp.length( baseOp ),\n\t\t\t\t\t\t\tAttributeMap.invert(\n\t\t\t\t\t\t\t\top.attributes,\n\t\t\t\t\t\t\t\tbaseOp.attributes\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn baseIndex + length;\n\t\t\t} else if ( typeof op.retain === 'object' && op.retain !== null ) {\n\t\t\t\tconst slice = base.slice( baseIndex, baseIndex + 1 );\n\t\t\t\tconst baseOp = new OpIterator( slice.ops ).next();\n\t\t\t\tconst [ embedType, opData, baseOpData ] = getEmbedTypeAndData(\n\t\t\t\t\top.retain,\n\t\t\t\t\tbaseOp.insert\n\t\t\t\t);\n\t\t\t\tconst handler = Delta.getHandler( embedType );\n\t\t\t\tinverted.retain(\n\t\t\t\t\t{ [ embedType ]: handler.invert( opData, baseOpData ) },\n\t\t\t\t\tAttributeMap.invert( op.attributes, baseOp.attributes )\n\t\t\t\t);\n\t\t\t\treturn baseIndex + 1;\n\t\t\t}\n\t\t\treturn baseIndex;\n\t\t}, 0 );\n\t\treturn inverted.chop();\n\t}\n\n\ttransform( index: number, priority?: boolean ): number;\n\ttransform( other: Delta, priority?: boolean ): Delta;\n\ttransform( arg: number | Delta, priority = false ): typeof arg {\n\t\tpriority = !! priority;\n\t\tif ( typeof arg === 'number' ) {\n\t\t\treturn this.transformPosition( arg, priority );\n\t\t}\n\t\tconst other: Delta = arg;\n\t\tconst thisIter = new OpIterator( this.ops );\n\t\tconst otherIter = new OpIterator( other.ops );\n\t\tconst delta = new Delta();\n\t\twhile ( thisIter.hasNext() || otherIter.hasNext() ) {\n\t\t\tif (\n\t\t\t\tthisIter.peekType() === 'insert' &&\n\t\t\t\t( priority || otherIter.peekType() !== 'insert' )\n\t\t\t) {\n\t\t\t\tdelta.retain( Op.length( thisIter.next() ) );\n\t\t\t} else if ( otherIter.peekType() === 'insert' ) {\n\t\t\t\tdelta.push( otherIter.next() );\n\t\t\t} else {\n\t\t\t\tconst length = Math.min(\n\t\t\t\t\tthisIter.peekLength(),\n\t\t\t\t\totherIter.peekLength()\n\t\t\t\t);\n\t\t\t\tconst thisOp = thisIter.next( length );\n\t\t\t\tconst otherOp = otherIter.next( length );\n\t\t\t\tif ( thisOp.delete ) {\n\t\t\t\t\t// Our delete either makes their delete redundant or removes their retain\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if ( otherOp.delete ) {\n\t\t\t\t\tdelta.push( otherOp );\n\t\t\t\t} else {\n\t\t\t\t\tconst thisData = thisOp.retain;\n\t\t\t\t\tconst otherData = otherOp.retain;\n\t\t\t\t\tlet transformedData: Op[ 'retain' ] =\n\t\t\t\t\t\ttypeof otherData === 'object' && otherData !== null\n\t\t\t\t\t\t\t? otherData\n\t\t\t\t\t\t\t: length;\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof thisData === 'object' &&\n\t\t\t\t\t\tthisData !== null &&\n\t\t\t\t\t\ttypeof otherData === 'object' &&\n\t\t\t\t\t\totherData !== null\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst embedType = Object.keys( thisData )[ 0 ];\n\t\t\t\t\t\tif ( embedType === Object.keys( otherData )[ 0 ] ) {\n\t\t\t\t\t\t\tconst handler = Delta.getHandler( embedType );\n\t\t\t\t\t\t\tif ( handler ) {\n\t\t\t\t\t\t\t\ttransformedData = {\n\t\t\t\t\t\t\t\t\t[ embedType ]: handler.transform(\n\t\t\t\t\t\t\t\t\t\tthisData[ embedType ],\n\t\t\t\t\t\t\t\t\t\totherData[ embedType ],\n\t\t\t\t\t\t\t\t\t\tpriority\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// We retain either their retain or insert\n\t\t\t\t\tdelta.retain(\n\t\t\t\t\t\ttransformedData,\n\t\t\t\t\t\tAttributeMap.transform(\n\t\t\t\t\t\t\tthisOp.attributes,\n\t\t\t\t\t\t\totherOp.attributes,\n\t\t\t\t\t\t\tpriority\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn delta.chop();\n\t}\n\n\ttransformPosition( index: number, priority = false ): number {\n\t\tpriority = !! priority;\n\t\tconst thisIter = new OpIterator( this.ops );\n\t\tlet offset = 0;\n\t\twhile ( thisIter.hasNext() && offset <= index ) {\n\t\t\tconst length = thisIter.peekLength();\n\t\t\tconst nextType = thisIter.peekType();\n\t\t\tthisIter.next();\n\t\t\tif ( nextType === 'delete' ) {\n\t\t\t\tindex -= Math.min( length, index - offset );\n\t\t\t\tcontinue;\n\t\t\t} else if (\n\t\t\t\tnextType === 'insert' &&\n\t\t\t\t( offset < index || ! priority )\n\t\t\t) {\n\t\t\t\tindex += length;\n\t\t\t}\n\t\t\toffset += length;\n\t\t}\n\t\treturn index;\n\t}\n\n\t/**\n\t * Given a Delta and a cursor position, do a diff and attempt to adjust\n\t * the diff to place insertions or deletions at the cursor position.\n\t *\n\t * @param other             - The other Delta to diff against.\n\t * @param cursorAfterChange - The cursor position index after the change.\n\t * @return A Delta that attempts to place insertions or deletions at the cursor position.\n\t */\n\tdiffWithCursor( other: Delta, cursorAfterChange: number | null ): Delta {\n\t\tif ( this.ops === other.ops ) {\n\t\t\treturn new Delta();\n\t\t} else if ( cursorAfterChange === null ) {\n\t\t\t// If no cursor position is provided, do a regular diff.\n\t\t\treturn this.diff( other );\n\t\t}\n\n\t\tconst strings = this.deltasToStrings( other );\n\t\tlet diffs = diffChars( strings[ 0 ], strings[ 1 ] );\n\t\tlet lastDiffPosition = 0;\n\t\tconst adjustedDiffs: Change[] = [];\n\n\t\tfor ( let i = 0; i < diffs.length; i++ ) {\n\t\t\tconst diff = diffs[ i ];\n\n\t\t\tconst segmentStart = lastDiffPosition;\n\t\t\tconst segmentEnd = lastDiffPosition + ( diff.count ?? 0 );\n\t\t\tconst isCursorInSegment =\n\t\t\t\tcursorAfterChange > segmentStart &&\n\t\t\t\tcursorAfterChange <= segmentEnd;\n\n\t\t\tconst isUnchangedSegment = ! diff.added && ! diff.removed;\n\t\t\tconst isRemovalSegment = diff.removed && ! diff.added;\n\n\t\t\tconst nextDiff = diffs[ i + 1 ];\n\t\t\tconst isNextDiffAnInsert =\n\t\t\t\tnextDiff && nextDiff.added && ! nextDiff.removed;\n\n\t\t\t// Path 1: Look-ahead strategy\n\t\t\t// If the position of the cursor is in an \"unchanged\" segment, but there's an insertion\n\t\t\t// right after this section, then the insertion has likely been placed in\n\t\t\t// the incorrect spot, and we can move the insertion to the position of the cursor.\n\t\t\tif (\n\t\t\t\tisUnchangedSegment &&\n\t\t\t\tisCursorInSegment &&\n\t\t\t\tisNextDiffAnInsert\n\t\t\t) {\n\t\t\t\tconst movedSegments = this.tryMoveInsertionToCursor(\n\t\t\t\t\tdiff,\n\t\t\t\t\tnextDiff,\n\t\t\t\t\tcursorAfterChange,\n\t\t\t\t\tsegmentStart\n\t\t\t\t);\n\n\t\t\t\tif ( movedSegments ) {\n\t\t\t\t\tadjustedDiffs.push( ...movedSegments );\n\t\t\t\t\t// Skip the next diff since we've already consumed it\n\t\t\t\t\ti++;\n\t\t\t\t\tlastDiffPosition = segmentEnd;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Path 2: Look-back strategy\n\t\t\t// Handle removals by checking if cursor was in the previous unchanged segment\n\t\t\tif ( isRemovalSegment ) {\n\t\t\t\tconst movedSegments = this.tryMoveDeletionToCursor(\n\t\t\t\t\tdiff,\n\t\t\t\t\tadjustedDiffs,\n\t\t\t\t\tcursorAfterChange,\n\t\t\t\t\tlastDiffPosition\n\t\t\t\t);\n\n\t\t\t\tif ( movedSegments ) {\n\t\t\t\t\t// Remove the previous unchanged segment from adjustedDiffs\n\t\t\t\t\tadjustedDiffs.pop();\n\t\t\t\t\tadjustedDiffs.push( ...movedSegments );\n\t\t\t\t\tlastDiffPosition += diff.count ?? 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Path 3: Do nothing - add diff as-is\n\t\t\tadjustedDiffs.push( diff );\n\t\t\tif ( ! diff.added ) {\n\t\t\t\tlastDiffPosition += diff.count ?? 0;\n\t\t\t}\n\t\t}\n\n\t\tdiffs = adjustedDiffs;\n\n\t\tconst thisIter = new OpIterator( this.ops );\n\t\tconst otherIter = new OpIterator( other.ops );\n\t\tconst retDelta = this.convertChangesToDelta(\n\t\t\tdiffs,\n\t\t\tthisIter,\n\t\t\totherIter\n\t\t);\n\n\t\treturn retDelta.chop();\n\t}\n\n\t/**\n\t * Try to move an insertion operation from after an unchanged segment to the cursor position within it.\n\t * This is a \"look-ahead\" strategy.\n\t *\n\t * @param diff              - The current unchanged diff segment.\n\t * @param nextDiff          - The next diff segment (expected to be an insertion).\n\t * @param cursorAfterChange - The cursor position after the change.\n\t * @param segmentStart      - The start position of the current segment.\n\t * @return An array of adjusted diff segments if the insertion was successfully moved, null otherwise.\n\t */\n\tprivate tryMoveInsertionToCursor(\n\t\tdiff: Change,\n\t\tnextDiff: Change,\n\t\tcursorAfterChange: number,\n\t\tsegmentStart: number\n\t): Change[] | null {\n\t\tconst nextDiffInsert = nextDiff.value;\n\t\tconst insertLength = nextDiffInsert.length;\n\t\tconst insertOffset = cursorAfterChange - segmentStart - insertLength;\n\n\t\t// Verify that the inserted text matches the text at the cursor position\n\t\tconst textAtCursor = diff.value.substring(\n\t\t\tinsertOffset,\n\t\t\tinsertOffset + nextDiffInsert.length\n\t\t);\n\t\tconst isInsertMoveable = textAtCursor === nextDiffInsert;\n\n\t\t// The insert text matches what's at the cursor position,\n\t\t// so we can safely move the insertion to the cursor position.\n\t\tif ( ! isInsertMoveable ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Split the current segment at the cursor\n\t\tconst beforeCursor = diff.value.substring( 0, insertOffset );\n\t\tconst afterCursor = diff.value.substring( insertOffset );\n\n\t\tconst result: Change[] = [];\n\n\t\t// Add before cursor part (if not empty)\n\t\tif ( beforeCursor.length > 0 ) {\n\t\t\tresult.push( {\n\t\t\t\tvalue: beforeCursor,\n\t\t\t\tcount: beforeCursor.length,\n\t\t\t\tadded: false,\n\t\t\t\tremoved: false,\n\t\t\t} );\n\t\t}\n\n\t\t// Add the insertion in the middle\n\t\tresult.push( nextDiff );\n\n\t\t// Add after cursor part (if not empty)\n\t\tif ( afterCursor.length > 0 ) {\n\t\t\tresult.push( {\n\t\t\t\tvalue: afterCursor,\n\t\t\t\tcount: afterCursor.length,\n\t\t\t\tadded: false,\n\t\t\t\tremoved: false,\n\t\t\t} );\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Try to move a deletion operation to the cursor position by looking back at the previous unchanged segment.\n\t * This is a \"look-back\" strategy.\n\t *\n\t * @param diff              - The current deletion diff segment.\n\t * @param adjustedDiffs     - The array of previously processed diff segments.\n\t * @param cursorAfterChange - The cursor position after the change.\n\t * @param lastDiffPosition  - The position in the document up to (but not including) the current diff.\n\t * @return An array of adjusted diff segments if the deletion was successfully moved, null otherwise.\n\t */\n\tprivate tryMoveDeletionToCursor(\n\t\tdiff: Change,\n\t\tadjustedDiffs: Change[],\n\t\tcursorAfterChange: number,\n\t\tlastDiffPosition: number\n\t): Change[] | null {\n\t\t// Check if there's a preceding unchanged segment where cursor falls\n\t\t// and the deleted characters match characters in that segment\n\t\tconst prevDiff = adjustedDiffs[ adjustedDiffs.length - 1 ];\n\n\t\tif ( ! prevDiff || prevDiff.added || prevDiff.removed ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst prevSegmentStart = lastDiffPosition - ( prevDiff.count ?? 0 );\n\t\tconst prevSegmentEnd = lastDiffPosition;\n\n\t\t// Check if cursor is within or at the end of the previous unchanged segment\n\t\tif (\n\t\t\tcursorAfterChange < prevSegmentStart ||\n\t\t\tcursorAfterChange >= prevSegmentEnd\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check if the deleted characters match the text at the cursor position\n\t\tconst deletedChars = diff.value;\n\t\tconst deleteOffset = cursorAfterChange - prevSegmentStart;\n\t\tconst textAtCursor = prevDiff.value.substring(\n\t\t\tdeleteOffset,\n\t\t\tdeleteOffset + deletedChars.length\n\t\t);\n\t\tconst canBePlacedHere = textAtCursor === deletedChars;\n\n\t\tif ( ! canBePlacedHere ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Split the unchanged segment at the cursor and place deletion there\n\t\tconst beforeCursor = prevDiff.value.substring( 0, deleteOffset );\n\t\tconst atAndAfterCursor = prevDiff.value.substring( deleteOffset );\n\n\t\t// The deletion should consume characters starting at cursor\n\t\tconst deletionLength = diff.count ?? 0;\n\t\tconst afterDeletion = atAndAfterCursor.substring( deletionLength );\n\n\t\tconst result: Change[] = [];\n\n\t\t// Add before cursor part (if not empty)\n\t\tif ( beforeCursor.length > 0 ) {\n\t\t\tresult.push( {\n\t\t\t\tvalue: beforeCursor,\n\t\t\t\tcount: beforeCursor.length,\n\t\t\t\tadded: false,\n\t\t\t\tremoved: false,\n\t\t\t} );\n\t\t}\n\n\t\t// Add the deletion\n\t\tresult.push( diff );\n\n\t\t// Add after deletion part (if not empty)\n\t\tif ( afterDeletion.length > 0 ) {\n\t\t\tresult.push( {\n\t\t\t\tvalue: afterDeletion,\n\t\t\t\tcount: afterDeletion.length,\n\t\t\t\tadded: false,\n\t\t\t\tremoved: false,\n\t\t\t} );\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Convert two Deltas to string representations for diffing.\n\t *\n\t * @param other - The other Delta to convert.\n\t * @return A tuple of [thisString, otherString].\n\t */\n\tprivate deltasToStrings( other: Delta ): [ string, string ] {\n\t\treturn [ this, other ].map( ( delta ) => {\n\t\t\treturn delta\n\t\t\t\t.map( ( op ) => {\n\t\t\t\t\tif ( op.insert !== null || op.insert !== undefined ) {\n\t\t\t\t\t\treturn typeof op.insert === 'string'\n\t\t\t\t\t\t\t? op.insert\n\t\t\t\t\t\t\t: NULL_CHARACTER;\n\t\t\t\t\t}\n\t\t\t\t\tconst prep = delta === other ? 'on' : 'with';\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'diff() called ' + prep + ' non-document'\n\t\t\t\t\t);\n\t\t\t\t} )\n\t\t\t\t.join( '' );\n\t\t} ) as [ string, string ];\n\t}\n\n\t/**\n\t * Process diff changes and convert them to Delta operations.\n\t *\n\t * @param changes   - The array of changes from the diff algorithm.\n\t * @param thisIter  - Iterator for this Delta's operations.\n\t * @param otherIter - Iterator for the other Delta's operations.\n\t * @return A Delta containing the processed diff operations.\n\t */\n\tprivate convertChangesToDelta(\n\t\tchanges: Change[],\n\t\tthisIter: OpIterator,\n\t\totherIter: OpIterator\n\t): Delta {\n\t\tconst retDelta = new Delta();\n\t\tchanges.forEach( ( component: Change ) => {\n\t\t\tlet length = component.count ?? 0;\n\t\t\twhile ( length > 0 ) {\n\t\t\t\tlet opLength = 0;\n\t\t\t\tif ( component.added ) {\n\t\t\t\t\topLength = Math.min( otherIter.peekLength(), length );\n\t\t\t\t\tretDelta.push( otherIter.next( opLength ) );\n\t\t\t\t} else if ( component.removed ) {\n\t\t\t\t\topLength = Math.min( length, thisIter.peekLength() );\n\t\t\t\t\tthisIter.next( opLength );\n\t\t\t\t\tretDelta.delete( opLength );\n\t\t\t\t} else {\n\t\t\t\t\topLength = Math.min(\n\t\t\t\t\t\tthisIter.peekLength(),\n\t\t\t\t\t\totherIter.peekLength(),\n\t\t\t\t\t\tlength\n\t\t\t\t\t);\n\t\t\t\t\tconst thisOp = thisIter.next( opLength );\n\t\t\t\t\tconst otherOp = otherIter.next( opLength );\n\t\t\t\t\tif ( isEqual( thisOp.insert, otherOp.insert ) ) {\n\t\t\t\t\t\tretDelta.retain(\n\t\t\t\t\t\t\topLength,\n\t\t\t\t\t\t\tAttributeMap.diff(\n\t\t\t\t\t\t\t\tthisOp.attributes,\n\t\t\t\t\t\t\t\totherOp.attributes\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tretDelta.push( otherOp ).delete( opLength );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlength -= opLength;\n\t\t\t}\n\t\t} );\n\t\treturn retDelta;\n\t}\n}\n\nexport default Delta;\nexport { Op, OpIterator, AttributeMap };\n", "// File copied https://github.com/slab/delta/blob/main/src/AttributeMap.ts with changes:\n// - lodash.clonedeep is replaced with JSON parse / stringify\n// - lodash.isequal is replaced with fast-deep-equal.\n\n/**\n * External dependencies\n */\nimport { default as isEqual } from 'fast-deep-equal/es6';\n\nfunction cloneDeep< T >( value: T ): T {\n\treturn JSON.parse( JSON.stringify( value ) ) as T;\n}\n\ninterface AttributeMap {\n\t[ key: string ]: unknown;\n}\n\nnamespace AttributeMap {\n\texport function compose(\n\t\ta: AttributeMap = {},\n\t\tb: AttributeMap = {},\n\t\tkeepNull = false\n\t): AttributeMap | undefined {\n\t\tif ( typeof a !== 'object' ) {\n\t\t\ta = {};\n\t\t}\n\t\tif ( typeof b !== 'object' ) {\n\t\t\tb = {};\n\t\t}\n\t\tlet attributes = cloneDeep( b );\n\t\tif ( ! keepNull ) {\n\t\t\tattributes = Object.keys( attributes ).reduce< AttributeMap >(\n\t\t\t\t( copy, key ) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tattributes[ key ] !== null ||\n\t\t\t\t\t\tattributes[ key ] !== undefined\n\t\t\t\t\t) {\n\t\t\t\t\t\tcopy[ key ] = attributes[ key ];\n\t\t\t\t\t}\n\t\t\t\t\treturn copy;\n\t\t\t\t},\n\t\t\t\t{}\n\t\t\t);\n\t\t}\n\t\tfor ( const key in a ) {\n\t\t\tif ( a[ key ] !== undefined && b[ key ] === undefined ) {\n\t\t\t\tattributes[ key ] = a[ key ];\n\t\t\t}\n\t\t}\n\t\treturn Object.keys( attributes ).length > 0 ? attributes : undefined;\n\t}\n\n\texport function diff(\n\t\ta: AttributeMap = {},\n\t\tb: AttributeMap = {}\n\t): AttributeMap | undefined {\n\t\tif ( typeof a !== 'object' ) {\n\t\t\ta = {};\n\t\t}\n\t\tif ( typeof b !== 'object' ) {\n\t\t\tb = {};\n\t\t}\n\t\tconst attributes = Object.keys( a )\n\t\t\t.concat( Object.keys( b ) )\n\t\t\t.reduce< AttributeMap >( ( attrs, key ) => {\n\t\t\t\tif ( ! isEqual( a[ key ], b[ key ] ) ) {\n\t\t\t\t\tattrs[ key ] = b[ key ] === undefined ? null : b[ key ];\n\t\t\t\t}\n\t\t\t\treturn attrs;\n\t\t\t}, {} );\n\t\treturn Object.keys( attributes ).length > 0 ? attributes : undefined;\n\t}\n\n\texport function invert(\n\t\tattr: AttributeMap = {},\n\t\tbase: AttributeMap = {}\n\t): AttributeMap {\n\t\tattr = attr || {};\n\t\tconst baseInverted = Object.keys( base ).reduce< AttributeMap >(\n\t\t\t( memo, key ) => {\n\t\t\t\tif (\n\t\t\t\t\tbase[ key ] !== attr[ key ] &&\n\t\t\t\t\tattr[ key ] !== undefined\n\t\t\t\t) {\n\t\t\t\t\tmemo[ key ] = base[ key ];\n\t\t\t\t}\n\t\t\t\treturn memo;\n\t\t\t},\n\t\t\t{}\n\t\t);\n\t\treturn Object.keys( attr ).reduce< AttributeMap >( ( memo, key ) => {\n\t\t\tif ( attr[ key ] !== base[ key ] && base[ key ] === undefined ) {\n\t\t\t\tmemo[ key ] = null;\n\t\t\t}\n\t\t\treturn memo;\n\t\t}, baseInverted );\n\t}\n\n\texport function transform(\n\t\ta: AttributeMap | undefined,\n\t\tb: AttributeMap | undefined,\n\t\tpriority = false\n\t): AttributeMap | undefined {\n\t\tif ( typeof a !== 'object' ) {\n\t\t\treturn b;\n\t\t}\n\t\tif ( typeof b !== 'object' ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif ( ! priority ) {\n\t\t\treturn b; // b simply overwrites us without priority\n\t\t}\n\t\tconst attributes = Object.keys( b ).reduce< AttributeMap >(\n\t\t\t( attrs, key ) => {\n\t\t\t\tif ( a[ key ] === undefined ) {\n\t\t\t\t\tattrs[ key ] = b[ key ]; // null is a valid value\n\t\t\t\t}\n\t\t\t\treturn attrs;\n\t\t\t},\n\t\t\t{}\n\t\t);\n\t\treturn Object.keys( attributes ).length > 0 ? attributes : undefined;\n\t}\n}\n\nexport default AttributeMap;\n", "/**\n * Internal dependencies\n */\nimport type AttributeMap from './AttributeMap';\n\ninterface Op {\n\t// only one property out of {insert, delete, retain} will be present\n\tinsert?: string | Record< string, unknown >;\n\tdelete?: number;\n\tretain?: number | Record< string, unknown >;\n\n\tattributes?: AttributeMap;\n}\n\nnamespace Op {\n\texport function length( op: Op ): number {\n\t\tif ( typeof op.delete === 'number' ) {\n\t\t\treturn op.delete;\n\t\t} else if ( typeof op.retain === 'number' ) {\n\t\t\treturn op.retain;\n\t\t} else if ( typeof op.retain === 'object' && op.retain !== null ) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn typeof op.insert === 'string' ? op.insert.length : 1;\n\t}\n}\n\nexport default Op;\n", "/**\n * Internal dependencies\n */\nimport Op from './Op';\n\nexport default class Iterator {\n\tops: Op[];\n\tindex: number;\n\toffset: number;\n\n\tconstructor( ops: Op[] ) {\n\t\tthis.ops = ops;\n\t\tthis.index = 0;\n\t\tthis.offset = 0;\n\t}\n\n\thasNext(): boolean {\n\t\treturn this.peekLength() < Infinity;\n\t}\n\n\tnext( length?: number ): Op {\n\t\tif ( ! length ) {\n\t\t\tlength = Infinity;\n\t\t}\n\t\tconst nextOp = this.ops[ this.index ];\n\t\tif ( nextOp ) {\n\t\t\tconst offset = this.offset;\n\t\t\tconst opLength = Op.length( nextOp );\n\t\t\tif ( length >= opLength - offset ) {\n\t\t\t\tlength = opLength - offset;\n\t\t\t\tthis.index += 1;\n\t\t\t\tthis.offset = 0;\n\t\t\t} else {\n\t\t\t\tthis.offset += length;\n\t\t\t}\n\t\t\tif ( typeof nextOp.delete === 'number' ) {\n\t\t\t\treturn { delete: length };\n\t\t\t}\n\t\t\tconst retOp: Op = {};\n\t\t\tif ( nextOp.attributes ) {\n\t\t\t\tretOp.attributes = nextOp.attributes;\n\t\t\t}\n\t\t\tif ( typeof nextOp.retain === 'number' ) {\n\t\t\t\tretOp.retain = length;\n\t\t\t} else if (\n\t\t\t\ttypeof nextOp.retain === 'object' &&\n\t\t\t\tnextOp.retain !== null\n\t\t\t) {\n\t\t\t\t// offset should === 0, length should === 1\n\t\t\t\tretOp.retain = nextOp.retain;\n\t\t\t} else if ( typeof nextOp.insert === 'string' ) {\n\t\t\t\tretOp.insert = nextOp.insert.substr( offset, length );\n\t\t\t} else {\n\t\t\t\t// offset should === 0, length should === 1\n\t\t\t\tretOp.insert = nextOp.insert;\n\t\t\t}\n\t\t\treturn retOp;\n\t\t}\n\t\treturn { retain: Infinity };\n\t}\n\n\tpeek(): Op {\n\t\treturn this.ops[ this.index ];\n\t}\n\n\tpeekLength(): number {\n\t\tif ( this.ops[ this.index ] ) {\n\t\t\t// Should never return 0 if our index is being managed correctly\n\t\t\treturn Op.length( this.ops[ this.index ] ) - this.offset;\n\t\t}\n\t\treturn Infinity;\n\t}\n\n\tpeekType(): string {\n\t\tconst op = this.ops[ this.index ];\n\t\tif ( op ) {\n\t\t\tif ( typeof op.delete === 'number' ) {\n\t\t\t\treturn 'delete';\n\t\t\t} else if (\n\t\t\t\ttypeof op.retain === 'number' ||\n\t\t\t\t( typeof op.retain === 'object' && op.retain !== null )\n\t\t\t) {\n\t\t\t\treturn 'retain';\n\t\t\t}\n\t\t\treturn 'insert';\n\t\t}\n\t\treturn 'retain';\n\t}\n\n\trest(): Op[] {\n\t\tif ( ! this.hasNext() ) {\n\t\t\treturn [];\n\t\t} else if ( this.offset === 0 ) {\n\t\t\treturn this.ops.slice( this.index );\n\t\t}\n\t\tconst offset = this.offset;\n\t\tconst index = this.index;\n\t\tconst next = this.next();\n\t\tconst rest = this.ops.slice( this.index );\n\t\tthis.offset = offset;\n\t\tthis.index = index;\n\t\treturn [ next ].concat( rest );\n\t}\n}\n", "/**\n * This version number should be incremented whenever there are breaking changes\n * to Yjs doc schema or in how it is interpreted by code in the SyncConfig. This\n * allows implementors to invalidate persisted CRDT docs.\n */\nexport const CRDT_DOC_VERSION = 1;\n\n/**\n * CRDT documents can hold meta information in a map. This map exists only in\n * memory and is not synced or persisted. This key can be used to indicate that\n * a (temporary) document has been loaded from persistence.\n */\nexport const CRDT_DOC_META_PERSISTENCE_KEY = 'fromPersistence';\n\n/**\n * Root-level key for the map that holds the entity record data.\n */\nexport const CRDT_RECORD_MAP_KEY = 'document';\n\n/**\n * Root-level key for the map that holds entity record metadata. This map should\n * only contain metadata that is not represented by the entity record itself.\n */\nexport const CRDT_RECORD_METADATA_MAP_KEY = 'documentMeta';\n\n/**\n * Y.Map key representing the timestamp of the last save operation.\n */\nexport const CRDT_RECORD_METADATA_SAVED_AT_KEY = 'savedAt';\n\n/**\n * Y.Map key representing the Y.Doc client ID of the user who performed the last\n * save operation.\n */\nexport const CRDT_RECORD_METADATA_SAVED_BY_KEY = 'savedBy';\n\n/**\n * Root-level key for the map that holds the state information about the CRDT\n * document itself. It should not contain information related to the entity\n * record.\n */\nexport const CRDT_STATE_MAP_KEY = 'state';\n\n// Y.Map keys for the state map.\nexport const CRDT_STATE_VERSION_KEY = 'version';\n\n/**\n * Origin string for CRDT document changes originating from the local editor.\n */\nexport const LOCAL_EDITOR_ORIGIN = 'gutenberg';\n\n/**\n * Origin string for CRDT document changes originating from the sync manager.\n */\nexport const LOCAL_SYNC_MANAGER_ORIGIN = 'syncManager';\n\n/**\n * WordPress meta key used to persist the CRDT document for an entity.\n */\nexport const WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE = '_crdt_document';\n\n/**\n * Delay in milliseconds before removing a user from presence indicators.\n */\nexport const REMOVAL_DELAY_IN_MS = 5000;\n", "/**\n * External dependencies\n */\nimport * as Y from 'yjs';\nimport * as buffer from 'lib0/buffer';\n\n/**\n * Internal dependencies\n */\nimport {\n\tCRDT_DOC_META_PERSISTENCE_KEY,\n\tCRDT_DOC_VERSION,\n\tCRDT_STATE_MAP_KEY,\n\tCRDT_STATE_VERSION_KEY,\n} from './config';\nimport type { CRDTDoc } from './types';\n\n// An object representation of CRDT document metadata.\ntype DocumentMeta = Record< string, DocumentMetaValue >;\ntype DocumentMetaValue = boolean | number | string;\n\nexport function createYjsDoc( documentMeta: DocumentMeta = {} ): Y.Doc {\n\t// Convert the object representation of CRDT document metadata to a map.\n\t// Document metadata is passed to the Y.Doc constructor and stored in its\n\t// `meta` property. It is not synced to peers or persisted with the document.\n\t// It is just a place to store transient information about this doc instance.\n\tconst metaMap = new Map< string, DocumentMetaValue >(\n\t\tObject.entries( documentMeta )\n\t);\n\n\tconst ydoc = new Y.Doc( { meta: metaMap } );\n\tconst stateMap = ydoc.getMap( CRDT_STATE_MAP_KEY );\n\n\tstateMap.set( CRDT_STATE_VERSION_KEY, CRDT_DOC_VERSION );\n\n\treturn ydoc;\n}\n\nexport function serializeCrdtDoc( crdtDoc: CRDTDoc ): string {\n\treturn JSON.stringify( {\n\t\tdocument: buffer.toBase64( Y.encodeStateAsUpdateV2( crdtDoc ) ),\n\t} );\n}\n\nexport function deserializeCrdtDoc(\n\tserializedCrdtDoc: string\n): CRDTDoc | null {\n\ttry {\n\t\tconst { document } = JSON.parse( serializedCrdtDoc );\n\n\t\t// Mark this document as from persistence.\n\t\tconst docMeta: DocumentMeta = {\n\t\t\t[ CRDT_DOC_META_PERSISTENCE_KEY ]: true,\n\t\t};\n\n\t\t// Apply the document as an update against a new (temporary) Y.Doc.\n\t\tconst ydoc = createYjsDoc( docMeta );\n\t\tconst yupdate = buffer.fromBase64( document );\n\t\tY.applyUpdateV2( ydoc, yupdate );\n\n\t\t// Overwrite the client ID (which is from a previous session) with a random\n\t\t// client ID. Deserialized documents should not be used directly. Instead,\n\t\t// their state should be applied to another in-use document.\n\t\tydoc.clientID = Math.floor( Math.random() * 1000000000 );\n\n\t\treturn ydoc;\n\t} catch ( e ) {\n\t\treturn null;\n\t}\n}\n\nexport function getRecordValue< RecordType, Key extends keyof RecordType >(\n\tobj: unknown,\n\tkey: Key\n): RecordType[ Key ] | null {\n\tif ( 'object' === typeof obj && null !== obj && key in obj ) {\n\t\treturn ( obj as RecordType )[ key ];\n\t}\n\n\treturn null;\n}\n\nexport function getTypedKeys< T extends object >( obj: T ): Array< keyof T > {\n\treturn Object.keys( obj ) as Array< keyof T >;\n}\n\nexport function areMapsEqual< Key, Value >(\n\tmap1: Map< Key, Value >,\n\tmap2: Map< Key, Value >,\n\tcomparatorFn: ( value1: Value, value2: Value ) => boolean\n): boolean {\n\tif ( map1.size !== map2.size ) {\n\t\treturn false;\n\t}\n\n\tfor ( const [ key, value1 ] of map1.entries() ) {\n\t\tif ( ! map2.has( key ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! comparatorFn( value1, map2.get( key )! ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n", "/**\n * Internal dependencies\n */\nimport { WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE } from './config';\nimport type { CRDTDoc, ObjectData } from './types';\nimport { deserializeCrdtDoc, serializeCrdtDoc } from './utils';\n\nexport function getPersistedCrdtDoc( record: ObjectData ): CRDTDoc | null {\n\tconst serializedCrdtDoc =\n\t\trecord.meta?.[ WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE ];\n\tif ( serializedCrdtDoc ) {\n\t\treturn deserializeCrdtDoc( serializedCrdtDoc );\n\t}\n\n\treturn null;\n}\n\nexport function createPersistedCRDTDoc(\n\tydoc: CRDTDoc\n): Record< string, string > {\n\treturn {\n\t\t[ WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]:\n\t\t\tserializeCrdtDoc( ydoc ),\n\t};\n}\n", "/**\n * WordPress dependencies\n */\nimport { applyFilters } from '@wordpress/hooks';\n\n/**\n * Internal dependencies\n */\nimport type { ProviderCreator } from '../types';\n\nlet providerCreators: ProviderCreator[] | null = null;\n\n/**\n * Returns Yjs provider creators for collaborative editing. There are currently\n * no default providers, so this function returns an empty array.\n *\n * @return {ProviderCreator[]} Creator functions for Yjs providers.\n */\nfunction getDefaultProviderCreators(): ProviderCreator[] {\n\treturn [];\n}\n\n/**\n * Type guard to ensure filter return values are functions.\n *\n * @param {unknown} creator\n * @return {boolean} Whether the argument is a function\n */\nfunction isProviderCreator( creator: unknown ): creator is ProviderCreator {\n\treturn 'function' === typeof creator;\n}\n\n/**\n * Get the current Yjs provider creators, allowing plugins to filter the array.\n *\n * @return {ProviderCreator[]} Creator functions for Yjs providers.\n */\nexport function getProviderCreators(): ProviderCreator[] {\n\tif ( providerCreators ) {\n\t\treturn providerCreators;\n\t}\n\n\t/**\n\t * Filter the\n\t */\n\tconst filteredProviderCreators: unknown = applyFilters(\n\t\t'sync.providers',\n\t\tgetDefaultProviderCreators()\n\t);\n\n\t// If the returned value is not an array, ignore and set to empty array.\n\tif ( ! Array.isArray( filteredProviderCreators ) ) {\n\t\tproviderCreators = [];\n\t\treturn providerCreators;\n\t}\n\n\tproviderCreators = filteredProviderCreators.filter( isProviderCreator );\n\n\treturn providerCreators;\n}\n", "// File copied as is from the y-utilities package.\n/* eslint-disable eslint-comments/disable-enable-pair */\n/* eslint-disable eslint-comments/no-unlimited-disable */\n/* eslint-disable */\n// @ts-nocheck\n/* eslint-env browser */\n\nimport * as array from 'lib0/array';\nimport * as map from 'lib0/map';\nimport { Observable } from 'lib0/observable';\nimport * as Y from 'yjs';\n\n/**\n * @param {YMultiDocUndoManager} mum\n * @param {'undo' | 'redo'} type\n */\nconst popStackItem = ( mum, type ) => {\n\tconst stack = type === 'undo' ? mum.undoStack : mum.redoStack;\n\twhile ( stack.length > 0 ) {\n\t\tconst um = /** @type {Y.UndoManager} */ ( stack.pop() );\n\t\tconst prevUmStack = type === 'undo' ? um.undoStack : um.redoStack;\n\t\tconst stackItem = /** @type {any} */ ( prevUmStack.pop() );\n\t\tlet actionPerformed = false;\n\t\tif ( type === 'undo' ) {\n\t\t\tum.undoStack = [ stackItem ];\n\t\t\tactionPerformed = um.undo() !== null;\n\t\t\tum.undoStack = prevUmStack;\n\t\t} else {\n\t\t\tum.redoStack = [ stackItem ];\n\t\t\tactionPerformed = um.redo() !== null;\n\t\t\tum.redoStack = prevUmStack;\n\t\t}\n\t\tif ( actionPerformed ) {\n\t\t\treturn stackItem;\n\t\t}\n\t}\n\treturn null;\n};\n\n/**\n * @extends Observable<any>\n */\nexport class YMultiDocUndoManager extends Observable {\n\t/**\n\t * @param {Y.AbstractType<any>|Array<Y.AbstractType<any>>} typeScope Accepts either a single type, or an array of types\n\t * @param {ConstructorParameters<typeof Y.UndoManager>[1]} opts\n\t */\n\tconstructor( typeScope = [], opts = {} ) {\n\t\tsuper();\n\t\t/**\n\t\t * @type {Map<Y.Doc, Y.UndoManager>}\n\t\t */\n\t\tthis.docs = new Map();\n\t\tthis.trackedOrigins = opts.trackedOrigins || new Set( [ null ] );\n\t\topts.trackedOrigins = this.trackedOrigins;\n\t\tthis._defaultOpts = opts;\n\t\t/**\n\t\t * @type {Array<Y.UndoManager>}\n\t\t */\n\t\tthis.undoStack = [];\n\t\t/**\n\t\t * @type {Array<Y.UndoManager>}\n\t\t */\n\t\tthis.redoStack = [];\n\t\tthis.addToScope( typeScope );\n\t}\n\n\t/**\n\t * @param {Array<Y.AbstractType<any>> | Y.AbstractType<any>} ytypes\n\t */\n\taddToScope( ytypes ) {\n\t\tytypes = array.isArray( ytypes ) ? ytypes : [ ytypes ];\n\t\tytypes.forEach( ( ytype ) => {\n\t\t\tconst ydoc = /** @type {Y.Doc} */ ( ytype.doc );\n\t\t\tconst um = map.setIfUndefined( this.docs, ydoc, () => {\n\t\t\t\tconst um = new Y.UndoManager( [ ytype ], this._defaultOpts );\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-cleared',\n\t\t\t\t\t/** @param {any} opts */ ( {\n\t\t\t\t\t\tundoStackCleared,\n\t\t\t\t\t\tredoStackCleared,\n\t\t\t\t\t} ) => {\n\t\t\t\t\t\tthis.clear( undoStackCleared, redoStackCleared );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tydoc.on( 'destroy', () => {\n\t\t\t\t\tthis.docs.delete( ydoc );\n\t\t\t\t\tthis.undoStack = this.undoStack.filter(\n\t\t\t\t\t\t( um ) => um.doc !== ydoc\n\t\t\t\t\t);\n\t\t\t\t\tthis.redoStack = this.redoStack.filter(\n\t\t\t\t\t\t( um ) => um.doc !== ydoc\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-item-added',\n\t\t\t\t\t/** @param {any} change */ ( change ) => {\n\t\t\t\t\t\tconst stack =\n\t\t\t\t\t\t\tchange.type === 'undo'\n\t\t\t\t\t\t\t\t? this.undoStack\n\t\t\t\t\t\t\t\t: this.redoStack;\n\t\t\t\t\t\tstack.push( um );\n\t\t\t\t\t\tthis.emit( 'stack-item-added', [\n\t\t\t\t\t\t\t{ ...change, ydoc: ydoc },\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-item-updated',\n\t\t\t\t\t/** @param {any} change */ ( change ) => {\n\t\t\t\t\t\tthis.emit( 'stack-item-updated', [\n\t\t\t\t\t\t\t{ ...change, ydoc },\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-item-popped',\n\t\t\t\t\t/** @param {any} change */ ( change ) => {\n\t\t\t\t\t\tthis.emit( 'stack-item-popped', [\n\t\t\t\t\t\t\t{ ...change, ydoc },\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t// if doc is destroyed\n\t\t\t\t// emit events from um to multium\n\t\t\t\treturn um;\n\t\t\t} );\n\t\t\t/* c8 ignore next 4 */\n\t\t\tif ( um.scope.every( ( yt ) => yt !== ytype ) ) {\n\t\t\t\tum.scope.push( ytype );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * @param {any} origin\n\t */\n\t/* c8 ignore next 3 */\n\taddTrackedOrigin( origin ) {\n\t\tthis.trackedOrigins.add( origin );\n\t}\n\n\t/**\n\t * @param {any} origin\n\t */\n\t/* c8 ignore next 3 */\n\tremoveTrackedOrigin( origin ) {\n\t\tthis.trackedOrigins.delete( origin );\n\t}\n\n\t/**\n\t * Undo last changes on type.\n\t *\n\t * @return {any?} Returns StackItem if a change was applied\n\t */\n\tundo() {\n\t\treturn popStackItem( this, 'undo' );\n\t}\n\n\t/**\n\t * Redo last undo operation.\n\t *\n\t * @return {any?} Returns StackItem if a change was applied\n\t */\n\tredo() {\n\t\treturn popStackItem( this, 'redo' );\n\t}\n\n\tclear( clearUndoStack = true, clearRedoStack = true ) {\n\t\t/* c8 ignore next */\n\t\tif (\n\t\t\t( clearUndoStack && this.canUndo() ) ||\n\t\t\t( clearRedoStack && this.canRedo() )\n\t\t) {\n\t\t\tthis.docs.forEach( ( um ) => {\n\t\t\t\t/* c8 ignore next */\n\t\t\t\tclearUndoStack && ( this.undoStack = [] );\n\t\t\t\t/* c8 ignore next */\n\t\t\t\tclearRedoStack && ( this.redoStack = [] );\n\t\t\t\tum.clear( clearUndoStack, clearRedoStack );\n\t\t\t} );\n\t\t\tthis.emit( 'stack-cleared', [\n\t\t\t\t{\n\t\t\t\t\tundoStackCleared: clearUndoStack,\n\t\t\t\t\tredoStackCleared: clearRedoStack,\n\t\t\t\t},\n\t\t\t] );\n\t\t}\n\t}\n\n\t/* c8 ignore next 5 */\n\tstopCapturing() {\n\t\tthis.docs.forEach( ( um ) => {\n\t\t\tum.stopCapturing();\n\t\t} );\n\t}\n\n\t/**\n\t * Are undo steps available?\n\t *\n\t * @return {boolean} `true` if undo is possible\n\t */\n\tcanUndo() {\n\t\treturn this.undoStack.length > 0;\n\t}\n\n\t/**\n\t * Are redo steps available?\n\t *\n\t * @return {boolean} `true` if redo is possible\n\t */\n\tcanRedo() {\n\t\treturn this.redoStack.length > 0;\n\t}\n\n\tdestroy() {\n\t\tthis.docs.forEach( ( um ) => um.destroy() );\n\t\tsuper.destroy();\n\t}\n}\n\n/**\n * @todo remove\n * @deprecated Use YMultiDocUndoManager instead\n */\nexport const MultiDocUndoManager = YMultiDocUndoManager;\n", "/**\n * External dependencies\n */\nimport type * as Y from 'yjs';\n\n/**\n * WordPress dependencies\n */\nimport type { HistoryRecord } from '@wordpress/undo-manager';\n\n/**\n * Internal dependencies\n */\nimport { LOCAL_EDITOR_ORIGIN } from './config';\nimport { YMultiDocUndoManager } from './y-utilities/y-multidoc-undomanager';\nimport type { ObjectData, SyncUndoManager } from './types';\n\n/**\n * Implementation of the WordPress UndoManager interface using YMultiDocUndoManager\n * internally. This allows undo/redo operations to be transacted against multiple\n * CRDT documents (one per entity) and giving each peer their own undo/redo stack\n * without conflicts.\n */\nexport function createUndoManager(): SyncUndoManager {\n\tconst yUndoManager = new YMultiDocUndoManager( [], {\n\t\t// Throttle undo/redo captures. (default: 500ms)\n\t\tcaptureTimeout: 200,\n\t\t// Ensure that we only scope the undo/redo to the current editor.\n\t\t// The yjs document's clientID is added once it's available.\n\t\ttrackedOrigins: new Set( [ LOCAL_EDITOR_ORIGIN ] ),\n\t} );\n\n\treturn {\n\t\t/**\n\t\t * Record changes into the history.\n\t\t * Since Yjs automatically tracks changes, this method translates the WordPress\n\t\t * HistoryRecord format into Yjs operations.\n\t\t *\n\t\t * @param _record   A record of changes to record.\n\t\t * @param _isStaged Whether to immediately create an undo point or not.\n\t\t */\n\t\taddRecord(\n\t\t\t_record?: HistoryRecord< ObjectData >,\n\t\t\t_isStaged = false // eslint-disable-line @typescript-eslint/no-unused-vars\n\t\t): void {\n\t\t\t// This is a no-op for Yjs since it automatically tracks changes.\n\t\t\t// If needed, we could implement custom logic to handle specific records.\n\t\t},\n\n\t\t/**\n\t\t * Add a Yjs map to the scope of the undo manager.\n\t\t *\n\t\t * @param {Y.Map< any >} ymap The Yjs map to add to the scope.\n\t\t */\n\t\taddToScope( ymap: Y.Map< any > ): void {\n\t\t\tyUndoManager.addToScope( ymap );\n\t\t},\n\n\t\t/**\n\t\t * Undo the last recorded changes.\n\t\t *\n\t\t */\n\t\tundo(): HistoryRecord< ObjectData > | undefined {\n\t\t\tif ( ! yUndoManager.canUndo() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Perform the undo operation\n\t\t\tyUndoManager.undo();\n\n\t\t\t// Intentionally return an empty array, because the SyncProvider will update\n\t\t\t// the entity record based on the Yjs document changes.\n\t\t\treturn [];\n\t\t},\n\n\t\t/**\n\t\t * Redo the last undone changes.\n\t\t */\n\t\tredo(): HistoryRecord< ObjectData > | undefined {\n\t\t\tif ( ! yUndoManager.canRedo() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Perform the redo operation\n\t\t\tyUndoManager.redo();\n\n\t\t\t// Intentionally return an empty array, because the SyncProvider will update\n\t\t\t// the entity record based on the Yjs document changes.\n\t\t\treturn [];\n\t\t},\n\n\t\t/**\n\t\t * Check if there are changes that can be undone.\n\t\t *\n\t\t * @return {boolean} Whether there are changes to undo.\n\t\t */\n\t\thasUndo(): boolean {\n\t\t\treturn yUndoManager.canUndo();\n\t\t},\n\n\t\t/**\n\t\t * Check if there are changes that can be redone.\n\t\t *\n\t\t * @return {boolean} Whether there are changes to redo.\n\t\t */\n\t\thasRedo(): boolean {\n\t\t\treturn yUndoManager.canRedo();\n\t\t},\n\t};\n}\n", "/**\n * @module awareness-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as time from 'lib0/time'\nimport * as math from 'lib0/math'\nimport { Observable } from 'lib0/observable'\nimport * as f from 'lib0/function'\nimport * as Y from 'yjs' // eslint-disable-line\n\nexport const outdatedTimeout = 30000\n\n/**\n * @typedef {Object} MetaClientState\n * @property {number} MetaClientState.clock\n * @property {number} MetaClientState.lastUpdated unix timestamp\n */\n\n/**\n * The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information\n * (cursor, username, status, ..). Each client can update its own local state and listen to state changes of\n * remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline.\n *\n * Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override\n * its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is\n * applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that\n * a remote client is offline, it may propagate a message with\n * `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a\n * message is received, and the known clock of that client equals the received clock, it will override the state with `null`.\n *\n * Before a client disconnects, it should propagate a `null` state with an updated clock.\n *\n * Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state.\n *\n * @extends {Observable<string>}\n */\nexport class Awareness extends Observable {\n  /**\n   * @param {Y.Doc} doc\n   */\n  constructor (doc) {\n    super()\n    this.doc = doc\n    /**\n     * @type {number}\n     */\n    this.clientID = doc.clientID\n    /**\n     * Maps from client id to client state\n     * @type {Map<number, Object<string, any>>}\n     */\n    this.states = new Map()\n    /**\n     * @type {Map<number, MetaClientState>}\n     */\n    this.meta = new Map()\n    this._checkInterval = /** @type {any} */ (setInterval(() => {\n      const now = time.getUnixTime()\n      if (this.getLocalState() !== null && (outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ (this.meta.get(this.clientID)).lastUpdated)) {\n        // renew local clock\n        this.setLocalState(this.getLocalState())\n      }\n      /**\n       * @type {Array<number>}\n       */\n      const remove = []\n      this.meta.forEach((meta, clientid) => {\n        if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {\n          remove.push(clientid)\n        }\n      })\n      if (remove.length > 0) {\n        removeAwarenessStates(this, remove, 'timeout')\n      }\n    }, math.floor(outdatedTimeout / 10)))\n    doc.on('destroy', () => {\n      this.destroy()\n    })\n    this.setLocalState({})\n  }\n\n  destroy () {\n    this.emit('destroy', [this])\n    this.setLocalState(null)\n    super.destroy()\n    clearInterval(this._checkInterval)\n  }\n\n  /**\n   * @return {Object<string,any>|null}\n   */\n  getLocalState () {\n    return this.states.get(this.clientID) || null\n  }\n\n  /**\n   * @param {Object<string,any>|null} state\n   */\n  setLocalState (state) {\n    const clientID = this.clientID\n    const currLocalMeta = this.meta.get(clientID)\n    const clock = currLocalMeta === undefined ? 0 : currLocalMeta.clock + 1\n    const prevState = this.states.get(clientID)\n    if (state === null) {\n      this.states.delete(clientID)\n    } else {\n      this.states.set(clientID, state)\n    }\n    this.meta.set(clientID, {\n      clock,\n      lastUpdated: time.getUnixTime()\n    })\n    const added = []\n    const updated = []\n    const filteredUpdated = []\n    const removed = []\n    if (state === null) {\n      removed.push(clientID)\n    } else if (prevState == null) {\n      if (state != null) {\n        added.push(clientID)\n      }\n    } else {\n      updated.push(clientID)\n      if (!f.equalityDeep(prevState, state)) {\n        filteredUpdated.push(clientID)\n      }\n    }\n    if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n      this.emit('change', [{ added, updated: filteredUpdated, removed }, 'local'])\n    }\n    this.emit('update', [{ added, updated, removed }, 'local'])\n  }\n\n  /**\n   * @param {string} field\n   * @param {any} value\n   */\n  setLocalStateField (field, value) {\n    const state = this.getLocalState()\n    if (state !== null) {\n      this.setLocalState({\n        ...state,\n        [field]: value\n      })\n    }\n  }\n\n  /**\n   * @return {Map<number,Object<string,any>>}\n   */\n  getStates () {\n    return this.states\n  }\n}\n\n/**\n * Mark (remote) clients as inactive and remove them from the list of active peers.\n * This change will be propagated to remote clients.\n *\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @param {any} origin\n */\nexport const removeAwarenessStates = (awareness, clients, origin) => {\n  const removed = []\n  for (let i = 0; i < clients.length; i++) {\n    const clientID = clients[i]\n    if (awareness.states.has(clientID)) {\n      awareness.states.delete(clientID)\n      if (clientID === awareness.clientID) {\n        const curMeta = /** @type {MetaClientState} */ (awareness.meta.get(clientID))\n        awareness.meta.set(clientID, {\n          clock: curMeta.clock + 1,\n          lastUpdated: time.getUnixTime()\n        })\n      }\n      removed.push(clientID)\n    }\n  }\n  if (removed.length > 0) {\n    awareness.emit('change', [{ added: [], updated: [], removed }, origin])\n    awareness.emit('update', [{ added: [], updated: [], removed }, origin])\n  }\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @return {Uint8Array}\n */\nexport const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => {\n  const len = clients.length\n  const encoder = encoding.createEncoder()\n  encoding.writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    const clientID = clients[i]\n    const state = states.get(clientID) || null\n    const clock = /** @type {MetaClientState} */ (awareness.meta.get(clientID)).clock\n    encoding.writeVarUint(encoder, clientID)\n    encoding.writeVarUint(encoder, clock)\n    encoding.writeVarString(encoder, JSON.stringify(state))\n  }\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * Modify the content of an awareness update before re-encoding it to an awareness update.\n *\n * This might be useful when you have a central server that wants to ensure that clients\n * cant hijack somebody elses identity.\n *\n * @param {Uint8Array} update\n * @param {function(any):any} modify\n * @return {Uint8Array}\n */\nexport const modifyAwarenessUpdate = (update, modify) => {\n  const decoder = decoding.createDecoder(update)\n  const encoder = encoding.createEncoder()\n  const len = decoding.readVarUint(decoder)\n  encoding.writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    const clientID = decoding.readVarUint(decoder)\n    const clock = decoding.readVarUint(decoder)\n    const state = JSON.parse(decoding.readVarString(decoder))\n    const modifiedState = modify(state)\n    encoding.writeVarUint(encoder, clientID)\n    encoding.writeVarUint(encoder, clock)\n    encoding.writeVarString(encoder, JSON.stringify(modifiedState))\n  }\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Uint8Array} update\n * @param {any} origin This will be added to the emitted change event\n */\nexport const applyAwarenessUpdate = (awareness, update, origin) => {\n  const decoder = decoding.createDecoder(update)\n  const timestamp = time.getUnixTime()\n  const added = []\n  const updated = []\n  const filteredUpdated = []\n  const removed = []\n  const len = decoding.readVarUint(decoder)\n  for (let i = 0; i < len; i++) {\n    const clientID = decoding.readVarUint(decoder)\n    let clock = decoding.readVarUint(decoder)\n    const state = JSON.parse(decoding.readVarString(decoder))\n    const clientMeta = awareness.meta.get(clientID)\n    const prevState = awareness.states.get(clientID)\n    const currClock = clientMeta === undefined ? 0 : clientMeta.clock\n    if (currClock < clock || (currClock === clock && state === null && awareness.states.has(clientID))) {\n      if (state === null) {\n        // never let a remote client remove this local state\n        if (clientID === awareness.clientID && awareness.getLocalState() != null) {\n          // remote client removed the local state. Do not remote state. Broadcast a message indicating\n          // that this client still exists by increasing the clock\n          clock++\n        } else {\n          awareness.states.delete(clientID)\n        }\n      } else {\n        awareness.states.set(clientID, state)\n      }\n      awareness.meta.set(clientID, {\n        clock,\n        lastUpdated: timestamp\n      })\n      if (clientMeta === undefined && state !== null) {\n        added.push(clientID)\n      } else if (clientMeta !== undefined && state === null) {\n        removed.push(clientID)\n      } else if (state !== null) {\n        if (!f.equalityDeep(state, prevState)) {\n          filteredUpdated.push(clientID)\n        }\n        updated.push(clientID)\n      }\n    }\n  }\n  if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n    awareness.emit('change', [{\n      added, updated: filteredUpdated, removed\n    }, origin])\n  }\n  if (added.length > 0 || updated.length > 0 || removed.length > 0) {\n    awareness.emit('update', [{\n      added, updated, removed\n    }, origin])\n  }\n}\n", "import { Awareness } from 'y-protocols/awareness';\n\nimport { getRecordValue } from '../utils';\n\n/**\n * Extended Awareness class with typed state accessors.\n */\nexport class TypedAwareness< State extends BaseState > extends Awareness {\n\t/**\n\t * Get the states from an awareness document.\n\t */\n\tpublic getStates(): Map< number, State > {\n\t\treturn super.getStates() as Map< number, State >;\n\t}\n\n\t/**\n\t * Get a local state field from an awareness document.\n\t * @param field\n\t */\n\tpublic getLocalStateField< FieldName extends keyof State >(\n\t\tfield: FieldName\n\t): State[ FieldName ] | null {\n\t\tconst state: State | null = this.getLocalState() as State | null;\n\t\treturn getRecordValue< State, FieldName >( state, field );\n\t}\n\n\t/**\n\t * Set a local state field on an awareness document.\n\t * @param field\n\t * @param value\n\t */\n\tpublic setLocalStateField< FieldName extends string & keyof State >(\n\t\tfield: FieldName,\n\t\tvalue: State[ FieldName ]\n\t): void {\n\t\tsuper.setLocalStateField( field, value );\n\t}\n}\n\n/**\n * This base state represents the presence of the user. We expect it to be\n * extended to include additional state describing the user's current activity.\n * This state must be serializable and compact.\n *\n * TODO: Add in the user information.\n */\nexport interface BaseState {}\n\n/**\n * An enhanced state includes additional metadata about the user's connection\n * that is not appropriate to synchronize via Yjs awareness.\n */\nexport type EnhancedState< State extends BaseState > = State & {\n\tclientId: number;\n\tisConnected: boolean;\n\tisMe: boolean;\n};\n\nexport type EqualityFieldCheck<\n\tState extends BaseState,\n\tFieldName extends keyof State,\n> = ( value1?: State[ FieldName ], value2?: State[ FieldName ] ) => boolean;\n\n/**\n * The post editor state extends the base state with information used to render\n * presence indicators in the post editor.\n *\n * TODO: Add in the presence indicators.\n */\nexport interface PostEditorState extends BaseState {}\n", "/**\n * Internal dependencies\n */\nimport {\n\tTypedAwareness,\n\ttype BaseState,\n\ttype EnhancedState,\n\ttype EqualityFieldCheck,\n} from './awareness-types';\nimport { getTypedKeys, areMapsEqual } from '../utils';\nimport { REMOVAL_DELAY_IN_MS } from '../config';\n\ntype AwarenessClientID = number;\n\ninterface AwarenessStateChange {\n\tadded: AwarenessClientID[];\n\tupdated: AwarenessClientID[];\n\tremoved: AwarenessClientID[];\n}\n\nabstract class AwarenessWithEqualityChecks<\n\tState extends BaseState = BaseState,\n> extends TypedAwareness< State > {\n\t/** OVERRIDDEN METHODS */\n\n\t/**\n\t * Set a local state field on an awareness document. Calling this method may\n\t * trigger rerenders of any subscribed components.\n\t *\n\t * Equality checks are provided by the abstract `equalityFieldChecks` property.\n\t * @param field\n\t * @param value\n\t */\n\tpublic setLocalStateField< FieldName extends string & keyof State >(\n\t\tfield: FieldName,\n\t\tvalue: State[ FieldName ]\n\t): void {\n\t\tif (\n\t\t\tthis.isFieldEqual(\n\t\t\t\tfield,\n\t\t\t\tvalue,\n\t\t\t\tthis.getLocalStateField( field ) ?? undefined\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.setLocalStateField( field, value );\n\t}\n\n\t/** ABSTRACT PROPERTIES */\n\n\t/**\n\t * Extending classes must implement equality checks for each awareness state\n\t * field they manage.\n\t */\n\tprotected abstract equalityFieldChecks: {\n\t\t[ FieldName in keyof State ]: EqualityFieldCheck< State, FieldName >;\n\t};\n\n\t/** CUSTOM METHODS */\n\n\t/**\n\t * Determine if a field value has changed using the provided equality checks.\n\t * @param field\n\t * @param value1\n\t * @param value2\n\t */\n\tprotected isFieldEqual< FieldName extends keyof State >(\n\t\tfield: FieldName,\n\t\tvalue1?: State[ FieldName ],\n\t\tvalue2?: State[ FieldName ]\n\t): boolean {\n\t\tif (\n\t\t\t[ 'clientId', 'isConnected', 'isMe' ].includes( field as string )\n\t\t) {\n\t\t\treturn value1 === value2;\n\t\t}\n\n\t\tif ( field in this.equalityFieldChecks ) {\n\t\t\tconst fn = this.equalityFieldChecks[ field ];\n\t\t\treturn fn( value1, value2 );\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`No equality check implemented for awareness state field \"${ field.toString() }\".`\n\t\t);\n\t}\n\n\t/**\n\t * Determine if two states are equal by comparing each field using the\n\t * provided equality checks.\n\t * @param state1\n\t * @param state2\n\t */\n\tprotected isStateEqual( state1: State, state2: State ): boolean {\n\t\treturn [\n\t\t\t...new Set< keyof State >( [\n\t\t\t\t...getTypedKeys( state1 ),\n\t\t\t\t...getTypedKeys( state2 ),\n\t\t\t] ),\n\t\t].every( ( field ) => {\n\t\t\tconst value1 = state1[ field ];\n\t\t\tconst value2 = state2[ field ];\n\n\t\t\treturn this.isFieldEqual( field, value1, value2 );\n\t\t} );\n\t}\n}\n\n/**\n * Abstract class to manage awareness and allow external code to subscribe to\n * state updates.\n */\nexport abstract class AwarenessState<\n\tState extends BaseState = BaseState,\n> extends AwarenessWithEqualityChecks< State > {\n\t/** CUSTOM PROPERTIES */\n\n\t/**\n\t * We keep track of all seen states during the current session for two reasons:\n\t *\n\t * 1. So that we can represent recently disconnected users in our UI, even\n\t *    after they have been removed from the awareness document.\n\t * 2. So that we can provide debug information about all users seen during\n\t *    the session.\n\t */\n\tprivate disconnectedUsers: Set< number > = new Set();\n\tprivate seenStates: Map< number, State > = new Map();\n\n\t/**\n\t * Hold a snapshot of the previous awareness state allows us to compare the\n\t * state values and avoid unnecessary updates to subscribers.\n\t */\n\tprivate previousSnapshot = new Map< number, State >();\n\tprivate stateSubscriptions: Array<\n\t\t( newState: EnhancedState< State >[] ) => void\n\t> = [];\n\n\t/**\n\t * In some cases, we may want to throttle setting local state fields to avoid\n\t * overwhelming the awareness document with rapid updates. At the same time, we\n\t * want to ensure that when we read our own state locally, we get the latest\n\t * value -- even if it hasn't yet been set on the awareness instance.\n\t */\n\tprivate myThrottledState: Partial< State > = {};\n\n\t/** CUSTOM METHODS */\n\n\t/**\n\t * Set up.\n\t */\n\tpublic setUp(): void {\n\t\tthis.on(\n\t\t\t'change',\n\t\t\t( { added, removed, updated }: AwarenessStateChange ) => {\n\t\t\t\t[ ...added, ...updated ].forEach( ( id ) => {\n\t\t\t\t\tthis.disconnectedUsers.delete( id );\n\t\t\t\t} );\n\n\t\t\t\tremoved.forEach( ( id ) => {\n\t\t\t\t\tthis.disconnectedUsers.add( id );\n\n\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\tthis.disconnectedUsers.delete( id );\n\t\t\t\t\t\tthis.updateSubscribers( true /* force update */ );\n\t\t\t\t\t}, REMOVAL_DELAY_IN_MS );\n\t\t\t\t} );\n\n\t\t\t\t// Do not force-update the store here, since this change handler can be\n\t\t\t\t// called even when there are no actual state changes.\n\t\t\t\tthis.updateSubscribers();\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Get all seen states in this session to enable debug reporting.\n\t */\n\tpublic getSeenStates(): Map< number, State > {\n\t\treturn this.seenStates;\n\t}\n\n\t/**\n\t * Allow external code to subscribe to awareness state changes.\n\t * @param callback\n\t */\n\tpublic onStateChange(\n\t\tcallback: ( newState: EnhancedState< State >[] ) => void\n\t): () => void {\n\t\tthis.stateSubscriptions.push( callback );\n\n\t\treturn () => {\n\t\t\tthis.stateSubscriptions = this.stateSubscriptions.filter(\n\t\t\t\t( cb ) => cb !== callback\n\t\t\t);\n\t\t};\n\t}\n\n\t/**\n\t * Set the current user's connection status as awareness state.\n\t * @param isConnected\n\t */\n\tpublic setConnectionStatus( isConnected: boolean ): void {\n\t\tif ( isConnected ) {\n\t\t\tthis.disconnectedUsers.delete( this.clientID );\n\t\t} else {\n\t\t\tthis.disconnectedUsers.add( this.clientID );\n\t\t}\n\n\t\tthis.updateSubscribers( true /* force update */ );\n\t}\n\n\t/**\n\t * Update all subscribed listeners with the latest awareness state.\n\t * @param forceUpdate\n\t */\n\tprotected updateSubscribers( forceUpdate = false ): void {\n\t\tif ( ! this.stateSubscriptions.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst states = this.getStates();\n\n\t\tthis.seenStates = new Map< number, State >( [\n\t\t\t...this.seenStates.entries(),\n\t\t\t...states.entries(),\n\t\t] );\n\n\t\tconst updatedStates = new Map< number, EnhancedState< State > >(\n\t\t\t[ ...this.disconnectedUsers, ...states.keys() ].map(\n\t\t\t\t( clientId ) => {\n\t\t\t\t\tconst rawState: State = this.seenStates.get( clientId )!;\n\n\t\t\t\t\tconst isConnected =\n\t\t\t\t\t\t! this.disconnectedUsers.has( clientId );\n\t\t\t\t\tconst isMe = clientId === this.clientID;\n\t\t\t\t\tconst myState: Partial< State > = isMe\n\t\t\t\t\t\t? this.myThrottledState\n\t\t\t\t\t\t: {};\n\t\t\t\t\tconst state: EnhancedState< State > = {\n\t\t\t\t\t\t...rawState,\n\t\t\t\t\t\t...myState,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tisConnected,\n\t\t\t\t\t\tisMe,\n\t\t\t\t\t};\n\n\t\t\t\t\treturn [ clientId, state ];\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\n\t\tif ( ! forceUpdate ) {\n\t\t\tif (\n\t\t\t\tareMapsEqual(\n\t\t\t\t\tthis.previousSnapshot,\n\t\t\t\t\tupdatedStates,\n\t\t\t\t\tthis.isStateEqual.bind( this )\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// Awareness state unchanged, do not update subscribers.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Update subscribers.\n\t\tthis.previousSnapshot = updatedStates;\n\t\tthis.stateSubscriptions.forEach( ( callback ) => {\n\t\t\tcallback( Array.from( updatedStates.values() ) );\n\t\t} );\n\t}\n}\n", "import type { PostEditorState } from './awareness-types';\nimport { AwarenessState } from './awareness-state';\n\nexport class PostEditorAwarenessState extends AwarenessState< PostEditorState > {\n\tprotected equalityFieldChecks = {};\n\n\t// TODO: Add in subscription for user selection changes.\n}\n", "/**\n * External dependencies\n */\nimport type * as Y from 'yjs';\n\n/**\n * Internal dependencies\n */\nimport type { ObjectID, ObjectType } from '../types';\nimport type { AwarenessState } from './awareness-state';\nimport { PostEditorAwarenessState } from './post-editor-awareness-state';\n\nconst awarenessInstances: Map< string, AwarenessState > = new Map();\n\nfunction getAwarenessId(\n\tobjectType: ObjectType,\n\tobjectId: ObjectID | null\n): string {\n\treturn `${ objectType }:${ objectId }`;\n}\n\nfunction getAwarenessInstance(\n\tobjectType: ObjectType,\n\tobjectId: ObjectID | null\n): AwarenessState | undefined {\n\treturn awarenessInstances.get( getAwarenessId( objectType, objectId ) );\n}\n\n/**\n * Get the post editor awareness instance for the given post ID and post type.\n * @param postId   Post ID.\n * @param postType Post type.\n * @return Post editor awareness instance.\n */\nexport function getPostEditorAwareness(\n\tpostId: number,\n\tpostType: string\n): PostEditorAwarenessState | undefined {\n\tconst objectId: ObjectID = postId.toString();\n\tconst objectType: ObjectType = `postType/${ postType }`;\n\n\tconst awareness = getAwarenessInstance( objectType, objectId );\n\tif ( awareness instanceof PostEditorAwarenessState ) {\n\t\treturn awareness;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Create an awareness instance for the given object type and object ID.\n * @param objectType Object type.\n * @param objectId   Object ID.\n * @param ydoc       Yjs document.\n * @return Awareness instance.\n */\nexport async function createAwareness(\n\tobjectType: ObjectType,\n\tobjectId: ObjectID | null,\n\tydoc: Y.Doc\n): Promise< AwarenessState | undefined > {\n\tif ( objectId && objectType.startsWith( 'postType/' ) ) {\n\t\tconst awareness = new PostEditorAwarenessState( ydoc );\n\t\tawareness.setUp();\n\t\tawarenessInstances.set(\n\t\t\tgetAwarenessId( objectType, objectId ),\n\t\t\tawareness\n\t\t);\n\n\t\treturn awareness;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Set the current user's connection status in the awareness instance for the given object type and object ID.\n * @param objectType  Object type.\n * @param objectId    Object ID.\n * @param isConnected Connection status.\n */\nexport function setConnectionStatus(\n\tobjectType: ObjectType,\n\tobjectId: ObjectID | null,\n\tisConnected: boolean\n): void {\n\tgetAwarenessInstance( objectType, objectId )?.setConnectionStatus(\n\t\tisConnected\n\t);\n}\n", "/**\n * External dependencies\n */\nimport * as Y from 'yjs';\n\n/**\n * Internal dependencies\n */\nimport {\n\tCRDT_RECORD_MAP_KEY as RECORD_KEY,\n\tLOCAL_SYNC_MANAGER_ORIGIN,\n\tCRDT_RECORD_METADATA_MAP_KEY as RECORD_METADATA_KEY,\n\tCRDT_RECORD_METADATA_SAVED_AT_KEY as SAVED_AT_KEY,\n\tCRDT_RECORD_METADATA_SAVED_BY_KEY as SAVED_BY_KEY,\n} from './config';\nimport { createPersistedCRDTDoc, getPersistedCrdtDoc } from './persistence';\nimport { getProviderCreators } from './providers';\nimport type {\n\tCRDTDoc,\n\tEntityID,\n\tObjectID,\n\tObjectData,\n\tObjectType,\n\tRecordHandlers,\n\tSyncConfig,\n\tSyncManager,\n\tSyncUndoManager,\n} from './types';\nimport { createUndoManager } from './undo-manager';\nimport { createYjsDoc } from './utils';\nimport { createAwareness } from './awareness/awareness-manager';\n\ninterface EntityState {\n\thandlers: RecordHandlers;\n\tobjectId: ObjectID;\n\tobjectType: ObjectType;\n\tsyncConfig: SyncConfig;\n\tunload: () => void;\n\tydoc: CRDTDoc;\n}\n\n/**\n * The sync manager orchestrates the lifecycle of syncing entity records. It\n * creates Yjs documents, connects to providers, creates awareness instances,\n * and coordinates with the `core-data` store.\n */\nexport function createSyncManager(): SyncManager {\n\tconst entityStates: Map< EntityID, EntityState > = new Map();\n\n\t/**\n\t * A \"sync-aware\" undo manager for all synced entities. It is lazily created\n\t * when the first entity is loaded.\n\t *\n\t * IMPORTANT: In Gutenberg, the undo manager is effectively global and manages\n\t * undo/redo state for all entities. If the default WPUndoManager is used,\n\t * changes to entities are recorded in the `editEntityRecord` action:\n\t *\n\t * https://github.com/WordPress/gutenberg/blob/b63451e26e3c91b6bb291a2f9994722e3850417e/packages/core-data/src/actions.js#L428-L442\n\t *\n\t * In contrast, the `SyncUndoManager` only manages undo/redo for entities that\n\t * **are being synced by this sync manager**. The `addRecord` method is still\n\t * called in the code linked above, but it is a no-op. Yjs automatically tracks\n\t * changes to entities via the associated CRDT doc:\n\t *\n\t * https://github.com/WordPress/gutenberg/blob/b63451e26e3c91b6bb291a2f9994722e3850417e/packages/sync/src/undo-manager.ts#L42-L48\n\t *\n\t * This means that if at least one entity is being synced, then undo/redo\n\t * operations will be **restricted to synced entities only.**\n\t *\n\t * We could improve the `SyncUndoManager` to also track non-synced entities by\n\t * delegating to a secondary `WPUndoManager`, but this would add complexity\n\t * since we would need to maintain two separate undo/redo stacks and ensure\n\t * that they retain ordering and integrity.\n\t *\n\t * However, we also anticipate that most entities being edited in Gutenberg\n\t * will be synced entities (e.g. posts, pages, templates, template parts,\n\t * etc.), so this limitation may be temporary.\n\t */\n\tlet undoManager: SyncUndoManager | undefined;\n\n\t/**\n\t * Load an entity for syncing and manage its lifecycle.\n\t *\n\t * @param {SyncConfig}     syncConfig Sync configuration for the object type.\n\t * @param {ObjectType}     objectType Object type.\n\t * @param {ObjectID}       objectId   Object ID.\n\t * @param {ObjectData}     record     Entity record representing this object type.\n\t * @param {RecordHandlers} handlers   Handlers for updating and fetching the record.\n\t */\n\tasync function loadEntity(\n\t\tsyncConfig: SyncConfig,\n\t\tobjectType: ObjectType,\n\t\tobjectId: ObjectID,\n\t\trecord: ObjectData,\n\t\thandlers: RecordHandlers\n\t): Promise< void > {\n\t\tconst providerCreators = getProviderCreators();\n\n\t\tif ( 0 === providerCreators.length ) {\n\t\t\treturn; // No provider creators, so syncing is effectively disabled.\n\t\t}\n\n\t\tconst entityId = getEntityId( objectType, objectId );\n\n\t\tif ( entityStates.has( entityId ) ) {\n\t\t\treturn; // Already bootstrapped.\n\t\t}\n\n\t\tconst ydoc = createYjsDoc( { objectType } );\n\t\tconst recordMap = ydoc.getMap( RECORD_KEY );\n\t\tconst recordMetaMap = ydoc.getMap( RECORD_METADATA_KEY );\n\t\tconst now = Date.now();\n\n\t\t// Clean up providers and in-memory state when the entity is unloaded.\n\t\tconst unload = (): void => {\n\t\t\tproviderResults.forEach( ( result ) => result.destroy() );\n\t\t\trecordMap.unobserveDeep( onRecordUpdate );\n\t\t\tydoc.destroy();\n\t\t\tentityStates.delete( entityId );\n\t\t};\n\n\t\t// When the CRDT document is updated by an UndoManager or a connection (not\n\t\t// a local origin), update the local store.\n\t\tconst onRecordUpdate = (\n\t\t\t_events: Y.YEvent< any >[],\n\t\t\ttransaction: Y.Transaction\n\t\t): void => {\n\t\t\tif (\n\t\t\t\ttransaction.local &&\n\t\t\t\t! ( transaction.origin instanceof Y.UndoManager )\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid updateEntityRecord( objectType, objectId );\n\t\t};\n\n\t\tconst onRecordMetaUpdate = (\n\t\t\tevent: Y.YMapEvent< unknown >,\n\t\t\ttransaction: Y.Transaction\n\t\t) => {\n\t\t\tif ( transaction.local ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.keysChanged.forEach( ( key ) => {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase SAVED_AT_KEY:\n\t\t\t\t\t\tconst newValue = recordMetaMap.get( SAVED_AT_KEY );\n\t\t\t\t\t\tif ( 'number' === typeof newValue && newValue > now ) {\n\t\t\t\t\t\t\t// Another peer has saved the record. Refetch it so that we have\n\t\t\t\t\t\t\t// a correct understanding of our own unsaved edits.\n\t\t\t\t\t\t\tvoid handlers.refetchRecord().catch( () => {} );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} );\n\t\t};\n\n\t\t// Lazily create the undo manager when the first entity is loaded.\n\t\tif ( ! undoManager ) {\n\t\t\tundoManager = createUndoManager();\n\t\t}\n\t\tundoManager.addToScope( recordMap );\n\n\t\tconst entityState: EntityState = {\n\t\t\thandlers,\n\t\t\tobjectId,\n\t\t\tobjectType,\n\t\t\tsyncConfig,\n\t\t\tunload,\n\t\t\tydoc,\n\t\t};\n\n\t\tentityStates.set( entityId, entityState );\n\n\t\t// Create awareness for the given entity and its Yjs document.\n\t\tconst awareness = await createAwareness( objectType, objectId, ydoc );\n\n\t\t// Create providers for the given entity and its Yjs document.\n\t\tconst providerResults = await Promise.all(\n\t\t\tproviderCreators.map( ( create ) =>\n\t\t\t\tcreate( objectType, objectId, ydoc, awareness )\n\t\t\t)\n\t\t);\n\n\t\t// Attach observers.\n\t\trecordMap.observeDeep( onRecordUpdate );\n\t\trecordMetaMap.observe( onRecordMetaUpdate );\n\n\t\t// Get and apply the persisted CRDT document, if it exists.\n\t\tapplyPersistedCrdtDoc( objectType, objectId, record );\n\t}\n\n\t/**\n\t * Unload an entity, stop syncing, and destroy its in-memory state.\n\t *\n\t * @param {ObjectType} objectType Object type to discard.\n\t * @param {ObjectID}   objectId   Object ID to discard.\n\t */\n\tfunction unloadEntity( objectType: ObjectType, objectId: ObjectID ): void {\n\t\tentityStates.get( getEntityId( objectType, objectId ) )?.unload();\n\t}\n\n\t/**\n\t * Get the entity ID for the given object type and object ID.\n\t *\n\t * @param {ObjectType} objectType Object type.\n\t * @param {ObjectID}   objectId   Object ID.\n\t */\n\tfunction getEntityId(\n\t\tobjectType: ObjectType,\n\t\tobjectId: ObjectID\n\t): EntityID {\n\t\treturn `${ objectType }_${ objectId }`;\n\t}\n\n\t/**\n\t * Load and inspect the persisted CRDT document. If supported and it exists,\n\t * compare it against the current entity record. If there are differences,\n\t * apply the changes from the entity record.\n\t *\n\t * @param {ObjectType} objectType Object type.\n\t * @param {ObjectID}   objectId   Object ID.\n\t * @param {ObjectData} record     Entity record representing this object type.\n\t */\n\tfunction applyPersistedCrdtDoc(\n\t\tobjectType: ObjectType,\n\t\tobjectId: ObjectID,\n\t\trecord: ObjectData\n\t): void {\n\t\tconst entityId = getEntityId( objectType, objectId );\n\t\tconst entityState = entityStates.get( entityId );\n\n\t\tif ( ! entityState ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst {\n\t\t\thandlers,\n\t\t\tsyncConfig: {\n\t\t\t\tapplyChangesToCRDTDoc,\n\t\t\t\tgetChangesFromCRDTDoc,\n\t\t\t\tsupports,\n\t\t\t},\n\t\t\tydoc: targetDoc,\n\t\t} = entityState;\n\n\t\ttargetDoc.transact( () => {\n\t\t\tif ( ! supports?.crdtPersistence ) {\n\t\t\t\t// Apply the current record as changes.\n\t\t\t\tapplyChangesToCRDTDoc( targetDoc, record );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get the persisted CRDT document, if it exists.\n\t\t\tconst tempDoc = getPersistedCrdtDoc( record );\n\n\t\t\tif ( ! tempDoc ) {\n\t\t\t\t// Apply the current record as changes and trigger a save, which will\n\t\t\t\t// persist the CRDT document. (The entity should call `createEntityMeta`\n\t\t\t\t// via its pre-persist hook.)\n\t\t\t\tapplyChangesToCRDTDoc( targetDoc, record );\n\t\t\t\thandlers.saveRecord();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Apply the persisted document to the current document as a single update.\n\t\t\t// This is done even if the persisted document has been invalidated. This\n\t\t\t// prevents a newly joining peer (or refreshing user) from re-initializing\n\t\t\t// the CRDT document (the \"initialization problem\").\n\t\t\tconst update = Y.encodeStateAsUpdateV2( tempDoc );\n\t\t\tY.applyUpdateV2( targetDoc, update );\n\n\t\t\t// Compute the differences between the persisted doc and the current\n\t\t\t// record. This can happen when:\n\t\t\t//\n\t\t\t// 1. The server makes updates on save that mutate the entity. Example: On\n\t\t\t//    initial save, the server adds the \"Uncategorized\" category to the\n\t\t\t//    post.\n\t\t\t// 2. An \"out-of-band\" update occurs. Example: a WP-CLI command or direct\n\t\t\t//    database update mutates the entity.\n\t\t\t// 3. Unsaved changes are synced from a peer _before_ this code runs. We\n\t\t\t//    can't control when (or if) remote changes are synced, so this is a\n\t\t\t//    race condition.\n\t\t\tconst invalidations = getChangesFromCRDTDoc( tempDoc, record );\n\t\t\tconst invalidatedKeys = Object.keys( invalidations );\n\n\t\t\t// Destroy the temporary document to prevent leaks.\n\t\t\ttempDoc.destroy();\n\n\t\t\tif ( 0 === invalidatedKeys.length ) {\n\t\t\t\t// The persisted CRDT document is valid. There are no updates to apply.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Use the invalidated keys to get the updated values from the entity.\n\t\t\tconst changes = invalidatedKeys.reduce(\n\t\t\t\t( acc, key ) =>\n\t\t\t\t\tObject.assign( acc, {\n\t\t\t\t\t\t[ key ]: record[ key ],\n\t\t\t\t\t} ),\n\t\t\t\t{}\n\t\t\t);\n\n\t\t\t// Apply the changes and trigger a save, which will persist the CRDT\n\t\t\t// document. (The entity should call `createEntityMeta` via its pre-persist\n\t\t\t// hook.)\n\t\t\tapplyChangesToCRDTDoc( targetDoc, changes );\n\t\t\thandlers.saveRecord();\n\t\t}, LOCAL_SYNC_MANAGER_ORIGIN );\n\t}\n\n\t/**\n\t * Update CRDT document with changes from the local store.\n\t *\n\t * @param {ObjectType}            objectType Object type.\n\t * @param {ObjectID}              objectId   Object ID.\n\t * @param {Partial< ObjectData >} changes    Updates to make.\n\t * @param {string}                origin     The source of change.\n\t * @param {boolean}               isSave     Whether this update is part of a save operation.\n\t */\n\tfunction updateCRDTDoc(\n\t\tobjectType: ObjectType,\n\t\tobjectId: ObjectID,\n\t\tchanges: Partial< ObjectData >,\n\t\torigin: string,\n\t\tisSave: boolean = false\n\t): void {\n\t\tconst entityId = getEntityId( objectType, objectId );\n\t\tconst entityState = entityStates.get( entityId );\n\n\t\tif ( ! entityState ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { syncConfig, ydoc } = entityState;\n\n\t\tydoc.transact( () => {\n\t\t\tsyncConfig.applyChangesToCRDTDoc( ydoc, changes );\n\n\t\t\tif ( isSave ) {\n\t\t\t\t// Mark the document as saved in the record metadata map.\n\t\t\t\tconst recordMeta = ydoc.getMap( RECORD_METADATA_KEY );\n\t\t\t\trecordMeta.set( SAVED_AT_KEY, Date.now() );\n\t\t\t\trecordMeta.set( SAVED_BY_KEY, ydoc.clientID );\n\t\t\t}\n\t\t}, origin );\n\t}\n\n\t/**\n\t * Update the entity record in the local store with changes from the CRDT\n\t * document.\n\t *\n\t * @param {ObjectType} objectType Object type of record to update.\n\t * @param {ObjectID}   objectId   Object ID of record to update.\n\t */\n\tasync function updateEntityRecord(\n\t\tobjectType: ObjectType,\n\t\tobjectId: ObjectID\n\t): Promise< void > {\n\t\tconst entityId = getEntityId( objectType, objectId );\n\t\tconst entityState = entityStates.get( entityId );\n\n\t\tif ( ! entityState ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { handlers, syncConfig, ydoc } = entityState;\n\n\t\t// Determine which synced properties have actually changed by comparing\n\t\t// them against the current edited entity record.\n\t\tconst changes = syncConfig.getChangesFromCRDTDoc(\n\t\t\tydoc,\n\t\t\tawait handlers.getEditedRecord()\n\t\t);\n\n\t\tif ( 0 === Object.keys( changes ).length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// This is a good spot to debug to see which changes are being synced. Note\n\t\t// that `blocks` will always appear in the changes, but will only result\n\t\t// in an update to the store if the blocks have changed.\n\n\t\thandlers.editRecord( changes );\n\t}\n\n\t/**\n\t * Create object meta to persist the CRDT document in the entity record.\n\t *\n\t * @param {ObjectType} objectType Object type.\n\t * @param {ObjectID}   objectId   Object ID.\n\t */\n\tfunction createEntityMeta(\n\t\tobjectType: ObjectType,\n\t\tobjectId: ObjectID\n\t): Record< string, string > {\n\t\tconst entityId = getEntityId( objectType, objectId );\n\t\tconst entityState = entityStates.get( entityId );\n\n\t\tif ( ! entityState?.syncConfig.supports?.crdtPersistence ) {\n\t\t\treturn {};\n\t\t}\n\n\t\treturn createPersistedCRDTDoc( entityState.ydoc );\n\t}\n\n\treturn {\n\t\tcreateMeta: createEntityMeta,\n\t\tload: loadEntity,\n\t\t// Use getter to ensure we always return the current value of `undoManager`.\n\t\tget undoManager(): SyncUndoManager | undefined {\n\t\t\treturn undoManager;\n\t\t},\n\t\tunload: unloadEntity,\n\t\tupdate: updateCRDTDoc,\n\t};\n}\n", "/**\n * WordPress dependencies\n */\nimport {\n\tCRDT_DOC_META_PERSISTENCE_KEY,\n\tCRDT_RECORD_MAP_KEY,\n\tLOCAL_EDITOR_ORIGIN,\n\tLOCAL_SYNC_MANAGER_ORIGIN,\n\tWORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE,\n\ttype SyncManager,\n\tcreateSyncManager,\n} from '@wordpress/sync';\n\nexport {\n\tCRDT_DOC_META_PERSISTENCE_KEY,\n\tCRDT_RECORD_MAP_KEY,\n\tLOCAL_EDITOR_ORIGIN,\n\tLOCAL_SYNC_MANAGER_ORIGIN,\n\tWORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE,\n};\n\nlet syncManager: SyncManager;\n\nexport function getSyncManager(): SyncManager | undefined {\n\tif ( syncManager ) {\n\t\treturn syncManager;\n\t}\n\n\tsyncManager = createSyncManager();\n\n\treturn syncManager;\n}\n", "/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\n// @ts-expect-error No exported types.\nimport { __unstableSerializeAndClean } from '@wordpress/blocks';\nimport { type CRDTDoc, type ObjectData, Y } from '@wordpress/sync';\n\n/**\n * Internal dependencies\n */\nimport {\n\tmergeCrdtBlocks,\n\ttype Block,\n\ttype YBlock,\n\ttype YBlocks,\n} from './crdt-blocks';\nimport { type Post } from '../entity-types/post';\nimport { type Type } from '../entity-types';\nimport {\n\tCRDT_DOC_META_PERSISTENCE_KEY,\n\tCRDT_RECORD_MAP_KEY,\n\tWORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE,\n} from '../sync';\nimport type { WPSelection } from '../types';\nimport {\n\tcreateYMap,\n\tgetRootMap,\n\tisYMap,\n\ttype YMapRecord,\n\ttype YMapWrap,\n} from './crdt-utils';\n\n// Changes that can be applied to a post entity record.\nexport type PostChanges = Partial< Post > & {\n\tblocks?: Block[];\n\texcerpt?: Post[ 'excerpt' ] | string;\n\tselection?: WPSelection;\n\ttitle?: Post[ 'title' ] | string;\n};\n\n// A post record as represented in the CRDT document (Y.Map).\nexport interface YPostRecord extends YMapRecord {\n\tauthor: number;\n\tblocks: YBlocks;\n\tcomment_status: string;\n\tdate: string | null;\n\texcerpt: string;\n\tfeatured_media: number;\n\tformat: string;\n\tmeta: YMapWrap< YMapRecord >;\n\tping_status: string;\n\tslug: string;\n\tstatus: string;\n\tsticky: boolean;\n\ttags: number[];\n\ttemplate: string;\n\ttitle: string;\n}\n\n// Properties that are allowed to be synced for a post.\nconst allowedPostProperties = new Set< string >( [\n\t'author',\n\t'blocks',\n\t'comment_status',\n\t'date',\n\t'excerpt',\n\t'featured_media',\n\t'format',\n\t'meta',\n\t'ping_status',\n\t'slug',\n\t'status',\n\t'sticky',\n\t'tags',\n\t'template',\n\t'title',\n] );\n\n// Post meta keys that should *not* be synced.\nconst disallowedPostMetaKeys = new Set< string >( [\n\tWORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE,\n] );\n\n/**\n * Given a set of local changes to a generic entity record, apply those changes\n * to the local Y.Doc.\n *\n * @param {CRDTDoc}               ydoc\n * @param {Partial< ObjectData >} changes\n * @return {void}\n */\nexport function defaultApplyChangesToCRDTDoc(\n\tydoc: CRDTDoc,\n\tchanges: ObjectData\n): void {\n\tconst ymap = getRootMap( ydoc, CRDT_RECORD_MAP_KEY );\n\n\tObject.entries( changes ).forEach( ( [ key, newValue ] ) => {\n\t\t// Cannot serialize function values, so cannot sync them.\n\t\tif ( 'function' === typeof newValue ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( key ) {\n\t\t\t// Add support for additional data types here.\n\n\t\t\tdefault: {\n\t\t\t\tconst currentValue = ymap.get( key );\n\t\t\t\tupdateMapValue( ymap, key, currentValue, newValue );\n\t\t\t}\n\t\t}\n\t} );\n}\n\n/**\n * Given a set of local changes to a post record, apply those changes to the\n * local Y.Doc.\n *\n * @param {CRDTDoc}     ydoc\n * @param {PostChanges} changes\n * @param {Type}        _postType\n * @return {void}\n */\nexport function applyPostChangesToCRDTDoc(\n\tydoc: CRDTDoc,\n\tchanges: PostChanges,\n\t_postType: Type // eslint-disable-line @typescript-eslint/no-unused-vars\n): void {\n\tconst ymap = getRootMap< YPostRecord >( ydoc, CRDT_RECORD_MAP_KEY );\n\n\tObject.keys( changes ).forEach( ( key ) => {\n\t\tif ( ! allowedPostProperties.has( key ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newValue = changes[ key ];\n\n\t\t// Cannot serialize function values, so cannot sync them.\n\t\tif ( 'function' === typeof newValue ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( key ) {\n\t\t\tcase 'blocks': {\n\t\t\t\tlet currentBlocks = ymap.get( key );\n\n\t\t\t\t// Initialize.\n\t\t\t\tif ( ! ( currentBlocks instanceof Y.Array ) ) {\n\t\t\t\t\tcurrentBlocks = new Y.Array< YBlock >();\n\t\t\t\t\tymap.set( key, currentBlocks );\n\t\t\t\t}\n\n\t\t\t\t// Block[] from local changes.\n\t\t\t\tconst newBlocks = ( newValue as PostChanges[ 'blocks' ] ) ?? [];\n\n\t\t\t\t// Block changes from typing are bundled with a 'selection' update.\n\t\t\t\t// Pass the resulting cursor position to the mergeCrdtBlocks function.\n\t\t\t\tconst cursorPosition =\n\t\t\t\t\tchanges.selection?.selectionStart?.offset ?? null;\n\n\t\t\t\t// Merge blocks does not need `setValue` because it is operating on a\n\t\t\t\t// Yjs type that is already in the Y.Doc.\n\t\t\t\tmergeCrdtBlocks( currentBlocks, newBlocks, cursorPosition );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'excerpt': {\n\t\t\t\tconst currentValue = ymap.get( 'excerpt' );\n\t\t\t\tconst rawNewValue = getRawValue( newValue );\n\n\t\t\t\tupdateMapValue( ymap, key, currentValue, rawNewValue );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// \"Meta\" is overloaded term; here, it refers to post meta.\n\t\t\tcase 'meta': {\n\t\t\t\tlet metaMap = ymap.get( 'meta' );\n\n\t\t\t\t// Initialize.\n\t\t\t\tif ( ! isYMap( metaMap ) ) {\n\t\t\t\t\tmetaMap = createYMap< YMapRecord >();\n\t\t\t\t\tymap.set( 'meta', metaMap );\n\t\t\t\t}\n\n\t\t\t\t// Iterate over each meta property in the new value and merge it if it\n\t\t\t\t// should be synced.\n\t\t\t\tObject.entries( newValue ?? {} ).forEach(\n\t\t\t\t\t( [ metaKey, metaValue ] ) => {\n\t\t\t\t\t\tif ( disallowedPostMetaKeys.has( metaKey ) ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tupdateMapValue(\n\t\t\t\t\t\t\tmetaMap,\n\t\t\t\t\t\t\tmetaKey,\n\t\t\t\t\t\t\tmetaMap.get( metaKey ), // current value in CRDT\n\t\t\t\t\t\t\tmetaValue // new value from changes\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'slug': {\n\t\t\t\t// Do not sync an empty slug. This indicates that the post is using\n\t\t\t\t// the default auto-generated slug.\n\t\t\t\tif ( ! newValue ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst currentValue = ymap.get( key );\n\t\t\t\tupdateMapValue( ymap, key, currentValue, newValue );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'title': {\n\t\t\t\tconst currentValue = ymap.get( key );\n\n\t\t\t\t// Copy logic from prePersistPostType to ensure that the \"Auto\n\t\t\t\t// Draft\" template title is not synced.\n\t\t\t\tlet rawNewValue = getRawValue( newValue );\n\t\t\t\tif ( ! currentValue && 'Auto Draft' === rawNewValue ) {\n\t\t\t\t\trawNewValue = '';\n\t\t\t\t}\n\n\t\t\t\tupdateMapValue( ymap, key, currentValue, rawNewValue );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Add support for additional properties here.\n\n\t\t\tdefault: {\n\t\t\t\tconst currentValue = ymap.get( key );\n\t\t\t\tupdateMapValue( ymap, key, currentValue, newValue );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nexport function defaultGetChangesFromCRDTDoc( crdtDoc: CRDTDoc ): ObjectData {\n\treturn getRootMap( crdtDoc, CRDT_RECORD_MAP_KEY ).toJSON();\n}\n\n/**\n * Given a local Y.Doc that *may* contain changes from remote peers, compare\n * against the local record and determine if there are changes (edits) we want\n * to dispatch.\n *\n * @param {CRDTDoc} ydoc\n * @param {Post}    editedRecord\n * @param {Type}    _postType\n * @return {Partial<PostChanges>} The changes that should be applied to the local record.\n */\nexport function getPostChangesFromCRDTDoc(\n\tydoc: CRDTDoc,\n\teditedRecord: Post,\n\t_postType: Type // eslint-disable-line @typescript-eslint/no-unused-vars\n): PostChanges {\n\tconst ymap = getRootMap< YPostRecord >( ydoc, CRDT_RECORD_MAP_KEY );\n\n\tlet allowedMetaChanges: Post[ 'meta' ] = {};\n\n\tconst changes = Object.fromEntries(\n\t\tObject.entries( ymap.toJSON() ).filter( ( [ key, newValue ] ) => {\n\t\t\tif ( ! allowedPostProperties.has( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst currentValue = editedRecord[ key ];\n\n\t\t\tswitch ( key ) {\n\t\t\t\tcase 'blocks': {\n\t\t\t\t\t// When we are passed a persisted CRDT document, make a special\n\t\t\t\t\t// comparison of the content and blocks.\n\t\t\t\t\t//\n\t\t\t\t\t// When other fields (besides `blocks`) are mutated outside the block\n\t\t\t\t\t// editor, the change is caught by an equality check (see other cases\n\t\t\t\t\t// in this `switch` statement). As a transient property, `blocks`\n\t\t\t\t\t// cannot be directly mutated outside the block editor -- only\n\t\t\t\t\t// `content` can.\n\t\t\t\t\t//\n\t\t\t\t\t// Therefore, for this special comparison, we serialize the `blocks`\n\t\t\t\t\t// from the persisted CRDT document and compare that to the content\n\t\t\t\t\t// from the persisted record. If they differ, we know that the content\n\t\t\t\t\t// in the database has changed, and therefore the blocks have changed.\n\t\t\t\t\t//\n\t\t\t\t\t// We cannot directly compare the `blocks` from the CRDT document to\n\t\t\t\t\t// the `blocks` derived from the `content` in the persisted record,\n\t\t\t\t\t// because the latter will have different client IDs.\n\t\t\t\t\tif (\n\t\t\t\t\t\tydoc.meta?.get( CRDT_DOC_META_PERSISTENCE_KEY ) &&\n\t\t\t\t\t\teditedRecord.content\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst blocks = ymap.get( 'blocks' ) as YBlocks;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t__unstableSerializeAndClean(\n\t\t\t\t\t\t\t\tblocks.toJSON()\n\t\t\t\t\t\t\t).trim() !== editedRecord.content.raw.trim()\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// The consumers of blocks have memoization that renders optimization\n\t\t\t\t\t// here unnecessary.\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tcase 'date': {\n\t\t\t\t\t// Do not overwrite a \"floating\" date. Borrowing logic from the\n\t\t\t\t\t// isEditedPostDateFloating selector.\n\t\t\t\t\tconst currentDateIsFloating =\n\t\t\t\t\t\t[ 'draft', 'auto-draft', 'pending' ].includes(\n\t\t\t\t\t\t\tymap.get( 'status' ) as string\n\t\t\t\t\t\t) &&\n\t\t\t\t\t\t( null === currentValue ||\n\t\t\t\t\t\t\teditedRecord.modified === currentValue );\n\n\t\t\t\t\tif ( currentDateIsFloating ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn haveValuesChanged( currentValue, newValue );\n\t\t\t\t}\n\n\t\t\t\tcase 'meta': {\n\t\t\t\t\tallowedMetaChanges = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( newValue ?? {} ).filter(\n\t\t\t\t\t\t\t( [ metaKey ] ) =>\n\t\t\t\t\t\t\t\t! disallowedPostMetaKeys.has( metaKey )\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\t// Merge the allowed meta changes with the current meta values since\n\t\t\t\t\t// not all meta properties are synced.\n\t\t\t\t\tconst mergedValue = {\n\t\t\t\t\t\t...( currentValue as PostChanges[ 'meta' ] ),\n\t\t\t\t\t\t...allowedMetaChanges,\n\t\t\t\t\t};\n\n\t\t\t\t\treturn haveValuesChanged( currentValue, mergedValue );\n\t\t\t\t}\n\n\t\t\t\tcase 'status': {\n\t\t\t\t\t// Do not sync an invalid status.\n\t\t\t\t\tif ( 'auto-draft' === newValue ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn haveValuesChanged( currentValue, newValue );\n\t\t\t\t}\n\n\t\t\t\tcase 'excerpt':\n\t\t\t\tcase 'title': {\n\t\t\t\t\treturn haveValuesChanged(\n\t\t\t\t\t\tgetRawValue( currentValue ),\n\t\t\t\t\t\tnewValue\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Add support for additional data types here.\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn haveValuesChanged( currentValue, newValue );\n\t\t\t\t}\n\t\t\t}\n\t\t} )\n\t);\n\n\t// Meta changes must be merged with the edited record since not all meta\n\t// properties are synced.\n\tif ( 'object' === typeof changes.meta ) {\n\t\tchanges.meta = {\n\t\t\t...editedRecord.meta,\n\t\t\t...allowedMetaChanges,\n\t\t};\n\t}\n\n\treturn changes;\n}\n\n/**\n * Extract the raw string value from a property that may be a string or an object\n * with a `raw` property (`RenderedText`).\n *\n * @param {unknown} value The value to extract from.\n * @return {string|undefined} The raw string value, or undefined if it could not be determined.\n */\nfunction getRawValue( value?: unknown ): string | undefined {\n\t// Value may be a string property or a nested object with a `raw` property.\n\tif ( 'string' === typeof value ) {\n\t\treturn value;\n\t}\n\n\tif (\n\t\tvalue &&\n\t\t'object' === typeof value &&\n\t\t'raw' in value &&\n\t\t'string' === typeof value.raw\n\t) {\n\t\treturn value.raw;\n\t}\n\n\treturn undefined;\n}\n\nfunction haveValuesChanged< ValueType >(\n\tcurrentValue: ValueType | undefined,\n\tnewValue: ValueType | undefined\n): boolean {\n\treturn ! fastDeepEqual( currentValue, newValue );\n}\n\nfunction updateMapValue< T extends YMapRecord, K extends keyof T >(\n\tmap: YMapWrap< T >,\n\tkey: K,\n\tcurrentValue: T[ K ] | undefined,\n\tnewValue: T[ K ] | undefined\n): void {\n\tif ( undefined === newValue ) {\n\t\tmap.delete( key );\n\t\treturn;\n\t}\n\n\tif ( haveValuesChanged< T[ K ] >( currentValue, newValue ) ) {\n\t\tmap.set( key, newValue );\n\t}\n}\n", "// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n  // lazy load so that environments that need to polyfill have a chance to do so\n  if (!getRandomValues) {\n    // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n    if (!getRandomValues) {\n      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n    }\n  }\n\n  return getRandomValues(rnds8);\n}", "import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n  // Note: Be careful editing this code!  It's been tuned for performance\n  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n  return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n  const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID.  If this throws, it's likely due to one\n  // of the following:\n  // - One or more input array values don't map to a hex octet (leading to\n  // \"undefined\" in the uuid)\n  // - Invalid input values for the RFC `version` or `variant` fields\n\n  if (!validate(uuid)) {\n    throw TypeError('Stringified UUID is invalid');\n  }\n\n  return uuid;\n}\n\nexport default stringify;", "const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n  randomUUID\n};", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n  if (native.randomUUID && !buf && !options) {\n    return native.randomUUID();\n  }\n\n  options = options || {};\n  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n  rnds[6] = rnds[6] & 0x0f | 0x40;\n  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n  if (buf) {\n    offset = offset || 0;\n\n    for (let i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n\n    return buf;\n  }\n\n  return unsafeStringify(rnds);\n}\n\nexport default v4;", "/**\n * External dependencies\n */\nimport { v4 as uuidv4 } from 'uuid';\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\n\n/**\n * WordPress dependencies\n */\n// @ts-expect-error No exported types.\nimport { getBlockTypes } from '@wordpress/blocks';\nimport { RichTextData } from '@wordpress/rich-text';\nimport { Y, Delta } from '@wordpress/sync';\n\n/**\n * Internal dependencies\n */\nimport { createYMap, type YMapRecord, type YMapWrap } from './crdt-utils';\n\ninterface BlockAttributes {\n\t[ key: string ]: unknown;\n}\n\ninterface BlockType {\n\tname: string;\n\tattributes?: Record< string, { type?: string } >;\n}\n\n// A block as represented in Gutenberg's data store.\nexport interface Block {\n\tattributes: BlockAttributes;\n\tclientId?: string;\n\tinnerBlocks: Block[];\n\tisValid?: boolean;\n\tname: string;\n\toriginalContent?: string;\n\tvalidationIssues?: string[]; // unserializable\n}\n\n// A block as represented in the CRDT document (Y.Map).\ninterface YBlockRecord extends YMapRecord {\n\tattributes: YBlockAttributes;\n\tclientId: string;\n\tinnerBlocks: YBlocks;\n\tisValid?: boolean;\n\toriginalContent?: string;\n\tname: string;\n}\n\nexport type YBlock = YMapWrap< YBlockRecord >;\nexport type YBlocks = Y.Array< YBlock >;\n\n// Block attribute schema cannot be known at compile time, so we use Y.Map.\n// Attribute values will be typed as the union of `Y.Text` and `unknown`.\nexport type YBlockAttributes = Y.Map< Y.Text | unknown >;\n\nconst serializableBlocksCache = new WeakMap< WeakKey, Block[] >();\n\nfunction makeBlockAttributesSerializable(\n\tattributes: BlockAttributes\n): BlockAttributes {\n\tconst newAttributes = { ...attributes };\n\tfor ( const [ key, value ] of Object.entries( attributes ) ) {\n\t\tif ( value instanceof RichTextData ) {\n\t\t\tnewAttributes[ key ] = value.valueOf();\n\t\t}\n\t}\n\treturn newAttributes;\n}\n\nfunction makeBlocksSerializable( blocks: Block[] ): Block[] {\n\treturn blocks.map( ( block: Block ) => {\n\t\tconst { name, innerBlocks, attributes, ...rest } = block;\n\t\tdelete rest.validationIssues;\n\t\treturn {\n\t\t\t...rest,\n\t\t\tname,\n\t\t\tattributes: makeBlockAttributesSerializable( attributes ),\n\t\t\tinnerBlocks: makeBlocksSerializable( innerBlocks ),\n\t\t};\n\t} );\n}\n\n/**\n * @param {any}   gblock\n * @param {Y.Map} yblock\n */\nfunction areBlocksEqual( gblock: Block, yblock: YBlock ): boolean {\n\tconst yblockAsJson = yblock.toJSON();\n\n\t// we must not sync clientId, as this can't be generated consistently and\n\t// hence will lead to merge conflicts.\n\tconst overwrites = {\n\t\tinnerBlocks: null,\n\t\tclientId: null,\n\t};\n\tconst res = fastDeepEqual(\n\t\tObject.assign( {}, gblock, overwrites ),\n\t\tObject.assign( {}, yblockAsJson, overwrites )\n\t);\n\tconst inners = gblock.innerBlocks || [];\n\tconst yinners = yblock.get( 'innerBlocks' );\n\treturn (\n\t\tres &&\n\t\tinners.length === yinners?.length &&\n\t\tinners.every( ( block: Block, i: number ) =>\n\t\t\tareBlocksEqual( block, yinners.get( i ) )\n\t\t)\n\t);\n}\n\nfunction createNewYAttributeMap(\n\tblockName: string,\n\tattributes: BlockAttributes\n): YBlockAttributes {\n\treturn new Y.Map(\n\t\tObject.entries( attributes ).map(\n\t\t\t( [ attributeName, attributeValue ] ) => {\n\t\t\t\treturn [\n\t\t\t\t\tattributeName,\n\t\t\t\t\tcreateNewYAttributeValue(\n\t\t\t\t\t\tblockName,\n\t\t\t\t\t\tattributeName,\n\t\t\t\t\t\tattributeValue\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t}\n\t\t)\n\t);\n}\n\nfunction createNewYAttributeValue(\n\tblockName: string,\n\tattributeName: string,\n\tattributeValue: unknown\n): Y.Text | unknown {\n\tconst isRichText = isRichTextAttribute( blockName, attributeName );\n\n\tif ( isRichText ) {\n\t\treturn new Y.Text( attributeValue?.toString() ?? '' );\n\t}\n\n\treturn attributeValue;\n}\n\nfunction createNewYBlock( block: Block ): YBlock {\n\treturn createYMap< YBlockRecord >(\n\t\tObject.fromEntries(\n\t\t\tObject.entries( block ).map( ( [ key, value ] ) => {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'attributes': {\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tcreateNewYAttributeMap( block.name, value ),\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'innerBlocks': {\n\t\t\t\t\t\tconst innerBlocks = new Y.Array();\n\n\t\t\t\t\t\t// If not an array, set to empty Y.Array.\n\t\t\t\t\t\tif ( ! Array.isArray( value ) ) {\n\t\t\t\t\t\t\treturn [ key, innerBlocks ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinnerBlocks.insert(\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\tvalue.map( ( innerBlock: Block ) =>\n\t\t\t\t\t\t\t\tcreateNewYBlock( innerBlock )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn [ key, innerBlocks ];\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn [ key, value ];\n\t\t\t\t}\n\t\t\t} )\n\t\t)\n\t);\n}\n\n/**\n * Merge incoming block data into the local Y.Doc.\n * This function is called to sync local block changes to a shared Y.Doc.\n *\n * @param yblocks        The blocks in the local Y.Doc.\n * @param incomingBlocks Gutenberg blocks being synced.\n * @param cursorPosition The position of the cursor after the change occurs.\n */\nexport function mergeCrdtBlocks(\n\tyblocks: YBlocks,\n\tincomingBlocks: Block[],\n\tcursorPosition: number | null\n): void {\n\t// Ensure we are working with serializable block data.\n\tif ( ! serializableBlocksCache.has( incomingBlocks ) ) {\n\t\tserializableBlocksCache.set(\n\t\t\tincomingBlocks,\n\t\t\tmakeBlocksSerializable( incomingBlocks )\n\t\t);\n\t}\n\tconst allBlocks = serializableBlocksCache.get( incomingBlocks ) ?? [];\n\n\t// Ensure we skip blocks that we don't want to sync at the moment\n\tconst blocksToSync = allBlocks.filter( ( block ) =>\n\t\tshouldBlockBeSynced( block )\n\t);\n\n\t// This is a rudimentary diff implementation similar to the y-prosemirror diffing\n\t// approach.\n\t// A better implementation would also diff the textual content and represent it\n\t// using a Y.Text type.\n\t// However, at this time it makes more sense to keep this algorithm generic to\n\t// support all kinds of block types.\n\t// Ideally, we ensure that block data structure have a consistent data format.\n\t// E.g.:\n\t//   - textual content (using rich-text formatting?) may always be stored under `block.text`\n\t//   - local information that shouldn't be shared (e.g. clientId or isDragging) is stored under `block.private`\n\t//\n\t// @credit Kevin Jahns (dmonad)\n\t// @link https://github.com/WordPress/gutenberg/pull/68483\n\tconst numOfCommonEntries = Math.min(\n\t\tblocksToSync.length ?? 0,\n\t\tyblocks.length\n\t);\n\n\tlet left = 0;\n\tlet right = 0;\n\n\t// skip equal blocks from left\n\tfor (\n\t\t;\n\t\tleft < numOfCommonEntries &&\n\t\tareBlocksEqual( blocksToSync[ left ], yblocks.get( left ) );\n\t\tleft++\n\t) {\n\t\t/* nop */\n\t}\n\n\t// skip equal blocks from right\n\tfor (\n\t\t;\n\t\tright < numOfCommonEntries - left &&\n\t\tareBlocksEqual(\n\t\t\tblocksToSync[ blocksToSync.length - right - 1 ],\n\t\t\tyblocks.get( yblocks.length - right - 1 )\n\t\t);\n\t\tright++\n\t) {\n\t\t/* nop */\n\t}\n\n\tconst numOfUpdatesNeeded = numOfCommonEntries - left - right;\n\tconst numOfInsertionsNeeded = Math.max(\n\t\t0,\n\t\tblocksToSync.length - yblocks.length\n\t);\n\tconst numOfDeletionsNeeded = Math.max(\n\t\t0,\n\t\tyblocks.length - blocksToSync.length\n\t);\n\n\t// updates\n\tfor ( let i = 0; i < numOfUpdatesNeeded; i++, left++ ) {\n\t\tconst block = blocksToSync[ left ];\n\t\tconst yblock = yblocks.get( left );\n\t\tObject.entries( block ).forEach( ( [ key, value ] ) => {\n\t\t\tswitch ( key ) {\n\t\t\t\tcase 'attributes': {\n\t\t\t\t\tconst currentAttributes = yblock.get( key );\n\n\t\t\t\t\t// If attributes are not set on the yblock, use the new values.\n\t\t\t\t\tif ( ! currentAttributes ) {\n\t\t\t\t\t\tyblock.set(\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tcreateNewYAttributeMap( block.name, value )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.entries( value ).forEach(\n\t\t\t\t\t\t( [ attributeName, attributeValue ] ) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tfastDeepEqual(\n\t\t\t\t\t\t\t\t\tcurrentAttributes?.get( attributeName ),\n\t\t\t\t\t\t\t\t\tattributeValue\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst currentAttribute =\n\t\t\t\t\t\t\t\tcurrentAttributes.get( attributeName );\n\t\t\t\t\t\t\tconst isRichText = isRichTextAttribute(\n\t\t\t\t\t\t\t\tblock.name,\n\t\t\t\t\t\t\t\tattributeName\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tisRichText &&\n\t\t\t\t\t\t\t\t'string' === typeof attributeValue &&\n\t\t\t\t\t\t\t\tcurrentAttributes.has( attributeName ) &&\n\t\t\t\t\t\t\t\tcurrentAttribute instanceof Y.Text\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// Rich text values are stored as persistent Y.Text instances.\n\t\t\t\t\t\t\t\t// Update the value with a delta in place.\n\t\t\t\t\t\t\t\tmergeRichTextUpdate(\n\t\t\t\t\t\t\t\t\tcurrentAttribute,\n\t\t\t\t\t\t\t\t\tattributeValue,\n\t\t\t\t\t\t\t\t\tcursorPosition\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrentAttributes.set(\n\t\t\t\t\t\t\t\t\tattributeName,\n\t\t\t\t\t\t\t\t\tcreateNewYAttributeValue(\n\t\t\t\t\t\t\t\t\t\tblock.name,\n\t\t\t\t\t\t\t\t\t\tattributeName,\n\t\t\t\t\t\t\t\t\t\tattributeValue\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// Delete any attributes that are no longer present.\n\t\t\t\t\tcurrentAttributes.forEach(\n\t\t\t\t\t\t( _attrValue: unknown, attrName: string ) => {\n\t\t\t\t\t\t\tif ( ! value.hasOwnProperty( attrName ) ) {\n\t\t\t\t\t\t\t\tcurrentAttributes.delete( attrName );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'innerBlocks': {\n\t\t\t\t\t// Recursively merge innerBlocks\n\t\t\t\t\tlet yInnerBlocks = yblock.get( key );\n\n\t\t\t\t\tif ( ! ( yInnerBlocks instanceof Y.Array ) ) {\n\t\t\t\t\t\tyInnerBlocks = new Y.Array< YBlock >();\n\t\t\t\t\t\tyblock.set( key, yInnerBlocks );\n\t\t\t\t\t}\n\n\t\t\t\t\tmergeCrdtBlocks(\n\t\t\t\t\t\tyInnerBlocks,\n\t\t\t\t\t\tvalue ?? [],\n\t\t\t\t\t\tcursorPosition\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tif ( ! fastDeepEqual( block[ key ], yblock.get( key ) ) ) {\n\t\t\t\t\t\tyblock.set( key, value );\n\t\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\tyblock.forEach( ( _v, k ) => {\n\t\t\tif ( ! block.hasOwnProperty( k ) ) {\n\t\t\t\tyblock.delete( k );\n\t\t\t}\n\t\t} );\n\t}\n\n\t// deletes\n\tyblocks.delete( left, numOfDeletionsNeeded );\n\n\t// inserts\n\tfor ( let i = 0; i < numOfInsertionsNeeded; i++, left++ ) {\n\t\tconst newBlock = [ createNewYBlock( blocksToSync[ left ] ) ];\n\n\t\tyblocks.insert( left, newBlock );\n\t}\n\n\t// remove duplicate clientids\n\tconst knownClientIds = new Set< string >();\n\tfor ( let j = 0; j < yblocks.length; j++ ) {\n\t\tconst yblock: YBlock = yblocks.get( j );\n\n\t\tlet clientId = yblock.get( 'clientId' );\n\n\t\tif ( ! clientId ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( knownClientIds.has( clientId ) ) {\n\t\t\tclientId = uuidv4();\n\t\t\tyblock.set( 'clientId', clientId );\n\t\t}\n\t\tknownClientIds.add( clientId );\n\t}\n}\n\n/**\n * Determine if a block should be synced.\n *\n * Ex: A gallery block should not be synced until the images have been\n * uploaded to WordPress, and their url is available. Before that,\n * it's not possible to access the blobs on a client as those are\n * local.\n *\n * @param block The block to check.\n * @return True if the block should be synced, false otherwise.\n */\nfunction shouldBlockBeSynced( block: Block ): boolean {\n\t// Verify that the gallery block is ready to be synced.\n\t// This means that, all images have had their blobs converted to full URLs.\n\t// Checking for only the blobs ensures that blocks that have just been inserted work as well.\n\tif ( 'core/gallery' === block.name ) {\n\t\treturn ! block.innerBlocks.some(\n\t\t\t( innerBlock ) =>\n\t\t\t\tinnerBlock.attributes && innerBlock.attributes.blob\n\t\t);\n\t}\n\n\t// Allow all other blocks to be synced.\n\treturn true;\n}\n\n// Cache rich-text attributes for all block types.\nlet cachedRichTextAttributes: Map< string, Map< string, true > >;\n\n/**\n * Given a block name and attribute key, return true if the attribute is rich-text typed.\n *\n * @param blockName     The name of the block, e.g. 'core/paragraph'.\n * @param attributeName The name of the attribute to check, e.g. 'content'.\n * @return True if the attribute is rich-text typed, false otherwise.\n */\nfunction isRichTextAttribute(\n\tblockName: string,\n\tattributeName: string\n): boolean {\n\tif ( ! cachedRichTextAttributes ) {\n\t\t// Parse the attributes for all blocks once.\n\t\tcachedRichTextAttributes = new Map< string, Map< string, true > >();\n\n\t\tfor ( const blockType of getBlockTypes() as BlockType[] ) {\n\t\t\tconst richTextAttributeMap = new Map< string, true >();\n\n\t\t\tfor ( const [ name, definition ] of Object.entries(\n\t\t\t\tblockType.attributes ?? {}\n\t\t\t) ) {\n\t\t\t\tif ( 'rich-text' === definition.type ) {\n\t\t\t\t\trichTextAttributeMap.set( name, true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcachedRichTextAttributes.set(\n\t\t\t\tblockType.name,\n\t\t\t\trichTextAttributeMap\n\t\t\t);\n\t\t}\n\t}\n\n\treturn (\n\t\tcachedRichTextAttributes.get( blockName )?.has( attributeName ) ?? false\n\t);\n}\n\nlet localDoc: Y.Doc;\n\n/**\n * Given a Y.Text object and an updated string value, diff the new value and\n * apply the delta to the Y.Text.\n *\n * @param blockYText     The Y.Text to update.\n * @param updatedValue   The updated value.\n * @param cursorPosition The position of the cursor after the change occurs.\n */\nfunction mergeRichTextUpdate(\n\tblockYText: Y.Text,\n\tupdatedValue: string,\n\tcursorPosition: number | null\n): void {\n\t// Gutenberg does not use Yjs shared types natively, so we can only subscribe\n\t// to changes from store and apply them to Yjs types that we create and\n\t// manage. Crucially, for rich-text attributes, we do not receive granular\n\t// string updates; we get the new full string value on each change, even when\n\t// only a single character changed.\n\t//\n\t// The code below allows us to compute a delta between the current and new\n\t// value, then apply it to the Y.Text.\n\n\tif ( ! localDoc ) {\n\t\t// Y.Text must be attached to a Y.Doc to be able to do operations on it.\n\t\t// Create a temporary Y.Text attached to a local Y.Doc for delta computation.\n\t\tlocalDoc = new Y.Doc();\n\t}\n\n\tconst localYText = localDoc.getText( 'temporary-text' );\n\tlocalYText.delete( 0, localYText.length );\n\tlocalYText.insert( 0, updatedValue );\n\n\tconst currentValueAsDelta = new Delta( blockYText.toDelta() );\n\tconst updatedValueAsDelta = new Delta( localYText.toDelta() );\n\tconst deltaDiff = currentValueAsDelta.diffWithCursor(\n\t\tupdatedValueAsDelta,\n\t\tcursorPosition\n\t);\n\n\tblockYText.applyDelta( deltaDiff.ops );\n}\n", "/**\n * WordPress dependencies\n */\nimport { Y } from '@wordpress/sync';\n\n/**\n * A YMapRecord represents the shape of the data stored in a Y.Map.\n */\nexport type YMapRecord = Record< string, unknown >;\n\n/**\n * A wrapper around Y.Map to provide type safety. The generic type accepted by\n * Y.Map represents the union of possible values of the map, which are varied in\n * many cases. This type is accurate, but its non-specificity requires aggressive\n * type narrowing or type casting / destruction with `as`.\n *\n * This type provides type enhancements so that the correct value type can be\n * inferred based on the provided key. It is just a type wrap / overlay, and\n * does not change the runtime behavior of Y.Map.\n *\n * This interface cannot extend Y.Map directly due to the limitations of\n * TypeScript's structural typing. One negative consequence of this is that\n * `instanceof` checks against Y.Map continue to work at runtime but will blur\n * the type at compile time. To navigate this, use the `isYMap` function below.\n */\nexport interface YMapWrap< T extends YMapRecord > extends Y.AbstractType< T > {\n\tdelete: < K extends keyof T >( key: K ) => void;\n\tforEach: (\n\t\tcallback: (\n\t\t\tvalue: T[ keyof T ],\n\t\t\tkey: keyof T,\n\t\t\tmap: YMapWrap< T >\n\t\t) => void\n\t) => void;\n\thas: < K extends keyof T >( key: K ) => boolean;\n\tget: < K extends keyof T >( key: K ) => T[ K ] | undefined;\n\tset: < K extends keyof T >( key: K, value: T[ K ] ) => void;\n\ttoJSON: () => T;\n\t// add types for other Y.Map methods as needed\n}\n\n/**\n * Get or create a root-level Map for the given Y.Doc. Use this instead of\n * doc.getMap() for additional type safety.\n *\n * @param doc Y.Doc\n * @param key Map key\n */\nexport function getRootMap< T extends YMapRecord >(\n\tdoc: Y.Doc,\n\tkey: string\n): YMapWrap< T > {\n\treturn doc.getMap< T >( key ) as unknown as YMapWrap< T >;\n}\n\n/**\n * Create a new Y.Map (provided with YMapWrap type), optionally initialized with\n * data. Use this instead of `new Y.Map()` for additional type safety.\n *\n * @param partial Partial data to initialize the map with.\n */\nexport function createYMap< T extends YMapRecord >(\n\tpartial: Partial< T > = {}\n): YMapWrap< T > {\n\treturn new Y.Map( Object.entries( partial ) ) as unknown as YMapWrap< T >;\n}\n\n/**\n * Type guard to check if a value is a Y.Map without losing type information.\n *\n * @param value Value to check.\n */\nexport function isYMap< T extends YMapRecord >(\n\tvalue: YMapWrap< T > | undefined\n): value is YMapWrap< T > {\n\treturn value instanceof Y.Map;\n}\n", "/**\n * WordPress dependencies\n */\nimport { createSelector, createRegistrySelector } from '@wordpress/data';\nimport { addQueryArgs } from '@wordpress/url';\nimport type { UndoManager } from '@wordpress/undo-manager';\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport {\n\tgetQueriedItems,\n\tgetQueriedTotalItems,\n\tgetQueriedTotalPages,\n} from './queried-data';\nimport { DEFAULT_ENTITY_KEY } from './entities';\nimport { getUndoManager } from './private-selectors';\nimport {\n\tgetNormalizedCommaSeparable,\n\tisRawAttribute,\n\tsetNestedValue,\n\tisNumericID,\n\tgetUserPermissionCacheKey,\n} from './utils';\nimport type * as ET from './entity-types';\nimport logEntityDeprecation from './utils/log-entity-deprecation';\n\n// This is an incomplete, high-level approximation of the State type.\n// It makes the selectors slightly more safe, but is intended to evolve\n// into a more detailed representation over time.\n// See https://github.com/WordPress/gutenberg/pull/40025#discussion_r865410589 for more context.\nexport interface State {\n\tautosaves: Record< string | number, Array< unknown > >;\n\tblockPatterns: Array< unknown >;\n\tblockPatternCategories: Array< unknown >;\n\tcurrentGlobalStylesId: string;\n\tcurrentTheme: string;\n\tcurrentUser: ET.User< 'view' >;\n\tembedPreviews: Record< string, { html: string } >;\n\tentities: EntitiesState;\n\tthemeBaseGlobalStyles: Record< string, Object >;\n\tthemeGlobalStyleVariations: Record< string, string >;\n\tthemeGlobalStyleRevisions: Record< number, Object >;\n\tundoManager: UndoManager;\n\tuserPermissions: Record< string, boolean >;\n\tusers: UserState;\n\tnavigationFallbackId: EntityRecordKey;\n\tuserPatternCategories: Array< UserPatternCategory >;\n\tdefaultTemplates: Record< string, string >;\n\tregisteredPostMeta: Record< string, Object >;\n\teditorSettings: Record< string, any > | null;\n\teditorAssets: Record< string, any > | null;\n}\n\ntype EntityRecordKey = string | number;\n\ninterface EntitiesState {\n\tconfig: EntityConfig[];\n\trecords: Record< string, Record< string, EntityState< ET.EntityRecord > > >;\n}\n\ninterface QueriedData {\n\titems: Record< ET.Context, Record< number, ET.EntityRecord > >;\n\titemIsComplete: Record< ET.Context, Record< number, boolean > >;\n\tqueries: Record< ET.Context, Record< string, Array< number > > >;\n}\n\ntype RevisionRecord =\n\t| Record< ET.Context, Record< number, ET.PostRevision > >\n\t| Record< ET.Context, Record< number, ET.GlobalStylesRevision > >;\n\ninterface RevisionsQueriedData {\n\titems: RevisionRecord;\n\titemIsComplete: Record< ET.Context, Record< number, boolean > >;\n\tqueries: Record< ET.Context, Record< string, Array< number > > >;\n}\n\ninterface EntityState< EntityRecord extends ET.EntityRecord > {\n\tedits: Record< string, Partial< EntityRecord > >;\n\tsaving: Record<\n\t\tstring,\n\t\tPartial< { pending: boolean; isAutosave: boolean; error: Error } >\n\t>;\n\tdeleting: Record< string, Partial< { pending: boolean; error: Error } > >;\n\tqueriedData: QueriedData;\n\trevisions?: RevisionsQueriedData;\n}\n\ninterface EntityConfig {\n\tname: string;\n\tkind: string;\n}\n\ninterface UserState {\n\tqueries: Record< string, EntityRecordKey[] >;\n\tbyId: Record< EntityRecordKey, ET.User< 'edit' > >;\n}\n\ntype TemplateQuery = {\n\tslug?: string;\n\tis_custom?: boolean;\n\tignore_empty?: boolean;\n};\n\nexport interface UserPatternCategory {\n\tid: number;\n\tname: string;\n\tlabel: string;\n\tslug: string;\n\tdescription: string;\n}\n\ntype Optional< T > = T | undefined;\n\n/**\n * HTTP Query parameters sent with the API request to fetch the entity records.\n */\nexport type GetRecordsHttpQuery = Record< string, any >;\n\n/**\n * Arguments for EntityRecord selectors.\n */\ntype EntityRecordArgs =\n\t| [ string, string, EntityRecordKey ]\n\t| [ string, string, EntityRecordKey, GetRecordsHttpQuery ];\n\ntype EntityResource = { kind: string; name: string; id?: EntityRecordKey };\n\n/**\n * Shared reference to an empty object for cases where it is important to avoid\n * returning a new object reference on every invocation, as in a connected or\n * other pure component which performs `shouldComponentUpdate` check on props.\n * This should be used as a last resort, since the normalized data should be\n * maintained by the reducer result in state.\n */\nconst EMPTY_OBJECT = {};\n\n/**\n * Returns true if a request is in progress for embed preview data, or false\n * otherwise.\n *\n * @param state Data state.\n * @param url   URL the preview would be for.\n *\n * @return Whether a request is in progress for an embed preview.\n */\nexport const isRequestingEmbedPreview = createRegistrySelector(\n\t( select: any ) =>\n\t\t( state: State, url: string ): boolean => {\n\t\t\treturn select( STORE_NAME ).isResolving( 'getEmbedPreview', [\n\t\t\t\turl,\n\t\t\t] );\n\t\t}\n);\n\n/**\n * Returns all available authors.\n *\n * @deprecated since 11.3. Callers should use `select( 'core' ).getUsers({ who: 'authors' })` instead.\n *\n * @param      state Data state.\n * @param      query Optional object of query parameters to\n *                   include with request. For valid query parameters see the [Users page](https://developer.wordpress.org/rest-api/reference/users/) in the REST API Handbook and see the arguments for [List Users](https://developer.wordpress.org/rest-api/reference/users/#list-users) and [Retrieve a User](https://developer.wordpress.org/rest-api/reference/users/#retrieve-a-user).\n * @return Authors list.\n */\nexport function getAuthors(\n\tstate: State,\n\tquery?: GetRecordsHttpQuery\n): ET.User[] {\n\tdeprecated( \"select( 'core' ).getAuthors()\", {\n\t\tsince: '5.9',\n\t\talternative: \"select( 'core' ).getUsers({ who: 'authors' })\",\n\t} );\n\n\tconst path = addQueryArgs(\n\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\tquery\n\t);\n\treturn getUserQueryResults( state, path );\n}\n\n/**\n * Returns the current user.\n *\n * @param state Data state.\n *\n * @return Current user object.\n */\nexport function getCurrentUser( state: State ): ET.User< 'view' > {\n\treturn state.currentUser;\n}\n\n/**\n * Returns all the users returned by a query ID.\n *\n * @param state   Data state.\n * @param queryID Query ID.\n *\n * @return Users list.\n */\nexport const getUserQueryResults = createSelector(\n\t( state: State, queryID: string ): ET.User< 'edit' >[] => {\n\t\tconst queryResults = state.users.queries[ queryID ] ?? [];\n\n\t\treturn queryResults.map( ( id ) => state.users.byId[ id ] );\n\t},\n\t( state: State, queryID: string ) => [\n\t\tstate.users.queries[ queryID ],\n\t\tstate.users.byId,\n\t]\n);\n\n/**\n * Returns the loaded entities for the given kind.\n *\n * @deprecated since WordPress 6.0. Use getEntitiesConfig instead\n * @param      state Data state.\n * @param      kind  Entity kind.\n *\n * @return Array of entities with config matching kind.\n */\nexport function getEntitiesByKind( state: State, kind: string ): Array< any > {\n\tdeprecated( \"wp.data.select( 'core' ).getEntitiesByKind()\", {\n\t\tsince: '6.0',\n\t\talternative: \"wp.data.select( 'core' ).getEntitiesConfig()\",\n\t} );\n\treturn getEntitiesConfig( state, kind );\n}\n\n/**\n * Returns the loaded entities for the given kind.\n *\n * @param state Data state.\n * @param kind  Entity kind.\n *\n * @return Array of entities with config matching kind.\n */\nexport const getEntitiesConfig = createSelector(\n\t( state: State, kind: string ): Array< any > =>\n\t\tstate.entities.config.filter( ( entity ) => entity.kind === kind ),\n\t/* eslint-disable @typescript-eslint/no-unused-vars */\n\t( state: State, kind: string ) => state.entities.config\n\t/* eslint-enable @typescript-eslint/no-unused-vars */\n);\n/**\n * Returns the entity config given its kind and name.\n *\n * @deprecated since WordPress 6.0. Use getEntityConfig instead\n * @param      state Data state.\n * @param      kind  Entity kind.\n * @param      name  Entity name.\n *\n * @return Entity config\n */\nexport function getEntity( state: State, kind: string, name: string ): any {\n\tdeprecated( \"wp.data.select( 'core' ).getEntity()\", {\n\t\tsince: '6.0',\n\t\talternative: \"wp.data.select( 'core' ).getEntityConfig()\",\n\t} );\n\treturn getEntityConfig( state, kind, name );\n}\n\n/**\n * Returns the entity config given its kind and name.\n *\n * @param state Data state.\n * @param kind  Entity kind.\n * @param name  Entity name.\n *\n * @return Entity config\n */\nexport function getEntityConfig(\n\tstate: State,\n\tkind: string,\n\tname: string\n): any {\n\tlogEntityDeprecation( kind, name, 'getEntityConfig' );\n\n\treturn state.entities.config?.find(\n\t\t( config ) => config.kind === kind && config.name === name\n\t);\n}\n\n/**\n * GetEntityRecord is declared as a *callable interface* with\n * two signatures to work around the fact that TypeScript doesn't\n * allow currying generic functions:\n *\n * ```ts\n * \t\ttype CurriedState = F extends ( state: any, ...args: infer P ) => infer R\n * \t\t\t? ( ...args: P ) => R\n * \t\t\t: F;\n * \t\ttype Selector = <K extends string | number>(\n *         state: any,\n *         kind: K,\n *         key: K extends string ? 'string value' : false\n *    ) => K;\n * \t\ttype BadlyInferredSignature = CurriedState< Selector >\n *    // BadlyInferredSignature evaluates to:\n *    // (kind: string number, key: false | \"string value\") => string number\n * ```\n *\n * The signature without the state parameter shipped as CurriedSignature\n * is used in the return value of `select( coreStore )`.\n *\n * See https://github.com/WordPress/gutenberg/pull/41578 for more details.\n */\nexport interface GetEntityRecord {\n\t<\n\t\tEntityRecord extends\n\t\t\t| ET.EntityRecord< any >\n\t\t\t| Partial< ET.EntityRecord< any > >,\n\t>(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\tkey?: EntityRecordKey,\n\t\tquery?: GetRecordsHttpQuery\n\t): EntityRecord | undefined;\n\n\tCurriedSignature: <\n\t\tEntityRecord extends\n\t\t\t| ET.EntityRecord< any >\n\t\t\t| Partial< ET.EntityRecord< any > >,\n\t>(\n\t\tkind: string,\n\t\tname: string,\n\t\tkey?: EntityRecordKey,\n\t\tquery?: GetRecordsHttpQuery\n\t) => EntityRecord | undefined;\n\t__unstableNormalizeArgs?: ( args: EntityRecordArgs ) => EntityRecordArgs;\n}\n\n/**\n * Returns the Entity's record object by key. Returns `null` if the value is not\n * yet received, undefined if the value entity is known to not exist, or the\n * entity object if it exists and is received.\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param key   Optional record's key. If requesting a global record (e.g. site settings), the key can be omitted. If requesting a specific item, the key must always be included.\n * @param query Optional query. If requesting specific\n *              fields, fields must always include the ID. For valid query parameters see the [Reference](https://developer.wordpress.org/rest-api/reference/) in the REST API Handbook and select the entity kind. Then see the arguments available \"Retrieve a [Entity kind]\".\n *\n * @return Record.\n */\nexport const getEntityRecord = createSelector(\n\t( <\n\t\tEntityRecord extends\n\t\t\t| ET.EntityRecord< any >\n\t\t\t| Partial< ET.EntityRecord< any > >,\n\t>(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\tkey?: EntityRecordKey,\n\t\tquery?: GetRecordsHttpQuery\n\t): EntityRecord | undefined => {\n\t\tlogEntityDeprecation( kind, name, 'getEntityRecord' );\n\t\tconst queriedState =\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData;\n\t\tif ( ! queriedState ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst context = query?.context ?? 'default';\n\n\t\tif ( ! query || ! query._fields ) {\n\t\t\t// If expecting a complete item, validate that completeness.\n\t\t\tif ( ! queriedState.itemIsComplete[ context ]?.[ key ] ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn queriedState.items[ context ][ key ];\n\t\t}\n\n\t\tconst item = queriedState.items[ context ]?.[ key ];\n\t\tif ( ! item ) {\n\t\t\treturn item;\n\t\t}\n\n\t\tconst filteredItem = {};\n\t\tconst fields = getNormalizedCommaSeparable( query._fields ) ?? [];\n\t\tfor ( let f = 0; f < fields.length; f++ ) {\n\t\t\tconst field = fields[ f ].split( '.' );\n\t\t\tlet value = item;\n\t\t\tfield.forEach( ( fieldName ) => {\n\t\t\t\tvalue = value?.[ fieldName ];\n\t\t\t} );\n\t\t\tsetNestedValue( filteredItem, field, value );\n\t\t}\n\t\treturn filteredItem as EntityRecord;\n\t} ) as GetEntityRecord,\n\t( state: State, kind, name, recordId, query ) => {\n\t\tconst context = query?.context ?? 'default';\n\t\tconst queriedState =\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData;\n\t\treturn [\n\t\t\tqueriedState?.items[ context ]?.[ recordId ],\n\t\t\tqueriedState?.itemIsComplete[ context ]?.[ recordId ],\n\t\t];\n\t}\n) as GetEntityRecord;\n\n/**\n * Normalizes `recordKey`s that look like numeric IDs to numbers.\n *\n * @param args EntityRecordArgs the selector arguments.\n * @return EntityRecordArgs the normalized arguments.\n */\ngetEntityRecord.__unstableNormalizeArgs = (\n\targs: EntityRecordArgs\n): EntityRecordArgs => {\n\tconst newArgs = [ ...args ] as EntityRecordArgs;\n\tconst recordKey = newArgs?.[ 2 ];\n\n\t// If recordKey looks to be a numeric ID then coerce to number.\n\tnewArgs[ 2 ] = isNumericID( recordKey ) ? Number( recordKey ) : recordKey;\n\n\treturn newArgs;\n};\n\n/**\n * Returns true if a record has been received for the given set of parameters, or false otherwise.\n *\n * Note: This action does not trigger a request for the entity record from the API\n * if it's not available in the local state.\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param key   Record's key.\n * @param query Optional query.\n *\n * @return Whether an entity record has been received.\n */\nexport function hasEntityRecord(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\tkey?: EntityRecordKey,\n\tquery?: GetRecordsHttpQuery\n): boolean {\n\tconst queriedState =\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData;\n\tif ( ! queriedState ) {\n\t\treturn false;\n\t}\n\tconst context = query?.context ?? 'default';\n\n\t// If expecting a complete item, validate that completeness.\n\tif ( ! query || ! query._fields ) {\n\t\treturn !! queriedState.itemIsComplete[ context ]?.[ key ];\n\t}\n\n\tconst item = queriedState.items[ context ]?.[ key ];\n\tif ( ! item ) {\n\t\treturn false;\n\t}\n\n\t// When `query._fields` is provided, check that each requested field exists,\n\t// including any nested paths, on the item; return false if any part is missing.\n\tconst fields = getNormalizedCommaSeparable( query._fields ) ?? [];\n\tfor ( let i = 0; i < fields.length; i++ ) {\n\t\tconst path = fields[ i ].split( '.' );\n\t\tlet value = item;\n\t\tfor ( let p = 0; p < path.length; p++ ) {\n\t\t\tconst part = path[ p ];\n\t\t\tif ( ! value || ! Object.hasOwn( value, part ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvalue = value[ part ];\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Returns the Entity's record object by key. Doesn't trigger a resolver nor requests the entity records from the API if the entity record isn't available in the local state.\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param key   Record's key\n *\n * @return Record.\n */\nexport function __experimentalGetEntityRecordNoResolver<\n\tEntityRecord extends ET.EntityRecord< any >,\n>( state: State, kind: string, name: string, key: EntityRecordKey ) {\n\treturn getEntityRecord< EntityRecord >( state, kind, name, key );\n}\n\n/**\n * Returns the entity's record object by key,\n * with its attributes mapped to their raw values.\n *\n * @param state State tree.\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param key   Record's key.\n *\n * @return Object with the entity's raw attributes.\n */\nexport const getRawEntityRecord = createSelector(\n\t< EntityRecord extends ET.EntityRecord< any > >(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\tkey: EntityRecordKey\n\t): EntityRecord | undefined => {\n\t\tlogEntityDeprecation( kind, name, 'getRawEntityRecord' );\n\n\t\tconst record = getEntityRecord< EntityRecord >(\n\t\t\tstate,\n\t\t\tkind,\n\t\t\tname,\n\t\t\tkey\n\t\t);\n\t\treturn (\n\t\t\trecord &&\n\t\t\tObject.keys( record ).reduce( ( accumulator, _key ) => {\n\t\t\t\tif (\n\t\t\t\t\tisRawAttribute( getEntityConfig( state, kind, name ), _key )\n\t\t\t\t) {\n\t\t\t\t\t// Because edits are the \"raw\" attribute values,\n\t\t\t\t\t// we return those from record selectors to make rendering,\n\t\t\t\t\t// comparisons, and joins with edits easier.\n\t\t\t\t\taccumulator[ _key ] =\n\t\t\t\t\t\trecord[ _key ]?.raw !== undefined\n\t\t\t\t\t\t\t? record[ _key ]?.raw\n\t\t\t\t\t\t\t: record[ _key ];\n\t\t\t\t} else {\n\t\t\t\t\taccumulator[ _key ] = record[ _key ];\n\t\t\t\t}\n\t\t\t\treturn accumulator;\n\t\t\t}, {} as any )\n\t\t);\n\t},\n\t(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\trecordId: EntityRecordKey,\n\t\tquery?: GetRecordsHttpQuery\n\t) => {\n\t\tconst context = query?.context ?? 'default';\n\t\treturn [\n\t\t\tstate.entities.config,\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData?.items[\n\t\t\t\tcontext\n\t\t\t]?.[ recordId ],\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData\n\t\t\t\t?.itemIsComplete[ context ]?.[ recordId ],\n\t\t];\n\t}\n);\n\n/**\n * Returns true if records have been received for the given set of parameters,\n * or false otherwise.\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param query Optional terms query. For valid query parameters see the [Reference](https://developer.wordpress.org/rest-api/reference/) in the REST API Handbook and select the entity kind. Then see the arguments available for \"List [Entity kind]s\".\n *\n * @return  Whether entity records have been received.\n */\nexport function hasEntityRecords(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\tquery?: GetRecordsHttpQuery\n): boolean {\n\tlogEntityDeprecation( kind, name, 'hasEntityRecords' );\n\treturn Array.isArray( getEntityRecords( state, kind, name, query ) );\n}\n\n/**\n * GetEntityRecord is declared as a *callable interface* with\n * two signatures to work around the fact that TypeScript doesn't\n * allow currying generic functions.\n *\n * @see GetEntityRecord\n * @see https://github.com/WordPress/gutenberg/pull/41578\n */\nexport interface GetEntityRecords {\n\t<\n\t\tEntityRecord extends\n\t\t\t| ET.EntityRecord< any >\n\t\t\t| Partial< ET.EntityRecord< any > >,\n\t>(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\tquery?: GetRecordsHttpQuery\n\t): EntityRecord[] | null;\n\n\tCurriedSignature: <\n\t\tEntityRecord extends\n\t\t\t| ET.EntityRecord< any >\n\t\t\t| Partial< ET.EntityRecord< any > >,\n\t>(\n\t\tkind: string,\n\t\tname: string,\n\t\tquery?: GetRecordsHttpQuery\n\t) => EntityRecord[] | null;\n\n\tPromiseCurriedSignature: <\n\t\tEntityRecord extends\n\t\t\t| ET.EntityRecord< any >\n\t\t\t| Partial< ET.EntityRecord< any > >,\n\t>(\n\t\tkind: string,\n\t\tname: string,\n\t\tquery?: GetRecordsHttpQuery\n\t) => Promise< EntityRecord[] | null >;\n}\n\n/**\n * Returns the Entity's records.\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param query Optional terms query. If requesting specific\n *              fields, fields must always include the ID. For valid query parameters see the [Reference](https://developer.wordpress.org/rest-api/reference/) in the REST API Handbook and select the entity kind. Then see the arguments available for \"List [Entity kind]s\".\n *\n * @return Records.\n */\nexport const getEntityRecords = ( <\n\tEntityRecord extends\n\t\t| ET.EntityRecord< any >\n\t\t| Partial< ET.EntityRecord< any > >,\n>(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\tquery: GetRecordsHttpQuery\n): EntityRecord[] | null => {\n\tlogEntityDeprecation( kind, name, 'getEntityRecords' );\n\n\t// Queried data state is prepopulated for all known entities. If this is not\n\t// assigned for the given parameters, then it is known to not exist.\n\tconst queriedState =\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData;\n\tif ( ! queriedState ) {\n\t\treturn null;\n\t}\n\treturn getQueriedItems( queriedState, query );\n} ) as GetEntityRecords;\n\n/**\n * Returns the Entity's total available records for a given query (ignoring pagination).\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param query Optional terms query. If requesting specific\n *              fields, fields must always include the ID. For valid query parameters see the [Reference](https://developer.wordpress.org/rest-api/reference/) in the REST API Handbook and select the entity kind. Then see the arguments available for \"List [Entity kind]s\".\n *\n * @return number | null.\n */\nexport const getEntityRecordsTotalItems = (\n\tstate: State,\n\tkind: string,\n\tname: string,\n\tquery: GetRecordsHttpQuery\n): number | null => {\n\tlogEntityDeprecation( kind, name, 'getEntityRecordsTotalItems' );\n\n\t// Queried data state is prepopulated for all known entities. If this is not\n\t// assigned for the given parameters, then it is known to not exist.\n\tconst queriedState =\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData;\n\tif ( ! queriedState ) {\n\t\treturn null;\n\t}\n\treturn getQueriedTotalItems( queriedState, query );\n};\n\n/**\n * Returns the number of available pages for the given query.\n *\n * @param state State tree\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param query Optional terms query. If requesting specific\n *              fields, fields must always include the ID. For valid query parameters see the [Reference](https://developer.wordpress.org/rest-api/reference/) in the REST API Handbook and select the entity kind. Then see the arguments available for \"List [Entity kind]s\".\n *\n * @return number | null.\n */\nexport const getEntityRecordsTotalPages = (\n\tstate: State,\n\tkind: string,\n\tname: string,\n\tquery: GetRecordsHttpQuery\n): number | null => {\n\tlogEntityDeprecation( kind, name, 'getEntityRecordsTotalPages' );\n\n\t// Queried data state is prepopulated for all known entities. If this is not\n\t// assigned for the given parameters, then it is known to not exist.\n\tconst queriedState =\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData;\n\tif ( ! queriedState ) {\n\t\treturn null;\n\t}\n\tif ( query?.per_page === -1 ) {\n\t\treturn 1;\n\t}\n\tconst totalItems = getQueriedTotalItems( queriedState, query );\n\tif ( ! totalItems ) {\n\t\treturn totalItems;\n\t}\n\t// If `per_page` is not set and the query relies on the defaults of the\n\t// REST endpoint, get the info from query's meta.\n\tif ( ! query?.per_page ) {\n\t\treturn getQueriedTotalPages( queriedState, query );\n\t}\n\treturn Math.ceil( totalItems / query.per_page );\n};\n\ntype DirtyEntityRecord = {\n\ttitle: string;\n\tkey: EntityRecordKey;\n\tname: string;\n\tkind: string;\n};\n/**\n * Returns the list of dirty entity records.\n *\n * @param state State tree.\n *\n * @return The list of updated records\n */\nexport const __experimentalGetDirtyEntityRecords = createSelector(\n\t( state: State ): Array< DirtyEntityRecord > => {\n\t\tconst {\n\t\t\tentities: { records },\n\t\t} = state;\n\t\tconst dirtyRecords: DirtyEntityRecord[] = [];\n\t\tObject.keys( records ).forEach( ( kind ) => {\n\t\t\tObject.keys( records[ kind ] ).forEach( ( name ) => {\n\t\t\t\tconst primaryKeys = (\n\t\t\t\t\tObject.keys( records[ kind ][ name ].edits ) as string[]\n\t\t\t\t ).filter(\n\t\t\t\t\t( primaryKey ) =>\n\t\t\t\t\t\t// The entity record must exist (not be deleted),\n\t\t\t\t\t\t// and it must have edits.\n\t\t\t\t\t\tgetEntityRecord( state, kind, name, primaryKey ) &&\n\t\t\t\t\t\thasEditsForEntityRecord( state, kind, name, primaryKey )\n\t\t\t\t);\n\n\t\t\t\tif ( primaryKeys.length ) {\n\t\t\t\t\tconst entityConfig = getEntityConfig( state, kind, name );\n\t\t\t\t\tprimaryKeys.forEach( ( primaryKey ) => {\n\t\t\t\t\t\tconst entityRecord = getEditedEntityRecord(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tprimaryKey\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdirtyRecords.push( {\n\t\t\t\t\t\t\t// We avoid using primaryKey because it's transformed into a string\n\t\t\t\t\t\t\t// when it's used as an object key.\n\t\t\t\t\t\t\tkey: entityRecord\n\t\t\t\t\t\t\t\t? entityRecord[\n\t\t\t\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY\n\t\t\t\t\t\t\t\t  ]\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tentityConfig?.getTitle?.( entityRecord ) || '',\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\treturn dirtyRecords;\n\t},\n\t( state ) => [ state.entities.records ]\n);\n\n/**\n * Returns the list of entities currently being saved.\n *\n * @param state State tree.\n *\n * @return The list of records being saved.\n */\nexport const __experimentalGetEntitiesBeingSaved = createSelector(\n\t( state: State ): Array< DirtyEntityRecord > => {\n\t\tconst {\n\t\t\tentities: { records },\n\t\t} = state;\n\t\tconst recordsBeingSaved: DirtyEntityRecord[] = [];\n\t\tObject.keys( records ).forEach( ( kind ) => {\n\t\t\tObject.keys( records[ kind ] ).forEach( ( name ) => {\n\t\t\t\tconst primaryKeys = (\n\t\t\t\t\tObject.keys( records[ kind ][ name ].saving ) as string[]\n\t\t\t\t ).filter( ( primaryKey ) =>\n\t\t\t\t\tisSavingEntityRecord( state, kind, name, primaryKey )\n\t\t\t\t);\n\n\t\t\t\tif ( primaryKeys.length ) {\n\t\t\t\t\tconst entityConfig = getEntityConfig( state, kind, name );\n\t\t\t\t\tprimaryKeys.forEach( ( primaryKey ) => {\n\t\t\t\t\t\tconst entityRecord = getEditedEntityRecord(\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tprimaryKey\n\t\t\t\t\t\t);\n\t\t\t\t\t\trecordsBeingSaved.push( {\n\t\t\t\t\t\t\t// We avoid using primaryKey because it's transformed into a string\n\t\t\t\t\t\t\t// when it's used as an object key.\n\t\t\t\t\t\t\tkey: entityRecord\n\t\t\t\t\t\t\t\t? entityRecord[\n\t\t\t\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY\n\t\t\t\t\t\t\t\t  ]\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tentityConfig?.getTitle?.( entityRecord ) || '',\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t\treturn recordsBeingSaved;\n\t},\n\t( state ) => [ state.entities.records ]\n);\n\n/**\n * Returns the specified entity record's edits.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return The entity record's edits.\n */\nexport function getEntityRecordEdits(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): Optional< any > {\n\tlogEntityDeprecation( kind, name, 'getEntityRecordEdits' );\n\treturn state.entities.records?.[ kind ]?.[ name ]?.edits?.[\n\t\trecordId as string | number\n\t];\n}\n\n/**\n * Returns the specified entity record's non transient edits.\n *\n * Transient edits don't create an undo level, and\n * are not considered for change detection.\n * They are defined in the entity's config.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return The entity record's non transient edits.\n */\nexport const getEntityRecordNonTransientEdits = createSelector(\n\t(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\trecordId: EntityRecordKey\n\t): Optional< any > => {\n\t\tlogEntityDeprecation( kind, name, 'getEntityRecordNonTransientEdits' );\n\t\tconst { transientEdits } = getEntityConfig( state, kind, name ) || {};\n\t\tconst edits = getEntityRecordEdits( state, kind, name, recordId ) || {};\n\t\tif ( ! transientEdits ) {\n\t\t\treturn edits;\n\t\t}\n\t\treturn Object.keys( edits ).reduce( ( acc, key ) => {\n\t\t\tif ( ! transientEdits[ key ] ) {\n\t\t\t\tacc[ key ] = edits[ key ];\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} );\n\t},\n\t( state: State, kind: string, name: string, recordId: EntityRecordKey ) => [\n\t\tstate.entities.config,\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.edits?.[ recordId ],\n\t]\n);\n\n/**\n * Returns true if the specified entity record has edits,\n * and false otherwise.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return Whether the entity record has edits or not.\n */\nexport function hasEditsForEntityRecord(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): boolean {\n\tlogEntityDeprecation( kind, name, 'hasEditsForEntityRecord' );\n\treturn (\n\t\tisSavingEntityRecord( state, kind, name, recordId ) ||\n\t\tObject.keys(\n\t\t\tgetEntityRecordNonTransientEdits( state, kind, name, recordId )\n\t\t).length > 0\n\t);\n}\n\n/**\n * Returns the specified entity record, merged with its edits.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return The entity record, merged with its edits.\n */\nexport const getEditedEntityRecord = createSelector(\n\t< EntityRecord extends ET.EntityRecord< any > >(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\trecordId: EntityRecordKey\n\t): ET.Updatable< EntityRecord > | false => {\n\t\tlogEntityDeprecation( kind, name, 'getEditedEntityRecord' );\n\t\tconst raw = getRawEntityRecord( state, kind, name, recordId );\n\t\tconst edited = getEntityRecordEdits( state, kind, name, recordId );\n\t\t// Never return a non-falsy empty object. Unfortunately we can't return\n\t\t// undefined or null because we were previously returning an empty\n\t\t// object, so trying to read properties from the result would throw.\n\t\t// Using false here is a workaround to avoid breaking changes.\n\t\tif ( ! raw && ! edited ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn {\n\t\t\t...raw,\n\t\t\t...edited,\n\t\t};\n\t},\n\t(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\trecordId: EntityRecordKey,\n\t\tquery?: GetRecordsHttpQuery\n\t) => {\n\t\tconst context = query?.context ?? 'default';\n\t\treturn [\n\t\t\tstate.entities.config,\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData.items[\n\t\t\t\tcontext\n\t\t\t]?.[ recordId ],\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.queriedData\n\t\t\t\t.itemIsComplete[ context ]?.[ recordId ],\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.edits?.[ recordId ],\n\t\t];\n\t}\n);\n\n/**\n * Returns true if the specified entity record is autosaving, and false otherwise.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return Whether the entity record is autosaving or not.\n */\nexport function isAutosavingEntityRecord(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): boolean {\n\tlogEntityDeprecation( kind, name, 'isAutosavingEntityRecord' );\n\tconst { pending, isAutosave } =\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.saving?.[ recordId ] ?? {};\n\treturn Boolean( pending && isAutosave );\n}\n\n/**\n * Returns true if the specified entity record is saving, and false otherwise.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return Whether the entity record is saving or not.\n */\nexport function isSavingEntityRecord(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): boolean {\n\tlogEntityDeprecation( kind, name, 'isSavingEntityRecord' );\n\treturn (\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.saving?.[\n\t\t\trecordId as EntityRecordKey\n\t\t]?.pending ?? false\n\t);\n}\n\n/**\n * Returns true if the specified entity record is deleting, and false otherwise.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return Whether the entity record is deleting or not.\n */\nexport function isDeletingEntityRecord(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): boolean {\n\tlogEntityDeprecation( kind, name, 'isDeletingEntityRecord' );\n\treturn (\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.deleting?.[\n\t\t\trecordId as EntityRecordKey\n\t\t]?.pending ?? false\n\t);\n}\n\n/**\n * Returns the specified entity record's last save error.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return The entity record's save error.\n */\nexport function getLastEntitySaveError(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): any {\n\tlogEntityDeprecation( kind, name, 'getLastEntitySaveError' );\n\treturn state.entities.records?.[ kind ]?.[ name ]?.saving?.[ recordId ]\n\t\t?.error;\n}\n\n/**\n * Returns the specified entity record's last delete error.\n *\n * @param state    State tree.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record ID.\n *\n * @return The entity record's save error.\n */\nexport function getLastEntityDeleteError(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): any {\n\tlogEntityDeprecation( kind, name, 'getLastEntityDeleteError' );\n\treturn state.entities.records?.[ kind ]?.[ name ]?.deleting?.[ recordId ]\n\t\t?.error;\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/**\n * Returns the previous edit from the current undo offset\n * for the entity records edits history, if any.\n *\n * @deprecated since 6.3\n *\n * @param      state State tree.\n *\n * @return The edit.\n */\nexport function getUndoEdit( state: State ): Optional< any > {\n\tdeprecated( \"select( 'core' ).getUndoEdit()\", {\n\t\tsince: '6.3',\n\t} );\n\treturn undefined;\n}\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/**\n * Returns the next edit from the current undo offset\n * for the entity records edits history, if any.\n *\n * @deprecated since 6.3\n *\n * @param      state State tree.\n *\n * @return The edit.\n */\nexport function getRedoEdit( state: State ): Optional< any > {\n\tdeprecated( \"select( 'core' ).getRedoEdit()\", {\n\t\tsince: '6.3',\n\t} );\n\treturn undefined;\n}\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\n/**\n * Returns true if there is a previous edit from the current undo offset\n * for the entity records edits history, and false otherwise.\n *\n * @param state State tree.\n *\n * @return Whether there is a previous edit or not.\n */\nexport function hasUndo( state: State ): boolean {\n\treturn getUndoManager( state ).hasUndo();\n}\n\n/**\n * Returns true if there is a next edit from the current undo offset\n * for the entity records edits history, and false otherwise.\n *\n * @param state State tree.\n *\n * @return Whether there is a next edit or not.\n */\nexport function hasRedo( state: State ): boolean {\n\treturn getUndoManager( state ).hasRedo();\n}\n\n/**\n * Return the current theme.\n *\n * @param state Data state.\n *\n * @return The current theme.\n */\nexport function getCurrentTheme( state: State ): any {\n\tif ( ! state.currentTheme ) {\n\t\treturn null;\n\t}\n\treturn getEntityRecord( state, 'root', 'theme', state.currentTheme );\n}\n\n/**\n * Return the ID of the current global styles object.\n *\n * @param state Data state.\n *\n * @return The current global styles ID.\n */\nexport function __experimentalGetCurrentGlobalStylesId( state: State ): string {\n\treturn state.currentGlobalStylesId;\n}\n\n/**\n * Return theme supports data in the index.\n *\n * @param state Data state.\n *\n * @return Index data.\n */\nexport function getThemeSupports( state: State ): any {\n\treturn getCurrentTheme( state )?.theme_supports ?? EMPTY_OBJECT;\n}\n\n/**\n * Returns the embed preview for the given URL.\n *\n * @param state Data state.\n * @param url   Embedded URL.\n *\n * @return Undefined if the preview has not been fetched, otherwise, the preview fetched from the embed preview API.\n */\nexport function getEmbedPreview( state: State, url: string ): any {\n\treturn state.embedPreviews[ url ];\n}\n\n/**\n * Determines if the returned preview is an oEmbed link fallback.\n *\n * WordPress can be configured to return a simple link to a URL if it is not embeddable.\n * We need to be able to determine if a URL is embeddable or not, based on what we\n * get back from the oEmbed preview API.\n *\n * @param state Data state.\n * @param url   Embedded URL.\n *\n * @return Is the preview for the URL an oEmbed link fallback.\n */\nexport function isPreviewEmbedFallback( state: State, url: string ): boolean {\n\tconst preview = state.embedPreviews[ url ];\n\tconst oEmbedLinkCheck = '<a href=\"' + url + '\">' + url + '</a>';\n\tif ( ! preview ) {\n\t\treturn false;\n\t}\n\treturn preview.html === oEmbedLinkCheck;\n}\n\n/**\n * Returns whether the current user can perform the given action on the given\n * REST resource.\n *\n * Calling this may trigger an OPTIONS request to the REST API via the\n * `canUser()` resolver.\n *\n * https://developer.wordpress.org/rest-api/reference/\n *\n * @param state    Data state.\n * @param action   Action to check. One of: 'create', 'read', 'update', 'delete'.\n * @param resource Entity resource to check. Accepts entity object `{ kind: 'postType', name: 'attachment', id: 1 }`\n *                 or REST base as a string - `media`.\n * @param id       Optional ID of the rest resource to check.\n *\n * @return Whether or not the user can perform the action,\n *                             or `undefined` if the OPTIONS request is still being made.\n */\nexport function canUser(\n\tstate: State,\n\taction: string,\n\tresource: string | EntityResource,\n\tid?: EntityRecordKey\n): boolean | undefined {\n\tconst isEntity = typeof resource === 'object';\n\tif ( isEntity && ( ! resource.kind || ! resource.name ) ) {\n\t\treturn false;\n\t}\n\tif ( isEntity ) {\n\t\tlogEntityDeprecation( resource.kind, resource.name, 'canUser' );\n\t}\n\n\tconst key = getUserPermissionCacheKey( action, resource, id );\n\n\treturn state.userPermissions[ key ];\n}\n\n/**\n * Returns whether the current user can edit the given entity.\n *\n * Calling this may trigger an OPTIONS request to the REST API via the\n * `canUser()` resolver.\n *\n * https://developer.wordpress.org/rest-api/reference/\n *\n * @param state    Data state.\n * @param kind     Entity kind.\n * @param name     Entity name.\n * @param recordId Record's id.\n * @return Whether or not the user can edit,\n * or `undefined` if the OPTIONS request is still being made.\n */\nexport function canUserEditEntityRecord(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordId: EntityRecordKey\n): boolean | undefined {\n\tdeprecated( `wp.data.select( 'core' ).canUserEditEntityRecord()`, {\n\t\tsince: '6.7',\n\t\talternative: `wp.data.select( 'core' ).canUser( 'update', { kind, name, id } )`,\n\t} );\n\n\treturn canUser( state, 'update', { kind, name, id: recordId } );\n}\n\n/**\n * Returns the latest autosaves for the post.\n *\n * May return multiple autosaves since the backend stores one autosave per\n * author for each post.\n *\n * @param state    State tree.\n * @param postType The type of the parent post.\n * @param postId   The id of the parent post.\n *\n * @return An array of autosaves for the post, or undefined if there is none.\n */\nexport function getAutosaves(\n\tstate: State,\n\tpostType: string,\n\tpostId: EntityRecordKey\n): Array< any > | undefined {\n\treturn state.autosaves[ postId ];\n}\n\n/**\n * Returns the autosave for the post and author.\n *\n * @param state    State tree.\n * @param postType The type of the parent post.\n * @param postId   The id of the parent post.\n * @param authorId The id of the author.\n *\n * @return The autosave for the post and author.\n */\nexport function getAutosave< EntityRecord extends ET.EntityRecord< any > >(\n\tstate: State,\n\tpostType: string,\n\tpostId: EntityRecordKey,\n\tauthorId: EntityRecordKey\n): EntityRecord | undefined {\n\tif ( authorId === undefined ) {\n\t\treturn;\n\t}\n\n\tconst autosaves = state.autosaves[ postId ];\n\n\treturn autosaves?.find(\n\t\t( autosave: any ) => autosave.author === authorId\n\t) as EntityRecord | undefined;\n}\n\n/**\n * Returns true if the REST request for autosaves has completed.\n *\n * @param state    State tree.\n * @param postType The type of the parent post.\n * @param postId   The id of the parent post.\n *\n * @return True if the REST request was completed. False otherwise.\n */\nexport const hasFetchedAutosaves = createRegistrySelector(\n\t( select ) =>\n\t\t(\n\t\t\tstate: State,\n\t\t\tpostType: string,\n\t\t\tpostId: EntityRecordKey\n\t\t): boolean => {\n\t\t\treturn select( STORE_NAME ).hasFinishedResolution( 'getAutosaves', [\n\t\t\t\tpostType,\n\t\t\t\tpostId,\n\t\t\t] );\n\t\t}\n);\n\n/**\n * Returns a new reference when edited values have changed. This is useful in\n * inferring where an edit has been made between states by comparison of the\n * return values using strict equality.\n *\n * @example\n *\n * ```\n * const hasEditOccurred = (\n *    getReferenceByDistinctEdits( beforeState ) !==\n *    getReferenceByDistinctEdits( afterState )\n * );\n * ```\n *\n * @param state Editor state.\n *\n * @return A value whose reference will change only when an edit occurs.\n */\nexport function getReferenceByDistinctEdits( state ) {\n\treturn state.editsReference;\n}\n\n/**\n * Retrieve the current theme's base global styles\n *\n * @param state Editor state.\n *\n * @return The Global Styles object.\n */\nexport function __experimentalGetCurrentThemeBaseGlobalStyles(\n\tstate: State\n): any {\n\tconst currentTheme = getCurrentTheme( state );\n\tif ( ! currentTheme ) {\n\t\treturn null;\n\t}\n\treturn state.themeBaseGlobalStyles[ currentTheme.stylesheet ];\n}\n\n/**\n * Return the ID of the current global styles object.\n *\n * @param state Data state.\n *\n * @return The current global styles ID.\n */\nexport function __experimentalGetCurrentThemeGlobalStylesVariations(\n\tstate: State\n): string | null {\n\tconst currentTheme = getCurrentTheme( state );\n\tif ( ! currentTheme ) {\n\t\treturn null;\n\t}\n\treturn state.themeGlobalStyleVariations[ currentTheme.stylesheet ];\n}\n\n/**\n * Retrieve the list of registered block patterns.\n *\n * @param state Data state.\n *\n * @return Block pattern list.\n */\nexport function getBlockPatterns( state: State ): Array< any > {\n\treturn state.blockPatterns;\n}\n\n/**\n * Retrieve the list of registered block pattern categories.\n *\n * @param state Data state.\n *\n * @return Block pattern category list.\n */\nexport function getBlockPatternCategories( state: State ): Array< any > {\n\treturn state.blockPatternCategories;\n}\n\n/**\n * Retrieve the registered user pattern categories.\n *\n * @param state Data state.\n *\n * @return User patterns category array.\n */\n\nexport function getUserPatternCategories(\n\tstate: State\n): Array< UserPatternCategory > {\n\treturn state.userPatternCategories;\n}\n\n/**\n * Returns the revisions of the current global styles theme.\n *\n * @deprecated since WordPress 6.5.0. Callers should use `select( 'core' ).getRevisions( 'root', 'globalStyles', ${ recordKey } )` instead, where `recordKey` is the id of the global styles parent post.\n *\n * @param      state Data state.\n *\n * @return The current global styles.\n */\nexport function getCurrentThemeGlobalStylesRevisions(\n\tstate: State\n): Array< object > | null {\n\tdeprecated( \"select( 'core' ).getCurrentThemeGlobalStylesRevisions()\", {\n\t\tsince: '6.5.0',\n\t\talternative:\n\t\t\t\"select( 'core' ).getRevisions( 'root', 'globalStyles', ${ recordKey } )\",\n\t} );\n\tconst currentGlobalStylesId =\n\t\t__experimentalGetCurrentGlobalStylesId( state );\n\n\tif ( ! currentGlobalStylesId ) {\n\t\treturn null;\n\t}\n\n\treturn state.themeGlobalStyleRevisions[ currentGlobalStylesId ];\n}\n\n/**\n * Returns the default template use to render a given query.\n *\n * @param state Data state.\n * @param query Query.\n *\n * @return The default template id for the given query.\n */\nexport function getDefaultTemplateId(\n\tstate: State,\n\tquery: TemplateQuery\n): string {\n\treturn state.defaultTemplates[ JSON.stringify( query ) ];\n}\n\n/**\n * Returns an entity's revisions.\n *\n * @param state     State tree\n * @param kind      Entity kind.\n * @param name      Entity name.\n * @param recordKey The key of the entity record whose revisions you want to fetch.\n * @param query     Optional query. If requesting specific\n *                  fields, fields must always include the ID. For valid query parameters see revisions schema in [the REST API Handbook](https://developer.wordpress.org/rest-api/reference/). Then see the arguments available \"Retrieve a [Entity kind]\".\n *\n * @return Record.\n */\nexport const getRevisions = (\n\tstate: State,\n\tkind: string,\n\tname: string,\n\trecordKey: EntityRecordKey,\n\tquery?: GetRecordsHttpQuery\n): RevisionRecord[] | null => {\n\tlogEntityDeprecation( kind, name, 'getRevisions' );\n\tconst queriedStateRevisions =\n\t\tstate.entities.records?.[ kind ]?.[ name ]?.revisions?.[ recordKey ];\n\tif ( ! queriedStateRevisions ) {\n\t\treturn null;\n\t}\n\n\treturn getQueriedItems( queriedStateRevisions, query );\n};\n\n/**\n * Returns a single, specific revision of a parent entity.\n *\n * @param state       State tree\n * @param kind        Entity kind.\n * @param name        Entity name.\n * @param recordKey   The key of the entity record whose revisions you want to fetch.\n * @param revisionKey The revision's key.\n * @param query       Optional query. If requesting specific\n *                    fields, fields must always include the ID. For valid query parameters see revisions schema in [the REST API Handbook](https://developer.wordpress.org/rest-api/reference/). Then see the arguments available \"Retrieve a [entity kind]\".\n *\n * @return Record.\n */\nexport const getRevision = createSelector(\n\t(\n\t\tstate: State,\n\t\tkind: string,\n\t\tname: string,\n\t\trecordKey: EntityRecordKey,\n\t\trevisionKey: EntityRecordKey,\n\t\tquery?: GetRecordsHttpQuery\n\t): RevisionRecord | Record< PropertyKey, never > | undefined => {\n\t\tlogEntityDeprecation( kind, name, 'getRevision' );\n\t\tconst queriedState =\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.revisions?.[\n\t\t\t\trecordKey\n\t\t\t];\n\n\t\tif ( ! queriedState ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst context = query?.context ?? 'default';\n\n\t\tif ( ! query || ! query._fields ) {\n\t\t\t// If expecting a complete item, validate that completeness.\n\t\t\tif ( ! queriedState.itemIsComplete[ context ]?.[ revisionKey ] ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn queriedState.items[ context ][ revisionKey ];\n\t\t}\n\n\t\tconst item = queriedState.items[ context ]?.[ revisionKey ];\n\t\tif ( ! item ) {\n\t\t\treturn item;\n\t\t}\n\n\t\tconst filteredItem = {};\n\t\tconst fields = getNormalizedCommaSeparable( query._fields ) ?? [];\n\n\t\tfor ( let f = 0; f < fields.length; f++ ) {\n\t\t\tconst field = fields[ f ].split( '.' );\n\t\t\tlet value = item;\n\t\t\tfield.forEach( ( fieldName ) => {\n\t\t\t\tvalue = value?.[ fieldName ];\n\t\t\t} );\n\t\t\tsetNestedValue( filteredItem, field, value );\n\t\t}\n\n\t\treturn filteredItem;\n\t},\n\t( state: State, kind, name, recordKey, revisionKey, query ) => {\n\t\tconst context = query?.context ?? 'default';\n\t\tconst queriedState =\n\t\t\tstate.entities.records?.[ kind ]?.[ name ]?.revisions?.[\n\t\t\t\trecordKey\n\t\t\t];\n\t\treturn [\n\t\t\tqueriedState?.items?.[ context ]?.[ revisionKey ],\n\t\t\tqueriedState?.itemIsComplete?.[ context ]?.[ revisionKey ],\n\t\t];\n\t}\n);\n", "/**\n * The reducer key used by core data in store registration.\n * This is defined in a separate file to avoid cycle-dependency\n *\n * @type {string}\n */\nexport const STORE_NAME = 'core';\n", "/**\n * WordPress dependencies\n */\nimport { createSelector, createRegistrySelector } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { getDefaultTemplateId, getEntityRecord, type State } from './selectors';\nimport { STORE_NAME } from './name';\nimport { unlock } from './lock-unlock';\nimport { getSyncManager } from './sync';\nimport logEntityDeprecation from './utils/log-entity-deprecation';\n\ntype EntityRecordKey = string | number;\n\n/**\n * Returns the previous edit from the current undo offset\n * for the entity records edits history, if any.\n *\n * Known Issue: Every-time state.undoManager changes, the getUndoManager\n * private selector is called (if used within useSelect and things like that)\n * which ensures the UI is always properly reactive. But, it's not the case with\n * the custom \"sync\" undo manager.\n *\n * Assumption: When an undo/redo is created, other parts of the core-data state\n * are likely changing simultaneously, which will trigger the selectors again.\n *\n * This issue is acceptable based on the assumption above.\n *\n * @see https://github.com/WordPress/gutenberg/pull/72407/files#r2580214235 for more details.\n *\n * @param state State tree.\n *\n * @return The undo manager.\n */\nexport function getUndoManager( state: State ) {\n\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t// undoManager is undefined until the first sync-enabled entity is loaded.\n\t\treturn getSyncManager()?.undoManager ?? state.undoManager;\n\t}\n\n\treturn state.undoManager;\n}\n\n/**\n * Retrieve the fallback Navigation.\n *\n * @param state Data state.\n * @return The ID for the fallback Navigation post.\n */\nexport function getNavigationFallbackId(\n\tstate: State\n): EntityRecordKey | undefined {\n\treturn state.navigationFallbackId;\n}\n\nexport const getBlockPatternsForPostType = createRegistrySelector(\n\t( select: any ) =>\n\t\tcreateSelector(\n\t\t\t( state, postType ) =>\n\t\t\t\tselect( STORE_NAME )\n\t\t\t\t\t.getBlockPatterns()\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t( { postTypes } ) =>\n\t\t\t\t\t\t\t! postTypes ||\n\t\t\t\t\t\t\t( Array.isArray( postTypes ) &&\n\t\t\t\t\t\t\t\tpostTypes.includes( postType ) )\n\t\t\t\t\t),\n\t\t\t() => [ select( STORE_NAME ).getBlockPatterns() ]\n\t\t)\n);\n\n/**\n * Returns the entity records permissions for the given entity record ids.\n */\nexport const getEntityRecordsPermissions = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\t(\n\t\t\tstate: State,\n\t\t\tkind: string,\n\t\t\tname: string,\n\t\t\tids: string | string[]\n\t\t) => {\n\t\t\tconst normalizedIds = Array.isArray( ids ) ? ids : [ ids ];\n\t\t\treturn normalizedIds.map( ( id ) => ( {\n\t\t\t\tdelete: select( STORE_NAME ).canUser( 'delete', {\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tid,\n\t\t\t\t} ),\n\t\t\t\tupdate: select( STORE_NAME ).canUser( 'update', {\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tid,\n\t\t\t\t} ),\n\t\t\t} ) );\n\t\t},\n\t\t( state ) => [ state.userPermissions ]\n\t)\n);\n\n/**\n * Returns the entity record permissions for the given entity record id.\n *\n * @param state Data state.\n * @param kind  Entity kind.\n * @param name  Entity name.\n * @param id    Entity record id.\n *\n * @return The entity record permissions.\n */\nexport function getEntityRecordPermissions(\n\tstate: State,\n\tkind: string,\n\tname: string,\n\tid: string\n) {\n\tlogEntityDeprecation( kind, name, 'getEntityRecordPermissions' );\n\treturn getEntityRecordsPermissions( state, kind, name, id )[ 0 ];\n}\n\n/**\n * Returns the registered post meta fields for a given post type.\n *\n * @param state    Data state.\n * @param postType Post type.\n *\n * @return Registered post meta fields.\n */\nexport function getRegisteredPostMeta( state: State, postType: string ) {\n\treturn state.registeredPostMeta?.[ postType ] ?? {};\n}\n\nfunction normalizePageId( value: number | string | undefined ): string | null {\n\tif ( ! value || ! [ 'number', 'string' ].includes( typeof value ) ) {\n\t\treturn null;\n\t}\n\n\t// We also need to check if it's not zero (`'0'`).\n\tif ( Number( value ) === 0 ) {\n\t\treturn null;\n\t}\n\n\treturn value.toString();\n}\n\ninterface SiteData {\n\tshow_on_front?: string;\n\tpage_on_front?: string | number;\n\tpage_for_posts?: string | number;\n}\n\nexport const getHomePage = createRegistrySelector( ( select ) =>\n\tcreateSelector(\n\t\t() => {\n\t\t\tconst siteData = select( STORE_NAME ).getEntityRecord(\n\t\t\t\t'root',\n\t\t\t\t'__unstableBase'\n\t\t\t) as SiteData | undefined;\n\t\t\t// Still resolving getEntityRecord.\n\t\t\tif ( ! siteData ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst homepageId =\n\t\t\t\tsiteData?.show_on_front === 'page'\n\t\t\t\t\t? normalizePageId( siteData.page_on_front )\n\t\t\t\t\t: null;\n\t\t\tif ( homepageId ) {\n\t\t\t\treturn { postType: 'page', postId: homepageId };\n\t\t\t}\n\t\t\tconst frontPageTemplateId = select(\n\t\t\t\tSTORE_NAME\n\t\t\t).getDefaultTemplateId( {\n\t\t\t\tslug: 'front-page',\n\t\t\t} );\n\t\t\t// Still resolving getDefaultTemplateId.\n\t\t\tif ( ! frontPageTemplateId ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn { postType: 'wp_template', postId: frontPageTemplateId };\n\t\t},\n\t\t( state ) => [\n\t\t\t// Even though getDefaultTemplateId.shouldInvalidate returns true when root/site changes,\n\t\t\t// it doesn't seem to invalidate this cache, I'm not sure why.\n\t\t\tgetEntityRecord( state, 'root', 'site' ),\n\t\t\tgetEntityRecord( state, 'root', '__unstableBase' ),\n\t\t\tgetDefaultTemplateId( state, {\n\t\t\t\tslug: 'front-page',\n\t\t\t} ),\n\t\t]\n\t)\n);\n\nexport const getPostsPageId = createRegistrySelector( ( select ) => () => {\n\tconst siteData = select( STORE_NAME ).getEntityRecord(\n\t\t'root',\n\t\t'__unstableBase'\n\t) as SiteData | undefined;\n\treturn siteData?.show_on_front === 'page'\n\t\t? normalizePageId( siteData.page_for_posts )\n\t\t: null;\n} );\n\nexport const getTemplateId = createRegistrySelector(\n\t( select ) => ( state, postType, postId ) => {\n\t\tconst homepage = unlock( select( STORE_NAME ) ).getHomePage();\n\n\t\tif ( ! homepage ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For the front page, we always use the front page template if existing.\n\t\tif (\n\t\t\tpostType === 'page' &&\n\t\t\tpostType === homepage?.postType &&\n\t\t\tpostId.toString() === homepage?.postId\n\t\t) {\n\t\t\t// The /lookup endpoint cannot currently handle a lookup\n\t\t\t// when a page is set as the front page, so specifically in\n\t\t\t// that case, we want to check if there is a front page\n\t\t\t// template, and instead of falling back to the home\n\t\t\t// template, we want to fall back to the page template.\n\t\t\tconst templates = select( STORE_NAME ).getEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_template',\n\t\t\t\t{\n\t\t\t\t\tper_page: -1,\n\t\t\t\t}\n\t\t\t);\n\t\t\tif ( ! templates ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst id = templates.find( ( { slug } ) => slug === 'front-page' )\n\t\t\t\t?.id;\n\t\t\tif ( id ) {\n\t\t\t\treturn id;\n\t\t\t}\n\t\t\t// If no front page template is found, continue with the\n\t\t\t// logic below (fetching the page template).\n\t\t}\n\n\t\tconst editedEntity = select( STORE_NAME ).getEditedEntityRecord(\n\t\t\t'postType',\n\t\t\tpostType,\n\t\t\tpostId\n\t\t);\n\t\tif ( ! editedEntity ) {\n\t\t\treturn;\n\t\t}\n\t\tconst postsPageId = unlock( select( STORE_NAME ) ).getPostsPageId();\n\t\t// Check if the current page is the posts page.\n\t\tif ( postType === 'page' && postsPageId === postId.toString() ) {\n\t\t\treturn select( STORE_NAME ).getDefaultTemplateId( {\n\t\t\t\tslug: 'home',\n\t\t\t} );\n\t\t}\n\t\t// First see if the post/page has an assigned template and fetch it.\n\t\tconst currentTemplateSlug = editedEntity.template;\n\t\tif ( currentTemplateSlug ) {\n\t\t\tconst currentTemplate = select( STORE_NAME )\n\t\t\t\t.getEntityRecords( 'postType', 'wp_template', {\n\t\t\t\t\tper_page: -1,\n\t\t\t\t} )\n\t\t\t\t?.find( ( { slug } ) => slug === currentTemplateSlug );\n\t\t\tif ( currentTemplate ) {\n\t\t\t\treturn currentTemplate.id;\n\t\t\t}\n\t\t}\n\t\t// If no template is assigned, use the default template.\n\t\tlet slugToCheck;\n\t\t// In `draft` status we might not have a slug available, so we use the `single`\n\t\t// post type templates slug(ex page, single-post, single-product etc..).\n\t\t// Pages do not need the `single` prefix in the slug to be prioritized\n\t\t// through template hierarchy.\n\t\tif ( editedEntity.slug ) {\n\t\t\tslugToCheck =\n\t\t\t\tpostType === 'page'\n\t\t\t\t\t? `${ postType }-${ editedEntity.slug }`\n\t\t\t\t\t: `single-${ postType }-${ editedEntity.slug }`;\n\t\t} else {\n\t\t\tslugToCheck = postType === 'page' ? 'page' : `single-${ postType }`;\n\t\t}\n\t\treturn select( STORE_NAME ).getDefaultTemplateId( {\n\t\t\tslug: slugToCheck,\n\t\t} );\n\t}\n);\n\n/**\n * Returns the editor settings.\n *\n * @param state Data state.\n * @return Editor settings object or null if not loaded.\n */\nexport function getEditorSettings(\n\tstate: State\n): Record< string, any > | null {\n\treturn state.editorSettings;\n}\n\n/**\n * Returns the editor assets.\n *\n * @param state Data state.\n * @return Editor assets object or null if not loaded.\n */\nexport function getEditorAssets( state: State ): Record< string, any > | null {\n\treturn state.editorAssets;\n}\n", "/**\n * WordPress dependencies\n */\nimport { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';\n\nexport const { lock, unlock } =\n\t__dangerousOptInToUnstableAPIsOnlyForCoreModules(\n\t\t'I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.',\n\t\t'@wordpress/core-data'\n\t);\n", "/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport { deprecatedEntities } from '../entities';\n\nlet loggedAlready = false;\n\n/**\n * Logs a deprecation warning for an entity, if it's deprecated.\n *\n * @param kind                            The kind of the entity.\n * @param name                            The name of the entity.\n * @param functionName                    The name of the function that was called with a deprecated entity.\n * @param options                         The options for the deprecation warning.\n * @param options.alternativeFunctionName The name of the alternative function that should be used instead.\n * @param options.isShorthandSelector     Whether the function is a shorthand selector.\n */\nexport default function logEntityDeprecation(\n\tkind: string,\n\tname: string,\n\tfunctionName: string,\n\t{\n\t\talternativeFunctionName,\n\t\tisShorthandSelector = false,\n\t}: {\n\t\talternativeFunctionName?: string;\n\t\tisShorthandSelector?: boolean;\n\t} = {}\n) {\n\tconst deprecation = deprecatedEntities[ kind ]?.[ name ];\n\tif ( ! deprecation ) {\n\t\treturn;\n\t}\n\n\tif ( ! loggedAlready ) {\n\t\tconst { alternative } = deprecation;\n\n\t\tconst message = isShorthandSelector\n\t\t\t? `'${ functionName }'`\n\t\t\t: `The '${ kind }', '${ name }' entity (used via '${ functionName }')`;\n\n\t\tlet alternativeMessage = `the '${ alternative.kind }', '${ alternative.name }' entity`;\n\t\tif ( alternativeFunctionName ) {\n\t\t\talternativeMessage += ` via the '${ alternativeFunctionName }' function`;\n\t\t}\n\n\t\tdeprecated( message, {\n\t\t\t...deprecation,\n\t\t\talternative: alternativeMessage,\n\t\t} );\n\t}\n\n\t// Only log an entity deprecation once per call stack,\n\t// else there's spurious logging when selections or actions call through to other selectors or actions.\n\t// Note: this won't prevent the deprecation warning being logged if a selector or action makes an async call\n\t// to another selector or action, but this is probably the best we can do.\n\tloggedAlready = true;\n\t// At the end of the call stack, reset the flag.\n\tsetTimeout( () => {\n\t\tloggedAlready = false;\n\t}, 0 );\n}\n", "/**\n * External dependencies\n */\nimport fastDeepEqual from 'fast-deep-equal/es6/index.js';\nimport { v4 as uuid } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport { getNestedValue, setNestedValue } from './utils';\nimport { receiveItems, removeItems, receiveQueriedItems } from './queried-data';\nimport { DEFAULT_ENTITY_KEY } from './entities';\nimport { createBatch } from './batch';\nimport { STORE_NAME } from './name';\nimport { LOCAL_EDITOR_ORIGIN, getSyncManager } from './sync';\nimport logEntityDeprecation from './utils/log-entity-deprecation';\n\n/**\n * Returns an action object used in signalling that authors have been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {string}       queryID Query ID.\n * @param {Array|Object} users   Users received.\n *\n * @return {Object} Action object.\n */\nexport function receiveUserQuery( queryID, users ) {\n\treturn {\n\t\ttype: 'RECEIVE_USER_QUERY',\n\t\tusers: Array.isArray( users ) ? users : [ users ],\n\t\tqueryID,\n\t};\n}\n\n/**\n * Returns an action used in signalling that the current user has been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {Object} currentUser Current user object.\n *\n * @return {Object} Action object.\n */\nexport function receiveCurrentUser( currentUser ) {\n\treturn {\n\t\ttype: 'RECEIVE_CURRENT_USER',\n\t\tcurrentUser,\n\t};\n}\n\n/**\n * Returns an action object used in adding new entities.\n *\n * @param {Array} entities Entities received.\n *\n * @return {Object} Action object.\n */\nexport function addEntities( entities ) {\n\treturn {\n\t\ttype: 'ADD_ENTITIES',\n\t\tentities,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that entity records have been received.\n *\n * @param {string}       kind            Kind of the received entity record.\n * @param {string}       name            Name of the received entity record.\n * @param {Array|Object} records         Records received.\n * @param {?Object}      query           Query Object.\n * @param {?boolean}     invalidateCache Should invalidate query caches.\n * @param {?Object}      edits           Edits to reset.\n * @param {?Object}      meta            Meta information about pagination.\n * @return {Object} Action object.\n */\nexport function receiveEntityRecords(\n\tkind,\n\tname,\n\trecords,\n\tquery = undefined,\n\tinvalidateCache = false,\n\tedits = undefined,\n\tmeta = undefined\n) {\n\t// Auto drafts should not have titles, but some plugins rely on them so we can't filter this\n\t// on the server.\n\tif ( kind === 'postType' ) {\n\t\trecords = ( Array.isArray( records ) ? records : [ records ] ).map(\n\t\t\t( record ) =>\n\t\t\t\trecord.status === 'auto-draft'\n\t\t\t\t\t? { ...record, title: '' }\n\t\t\t\t\t: record\n\t\t);\n\t}\n\tlet action;\n\tif ( query ) {\n\t\taction = receiveQueriedItems( records, query, edits, meta );\n\t} else {\n\t\taction = receiveItems( records, edits, meta );\n\t}\n\n\treturn {\n\t\t...action,\n\t\tkind,\n\t\tname,\n\t\tinvalidateCache,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the current theme has been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {Object} currentTheme The current theme.\n *\n * @return {Object} Action object.\n */\nexport function receiveCurrentTheme( currentTheme ) {\n\treturn {\n\t\ttype: 'RECEIVE_CURRENT_THEME',\n\t\tcurrentTheme,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the current global styles id has been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {string} currentGlobalStylesId The current global styles id.\n *\n * @return {Object} Action object.\n */\nexport function __experimentalReceiveCurrentGlobalStylesId(\n\tcurrentGlobalStylesId\n) {\n\treturn {\n\t\ttype: 'RECEIVE_CURRENT_GLOBAL_STYLES_ID',\n\t\tid: currentGlobalStylesId,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the theme base global styles have been received\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {string} stylesheet   The theme's identifier\n * @param {Object} globalStyles The global styles object.\n *\n * @return {Object} Action object.\n */\nexport function __experimentalReceiveThemeBaseGlobalStyles(\n\tstylesheet,\n\tglobalStyles\n) {\n\treturn {\n\t\ttype: 'RECEIVE_THEME_GLOBAL_STYLES',\n\t\tstylesheet,\n\t\tglobalStyles,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the theme global styles variations have been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {string} stylesheet The theme's identifier\n * @param {Array}  variations The global styles variations.\n *\n * @return {Object} Action object.\n */\nexport function __experimentalReceiveThemeGlobalStyleVariations(\n\tstylesheet,\n\tvariations\n) {\n\treturn {\n\t\ttype: 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS',\n\t\tstylesheet,\n\t\tvariations,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the index has been received.\n *\n * @deprecated since WP 5.9, this is not useful anymore, use the selector directly.\n *\n * @return {Object} Action object.\n */\nexport function receiveThemeSupports() {\n\tdeprecated( \"wp.data.dispatch( 'core' ).receiveThemeSupports\", {\n\t\tsince: '5.9',\n\t} );\n\n\treturn {\n\t\ttype: 'DO_NOTHING',\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the theme global styles CPT post revisions have been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @deprecated since WordPress 6.5.0. Callers should use `dispatch( 'core' ).receiveRevision` instead.\n *\n * @ignore\n *\n * @param {number} currentId The post id.\n * @param {Array}  revisions The global styles revisions.\n *\n * @return {Object} Action object.\n */\nexport function receiveThemeGlobalStyleRevisions( currentId, revisions ) {\n\tdeprecated(\n\t\t\"wp.data.dispatch( 'core' ).receiveThemeGlobalStyleRevisions()\",\n\t\t{\n\t\t\tsince: '6.5.0',\n\t\t\talternative: \"wp.data.dispatch( 'core' ).receiveRevisions\",\n\t\t}\n\t);\n\treturn {\n\t\ttype: 'RECEIVE_THEME_GLOBAL_STYLE_REVISIONS',\n\t\tcurrentId,\n\t\trevisions,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the preview data for\n * a given URl has been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {string} url     URL to preview the embed for.\n * @param {*}      preview Preview data.\n *\n * @return {Object} Action object.\n */\nexport function receiveEmbedPreview( url, preview ) {\n\treturn {\n\t\ttype: 'RECEIVE_EMBED_PREVIEW',\n\t\turl,\n\t\tpreview,\n\t};\n}\n\n/**\n * Action triggered to delete an entity record.\n *\n * @param {string}        kind                         Kind of the deleted entity.\n * @param {string}        name                         Name of the deleted entity.\n * @param {number|string} recordId                     Record ID of the deleted entity.\n * @param {?Object}       query                        Special query parameters for the\n *                                                     DELETE API call.\n * @param {Object}        [options]                    Delete options.\n * @param {Function}      [options.__unstableFetch]    Internal use only. Function to\n *                                                     call instead of `apiFetch()`.\n *                                                     Must return a promise.\n * @param {boolean}       [options.throwOnError=false] If false, this action suppresses all\n *                                                     the exceptions. Defaults to false.\n */\nexport const deleteEntityRecord =\n\t(\n\t\tkind,\n\t\tname,\n\t\trecordId,\n\t\tquery,\n\t\t{ __unstableFetch = apiFetch, throwOnError = false } = {}\n\t) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlogEntityDeprecation( kind, name, 'deleteEntityRecord' );\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.kind === kind && config.name === name\n\t\t);\n\t\tlet error;\n\t\tlet deletedRecord = false;\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, recordId ],\n\t\t\t{ exclusive: true }\n\t\t);\n\n\t\ttry {\n\t\t\tdispatch( {\n\t\t\t\ttype: 'DELETE_ENTITY_RECORD_START',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t} );\n\n\t\t\tlet hasError = false;\n\t\t\tlet { baseURL } = entityConfig;\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\t( ( recordId &&\n\t\t\t\t\ttypeof recordId === 'string' &&\n\t\t\t\t\t! /^\\d+$/.test( recordId ) ) ||\n\t\t\t\t\t! window?.__experimentalTemplateActivate )\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tlet path = `${ baseURL }/${ recordId }`;\n\n\t\t\t\tif ( query ) {\n\t\t\t\t\tpath = addQueryArgs( path, query );\n\t\t\t\t}\n\n\t\t\t\tdeletedRecord = await __unstableFetch( {\n\t\t\t\t\tpath,\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t} );\n\n\t\t\t\tawait dispatch( removeItems( kind, name, recordId, true ) );\n\t\t\t} catch ( _error ) {\n\t\t\t\thasError = true;\n\t\t\t\terror = _error;\n\t\t\t}\n\n\t\t\tdispatch( {\n\t\t\t\ttype: 'DELETE_ENTITY_RECORD_FINISH',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t\terror,\n\t\t\t} );\n\n\t\t\tif ( hasError && throwOnError ) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\treturn deletedRecord;\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n/**\n * Returns an action object that triggers an\n * edit to an entity record.\n *\n * @param {string}        kind                 Kind of the edited entity record.\n * @param {string}        name                 Name of the edited entity record.\n * @param {number|string} recordId             Record ID of the edited entity record.\n * @param {Object}        edits                The edits.\n * @param {Object}        options              Options for the edit.\n * @param {boolean}       [options.undoIgnore] Whether to ignore the edit in undo history or not.\n *\n * @return {Object} Action object.\n */\nexport const editEntityRecord =\n\t( kind, name, recordId, edits, options = {} ) =>\n\t( { select, dispatch } ) => {\n\t\tlogEntityDeprecation( kind, name, 'editEntityRecord' );\n\t\tconst entityConfig = select.getEntityConfig( kind, name );\n\t\tif ( ! entityConfig ) {\n\t\t\tthrow new Error(\n\t\t\t\t`The entity being edited (${ kind }, ${ name }) does not have a loaded config.`\n\t\t\t);\n\t\t}\n\t\tconst { mergedEdits = {} } = entityConfig;\n\t\tconst record = select.getRawEntityRecord( kind, name, recordId );\n\t\tconst editedRecord = select.getEditedEntityRecord(\n\t\t\tkind,\n\t\t\tname,\n\t\t\trecordId\n\t\t);\n\n\t\tconst edit = {\n\t\t\tkind,\n\t\t\tname,\n\t\t\trecordId,\n\t\t\t// Clear edits when they are equal to their persisted counterparts\n\t\t\t// so that the property is not considered dirty.\n\t\t\tedits: Object.keys( edits ).reduce( ( acc, key ) => {\n\t\t\t\tconst recordValue = record[ key ];\n\t\t\t\tconst editedRecordValue = editedRecord[ key ];\n\t\t\t\tconst value = mergedEdits[ key ]\n\t\t\t\t\t? { ...editedRecordValue, ...edits[ key ] }\n\t\t\t\t\t: edits[ key ];\n\t\t\t\tacc[ key ] = fastDeepEqual( recordValue, value )\n\t\t\t\t\t? undefined\n\t\t\t\t\t: value;\n\t\t\t\treturn acc;\n\t\t\t}, {} ),\n\t\t};\n\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\tif ( entityConfig.syncConfig ) {\n\t\t\t\tconst objectType = `${ kind }/${ name }`;\n\t\t\t\tconst objectId = recordId;\n\n\t\t\t\tgetSyncManager()?.update(\n\t\t\t\t\tobjectType,\n\t\t\t\t\tobjectId,\n\t\t\t\t\tedit.edits,\n\t\t\t\t\tLOCAL_EDITOR_ORIGIN\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif ( ! options.undoIgnore ) {\n\t\t\tselect.getUndoManager().addRecord(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tid: { kind, name, recordId },\n\t\t\t\t\t\tchanges: Object.keys( edits ).reduce( ( acc, key ) => {\n\t\t\t\t\t\t\tacc[ key ] = {\n\t\t\t\t\t\t\t\tfrom: editedRecord[ key ],\n\t\t\t\t\t\t\t\tto: edits[ key ],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} ),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\toptions.isCached\n\t\t\t);\n\t\t}\n\t\tdispatch( {\n\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t...edit,\n\t\t} );\n\t};\n\n/**\n * Action triggered to undo the last edit to\n * an entity record, if any.\n */\nexport const undo =\n\t() =>\n\t( { select, dispatch } ) => {\n\t\tconst undoRecord = select.getUndoManager().undo();\n\t\tif ( ! undoRecord ) {\n\t\t\treturn;\n\t\t}\n\t\tdispatch( {\n\t\t\ttype: 'UNDO',\n\t\t\trecord: undoRecord,\n\t\t} );\n\t};\n\n/**\n * Action triggered to redo the last undone\n * edit to an entity record, if any.\n */\nexport const redo =\n\t() =>\n\t( { select, dispatch } ) => {\n\t\tconst redoRecord = select.getUndoManager().redo();\n\t\tif ( ! redoRecord ) {\n\t\t\treturn;\n\t\t}\n\t\tdispatch( {\n\t\t\ttype: 'REDO',\n\t\t\trecord: redoRecord,\n\t\t} );\n\t};\n\n/**\n * Forces the creation of a new undo level.\n *\n * @return {Object} Action object.\n */\nexport const __unstableCreateUndoLevel =\n\t() =>\n\t( { select } ) => {\n\t\tselect.getUndoManager().addRecord();\n\t};\n\n/**\n * Action triggered to save an entity record.\n *\n * @param {string}   kind                         Kind of the received entity.\n * @param {string}   name                         Name of the received entity.\n * @param {Object}   record                       Record to be saved.\n * @param {Object}   options                      Saving options.\n * @param {boolean}  [options.isAutosave=false]   Whether this is an autosave.\n * @param {Function} [options.__unstableFetch]    Internal use only. Function to\n *                                                call instead of `apiFetch()`.\n *                                                Must return a promise.\n * @param {boolean}  [options.throwOnError=false] If false, this action suppresses all\n *                                                the exceptions. Defaults to false.\n */\nexport const saveEntityRecord =\n\t(\n\t\tkind,\n\t\tname,\n\t\trecord,\n\t\t{\n\t\t\tisAutosave = false,\n\t\t\t__unstableFetch = apiFetch,\n\t\t\tthrowOnError = false,\n\t\t} = {}\n\t) =>\n\tasync ( { select, resolveSelect, dispatch } ) => {\n\t\tlogEntityDeprecation( kind, name, 'saveEntityRecord' );\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.kind === kind && config.name === name\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\t\tconst entityIdKey = entityConfig.key ?? DEFAULT_ENTITY_KEY;\n\t\tconst recordId = record[ entityIdKey ];\n\t\tconst isNewRecord = !! entityIdKey && ! recordId;\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, recordId || uuid() ],\n\t\t\t{ exclusive: true }\n\t\t);\n\n\t\ttry {\n\t\t\t// Evaluate optimized edits.\n\t\t\t// (Function edits that should be evaluated on save to avoid expensive computations on every edit.)\n\t\t\tfor ( const [ key, value ] of Object.entries( record ) ) {\n\t\t\t\tif ( typeof value === 'function' ) {\n\t\t\t\t\tconst evaluatedValue = value(\n\t\t\t\t\t\tselect.getEditedEntityRecord( kind, name, recordId )\n\t\t\t\t\t);\n\t\t\t\t\tdispatch.editEntityRecord(\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\trecordId,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ key ]: evaluatedValue,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ undoIgnore: true }\n\t\t\t\t\t);\n\t\t\t\t\trecord[ key ] = evaluatedValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdispatch( {\n\t\t\t\ttype: 'SAVE_ENTITY_RECORD_START',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t\tisAutosave,\n\t\t\t} );\n\t\t\tlet updatedRecord;\n\t\t\tlet error;\n\t\t\tlet hasError = false;\n\t\t\tlet { baseURL } = entityConfig;\n\t\t\t// For \"string\" IDs, use the old templates endpoint.\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\t( ( recordId &&\n\t\t\t\t\ttypeof recordId === 'string' &&\n\t\t\t\t\t! /^\\d+$/.test( recordId ) ) ||\n\t\t\t\t\t! window?.__experimentalTemplateActivate )\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst path = `${ baseURL }${ recordId ? '/' + recordId : '' }`;\n\t\t\t\t// Skip the raw values check when creating a new record; they don't exist yet.\n\t\t\t\tconst persistedRecord = ! isNewRecord\n\t\t\t\t\t? select.getRawEntityRecord( kind, name, recordId )\n\t\t\t\t\t: {};\n\n\t\t\t\tif ( isAutosave ) {\n\t\t\t\t\t// Most of this autosave logic is very specific to posts.\n\t\t\t\t\t// This is fine for now as it is the only supported autosave,\n\t\t\t\t\t// but ideally this should all be handled in the back end,\n\t\t\t\t\t// so the client just sends and receives objects.\n\t\t\t\t\tconst currentUser = select.getCurrentUser();\n\t\t\t\t\tconst currentUserId = currentUser\n\t\t\t\t\t\t? currentUser.id\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst autosavePost = await resolveSelect.getAutosave(\n\t\t\t\t\t\tpersistedRecord.type,\n\t\t\t\t\t\tpersistedRecord.id,\n\t\t\t\t\t\tcurrentUserId\n\t\t\t\t\t);\n\t\t\t\t\t// Autosaves need all expected fields to be present.\n\t\t\t\t\t// So we fallback to the previous autosave and then\n\t\t\t\t\t// to the actual persisted entity if the edits don't\n\t\t\t\t\t// have a value.\n\t\t\t\t\tlet data = {\n\t\t\t\t\t\t...persistedRecord,\n\t\t\t\t\t\t...autosavePost,\n\t\t\t\t\t\t...record,\n\t\t\t\t\t};\n\t\t\t\t\tdata = Object.keys( data ).reduce(\n\t\t\t\t\t\t( acc, key ) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t'title',\n\t\t\t\t\t\t\t\t\t'excerpt',\n\t\t\t\t\t\t\t\t\t'content',\n\t\t\t\t\t\t\t\t\t'meta',\n\t\t\t\t\t\t\t\t].includes( key )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tacc[ key ] = data[ key ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Do not update the `status` if we have edited it when auto saving.\n\t\t\t\t\t\t\t// It's very important to let the user explicitly save this change,\n\t\t\t\t\t\t\t// because it can lead to unexpected results. An example would be to\n\t\t\t\t\t\t\t// have a draft post and change the status to publish.\n\t\t\t\t\t\t\tstatus:\n\t\t\t\t\t\t\t\tdata.status === 'auto-draft'\n\t\t\t\t\t\t\t\t\t? 'draft'\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\tupdatedRecord = await __unstableFetch( {\n\t\t\t\t\t\tpath: `${ path }/autosaves`,\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tdata,\n\t\t\t\t\t} );\n\n\t\t\t\t\t// An autosave may be processed by the server as a regular save\n\t\t\t\t\t// when its update is requested by the author and the post had\n\t\t\t\t\t// draft or auto-draft status.\n\t\t\t\t\tif ( persistedRecord.id === updatedRecord.id ) {\n\t\t\t\t\t\tlet newRecord = {\n\t\t\t\t\t\t\t...persistedRecord,\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t...updatedRecord,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnewRecord = Object.keys( newRecord ).reduce(\n\t\t\t\t\t\t\t( acc, key ) => {\n\t\t\t\t\t\t\t\t// These properties are persisted in autosaves.\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t[ 'title', 'excerpt', 'content' ].includes(\n\t\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tacc[ key ] = newRecord[ key ];\n\t\t\t\t\t\t\t\t} else if ( key === 'status' ) {\n\t\t\t\t\t\t\t\t\t// Status is only persisted in autosaves when going from\n\t\t\t\t\t\t\t\t\t// \"auto-draft\" to \"draft\".\n\t\t\t\t\t\t\t\t\tacc[ key ] =\n\t\t\t\t\t\t\t\t\t\tpersistedRecord.status ===\n\t\t\t\t\t\t\t\t\t\t\t'auto-draft' &&\n\t\t\t\t\t\t\t\t\t\tnewRecord.status === 'draft'\n\t\t\t\t\t\t\t\t\t\t\t? newRecord.status\n\t\t\t\t\t\t\t\t\t\t\t: persistedRecord.status;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// These properties are not persisted in autosaves.\n\t\t\t\t\t\t\t\t\tacc[ key ] = persistedRecord[ key ];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tnewRecord,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdispatch.receiveAutosaves(\n\t\t\t\t\t\t\tpersistedRecord.id,\n\t\t\t\t\t\t\tupdatedRecord\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlet edits = record;\n\t\t\t\t\tif ( entityConfig.__unstablePrePersist ) {\n\t\t\t\t\t\tedits = {\n\t\t\t\t\t\t\t...edits,\n\t\t\t\t\t\t\t...entityConfig.__unstablePrePersist(\n\t\t\t\t\t\t\t\tpersistedRecord,\n\t\t\t\t\t\t\t\tedits\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tupdatedRecord = await __unstableFetch( {\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tmethod: recordId ? 'PUT' : 'POST',\n\t\t\t\t\t\tdata: edits,\n\t\t\t\t\t} );\n\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdatedRecord,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tedits\n\t\t\t\t\t);\n\t\t\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\t\t\tif ( entityConfig.syncConfig ) {\n\t\t\t\t\t\t\tgetSyncManager()?.update(\n\t\t\t\t\t\t\t\t`${ kind }/${ name }`,\n\t\t\t\t\t\t\t\trecordId,\n\t\t\t\t\t\t\t\tupdatedRecord,\n\t\t\t\t\t\t\t\tLOCAL_EDITOR_ORIGIN,\n\t\t\t\t\t\t\t\ttrue // isSave\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch ( _error ) {\n\t\t\t\thasError = true;\n\t\t\t\terror = _error;\n\t\t\t}\n\t\t\tdispatch( {\n\t\t\t\ttype: 'SAVE_ENTITY_RECORD_FINISH',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t\terror,\n\t\t\t\tisAutosave,\n\t\t\t} );\n\n\t\t\tif ( hasError && throwOnError ) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\treturn updatedRecord;\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n/**\n * Runs multiple core-data actions at the same time using one API request.\n *\n * Example:\n *\n * ```\n * const [ savedRecord, updatedRecord, deletedRecord ] =\n *   await dispatch( 'core' ).__experimentalBatch( [\n *     ( { saveEntityRecord } ) => saveEntityRecord( 'root', 'widget', widget ),\n *     ( { saveEditedEntityRecord } ) => saveEntityRecord( 'root', 'widget', 123 ),\n *     ( { deleteEntityRecord } ) => deleteEntityRecord( 'root', 'widget', 123, null ),\n *   ] );\n * ```\n *\n * @param {Array} requests Array of functions which are invoked simultaneously.\n *                         Each function is passed an object containing\n *                         `saveEntityRecord`, `saveEditedEntityRecord`, and\n *                         `deleteEntityRecord`.\n *\n * @return {(thunkArgs: Object) => Promise} A promise that resolves to an array containing the return\n *                                          values of each function given in `requests`.\n */\nexport const __experimentalBatch =\n\t( requests ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst batch = createBatch();\n\t\tconst api = {\n\t\t\tsaveEntityRecord( kind, name, record, options ) {\n\t\t\t\treturn batch.add( ( add ) =>\n\t\t\t\t\tdispatch.saveEntityRecord( kind, name, record, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\t__unstableFetch: add,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t},\n\t\t\tsaveEditedEntityRecord( kind, name, recordId, options ) {\n\t\t\t\treturn batch.add( ( add ) =>\n\t\t\t\t\tdispatch.saveEditedEntityRecord( kind, name, recordId, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\t__unstableFetch: add,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t},\n\t\t\tdeleteEntityRecord( kind, name, recordId, query, options ) {\n\t\t\t\treturn batch.add( ( add ) =>\n\t\t\t\t\tdispatch.deleteEntityRecord( kind, name, recordId, query, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\t__unstableFetch: add,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t},\n\t\t};\n\t\tconst resultPromises = requests.map( ( request ) => request( api ) );\n\t\tconst [ , ...results ] = await Promise.all( [\n\t\t\tbatch.run(),\n\t\t\t...resultPromises,\n\t\t] );\n\t\treturn results;\n\t};\n\n/**\n * Action triggered to save an entity record's edits.\n *\n * @param {string}  kind     Kind of the entity.\n * @param {string}  name     Name of the entity.\n * @param {Object}  recordId ID of the record.\n * @param {Object=} options  Saving options.\n */\nexport const saveEditedEntityRecord =\n\t( kind, name, recordId, options ) =>\n\tasync ( { select, dispatch, resolveSelect } ) => {\n\t\tlogEntityDeprecation( kind, name, 'saveEditedEntityRecord' );\n\t\tif ( ! select.hasEditsForEntityRecord( kind, name, recordId ) ) {\n\t\t\treturn;\n\t\t}\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.kind === kind && config.name === name\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\t\tconst entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY;\n\n\t\tconst edits = select.getEntityRecordNonTransientEdits(\n\t\t\tkind,\n\t\t\tname,\n\t\t\trecordId\n\t\t);\n\t\tconst record = { [ entityIdKey ]: recordId, ...edits };\n\t\treturn await dispatch.saveEntityRecord( kind, name, record, options );\n\t};\n\n/**\n * Action triggered to save only specified properties for the entity.\n *\n * @param {string}        kind        Kind of the entity.\n * @param {string}        name        Name of the entity.\n * @param {number|string} recordId    ID of the record.\n * @param {Array}         itemsToSave List of entity properties or property paths to save.\n * @param {Object}        options     Saving options.\n */\nexport const __experimentalSaveSpecifiedEntityEdits =\n\t( kind, name, recordId, itemsToSave, options ) =>\n\tasync ( { select, dispatch, resolveSelect } ) => {\n\t\tlogEntityDeprecation(\n\t\t\tkind,\n\t\t\tname,\n\t\t\t'__experimentalSaveSpecifiedEntityEdits'\n\t\t);\n\t\tif ( ! select.hasEditsForEntityRecord( kind, name, recordId ) ) {\n\t\t\treturn;\n\t\t}\n\t\tconst edits = select.getEntityRecordNonTransientEdits(\n\t\t\tkind,\n\t\t\tname,\n\t\t\trecordId\n\t\t);\n\t\tconst editsToSave = {};\n\n\t\tfor ( const item of itemsToSave ) {\n\t\t\tsetNestedValue( editsToSave, item, getNestedValue( edits, item ) );\n\t\t}\n\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.kind === kind && config.name === name\n\t\t);\n\n\t\tconst entityIdKey = entityConfig?.key || DEFAULT_ENTITY_KEY;\n\n\t\t// If a record key is provided then update the existing record.\n\t\t// This necessitates providing `recordKey` to saveEntityRecord as part of the\n\t\t// `record` argument (here called `editsToSave`) to stop that action creating\n\t\t// a new record and instead cause it to update the existing record.\n\t\tif ( recordId ) {\n\t\t\teditsToSave[ entityIdKey ] = recordId;\n\t\t}\n\t\treturn await dispatch.saveEntityRecord(\n\t\t\tkind,\n\t\t\tname,\n\t\t\teditsToSave,\n\t\t\toptions\n\t\t);\n\t};\n\n/**\n * Returns an action object used in signalling that Upload permissions have been received.\n *\n * @deprecated since WP 5.9, use receiveUserPermission instead.\n *\n * @param {boolean} hasUploadPermissions Does the user have permission to upload files?\n *\n * @return {Object} Action object.\n */\nexport function receiveUploadPermissions( hasUploadPermissions ) {\n\tdeprecated( \"wp.data.dispatch( 'core' ).receiveUploadPermissions\", {\n\t\tsince: '5.9',\n\t\talternative: 'receiveUserPermission',\n\t} );\n\n\treturn receiveUserPermission( 'create/media', hasUploadPermissions );\n}\n\n/**\n * Returns an action object used in signalling that the current user has\n * permission to perform an action on a REST resource.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {string}  key       A key that represents the action and REST resource.\n * @param {boolean} isAllowed Whether or not the user can perform the action.\n *\n * @return {Object} Action object.\n */\nexport function receiveUserPermission( key, isAllowed ) {\n\treturn {\n\t\ttype: 'RECEIVE_USER_PERMISSION',\n\t\tkey,\n\t\tisAllowed,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the current user has\n * permission to perform an action on a REST resource. Ignored from\n * documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {Object<string, boolean>} permissions An object where keys represent\n *                                              actions and REST resources, and\n *                                              values indicate whether the user\n *                                              is allowed to perform the\n *                                              action.\n *\n * @return {Object} Action object.\n */\nexport function receiveUserPermissions( permissions ) {\n\treturn {\n\t\ttype: 'RECEIVE_USER_PERMISSIONS',\n\t\tpermissions,\n\t};\n}\n\n/**\n * Returns an action object used in signalling that the autosaves for a\n * post have been received.\n * Ignored from documentation as it's internal to the data store.\n *\n * @ignore\n *\n * @param {number}       postId    The id of the post that is parent to the autosave.\n * @param {Array|Object} autosaves An array of autosaves or singular autosave object.\n *\n * @return {Object} Action object.\n */\nexport function receiveAutosaves( postId, autosaves ) {\n\treturn {\n\t\ttype: 'RECEIVE_AUTOSAVES',\n\t\tpostId,\n\t\tautosaves: Array.isArray( autosaves ) ? autosaves : [ autosaves ],\n\t};\n}\n\n/**\n * Returns an action object signalling that the fallback Navigation\n * Menu id has been received.\n *\n * @param {integer} fallbackId the id of the fallback Navigation Menu\n * @return {Object} Action object.\n */\nexport function receiveNavigationFallbackId( fallbackId ) {\n\treturn {\n\t\ttype: 'RECEIVE_NAVIGATION_FALLBACK_ID',\n\t\tfallbackId,\n\t};\n}\n\n/**\n * Returns an action object used to set the template for a given query.\n *\n * @param {Object} query      The lookup query.\n * @param {string} templateId The resolved template id.\n *\n * @return {Object} Action object.\n */\nexport function receiveDefaultTemplateId( query, templateId ) {\n\treturn {\n\t\ttype: 'RECEIVE_DEFAULT_TEMPLATE',\n\t\tquery,\n\t\ttemplateId,\n\t};\n}\n\n/**\n * Action triggered to receive revision items.\n *\n * @param {string}        kind            Kind of the received entity record revisions.\n * @param {string}        name            Name of the received entity record revisions.\n * @param {number|string} recordKey       The key of the entity record whose revisions you want to fetch.\n * @param {Array|Object}  records         Revisions received.\n * @param {?Object}       query           Query Object.\n * @param {?boolean}      invalidateCache Should invalidate query caches.\n * @param {?Object}       meta            Meta information about pagination.\n */\nexport const receiveRevisions =\n\t( kind, name, recordKey, records, query, invalidateCache = false, meta ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlogEntityDeprecation( kind, name, 'receiveRevisions' );\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.kind === kind && config.name === name\n\t\t);\n\t\tconst key =\n\t\t\tentityConfig && entityConfig?.revisionKey\n\t\t\t\t? entityConfig.revisionKey\n\t\t\t\t: DEFAULT_ENTITY_KEY;\n\n\t\tdispatch( {\n\t\t\ttype: 'RECEIVE_ITEM_REVISIONS',\n\t\t\tkey,\n\t\t\titems: Array.isArray( records ) ? records : [ records ],\n\t\t\trecordKey,\n\t\t\tmeta,\n\t\t\tquery,\n\t\t\tkind,\n\t\t\tname,\n\t\t\tinvalidateCache,\n\t\t} );\n\t};\n", "/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Maximum number of requests to place in a single batch request. Obtained by\n * sending a preflight OPTIONS request to /batch/v1/.\n *\n * @type {number?}\n */\nlet maxItems = null;\n\nfunction chunk( arr, chunkSize ) {\n\tconst tmp = [ ...arr ];\n\tconst cache = [];\n\twhile ( tmp.length ) {\n\t\tcache.push( tmp.splice( 0, chunkSize ) );\n\t}\n\n\treturn cache;\n}\n\n/**\n * Default batch processor. Sends its input requests to /batch/v1.\n *\n * @param {Array} requests List of API requests to perform at once.\n *\n * @return {Promise} Promise that resolves to a list of objects containing\n *                   either `output` (if that request was successful) or `error`\n *                   (if not ).\n */\nexport default async function defaultProcessor( requests ) {\n\tif ( maxItems === null ) {\n\t\tconst preflightResponse = await apiFetch( {\n\t\t\tpath: '/batch/v1',\n\t\t\tmethod: 'OPTIONS',\n\t\t} );\n\t\tmaxItems = preflightResponse.endpoints[ 0 ].args.requests.maxItems;\n\t}\n\n\tconst results = [];\n\n\t// @ts-ignore We would have crashed or never gotten to this point if we hadn't received the maxItems count.\n\tfor ( const batchRequests of chunk( requests, maxItems ) ) {\n\t\tconst batchResponse = await apiFetch( {\n\t\t\tpath: '/batch/v1',\n\t\t\tmethod: 'POST',\n\t\t\tdata: {\n\t\t\t\tvalidation: 'require-all-validate',\n\t\t\t\trequests: batchRequests.map( ( request ) => ( {\n\t\t\t\t\tpath: request.path,\n\t\t\t\t\tbody: request.data, // Rename 'data' to 'body'.\n\t\t\t\t\tmethod: request.method,\n\t\t\t\t\theaders: request.headers,\n\t\t\t\t} ) ),\n\t\t\t},\n\t\t} );\n\n\t\tlet batchResults;\n\n\t\tif ( batchResponse.failed ) {\n\t\t\tbatchResults = batchResponse.responses.map( ( response ) => ( {\n\t\t\t\terror: response?.body,\n\t\t\t} ) );\n\t\t} else {\n\t\t\tbatchResults = batchResponse.responses.map( ( response ) => {\n\t\t\t\tconst result = {};\n\t\t\t\tif ( response.status >= 200 && response.status < 300 ) {\n\t\t\t\t\tresult.output = response.body;\n\t\t\t\t} else {\n\t\t\t\t\tresult.error = response.body;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} );\n\t\t}\n\n\t\tresults.push( ...batchResults );\n\t}\n\n\treturn results;\n}\n", "/**\n * Internal dependencies\n */\nimport defaultProcessor from './default-processor';\n\n/**\n * Creates a batch, which can be used to combine multiple API requests into one\n * API request using the WordPress batch processing API (/v1/batch).\n *\n * ```\n * const batch = createBatch();\n * const dunePromise = batch.add( {\n *   path: '/v1/books',\n *   method: 'POST',\n *   data: { title: 'Dune' }\n * } );\n * const lotrPromise = batch.add( {\n *   path: '/v1/books',\n *   method: 'POST',\n *   data: { title: 'Lord of the Rings' }\n * } );\n * const isSuccess = await batch.run(); // Sends one POST to /v1/batch.\n * if ( isSuccess ) {\n *   console.log(\n *     'Saved two books:',\n *     await dunePromise,\n *     await lotrPromise\n *   );\n * }\n * ```\n *\n * @param {Function} [processor] Processor function. Can be used to replace the\n *                               default functionality which is to send an API\n *                               request to /v1/batch. Is given an array of\n *                               inputs and must return a promise that\n *                               resolves to an array of objects containing\n *                               either `output` or `error`.\n */\nexport default function createBatch( processor = defaultProcessor ) {\n\tlet lastId = 0;\n\t/** @type {Array<{ input: any; resolve: ( value: any ) => void; reject: ( error: any ) => void }>} */\n\tlet queue = [];\n\tconst pending = new ObservableSet();\n\n\treturn {\n\t\t/**\n\t\t * Adds an input to the batch and returns a promise that is resolved or\n\t\t * rejected when the input is processed by `batch.run()`.\n\t\t *\n\t\t * You may also pass a thunk which allows inputs to be added\n\t\t * asynchronously.\n\t\t *\n\t\t * ```\n\t\t * // Both are allowed:\n\t\t * batch.add( { path: '/v1/books', ... } );\n\t\t * batch.add( ( add ) => add( { path: '/v1/books', ... } ) );\n\t\t * ```\n\t\t *\n\t\t * If a thunk is passed, `batch.run()` will pause until either:\n\t\t *\n\t\t * - The thunk calls its `add` argument, or;\n\t\t * - The thunk returns a promise and that promise resolves, or;\n\t\t * - The thunk returns a non-promise.\n\t\t *\n\t\t * @param {any|Function} inputOrThunk Input to add or thunk to execute.\n\t\t *\n\t\t * @return {Promise|any} If given an input, returns a promise that\n\t\t *                       is resolved or rejected when the batch is\n\t\t *                       processed. If given a thunk, returns the return\n\t\t *                       value of that thunk.\n\t\t */\n\t\tadd( inputOrThunk ) {\n\t\t\tconst id = ++lastId;\n\t\t\tpending.add( id );\n\n\t\t\tconst add = ( input ) =>\n\t\t\t\tnew Promise( ( resolve, reject ) => {\n\t\t\t\t\tqueue.push( {\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\tresolve,\n\t\t\t\t\t\treject,\n\t\t\t\t\t} );\n\t\t\t\t\tpending.delete( id );\n\t\t\t\t} );\n\n\t\t\tif ( typeof inputOrThunk === 'function' ) {\n\t\t\t\treturn Promise.resolve( inputOrThunk( add ) ).finally( () => {\n\t\t\t\t\tpending.delete( id );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn add( inputOrThunk );\n\t\t},\n\n\t\t/**\n\t\t * Runs the batch. This calls `batchProcessor` and resolves or rejects\n\t\t * all promises returned by `add()`.\n\t\t *\n\t\t * @return {Promise<boolean>} A promise that resolves to a boolean that is true\n\t\t *                   if the processor returned no errors.\n\t\t */\n\t\tasync run() {\n\t\t\tif ( pending.size ) {\n\t\t\t\tawait new Promise( ( resolve ) => {\n\t\t\t\t\tconst unsubscribe = pending.subscribe( () => {\n\t\t\t\t\t\tif ( ! pending.size ) {\n\t\t\t\t\t\t\tunsubscribe();\n\t\t\t\t\t\t\tresolve( undefined );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tlet results;\n\n\t\t\ttry {\n\t\t\t\tresults = await processor(\n\t\t\t\t\tqueue.map( ( { input } ) => input )\n\t\t\t\t);\n\n\t\t\t\tif ( results.length !== queue.length ) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'run: Array returned by processor must be same size as input array.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch ( error ) {\n\t\t\t\tfor ( const { reject } of queue ) {\n\t\t\t\t\treject( error );\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tlet isSuccess = true;\n\n\t\t\tresults.forEach( ( result, key ) => {\n\t\t\t\tconst queueItem = queue[ key ];\n\n\t\t\t\tif ( result?.error ) {\n\t\t\t\t\tqueueItem?.reject( result.error );\n\t\t\t\t\tisSuccess = false;\n\t\t\t\t} else {\n\t\t\t\t\tqueueItem?.resolve( result?.output ?? result );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tqueue = [];\n\n\t\t\treturn isSuccess;\n\t\t},\n\t};\n}\n\nclass ObservableSet {\n\tconstructor( ...args ) {\n\t\tthis.set = new Set( ...args );\n\t\tthis.subscribers = new Set();\n\t}\n\n\tget size() {\n\t\treturn this.set.size;\n\t}\n\n\tadd( value ) {\n\t\tthis.set.add( value );\n\t\tthis.subscribers.forEach( ( subscriber ) => subscriber() );\n\t\treturn this;\n\t}\n\n\tdelete( value ) {\n\t\tconst isSuccess = this.set.delete( value );\n\t\tthis.subscribers.forEach( ( subscriber ) => subscriber() );\n\t\treturn isSuccess;\n\t}\n\n\tsubscribe( subscriber ) {\n\t\tthis.subscribers.add( subscriber );\n\t\treturn () => {\n\t\t\tthis.subscribers.delete( subscriber );\n\t\t};\n\t}\n}\n", "/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\n\n/**\n * Returns an action object used in signalling that the registered post meta\n * fields for a post type have been received.\n *\n * @param {string} postType           Post type slug.\n * @param {Object} registeredPostMeta Registered post meta.\n *\n * @return {Object} Action object.\n */\nexport function receiveRegisteredPostMeta( postType, registeredPostMeta ) {\n\treturn {\n\t\ttype: 'RECEIVE_REGISTERED_POST_META',\n\t\tpostType,\n\t\tregisteredPostMeta,\n\t};\n}\n\n/**\n * @typedef {Object} Modifier\n * @property {string} [type] - The type of modifier.\n * @property {Object} [args] - The arguments of the modifier.\n */\n\n/**\n * @typedef {Object} Edits\n * @property {string}     [src]       - The URL of the media item.\n * @property {Modifier[]} [modifiers] - The modifiers to apply to the media item.\n */\n\n/**\n * Duplicates a media (attachment) entity record and, optionally, modifies it.\n *\n * @param {string}   recordId                Entity record ID.\n * @param {Edits}    edits                   Edits to apply to the record.\n * @param {Object}   options                 Options object.\n * @param {Function} options.__unstableFetch Custom fetch function.\n * @param {boolean}  options.throwOnError    Whether to throw an error if the request fails.\n *\n * @return {Promise} Promise resolving to the updated record.\n */\nexport const editMediaEntity =\n\t(\n\t\trecordId,\n\t\tedits = {},\n\t\t{ __unstableFetch = apiFetch, throwOnError = false } = {}\n\t) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tif ( ! recordId ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst kind = 'postType';\n\t\tconst name = 'attachment';\n\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.kind === kind && config.name === name\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, recordId ],\n\t\t\t{ exclusive: true }\n\t\t);\n\n\t\tlet updatedRecord;\n\t\tlet error;\n\t\tlet hasError = false;\n\n\t\ttry {\n\t\t\tdispatch( {\n\t\t\t\ttype: 'SAVE_ENTITY_RECORD_START',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t} );\n\n\t\t\ttry {\n\t\t\t\tconst path = `${ entityConfig.baseURL }/${ recordId }/edit`;\n\t\t\t\tconst newRecord = await __unstableFetch( {\n\t\t\t\t\tpath,\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t...edits,\n\t\t\t\t\t},\n\t\t\t\t} );\n\n\t\t\t\tif ( newRecord ) {\n\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\t[ newRecord ],\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined\n\t\t\t\t\t);\n\t\t\t\t\tupdatedRecord = newRecord;\n\t\t\t\t}\n\t\t\t} catch ( e ) {\n\t\t\t\terror = e;\n\t\t\t\thasError = true;\n\t\t\t}\n\n\t\t\tdispatch( {\n\t\t\t\ttype: 'SAVE_ENTITY_RECORD_FINISH',\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordId,\n\t\t\t\terror,\n\t\t\t} );\n\n\t\t\tif ( hasError && throwOnError ) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\treturn updatedRecord;\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n/**\n * Returns an action object used to receive editor settings.\n *\n * @param {Object} settings Editor settings object.\n *\n * @return {Object} Action object.\n */\nexport function receiveEditorSettings( settings ) {\n\treturn {\n\t\ttype: 'RECEIVE_EDITOR_SETTINGS',\n\t\tsettings,\n\t};\n}\n\n/**\n * Returns an action object used to receive editor assets.\n *\n * @param {Object} assets Editor assets object.\n *\n * @return {Object} Action object.\n */\nexport function receiveEditorAssets( assets ) {\n\treturn {\n\t\ttype: 'RECEIVE_EDITOR_ASSETS',\n\t\tassets,\n\t};\n}\n", "/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { additionalEntityConfigLoaders, DEFAULT_ENTITY_KEY } from './entities';\nimport { getSyncManager } from './sync';\nimport {\n\tforwardResolver,\n\tgetNormalizedCommaSeparable,\n\tgetUserPermissionCacheKey,\n\tgetUserPermissionsFromAllowHeader,\n\tALLOWED_RESOURCE_ACTIONS,\n\tRECEIVE_INTERMEDIATE_RESULTS,\n\tisNumericID,\n} from './utils';\nimport { fetchBlockPatterns } from './fetch';\n\n/**\n * Requests authors from the REST API.\n *\n * @param {Object|undefined} query Optional object of query parameters to\n *                                 include with request.\n */\nexport const getAuthors =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst path = addQueryArgs(\n\t\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\t\tquery\n\t\t);\n\t\tconst users = await apiFetch( { path } );\n\t\tdispatch.receiveUserQuery( path, users );\n\t};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\t\tdispatch.receiveCurrentUser( currentUser );\n\t};\n\n/**\n * Requests an entity's record from the REST API.\n *\n * @param {string}           kind  Entity kind.\n * @param {string}           name  Entity name.\n * @param {number|string}    key   Record's key\n * @param {Object|undefined} query Optional object of query parameters to\n *                                 include with request. If requesting specific\n *                                 fields, fields must always include the ID.\n */\nexport const getEntityRecord =\n\t( kind, name, key = '', query ) =>\n\tasync ( { select, dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, key ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t\t// and without causing `getEntityRecord` resolution to occur.\n\t\t\t\tconst hasRecord = select.hasEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tkey,\n\t\t\t\t\tquery\n\t\t\t\t);\n\t\t\t\tif ( hasRecord ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { baseURL } = entityConfig;\n\n\t\t\t// For \"string\" IDs, use the old templates endpoint.\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\t( ( key && typeof key === 'string' && ! /^\\d+$/.test( key ) ) ||\n\t\t\t\t\t! window?.__experimentalTemplateActivate )\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( baseURL + ( key ? '/' + key : '' ), {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\tconst record = await response.json();\n\t\t\tconst permissions = getUserPermissionsFromAllowHeader(\n\t\t\t\tresponse.headers?.get( 'allow' )\n\t\t\t);\n\n\t\t\tconst canUserResolutionsArgs = [];\n\t\t\tconst receiveUserPermissionArgs = {};\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\treceiveUserPermissionArgs[\n\t\t\t\t\tgetUserPermissionCacheKey( action, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tid: key,\n\t\t\t\t\t} )\n\t\t\t\t] = permissions[ action ];\n\n\t\t\t\tcanUserResolutionsArgs.push( [\n\t\t\t\t\taction,\n\t\t\t\t\t{ kind, name, id: key },\n\t\t\t\t] );\n\t\t\t}\n\n\t\t\t// Entity supports syncing.\n\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\tif (\n\t\t\t\t\tentityConfig.syncConfig &&\n\t\t\t\t\tisNumericID( key ) &&\n\t\t\t\t\t! query\n\t\t\t\t) {\n\t\t\t\t\tconst objectType = `${ kind }/${ name }`;\n\t\t\t\t\tconst objectId = key;\n\n\t\t\t\t\t// Use the new transient \"read/write\" config to compute transients for\n\t\t\t\t\t// the sync manager. Otherwise these transients are not available\n\t\t\t\t\t// if / until the record is edited. Use a copy of the record so that\n\t\t\t\t\t// it does not change the behavior outside this experimental flag.\n\t\t\t\t\tconst recordWithTransients = { ...record };\n\t\t\t\t\tObject.entries( entityConfig.transientEdits ?? {} )\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t( [ propName, transientConfig ] ) =>\n\t\t\t\t\t\t\t\tundefined ===\n\t\t\t\t\t\t\t\t\trecordWithTransients[ propName ] &&\n\t\t\t\t\t\t\t\ttransientConfig &&\n\t\t\t\t\t\t\t\t'object' === typeof transientConfig &&\n\t\t\t\t\t\t\t\t'read' in transientConfig &&\n\t\t\t\t\t\t\t\t'function' === typeof transientConfig.read\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.forEach( ( [ propName, transientConfig ] ) => {\n\t\t\t\t\t\t\trecordWithTransients[ propName ] =\n\t\t\t\t\t\t\t\ttransientConfig.read( recordWithTransients );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t// Load the entity record for syncing.\n\t\t\t\t\tawait getSyncManager()?.load(\n\t\t\t\t\t\tentityConfig.syncConfig,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\trecordWithTransients,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Handle edits sourced from the sync manager.\n\t\t\t\t\t\t\teditRecord: ( edits ) => {\n\t\t\t\t\t\t\t\tif ( ! Object.keys( edits ).length ) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdispatch( {\n\t\t\t\t\t\t\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\trecordId: key,\n\t\t\t\t\t\t\t\t\tedits,\n\t\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\t\tundo: undefined,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Get the current entity record (with edits)\n\t\t\t\t\t\t\tgetEditedRecord: async () =>\n\t\t\t\t\t\t\t\tawait resolveSelect.getEditedEntityRecord(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t// Refetch the current entity record from the database.\n\t\t\t\t\t\t\trefetchRecord: async () => {\n\t\t\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tawait apiFetch( { path, parse: true } ),\n\t\t\t\t\t\t\t\t\tquery\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Save the current entity record's unsaved edits.\n\t\t\t\t\t\t\tsaveRecord: () => {\n\t\t\t\t\t\t\t\tdispatch.saveEditedEntityRecord(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\t\t\t\tdispatch.receiveUserPermissions( receiveUserPermissionArgs );\n\t\t\t\tdispatch.finishResolutions( 'canUser', canUserResolutionsArgs );\n\t\t\t} );\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n// Whenever a template is saved, the active templates might be updated, so\n// invalidate the site settings when a template is updated or deleted.\ngetEntityRecord.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\tkind === 'root' &&\n\t\tname === 'site' &&\n\t\t( ( action.type === 'RECEIVE_ITEMS' &&\n\t\t\t// Making sure persistedEdits is set seems to be the only way of\n\t\t\t// knowing whether it's an update or fetch. Only an update would\n\t\t\t// have persistedEdits.\n\t\t\taction.persistedEdits &&\n\t\t\taction.persistedEdits.status !== 'auto-draft' ) ||\n\t\t\taction.type === 'REMOVE_ITEMS' ) &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\n\t);\n};\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getRawEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getEditedEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests the entity's records from the REST API.\n *\n * @param {string}  kind  Entity kind.\n * @param {string}  name  Entity name.\n * @param {?Object} query Query Object. If requesting specific fields, fields\n *                        must always include the ID.\n */\nexport const getEntityRecords =\n\t( kind, name, query = {} ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\t// Keep a copy of the original query for later use in getResolutionsArgs.\n\t\t// The query object may be modified below (for example, when _fields is\n\t\t// specified), but we want to use the original query when marking\n\t\t// resolutions as finished.\n\t\tconst rawQuery = { ...query };\n\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\n\t\tfunction getResolutionsArgs( records, recordsQuery ) {\n\t\t\tconst queryArgs = Object.fromEntries(\n\t\t\t\tObject.entries( recordsQuery ).filter( ( [ k, v ] ) => {\n\t\t\t\t\treturn [ 'context', '_fields' ].includes( k ) && !! v;\n\t\t\t\t} )\n\t\t\t);\n\t\t\treturn records\n\t\t\t\t.filter( ( record ) => record?.[ key ] )\n\t\t\t\t.map( ( record ) => [\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecord[ key ],\n\t\t\t\t\tObject.keys( queryArgs ).length > 0 ? queryArgs : undefined,\n\t\t\t\t] );\n\t\t}\n\n\t\ttry {\n\t\t\tif ( query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet { baseURL } = entityConfig;\n\t\t\t// `combinedTemplates` means that we fetch templates from the \"old\"\n\t\t\t// /templates endpoint, which combines active user templates with\n\t\t\t// the registered templates and rewrites IDs in the form of\n\t\t\t// `theme-slug/template-slug`. When turned off, we only fetch\n\t\t\t// database templates (posts). To fetch registered templates without\n\t\t\t// edits applied, use the `registeredTemplate` entity.\n\t\t\tconst { combinedTemplates = true } = query;\n\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\tcombinedTemplates\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( baseURL, {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\n\t\t\tlet records = [],\n\t\t\t\tmeta;\n\t\t\tif ( entityConfig.supportsPagination && query.per_page !== -1 ) {\n\t\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t),\n\t\t\t\t\ttotalPages: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t} else if (\n\t\t\t\tquery.per_page === -1 &&\n\t\t\t\tquery[ RECEIVE_INTERMEDIATE_RESULTS ] === true\n\t\t\t) {\n\t\t\t\tlet page = 1;\n\t\t\t\tlet totalPages;\n\n\t\t\t\tdo {\n\t\t\t\t\tconst response = await apiFetch( {\n\t\t\t\t\t\tpath: addQueryArgs( path, { page, per_page: 100 } ),\n\t\t\t\t\t\tparse: false,\n\t\t\t\t\t} );\n\t\t\t\t\tconst pageRecords = Object.values( await response.json() );\n\n\t\t\t\t\ttotalPages = parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( ! meta ) {\n\t\t\t\t\t\tmeta = {\n\t\t\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttotalPages: 1,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\trecords.push( ...pageRecords );\n\t\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\trecords,\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tmeta\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\t\t\tgetResolutionsArgs( pageRecords, rawQuery )\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t\tpage++;\n\t\t\t\t} while ( page <= totalPages );\n\t\t\t} else {\n\t\t\t\trecords = Object.values( await apiFetch( { path } ) );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: records.length,\n\t\t\t\t\ttotalPages: 1,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\tconst targetHints = records\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t( record ) =>\n\t\t\t\t\t\t\t!! record?.[ key ] &&\n\t\t\t\t\t\t\t!! record?._links?.self?.[ 0 ]?.targetHints?.allow\n\t\t\t\t\t)\n\t\t\t\t\t.map( ( record ) => ( {\n\t\t\t\t\t\tid: record[ key ],\n\t\t\t\t\t\tpermissions: getUserPermissionsFromAllowHeader(\n\t\t\t\t\t\t\trecord._links.self[ 0 ].targetHints.allow\n\t\t\t\t\t\t),\n\t\t\t\t\t} ) );\n\n\t\t\t\tconst canUserResolutionsArgs = [];\n\t\t\t\tconst receiveUserPermissionArgs = {};\n\t\t\t\tfor ( const targetHint of targetHints ) {\n\t\t\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\t\t\tcanUserResolutionsArgs.push( [\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\t{ kind, name, id: targetHint.id },\n\t\t\t\t\t\t] );\n\n\t\t\t\t\t\treceiveUserPermissionArgs[\n\t\t\t\t\t\t\tgetUserPermissionCacheKey( action, {\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tid: targetHint.id,\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t] = targetHint.permissions[ action ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( targetHints.length > 0 ) {\n\t\t\t\t\tdispatch.receiveUserPermissions(\n\t\t\t\t\t\treceiveUserPermissionArgs\n\t\t\t\t\t);\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'canUser',\n\t\t\t\t\t\tcanUserResolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\tgetResolutionsArgs( records, rawQuery )\n\t\t\t\t);\n\n\t\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t\t} );\n\t\t} catch ( e ) {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\ngetEntityRecords.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\tkind === action.kind &&\n\t\tname === action.name\n\t);\n};\n\n/**\n * Requests the total number of entity records.\n */\nexport const getEntityRecordsTotalItems = forwardResolver( 'getEntityRecords' );\n\n/**\n * Requests the number of available pages for the given query.\n */\nexport const getEntityRecordsTotalPages = forwardResolver( 'getEntityRecords' );\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\n\t\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n\t};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview =\n\t( url ) =>\n\tasync ( { dispatch } ) => {\n\t\ttry {\n\t\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t\t} );\n\t\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t\t} catch ( error ) {\n\t\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\t\tdispatch.receiveEmbedPreview( url, false );\n\t\t}\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string}        requestedAction Action to check. One of: 'create', 'read', 'update',\n *                                        'delete'.\n * @param {string|Object} resource        Entity resource to check. Accepts entity object `{ kind: 'postType', name: 'attachment', id: 1 }`\n *                                        or REST base as a string - `media`.\n * @param {?string}       id              ID of the rest resource to check.\n */\nexport const canUser =\n\t( requestedAction, resource, id ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tif ( ! ALLOWED_RESOURCE_ACTIONS.includes( requestedAction ) ) {\n\t\t\tthrow new Error( `'${ requestedAction }' is not a valid action.` );\n\t\t}\n\n\t\tconst { hasStartedResolution } = registry.select( STORE_NAME );\n\n\t\t// Prevent resolving the same resource twice.\n\t\tfor ( const relatedAction of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\tif ( relatedAction === requestedAction ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isAlreadyResolving = hasStartedResolution( 'canUser', [\n\t\t\t\trelatedAction,\n\t\t\t\tresource,\n\t\t\t\tid,\n\t\t\t] );\n\t\t\tif ( isAlreadyResolving ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet resourcePath = null;\n\t\tif ( typeof resource === 'object' ) {\n\t\t\tif ( ! resource.kind || ! resource.name ) {\n\t\t\t\tthrow new Error( 'The entity resource object is not valid.' );\n\t\t\t}\n\n\t\t\tconst configs = await resolveSelect.getEntitiesConfig(\n\t\t\t\tresource.kind\n\t\t\t);\n\t\t\tconst entityConfig = configs.find(\n\t\t\t\t( config ) =>\n\t\t\t\t\tconfig.name === resource.name &&\n\t\t\t\t\tconfig.kind === resource.kind\n\t\t\t);\n\t\t\tif ( ! entityConfig ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresourcePath =\n\t\t\t\tentityConfig.baseURL + ( resource.id ? '/' + resource.id : '' );\n\t\t} else {\n\t\t\tresourcePath = `/wp/v2/${ resource }` + ( id ? '/' + id : '' );\n\t\t}\n\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await apiFetch( {\n\t\t\t\tpath: resourcePath,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t\tparse: false,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\t\treturn;\n\t\t}\n\n\t\t// Optional chaining operator is used here because the API requests don't\n\t\t// return the expected result in the React native version. Instead, API requests\n\t\t// only return the result, without including response properties like the headers.\n\t\tconst permissions = getUserPermissionsFromAllowHeader(\n\t\t\tresponse.headers?.get( 'allow' )\n\t\t);\n\t\tregistry.batch( () => {\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\tconst key = getUserPermissionCacheKey( action, resource, id );\n\n\t\t\t\tdispatch.receiveUserPermission( key, permissions[ action ] );\n\n\t\t\t\t// Mark related action resolutions as finished.\n\t\t\t\tif ( action !== requestedAction ) {\n\t\t\t\t\tdispatch.finishResolution( 'canUser', [\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tresource,\n\t\t\t\t\t\tid,\n\t\t\t\t\t] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string}        kind     Entity kind.\n * @param {string}        name     Entity name.\n * @param {number|string} recordId Record's id.\n */\nexport const canUserEditEntityRecord =\n\t( kind, name, recordId ) =>\n\tasync ( { dispatch } ) => {\n\t\tawait dispatch( canUser( 'update', { kind, name, id: recordId } ) );\n\t};\n\n/**\n * Request autosave data from the REST API.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId   The id of the parent post.\n */\nexport const getAutosaves =\n\t( postType, postId ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst {\n\t\t\trest_base: restBase,\n\t\t\trest_namespace: restNamespace = 'wp/v2',\n\t\t\tsupports,\n\t\t} = await resolveSelect.getPostType( postType );\n\t\tif ( ! supports?.autosave ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst autosaves = await apiFetch( {\n\t\t\tpath: `/${ restNamespace }/${ restBase }/${ postId }/autosaves?context=edit`,\n\t\t} );\n\n\t\tif ( autosaves && autosaves.length ) {\n\t\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t\t}\n\t};\n\n/**\n * Request autosave data from the REST API.\n *\n * This resolver exists to ensure the underlying autosaves are fetched via\n * `getAutosaves` when a call to the `getAutosave` selector is made.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId   The id of the parent post.\n */\nexport const getAutosave =\n\t( postType, postId ) =>\n\tasync ( { resolveSelect } ) => {\n\t\tawait resolveSelect.getAutosaves( postType, postId );\n\t};\n\nexport const __experimentalGetCurrentGlobalStylesId =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\t\tconst globalStylesURL =\n\t\t\tactiveThemes?.[ 0 ]?._links?.[ 'wp:user-global-styles' ]?.[ 0 ]\n\t\t\t\t?.href;\n\t\tif ( ! globalStylesURL ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Regex matches the ID at the end of a URL or immediately before\n\t\t// the query string.\n\t\tconst matches = globalStylesURL.match( /\\/(\\d+)(?:\\?|$)/ );\n\t\tconst id = matches ? Number( matches[ 1 ] ) : null;\n\n\t\tif ( id ) {\n\t\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId( id );\n\t\t}\n\t};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\t// Please adjust the preloaded requests if this changes!\n\t\tconst themeGlobalStyles = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }?context=view`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tthemeGlobalStyles\n\t\t);\n\t};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\t// Please adjust the preloaded requests if this changes!\n\t\tconst variations = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations?context=view`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tvariations\n\t\t);\n\t};\n\n/**\n * Fetches and returns the revisions of the current global styles theme.\n */\nexport const getCurrentThemeGlobalStylesRevisions =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst globalStylesId =\n\t\t\tawait resolveSelect.__experimentalGetCurrentGlobalStylesId();\n\t\tconst record = globalStylesId\n\t\t\t? await resolveSelect.getEntityRecord(\n\t\t\t\t\t'root',\n\t\t\t\t\t'globalStyles',\n\t\t\t\t\tglobalStylesId\n\t\t\t  )\n\t\t\t: undefined;\n\t\tconst revisionsURL = record?._links?.[ 'version-history' ]?.[ 0 ]?.href;\n\n\t\tif ( revisionsURL ) {\n\t\t\tconst resetRevisions = await apiFetch( {\n\t\t\t\turl: revisionsURL,\n\t\t\t} );\n\t\t\tconst revisions = resetRevisions?.map( ( revision ) =>\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tObject.entries( revision ).map( ( [ key, value ] ) => [\n\t\t\t\t\t\tcamelCase( key ),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t] )\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch.receiveThemeGlobalStyleRevisions(\n\t\t\t\tglobalStylesId,\n\t\t\t\trevisions\n\t\t\t);\n\t\t}\n\t};\n\ngetCurrentThemeGlobalStylesRevisions.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\t\taction.kind === 'root' &&\n\t\t! action.error &&\n\t\taction.name === 'globalStyles'\n\t);\n};\n\nexport const getBlockPatterns =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst patterns = await fetchBlockPatterns();\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERNS', patterns } );\n\t};\n\nexport const getBlockPatternCategories =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst categories = await apiFetch( {\n\t\t\tpath: '/wp/v2/block-patterns/categories',\n\t\t} );\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', categories } );\n\t};\n\nexport const getUserPatternCategories =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst patternCategories = await resolveSelect.getEntityRecords(\n\t\t\t'taxonomy',\n\t\t\t'wp_pattern_category',\n\t\t\t{\n\t\t\t\tper_page: -1,\n\t\t\t\t_fields: 'id,name,description,slug',\n\t\t\t\tcontext: 'view',\n\t\t\t}\n\t\t);\n\n\t\tconst mappedPatternCategories =\n\t\t\tpatternCategories?.map( ( userCategory ) => ( {\n\t\t\t\t...userCategory,\n\t\t\t\tlabel: decodeEntities( userCategory.name ),\n\t\t\t\tname: userCategory.slug,\n\t\t\t} ) ) || [];\n\n\t\tdispatch( {\n\t\t\ttype: 'RECEIVE_USER_PATTERN_CATEGORIES',\n\t\t\tpatternCategories: mappedPatternCategories,\n\t\t} );\n\t};\n\nexport const getNavigationFallbackId =\n\t() =>\n\tasync ( { dispatch, select, registry } ) => {\n\t\tconst fallback = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp-block-editor/v1/navigation-fallback', {\n\t\t\t\t_embed: true,\n\t\t\t} ),\n\t\t} );\n\n\t\tconst record = fallback?._embedded?.self;\n\n\t\tregistry.batch( () => {\n\t\t\tdispatch.receiveNavigationFallbackId( fallback?.id );\n\n\t\t\tif ( ! record ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the fallback is already in the store, don't invalidate navigation queries.\n\t\t\t// Otherwise, invalidate the cache for the scenario where there were no Navigation\n\t\t\t// posts in the state and the fallback created one.\n\t\t\tconst existingFallbackEntityRecord = select.getEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id\n\t\t\t);\n\t\t\tconst invalidateNavigationQueries = ! existingFallbackEntityRecord;\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\trecord,\n\t\t\t\tundefined,\n\t\t\t\tinvalidateNavigationQueries\n\t\t\t);\n\n\t\t\t// Resolve to avoid further network requests.\n\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id,\n\t\t\t] );\n\t\t} );\n\t};\n\nexport const getDefaultTemplateId =\n\t( query ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst template = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/templates/lookup', query ),\n\t\t} );\n\t\t// Wait for the the entities config to be loaded, otherwise receiving\n\t\t// the template as an entity will not work.\n\t\tawait resolveSelect.getEntitiesConfig( 'postType' );\n\t\t// When active_templates experiment is enabled, use numeric wp_id if it\n\t\t// exists, otherwise fall back to string ID format (theme//slug) as the\n\t\t// frontend expects string IDs for templates.\n\t\tconst id = window?.__experimentalTemplateActivate\n\t\t\t? template?.wp_id || template?.id\n\t\t\t: template?.id;\n\t\t// Endpoint may return an empty object if no template is found.\n\t\tif ( id ) {\n\t\t\ttemplate.id = id;\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveDefaultTemplateId( query, id );\n\t\t\t\tdispatch.receiveEntityRecords( 'postType', template.type, [\n\t\t\t\t\ttemplate,\n\t\t\t\t] );\n\t\t\t\t// Avoid further network requests.\n\t\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t\t'postType',\n\t\t\t\t\ttemplate.type,\n\t\t\t\t\tid,\n\t\t\t\t] );\n\t\t\t} );\n\t\t}\n\t};\n\ngetDefaultTemplateId.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'RECEIVE_ITEMS' &&\n\t\taction.kind === 'root' &&\n\t\taction.name === 'site'\n\t);\n};\n\n/**\n * Requests an entity's revisions from the REST API.\n *\n * @param {string}           kind      Entity kind.\n * @param {string}           name      Entity name.\n * @param {number|string}    recordKey The key of the entity record whose revisions you want to fetch.\n * @param {Object|undefined} query     Optional object of query parameters to\n *                                     include with request. If requesting specific\n *                                     fields, fields must always include the ID.\n */\nexport const getRevisions =\n\t( kind, name, recordKey, query = {} ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet records, response;\n\t\tconst meta = {};\n\t\tconst isPaginated =\n\t\t\tentityConfig.supportsPagination && query.per_page !== -1;\n\t\ttry {\n\t\t\tresponse = await apiFetch( { path, parse: ! isPaginated } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( response ) {\n\t\t\tif ( isPaginated ) {\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta.totalItems = parseInt(\n\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecords = Object.values( response );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveRevisions(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordKey,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t\t// resolve the `getRevision` selector in addition to `getRevisions`.\n\t\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t\t\t.map( ( record ) => [\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\trecordKey,\n\t\t\t\t\t\t\trecord[ key ],\n\t\t\t\t\t\t] );\n\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'getRevision',\n\t\t\t\t\t\tresolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\n// Invalidate cache when a new revision is created.\ngetRevisions.shouldInvalidate = ( action, kind, name, recordKey ) =>\n\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\tname === action.name &&\n\tkind === action.kind &&\n\t! action.error &&\n\trecordKey === action.recordId;\n\n/**\n * Requests a specific Entity revision from the REST API.\n *\n * @param {string}           kind        Entity kind.\n * @param {string}           name        Entity name.\n * @param {number|string}    recordKey   The key of the entity record whose revisions you want to fetch.\n * @param {number|string}    revisionKey The revision's key.\n * @param {Object|undefined} query       Optional object of query parameters to\n *                                       include with request. If requesting specific\n *                                       fields, fields must always include the ID.\n */\nexport const getRevision =\n\t( kind, name, recordKey, revisionKey, query ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( query !== undefined && query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey, revisionKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet record;\n\t\ttry {\n\t\t\trecord = await apiFetch( { path } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveRevisions( kind, name, recordKey, record, query );\n\t\t}\n\t};\n\n/**\n * Requests a specific post type options from the REST API.\n *\n * @param {string} postType Post type slug.\n */\nexport const getRegisteredPostMeta =\n\t( postType ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlet options;\n\t\ttry {\n\t\t\tconst {\n\t\t\t\trest_namespace: restNamespace = 'wp/v2',\n\t\t\t\trest_base: restBase,\n\t\t\t} = ( await resolveSelect.getPostType( postType ) ) || {};\n\t\t\toptions = await apiFetch( {\n\t\t\t\tpath: `${ restNamespace }/${ restBase }/?context=edit`,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if the request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( options ) {\n\t\t\tdispatch.receiveRegisteredPostMeta(\n\t\t\t\tpostType,\n\t\t\t\toptions?.schema?.properties?.meta?.properties\n\t\t\t);\n\t\t}\n\t};\n\n/**\n * Requests entity configs for the given kind from the REST API.\n *\n * @param {string} kind Entity kind.\n */\nexport const getEntitiesConfig =\n\t( kind ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst loader = additionalEntityConfigLoaders.find(\n\t\t\t( l ) => l.kind === kind\n\t\t);\n\n\t\tif ( ! loader ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst configs = await loader.loadEntities();\n\t\t\tif ( ! configs.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch.addEntities( configs );\n\t\t} catch {\n\t\t\t// Do nothing if the request comes back with an API error.\n\t\t}\n\t};\n\n/**\n * Requests editor settings from the REST API.\n */\nexport const getEditorSettings =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst settings = await apiFetch( {\n\t\t\tpath: '/wp-block-editor/v1/settings',\n\t\t} );\n\t\tdispatch.receiveEditorSettings( settings );\n\t};\n\n/**\n * Requests editor assets from the REST API.\n */\nexport const getEditorAssets =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst assets = await apiFetch( {\n\t\t\tpath: '/wp-block-editor/v1/assets',\n\t\t} );\n\t\tdispatch.receiveEditorAssets( assets );\n\t};\n", "/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\n\nexport { default as __experimentalFetchLinkSuggestions } from './__experimental-fetch-link-suggestions';\nexport { default as __experimentalFetchUrlData } from './__experimental-fetch-url-data';\n\nexport async function fetchBlockPatterns() {\n\tconst restPatterns = await apiFetch( {\n\t\tpath: '/wp/v2/block-patterns/patterns',\n\t} );\n\tif ( ! restPatterns ) {\n\t\treturn [];\n\t}\n\treturn restPatterns.map( ( pattern ) =>\n\t\tObject.fromEntries(\n\t\t\tObject.entries( pattern ).map( ( [ key, value ] ) => [\n\t\t\t\tcamelCase( key ),\n\t\t\t\tvalue,\n\t\t\t] )\n\t\t)\n\t);\n}\n", "/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { __ } from '@wordpress/i18n';\n\nexport type SearchOptions = {\n\t/**\n\t * Displays initial search suggestions, when true.\n\t */\n\tisInitialSuggestions?: boolean;\n\t/**\n\t * Search options for initial suggestions.\n\t */\n\tinitialSuggestionsSearchOptions?: Omit<\n\t\tSearchOptions,\n\t\t'isInitialSuggestions' | 'initialSuggestionsSearchOptions'\n\t>;\n\t/**\n\t * Filters by search type.\n\t */\n\ttype?: 'attachment' | 'post' | 'term' | 'post-format';\n\t/**\n\t * Slug of the post-type or taxonomy.\n\t */\n\tsubtype?: string;\n\t/**\n\t * Which page of results to return.\n\t */\n\tpage?: number;\n\t/**\n\t * Search results per page.\n\t */\n\tperPage?: number;\n};\n\nexport type EditorSettings = {\n\t/**\n\t * Disables post formats, when true.\n\t */\n\tdisablePostFormats?: boolean;\n};\n\ntype SearchAPIResult = {\n\tid: number;\n\ttitle: string;\n\turl: string;\n\ttype: string;\n\tsubtype: string;\n};\n\ntype MediaAPIResult = {\n\tid: number;\n\ttitle: { rendered: string };\n\tsource_url: string;\n\ttype: string;\n};\n\nexport type SearchResult = {\n\t/**\n\t * Post or term id.\n\t */\n\tid: number;\n\t/**\n\t * Link url.\n\t */\n\turl: string;\n\t/**\n\t * Title of the link.\n\t */\n\ttitle: string;\n\t/**\n\t * The taxonomy or post type slug or type URL.\n\t */\n\ttype: string;\n\t/**\n\t * Link kind of post-type or taxonomy\n\t */\n\tkind?: string;\n};\n\n/**\n * Fetches link suggestions from the WordPress API.\n *\n * WordPress does not support searching multiple tables at once, e.g. posts and terms, so we\n * perform multiple queries at the same time and then merge the results together.\n *\n * @param search\n * @param searchOptions\n * @param editorSettings\n *\n * @example\n * ```js\n * import { __experimentalFetchLinkSuggestions as fetchLinkSuggestions } from '@wordpress/core-data';\n *\n * //...\n *\n * export function initialize( id, settings ) {\n *\n * settings.__experimentalFetchLinkSuggestions = (\n *     search,\n *     searchOptions\n * ) => fetchLinkSuggestions( search, searchOptions, settings );\n * ```\n */\nexport default async function fetchLinkSuggestions(\n\tsearch: string,\n\tsearchOptions: SearchOptions = {},\n\teditorSettings: EditorSettings = {}\n): Promise< SearchResult[] > {\n\tconst searchOptionsToUse =\n\t\tsearchOptions.isInitialSuggestions &&\n\t\tsearchOptions.initialSuggestionsSearchOptions\n\t\t\t? {\n\t\t\t\t\t...searchOptions,\n\t\t\t\t\t...searchOptions.initialSuggestionsSearchOptions,\n\t\t\t  }\n\t\t\t: searchOptions;\n\n\tconst {\n\t\ttype,\n\t\tsubtype,\n\t\tpage,\n\t\tperPage = searchOptions.isInitialSuggestions ? 3 : 20,\n\t} = searchOptionsToUse;\n\n\tconst { disablePostFormats = false } = editorSettings;\n\n\tconst queries: Promise< SearchResult[] >[] = [];\n\n\tif ( ! type || type === 'post' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'post',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'post-type',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! type || type === 'term' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'term',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'taxonomy',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! disablePostFormats && ( ! type || type === 'post-format' ) ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'post-format',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'taxonomy',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! type || type === 'attachment' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< MediaAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/media', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.source_url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title.rendered || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.type,\n\t\t\t\t\t\t\tkind: 'media',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tconst responses = await Promise.all( queries );\n\n\tlet results = responses.flat();\n\tresults = results.filter( ( result ) => !! result.id );\n\tresults = sortResults( results, search );\n\tresults = results.slice( 0, perPage );\n\treturn results;\n}\n\n/**\n * Sort search results by relevance to the given query.\n *\n * Sorting is necessary as we're querying multiple endpoints and merging the results. For example\n * a taxonomy title might be more relevant than a post title, but by default taxonomy results will\n * be ordered after all the (potentially irrelevant) post results.\n *\n * We sort by scoring each result, where the score is the number of tokens in the title that are\n * also in the search query, divided by the total number of tokens in the title. This gives us a\n * score between 0 and 1, where 1 is a perfect match.\n *\n * @param results\n * @param search\n */\nexport function sortResults( results: SearchResult[], search: string ) {\n\tconst searchTokens = tokenize( search );\n\n\tconst scores = {};\n\tfor ( const result of results ) {\n\t\tif ( result.title ) {\n\t\t\tconst titleTokens = tokenize( result.title );\n\t\t\tconst exactMatchingTokens = titleTokens.filter( ( titleToken ) =>\n\t\t\t\tsearchTokens.some(\n\t\t\t\t\t( searchToken ) => titleToken === searchToken\n\t\t\t\t)\n\t\t\t);\n\t\t\tconst subMatchingTokens = titleTokens.filter( ( titleToken ) =>\n\t\t\t\tsearchTokens.some(\n\t\t\t\t\t( searchToken ) =>\n\t\t\t\t\t\ttitleToken !== searchToken &&\n\t\t\t\t\t\ttitleToken.includes( searchToken )\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// The score is a combination of exact matches and sub-matches.\n\t\t\t// More weight is given to exact matches, as they are more relevant (e.g. \"cat\" vs \"caterpillar\").\n\t\t\t// Diving by the total number of tokens in the title normalizes the score and skews\n\t\t\t// the results towards shorter titles.\n\t\t\tconst exactMatchScore =\n\t\t\t\t( exactMatchingTokens.length / titleTokens.length ) * 10;\n\n\t\t\tconst subMatchScore = subMatchingTokens.length / titleTokens.length;\n\n\t\t\tscores[ result.id ] = exactMatchScore + subMatchScore;\n\t\t} else {\n\t\t\tscores[ result.id ] = 0;\n\t\t}\n\t}\n\n\treturn results.sort( ( a, b ) => scores[ b.id ] - scores[ a.id ] );\n}\n\n/**\n * Turns text into an array of tokens, with whitespace and punctuation removed.\n *\n * For example, `\"I'm having a ball.\"` becomes `[ \"im\", \"having\", \"a\", \"ball\" ]`.\n *\n * @param text\n */\nexport function tokenize( text: string ): string[] {\n\t// \\p{L} matches any kind of letter from any language.\n\t// \\p{N} matches any kind of numeric character.\n\treturn text.toLowerCase().match( /[\\p{L}\\p{N}]+/gu ) || [];\n}\n", "/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport {\n\taddQueryArgs,\n\tprependHTTP,\n\tisURL,\n\tgetProtocol,\n\tisValidProtocol,\n} from '@wordpress/url';\n\n/**\n * A simple in-memory cache for requests.\n * This avoids repeat HTTP requests which may be beneficial\n * for those wishing to preserve low-bandwidth.\n */\nconst CACHE = new Map();\n\n/**\n * @typedef WPRemoteUrlData\n *\n * @property {string} title contents of the remote URL's `<title>` tag.\n */\n\n/**\n * Fetches data about a remote URL.\n * eg: <title> tag, favicon...etc.\n *\n * @async\n * @param {string}  url     the URL to request details from.\n * @param {?Object} options any options to pass to the underlying fetch.\n * @example\n * ```js\n * import { __experimentalFetchUrlData as fetchUrlData } from '@wordpress/core-data';\n *\n * //...\n *\n * export function initialize( id, settings ) {\n *\n * settings.__experimentalFetchUrlData = (\n * url\n * ) => fetchUrlData( url );\n * ```\n * @return {Promise< WPRemoteUrlData[] >} Remote URL data.\n */\nconst fetchUrlData = async ( url, options = {} ) => {\n\tconst endpoint = '/wp-block-editor/v1/url-details';\n\n\tconst args = {\n\t\turl: prependHTTP( url ),\n\t};\n\n\tif ( ! isURL( url ) ) {\n\t\treturn Promise.reject( `${ url } is not a valid URL.` );\n\t}\n\n\t// Test for \"http\" based URL as it is possible for valid\n\t// yet unusable URLs such as `tel:123456` to be passed.\n\tconst protocol = getProtocol( url );\n\n\tif (\n\t\t! protocol ||\n\t\t! isValidProtocol( protocol ) ||\n\t\t! protocol.startsWith( 'http' ) ||\n\t\t! /^https?:\\/\\/[^\\/\\s]/i.test( url )\n\t) {\n\t\treturn Promise.reject(\n\t\t\t`${ url } does not have a valid protocol. URLs must be \"http\" based`\n\t\t);\n\t}\n\n\tif ( CACHE.has( url ) ) {\n\t\treturn CACHE.get( url );\n\t}\n\n\treturn apiFetch( {\n\t\tpath: addQueryArgs( endpoint, args ),\n\t\t...options,\n\t} ).then( ( res ) => {\n\t\tCACHE.set( url, res );\n\t\treturn res;\n\t} );\n};\n\nexport default fetchUrlData;\n", "export function deepCopyLocksTreePath( tree, path ) {\n\tconst newTree = { ...tree };\n\tlet currentNode = newTree;\n\tfor ( const branchName of path ) {\n\t\tcurrentNode.children = {\n\t\t\t...currentNode.children,\n\t\t\t[ branchName ]: {\n\t\t\t\tlocks: [],\n\t\t\t\tchildren: {},\n\t\t\t\t...currentNode.children[ branchName ],\n\t\t\t},\n\t\t};\n\t\tcurrentNode = currentNode.children[ branchName ];\n\t}\n\treturn newTree;\n}\n\nexport function getNode( tree, path ) {\n\tlet currentNode = tree;\n\tfor ( const branchName of path ) {\n\t\tconst nextNode = currentNode.children[ branchName ];\n\t\tif ( ! nextNode ) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrentNode = nextNode;\n\t}\n\treturn currentNode;\n}\n\nexport function* iteratePath( tree, path ) {\n\tlet currentNode = tree;\n\tyield currentNode;\n\tfor ( const branchName of path ) {\n\t\tconst nextNode = currentNode.children[ branchName ];\n\t\tif ( ! nextNode ) {\n\t\t\tbreak;\n\t\t}\n\t\tyield nextNode;\n\t\tcurrentNode = nextNode;\n\t}\n}\n\nexport function* iterateDescendants( node ) {\n\tconst stack = Object.values( node.children );\n\twhile ( stack.length ) {\n\t\tconst childNode = stack.pop();\n\t\tyield childNode;\n\t\tstack.push( ...Object.values( childNode.children ) );\n\t}\n}\n\nexport function hasConflictingLock( { exclusive }, locks ) {\n\tif ( exclusive && locks.length ) {\n\t\treturn true;\n\t}\n\n\tif ( ! exclusive && locks.filter( ( lock ) => lock.exclusive ).length ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n", "/**\n * Internal dependencies\n */\nimport { getNode, deepCopyLocksTreePath } from './utils';\n\nconst DEFAULT_STATE = {\n\trequests: [],\n\ttree: {\n\t\tlocks: [],\n\t\tchildren: {},\n\t},\n};\n\n/**\n * Reducer returning locks.\n *\n * @param {Object} state  Current state.\n * @param {Object} action Dispatched action.\n *\n * @return {Object} Updated state.\n */\nexport default function locks( state = DEFAULT_STATE, action ) {\n\tswitch ( action.type ) {\n\t\tcase 'ENQUEUE_LOCK_REQUEST': {\n\t\t\tconst { request } = action;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\trequests: [ request, ...state.requests ],\n\t\t\t};\n\t\t}\n\t\tcase 'GRANT_LOCK_REQUEST': {\n\t\t\tconst { lock, request } = action;\n\t\t\tconst { store, path } = request;\n\t\t\tconst storePath = [ store, ...path ];\n\n\t\t\tconst newTree = deepCopyLocksTreePath( state.tree, storePath );\n\t\t\tconst node = getNode( newTree, storePath );\n\t\t\tnode.locks = [ ...node.locks, lock ];\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\trequests: state.requests.filter( ( r ) => r !== request ),\n\t\t\t\ttree: newTree,\n\t\t\t};\n\t\t}\n\t\tcase 'RELEASE_LOCK': {\n\t\t\tconst { lock } = action;\n\t\t\tconst storePath = [ lock.store, ...lock.path ];\n\n\t\t\tconst newTree = deepCopyLocksTreePath( state.tree, storePath );\n\t\t\tconst node = getNode( newTree, storePath );\n\t\t\tnode.locks = node.locks.filter( ( l ) => l !== lock );\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttree: newTree,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn state;\n}\n", "/**\n * Internal dependencies\n */\nimport {\n\titerateDescendants,\n\titeratePath,\n\thasConflictingLock,\n\tgetNode,\n} from './utils';\n\nexport function getPendingLockRequests( state ) {\n\treturn state.requests;\n}\n\nexport function isLockAvailable( state, store, path, { exclusive } ) {\n\tconst storePath = [ store, ...path ];\n\tconst locks = state.tree;\n\n\t// Validate all parents and the node itself\n\tfor ( const node of iteratePath( locks, storePath ) ) {\n\t\tif ( hasConflictingLock( { exclusive }, node.locks ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// iteratePath terminates early if path is unreachable, let's\n\t// re-fetch the node and check it exists in the tree.\n\tconst node = getNode( locks, storePath );\n\tif ( ! node ) {\n\t\treturn true;\n\t}\n\n\t// Validate all nested nodes\n\tfor ( const descendant of iterateDescendants( node ) ) {\n\t\tif ( hasConflictingLock( { exclusive }, descendant.locks ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n", "/**\n * Internal dependencies\n */\nimport reducer from './reducer';\nimport { isLockAvailable, getPendingLockRequests } from './selectors';\n\nexport default function createLocks() {\n\tlet state = reducer( undefined, { type: '@@INIT' } );\n\n\tfunction processPendingLockRequests() {\n\t\tfor ( const request of getPendingLockRequests( state ) ) {\n\t\t\tconst { store, path, exclusive, notifyAcquired } = request;\n\t\t\tif ( isLockAvailable( state, store, path, { exclusive } ) ) {\n\t\t\t\tconst lock = { store, path, exclusive };\n\t\t\t\tstate = reducer( state, {\n\t\t\t\t\ttype: 'GRANT_LOCK_REQUEST',\n\t\t\t\t\tlock,\n\t\t\t\t\trequest,\n\t\t\t\t} );\n\t\t\t\tnotifyAcquired( lock );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction acquire( store, path, exclusive ) {\n\t\treturn new Promise( ( resolve ) => {\n\t\t\tstate = reducer( state, {\n\t\t\t\ttype: 'ENQUEUE_LOCK_REQUEST',\n\t\t\t\trequest: { store, path, exclusive, notifyAcquired: resolve },\n\t\t\t} );\n\t\t\tprocessPendingLockRequests();\n\t\t} );\n\t}\n\tfunction release( lock ) {\n\t\tstate = reducer( state, {\n\t\t\ttype: 'RELEASE_LOCK',\n\t\t\tlock,\n\t\t} );\n\t\tprocessPendingLockRequests();\n\t}\n\n\treturn { acquire, release };\n}\n", "/**\n * Internal dependencies\n */\nimport createLocks from './engine';\n\nexport default function createLocksActions() {\n\tconst locks = createLocks();\n\n\tfunction __unstableAcquireStoreLock( store, path, { exclusive } ) {\n\t\treturn () => locks.acquire( store, path, exclusive );\n\t}\n\n\tfunction __unstableReleaseStoreLock( lock ) {\n\t\treturn () => locks.release( lock );\n\t}\n\n\treturn { __unstableAcquireStoreLock, __unstableReleaseStoreLock };\n}\n", "/**\n * Internal dependencies\n */\nimport type { GetRecordsHttpQuery, State } from './selectors';\nimport type * as ET from './entity-types';\n\nexport type WPEntityTypes< C extends ET.Context = 'edit' > = {\n\tComment: ET.Comment< C >;\n\tGlobalStyles: ET.GlobalStylesRevision< C >;\n\tMedia: ET.Attachment< C >;\n\tMenu: ET.NavMenu< C >;\n\tMenuItem: ET.NavMenuItem< C >;\n\tMenuLocation: ET.MenuLocation< C >;\n\tPlugin: ET.Plugin< C >;\n\tPostType: ET.Type< C >;\n\tRevision: ET.PostRevision< C >;\n\tSidebar: ET.Sidebar< C >;\n\tSite: ET.Settings< C >;\n\tStatus: ET.PostStatusObject< C >;\n\tTaxonomy: ET.Taxonomy< C >;\n\tTerm: ET.Term< C >;\n\tTheme: ET.Theme< C >;\n\tUnstableBase: ET.UnstableBase< C >;\n\tUser: ET.User< C >;\n\tWidget: ET.Widget< C >;\n\tWidgetType: ET.WidgetType< C >;\n};\n\n/**\n * A simple utility that pluralizes a string.\n * Converts:\n * - \"post\" to \"posts\"\n * - \"taxonomy\" to \"taxonomies\"\n * - \"media\" to \"mediaItems\"\n * - \"status\" to \"statuses\"\n *\n * It does not pluralize \"GlobalStyles\" due to lack of clarity about it at time of writing.\n */\ntype PluralizeEntity< T extends string > = T extends 'GlobalStyles'\n\t? never\n\t: T extends 'Media'\n\t? 'MediaItems'\n\t: T extends 'Status'\n\t? 'Statuses'\n\t: T extends `${ infer U }y`\n\t? `${ U }ies`\n\t: `${ T }s`;\n\n/**\n * A simple utility that singularizes a string.\n *\n * Converts:\n * - \"posts\" to \"post\"\n * - \"taxonomies\" to \"taxonomy\"\n * - \"mediaItems\" to \"media\"\n * - \"statuses\" to \"status\"\n */\ntype SingularizeEntity< T extends string > = T extends 'MediaItems'\n\t? 'Media'\n\t: T extends 'Statuses'\n\t? 'Status'\n\t: T extends `${ infer U }ies`\n\t? `${ U }y`\n\t: T extends `${ infer U }s`\n\t? U\n\t: T;\n\nexport type SingularGetters = {\n\t[ Key in `get${ keyof WPEntityTypes }` ]: (\n\t\tstate: State,\n\t\tid: number | string,\n\t\tquery?: GetRecordsHttpQuery\n\t) => WPEntityTypes[ Key extends `get${ infer E }` ? E : never ] | undefined;\n};\n\nexport type PluralGetters = {\n\t[ Key in `get${ PluralizeEntity< keyof WPEntityTypes > }` ]: (\n\t\tstate: State,\n\t\tquery?: GetRecordsHttpQuery\n\t) => Array<\n\t\tWPEntityTypes[ Key extends `get${ infer E }`\n\t\t\t? SingularizeEntity< E >\n\t\t\t: never ]\n\t> | null;\n};\n\ntype ActionOptions = {\n\tthrowOnError?: boolean;\n};\n\ntype DeleteRecordsHttpQuery = Record< string, any >;\n\nexport type SaveActions = {\n\t[ Key in `save${ keyof WPEntityTypes }` ]: (\n\t\tdata: Partial<\n\t\t\tWPEntityTypes[ Key extends `save${ infer E }` ? E : never ]\n\t\t>,\n\t\toptions?: ActionOptions\n\t) => Promise< void >;\n};\n\nexport type DeleteActions = {\n\t[ Key in `delete${ keyof WPEntityTypes }` ]: (\n\t\tid: number | string,\n\t\tquery?: DeleteRecordsHttpQuery,\n\t\toptions?: ActionOptions\n\t) => Promise< void >;\n};\n\nexport let dynamicActions: SaveActions & DeleteActions;\n\nexport let dynamicSelectors: SingularGetters & PluralGetters;\n", "/**\n * WordPress dependencies\n */\nimport { useContext, useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { EntityContext } from './entity-context';\n\n/**\n * Context provider component for providing\n * an entity for a specific entity.\n *\n * @param {Object} props          The component's props.\n * @param {string} props.kind     The entity kind.\n * @param {string} props.type     The entity name.\n * @param {number} props.id       The entity ID.\n * @param {*}      props.children The children to wrap.\n *\n * @return {Object} The provided children, wrapped with\n *                   the entity's context provider.\n */\nexport default function EntityProvider( { kind, type: name, id, children } ) {\n\tconst parent = useContext( EntityContext );\n\tconst childContext = useMemo(\n\t\t() => ( {\n\t\t\t...parent,\n\t\t\t[ kind ]: {\n\t\t\t\t...parent?.[ kind ],\n\t\t\t\t[ name ]: id,\n\t\t\t},\n\t\t} ),\n\t\t[ parent, kind, name, id ]\n\t);\n\treturn (\n\t\t<EntityContext.Provider value={ childContext }>\n\t\t\t{ children }\n\t\t</EntityContext.Provider>\n\t);\n}\n", "/**\n * WordPress dependencies\n */\nimport { createContext } from '@wordpress/element';\n\nexport const EntityContext = createContext( {} );\nEntityContext.displayName = 'EntityContext';\n", "/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\nimport { useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport useQuerySelect from './use-query-select';\nimport { store as coreStore } from '../';\nimport type { Status } from './constants';\n\nexport interface EntityRecordResolution< RecordType > {\n\t/** The requested entity record */\n\trecord: RecordType | null;\n\n\t/** The edited entity record */\n\teditedRecord: Partial< RecordType >;\n\n\t/** The edits to the edited entity record */\n\tedits: Partial< RecordType >;\n\n\t/** Apply local (in-browser) edits to the edited entity record */\n\tedit: ( diff: Partial< RecordType > ) => void;\n\n\t/** Persist the edits to the server */\n\tsave: () => Promise< void >;\n\n\t/**\n\t * Is the record still being resolved?\n\t */\n\tisResolving: boolean;\n\n\t/**\n\t * Does the record have any local edits?\n\t */\n\thasEdits: boolean;\n\n\t/**\n\t * Is the record resolved by now?\n\t */\n\thasResolved: boolean;\n\n\t/** Resolution status */\n\tstatus: Status;\n}\n\nexport interface Options {\n\t/**\n\t * Whether to run the query or short-circuit and return null.\n\t *\n\t * @default true\n\t */\n\tenabled: boolean;\n}\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Resolves the specified entity record.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param    kind     Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.\n * @param    name     Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.\n * @param    recordId ID of the requested entity record.\n * @param    options  Optional hook options.\n * @example\n * ```js\n * import { useEntityRecord } from '@wordpress/core-data';\n *\n * function PageTitleDisplay( { id } ) {\n *   const { record, isResolving } = useEntityRecord( 'postType', 'page', id );\n *\n *   if ( isResolving ) {\n *     return 'Loading...';\n *   }\n *\n *   return record.title;\n * }\n *\n * // Rendered in the application:\n * // <PageTitleDisplay id={ 1 } />\n * ```\n *\n * In the above example, when `PageTitleDisplay` is rendered into an\n * application, the page and the resolution details will be retrieved from\n * the store state using `getEntityRecord()`, or resolved if missing.\n *\n * @example\n * ```js\n * import { useCallback } from 'react';\n * import { useDispatch } from '@wordpress/data';\n * import { __ } from '@wordpress/i18n';\n * import { TextControl } from '@wordpress/components';\n * import { store as noticeStore } from '@wordpress/notices';\n * import { useEntityRecord } from '@wordpress/core-data';\n *\n * function PageRenameForm( { id } ) {\n * \tconst page = useEntityRecord( 'postType', 'page', id );\n * \tconst { createSuccessNotice, createErrorNotice } =\n * \t\tuseDispatch( noticeStore );\n *\n * \tconst setTitle = useCallback( ( title ) => {\n * \t\tpage.edit( { title } );\n * \t}, [ page.edit ] );\n *\n * \tif ( page.isResolving ) {\n * \t\treturn 'Loading...';\n * \t}\n *\n * \tasync function onRename( event ) {\n * \t\tevent.preventDefault();\n * \t\ttry {\n * \t\t\tawait page.save();\n * \t\t\tcreateSuccessNotice( __( 'Page renamed.' ), {\n * \t\t\t\ttype: 'snackbar',\n * \t\t\t} );\n * \t\t} catch ( error ) {\n * \t\t\tcreateErrorNotice( error.message, { type: 'snackbar' } );\n * \t\t}\n * \t}\n *\n * \treturn (\n * \t\t<form onSubmit={ onRename }>\n * \t\t\t<TextControl\n *\t\t\t\t__next40pxDefaultSize\n * \t\t\t\tlabel={ __( 'Name' ) }\n * \t\t\t\tvalue={ page.editedRecord.title }\n * \t\t\t\tonChange={ setTitle }\n * \t\t\t/>\n * \t\t\t<button type=\"submit\">{ __( 'Save' ) }</button>\n * \t\t</form>\n * \t);\n * }\n *\n * // Rendered in the application:\n * // <PageRenameForm id={ 1 } />\n * ```\n *\n * In the above example, updating and saving the page title is handled\n * via the `edit()` and `save()` mutation helpers provided by\n * `useEntityRecord()`;\n *\n * @return Entity record data.\n * @template RecordType\n */\nexport default function useEntityRecord< RecordType >(\n\tkind: string,\n\tname: string,\n\trecordId: string | number,\n\toptions: Options = { enabled: true }\n): EntityRecordResolution< RecordType > {\n\tconst { editEntityRecord, saveEditedEntityRecord } =\n\t\tuseDispatch( coreStore );\n\n\tconst mutations = useMemo(\n\t\t() => ( {\n\t\t\tedit: ( record, editOptions: any = {} ) =>\n\t\t\t\teditEntityRecord( kind, name, recordId, record, editOptions ),\n\t\t\tsave: ( saveOptions: any = {} ) =>\n\t\t\t\tsaveEditedEntityRecord( kind, name, recordId, {\n\t\t\t\t\tthrowOnError: true,\n\t\t\t\t\t...saveOptions,\n\t\t\t\t} ),\n\t\t} ),\n\t\t[ editEntityRecord, kind, name, recordId, saveEditedEntityRecord ]\n\t);\n\n\tconst { editedRecord, hasEdits, edits } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\teditedRecord: EMPTY_OBJECT,\n\t\t\t\t\thasEdits: false,\n\t\t\t\t\tedits: EMPTY_OBJECT,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\teditedRecord: select( coreStore ).getEditedEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\thasEdits: select( coreStore ).hasEditsForEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\tedits: select( coreStore ).getEntityRecordNonTransientEdits(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ kind, name, recordId, options.enabled ]\n\t);\n\n\tconst { data: record, ...querySelectRest } = useQuerySelect(\n\t\t( query ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\tdata: null,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn query( coreStore ).getEntityRecord( kind, name, recordId );\n\t\t},\n\t\t[ kind, name, recordId, options.enabled ]\n\t);\n\n\treturn {\n\t\trecord,\n\t\teditedRecord,\n\t\thasEdits,\n\t\tedits,\n\t\t...querySelectRest,\n\t\t...mutations,\n\t};\n}\n\nexport function __experimentalUseEntityRecord(\n\tkind: string,\n\tname: string,\n\trecordId: any,\n\toptions: any\n) {\n\tdeprecated( `wp.data.__experimentalUseEntityRecord`, {\n\t\talternative: 'wp.data.useEntityRecord',\n\t\tsince: '6.1',\n\t} );\n\treturn useEntityRecord( kind, name, recordId, options );\n}\n", "/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport memoize from './memoize';\nimport { Status } from './constants';\n\nexport const META_SELECTORS = [\n\t'getIsResolving',\n\t'hasStartedResolution',\n\t'hasFinishedResolution',\n\t'isResolving',\n\t'getCachedResolvers',\n];\n\ninterface QuerySelectResponse< Data > {\n\t/** the requested selector return value */\n\tdata: Data;\n\n\t/** is the record still being resolved? Via the `isResolving` meta-selector */\n\tisResolving: boolean;\n\n\t/** was the resolution started? Via the `hasStartedResolution` meta-selector */\n\thasStarted: boolean;\n\n\t/** has the resolution finished? Via the `hasFinishedResolution` meta-selector. */\n\thasResolved: boolean;\n}\n\n/**\n * Like useSelect, but the selectors return objects containing\n * both the original data AND the resolution info.\n *\n * @since 6.1.0 Introduced in WordPress core.\n * @private\n *\n * @param {Function} mapQuerySelect see useSelect\n * @param {Array}    deps           see useSelect\n *\n * @example\n * ```js\n * import { useQuerySelect } from '@wordpress/data';\n * import { store as coreDataStore } from '@wordpress/core-data';\n *\n * function PageTitleDisplay( { id } ) {\n *   const { data: page, isResolving } = useQuerySelect( ( query ) => {\n *     return query( coreDataStore ).getEntityRecord( 'postType', 'page', id )\n *   }, [ id ] );\n *\n *   if ( isResolving ) {\n *     return 'Loading...';\n *   }\n *\n *   return page.title;\n * }\n *\n * // Rendered in the application:\n * // <PageTitleDisplay id={ 10 } />\n * ```\n *\n * In the above example, when `PageTitleDisplay` is rendered into an\n * application, the page and the resolution details will be retrieved from\n * the store state using the `mapSelect` callback on `useQuerySelect`.\n *\n * If the id prop changes then any page in the state for that id is\n * retrieved. If the id prop doesn't change and other props are passed in\n * that do change, the title will not change because the dependency is just\n * the id.\n * @see useSelect\n *\n * @return {QuerySelectResponse} Queried data.\n */\nexport default function useQuerySelect( mapQuerySelect, deps ) {\n\treturn useSelect( ( select, registry ) => {\n\t\tconst resolve = ( store ) => enrichSelectors( select( store ) );\n\t\treturn mapQuerySelect( resolve, registry );\n\t}, deps );\n}\n\ninterface EnrichedSelectors {\n\t< Selectors extends Record< string, ( ...args: any[] ) => any > >(\n\t\tselectors: Selectors\n\t): {\n\t\t[ Selector in keyof Selectors ]: (\n\t\t\t...args: Parameters< Selectors[ Selector ] >\n\t\t) => QuerySelectResponse< ReturnType< Selectors[ Selector ] > >;\n\t};\n}\n\n/**\n * Transform simple selectors into ones that return an object with the\n * original return value AND the resolution info.\n *\n * @param {Object} selectors Selectors to enrich\n * @return {EnrichedSelectors} Enriched selectors\n */\nconst enrichSelectors = memoize( ( ( selectors ) => {\n\tconst resolvers = {};\n\tfor ( const selectorName in selectors ) {\n\t\tif ( META_SELECTORS.includes( selectorName ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tObject.defineProperty( resolvers, selectorName, {\n\t\t\tget:\n\t\t\t\t() =>\n\t\t\t\t( ...args: unknown[] ) => {\n\t\t\t\t\tconst data = selectors[ selectorName ]( ...args );\n\t\t\t\t\tconst resolutionStatus = selectors.getResolutionState(\n\t\t\t\t\t\tselectorName,\n\t\t\t\t\t\targs\n\t\t\t\t\t)?.status;\n\n\t\t\t\t\tlet status;\n\t\t\t\t\tswitch ( resolutionStatus ) {\n\t\t\t\t\t\tcase 'resolving':\n\t\t\t\t\t\t\tstatus = Status.Resolving;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'finished':\n\t\t\t\t\t\t\tstatus = Status.Success;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tstatus = Status.Error;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase undefined:\n\t\t\t\t\t\t\tstatus = Status.Idle;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\tisResolving: status === Status.Resolving,\n\t\t\t\t\t\thasStarted: status !== Status.Idle,\n\t\t\t\t\t\thasResolved:\n\t\t\t\t\t\t\tstatus === Status.Success ||\n\t\t\t\t\t\t\tstatus === Status.Error,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t} );\n\t}\n\treturn resolvers;\n} ) as EnrichedSelectors );\n", "/**\n * Memize options object.\n *\n * @typedef MemizeOptions\n *\n * @property {number} [maxSize] Maximum size of the cache.\n */\n\n/**\n * Internal cache entry.\n *\n * @typedef MemizeCacheNode\n *\n * @property {?MemizeCacheNode|undefined} [prev] Previous node.\n * @property {?MemizeCacheNode|undefined} [next] Next node.\n * @property {Array<*>}                   args   Function arguments for cache\n *                                               entry.\n * @property {*}                          val    Function result.\n */\n\n/**\n * Properties of the enhanced function for controlling cache.\n *\n * @typedef MemizeMemoizedFunction\n *\n * @property {()=>void} clear Clear the cache.\n */\n\n/**\n * Accepts a function to be memoized, and returns a new memoized function, with\n * optional options.\n *\n * @template {(...args: any[]) => any} F\n *\n * @param {F}             fn        Function to memoize.\n * @param {MemizeOptions} [options] Options object.\n *\n * @return {((...args: Parameters<F>) => ReturnType<F>) & MemizeMemoizedFunction} Memoized function.\n */\nfunction memize(fn, options) {\n\tvar size = 0;\n\n\t/** @type {?MemizeCacheNode|undefined} */\n\tvar head;\n\n\t/** @type {?MemizeCacheNode|undefined} */\n\tvar tail;\n\n\toptions = options || {};\n\n\tfunction memoized(/* ...args */) {\n\t\tvar node = head,\n\t\t\tlen = arguments.length,\n\t\t\targs,\n\t\t\ti;\n\n\t\tsearchCache: while (node) {\n\t\t\t// Perform a shallow equality test to confirm that whether the node\n\t\t\t// under test is a candidate for the arguments passed. Two arrays\n\t\t\t// are shallowly equal if their length matches and each entry is\n\t\t\t// strictly equal between the two sets. Avoid abstracting to a\n\t\t\t// function which could incur an arguments leaking deoptimization.\n\n\t\t\t// Check whether node arguments match arguments length\n\t\t\tif (node.args.length !== arguments.length) {\n\t\t\t\tnode = node.next;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check whether node arguments match arguments values\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tif (node.args[i] !== arguments[i]) {\n\t\t\t\t\tnode = node.next;\n\t\t\t\t\tcontinue searchCache;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// At this point we can assume we've found a match\n\n\t\t\t// Surface matched node to head if not already\n\t\t\tif (node !== head) {\n\t\t\t\t// As tail, shift to previous. Must only shift if not also\n\t\t\t\t// head, since if both head and tail, there is no previous.\n\t\t\t\tif (node === tail) {\n\t\t\t\t\ttail = node.prev;\n\t\t\t\t}\n\n\t\t\t\t// Adjust siblings to point to each other. If node was tail,\n\t\t\t\t// this also handles new tail's empty `next` assignment.\n\t\t\t\t/** @type {MemizeCacheNode} */ (node.prev).next = node.next;\n\t\t\t\tif (node.next) {\n\t\t\t\t\tnode.next.prev = node.prev;\n\t\t\t\t}\n\n\t\t\t\tnode.next = head;\n\t\t\t\tnode.prev = null;\n\t\t\t\t/** @type {MemizeCacheNode} */ (head).prev = node;\n\t\t\t\thead = node;\n\t\t\t}\n\n\t\t\t// Return immediately\n\t\t\treturn node.val;\n\t\t}\n\n\t\t// No cached value found. Continue to insertion phase:\n\n\t\t// Create a copy of arguments (avoid leaking deoptimization)\n\t\targs = new Array(len);\n\t\tfor (i = 0; i < len; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\n\t\tnode = {\n\t\t\targs: args,\n\n\t\t\t// Generate the result from original function\n\t\t\tval: fn.apply(null, args),\n\t\t};\n\n\t\t// Don't need to check whether node is already head, since it would\n\t\t// have been returned above already if it was\n\n\t\t// Shift existing head down list\n\t\tif (head) {\n\t\t\thead.prev = node;\n\t\t\tnode.next = head;\n\t\t} else {\n\t\t\t// If no head, follows that there's no tail (at initial or reset)\n\t\t\ttail = node;\n\t\t}\n\n\t\t// Trim tail if we're reached max size and are pending cache insertion\n\t\tif (size === /** @type {MemizeOptions} */ (options).maxSize) {\n\t\t\ttail = /** @type {MemizeCacheNode} */ (tail).prev;\n\t\t\t/** @type {MemizeCacheNode} */ (tail).next = null;\n\t\t} else {\n\t\t\tsize++;\n\t\t}\n\n\t\thead = node;\n\n\t\treturn node.val;\n\t}\n\n\tmemoized.clear = function () {\n\t\thead = null;\n\t\ttail = null;\n\t\tsize = 0;\n\t};\n\n\t// Ignore reason: There's not a clear solution to create an intersection of\n\t// the function with additional properties, where the goal is to retain the\n\t// function signature of the incoming argument and add control properties\n\t// on the return value.\n\n\t// @ts-ignore\n\treturn memoized;\n}\n\nexport { memize as default };\n", "/**\n * External dependencies\n */\nimport memoize from 'memize';\n\n// re-export due to restrictive esModuleInterop setting\nexport default memoize;\n", "export const enum Status {\n\tIdle = 'IDLE',\n\tResolving = 'RESOLVING',\n\tError = 'ERROR',\n\tSuccess = 'SUCCESS',\n}\n", "/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport deprecated from '@wordpress/deprecated';\nimport { useSelect } from '@wordpress/data';\nimport { useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport useQuerySelect from './use-query-select';\nimport { store as coreStore } from '../';\nimport type { Options } from './use-entity-record';\nimport type { Status } from './constants';\nimport { unlock } from '../lock-unlock';\nimport { getNormalizedCommaSeparable } from '../utils';\n\ninterface EntityRecordsResolution< RecordType > {\n\t/** The requested entity records */\n\trecords: RecordType[] | null;\n\n\t/**\n\t * Is the record still being resolved?\n\t */\n\tisResolving: boolean;\n\n\t/**\n\t * Is the record resolved by now?\n\t */\n\thasResolved: boolean;\n\n\t/** Resolution status */\n\tstatus: Status;\n\n\t/**\n\t * The total number of available items (if not paginated).\n\t */\n\ttotalItems: number | null;\n\n\t/**\n\t * The total number of pages.\n\t */\n\ttotalPages: number | null;\n}\n\nexport type WithPermissions< RecordType > = RecordType & {\n\tpermissions: { delete: boolean; update: boolean };\n};\n\ninterface EntityRecordsWithPermissionsResolution< RecordType >\n\textends Omit< EntityRecordsResolution< RecordType >, 'records' > {\n\t/** The requested entity records with permissions */\n\trecords: WithPermissions< RecordType >[] | null;\n}\n\nconst EMPTY_ARRAY = [];\n\n/**\n * Resolves the specified entity records.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param    kind      Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.\n * @param    name      Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.\n * @param    queryArgs Optional HTTP query description for how to fetch the data, passed to the requested API endpoint.\n * @param    options   Optional hook options.\n * @example\n * ```js\n * import { useEntityRecords } from '@wordpress/core-data';\n *\n * function PageTitlesList() {\n *   const { records, isResolving } = useEntityRecords( 'postType', 'page' );\n *\n *   if ( isResolving ) {\n *     return 'Loading...';\n *   }\n *\n *   return (\n *     <ul>\n *       {records.map(( page ) => (\n *         <li>{ page.title }</li>\n *       ))}\n *     </ul>\n *   );\n * }\n *\n * // Rendered in the application:\n * // <PageTitlesList />\n * ```\n *\n * In the above example, when `PageTitlesList` is rendered into an\n * application, the list of records and the resolution details will be retrieved from\n * the store state using `getEntityRecords()`, or resolved if missing.\n *\n * @return Entity records data.\n * @template RecordType\n */\nexport default function useEntityRecords< RecordType >(\n\tkind: string,\n\tname: string,\n\tqueryArgs: Record< string, unknown > = {},\n\toptions: Options = { enabled: true }\n): EntityRecordsResolution< RecordType > {\n\t// Serialize queryArgs to a string that can be safely used as a React dep.\n\t// We can't just pass queryArgs as one of the deps, because if it is passed\n\t// as an object literal, then it will be a different object on each call even\n\t// if the values remain the same.\n\tconst queryAsString = addQueryArgs( '', queryArgs );\n\n\tconst { data: records, ...rest } = useQuerySelect(\n\t\t( query ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\t// Avoiding returning a new reference on every execution.\n\t\t\t\t\tdata: EMPTY_ARRAY,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn query( coreStore ).getEntityRecords( kind, name, queryArgs );\n\t\t},\n\t\t[ kind, name, queryAsString, options.enabled ]\n\t);\n\n\tconst { totalItems, totalPages } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\ttotalItems: null,\n\t\t\t\t\ttotalPages: null,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttotalItems: select( coreStore ).getEntityRecordsTotalItems(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t),\n\t\t\t\ttotalPages: select( coreStore ).getEntityRecordsTotalPages(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t\t[ kind, name, queryAsString, options.enabled ]\n\t);\n\n\treturn {\n\t\trecords,\n\t\ttotalItems,\n\t\ttotalPages,\n\t\t...rest,\n\t};\n}\n\nexport function __experimentalUseEntityRecords(\n\tkind: string,\n\tname: string,\n\tqueryArgs: any,\n\toptions: any\n) {\n\tdeprecated( `wp.data.__experimentalUseEntityRecords`, {\n\t\talternative: 'wp.data.useEntityRecords',\n\t\tsince: '6.1',\n\t} );\n\treturn useEntityRecords( kind, name, queryArgs, options );\n}\n\nexport function useEntityRecordsWithPermissions< RecordType >(\n\tkind: string,\n\tname: string,\n\tqueryArgs: Record< string, unknown > = {},\n\toptions: Options = { enabled: true }\n): EntityRecordsWithPermissionsResolution< RecordType > {\n\tconst entityConfig = useSelect(\n\t\t( select ) => select( coreStore ).getEntityConfig( kind, name ),\n\t\t[ kind, name ]\n\t);\n\tconst { records: data, ...ret } = useEntityRecords(\n\t\tkind,\n\t\tname,\n\t\t{\n\t\t\t...queryArgs,\n\t\t\t// If _fields is provided, we need to include _links in the request for permission caching to work.\n\t\t\t...( queryArgs._fields\n\t\t\t\t? {\n\t\t\t\t\t\t_fields: [\n\t\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t\t...( getNormalizedCommaSeparable(\n\t\t\t\t\t\t\t\t\tqueryArgs._fields\n\t\t\t\t\t\t\t\t) || [] ),\n\t\t\t\t\t\t\t\t'_links',\n\t\t\t\t\t\t\t] ),\n\t\t\t\t\t\t].join(),\n\t\t\t\t  }\n\t\t\t\t: {} ),\n\t\t},\n\t\toptions\n\t);\n\tconst ids = useMemo(\n\t\t() =>\n\t\t\tdata?.map(\n\t\t\t\t// @ts-ignore\n\t\t\t\t( record: RecordType ) => record[ entityConfig?.key ?? 'id' ]\n\t\t\t) ?? [],\n\t\t[ data, entityConfig?.key ]\n\t);\n\n\tconst permissions = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEntityRecordsPermissions } = unlock(\n\t\t\t\tselect( coreStore )\n\t\t\t);\n\t\t\treturn getEntityRecordsPermissions( kind, name, ids );\n\t\t},\n\t\t[ ids, kind, name ]\n\t);\n\n\tconst dataWithPermissions = useMemo(\n\t\t() =>\n\t\t\tdata?.map( ( record, index ) => ( {\n\t\t\t\t// @ts-ignore\n\t\t\t\t...record,\n\t\t\t\tpermissions: permissions[ index ],\n\t\t\t} ) ) ?? [],\n\t\t[ data, permissions ]\n\t);\n\n\treturn { records: dataWithPermissions, ...ret };\n}\n", "/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\nimport warning from '@wordpress/warning';\n\n/**\n * Internal dependencies\n */\nimport { store as coreStore } from '../';\nimport { Status } from './constants';\nimport useQuerySelect from './use-query-select';\n\ninterface GlobalResourcePermissionsResolution {\n\t/** Can the current user create new resources of this type? */\n\tcanCreate: boolean;\n}\ninterface SpecificResourcePermissionsResolution {\n\t/** Can the current user update resources of this type? */\n\tcanUpdate: boolean;\n\t/** Can the current user delete resources of this type? */\n\tcanDelete: boolean;\n}\ninterface ResolutionDetails {\n\t/** Resolution status */\n\tstatus: Status;\n\t/**\n\t * Is the data still being resolved?\n\t */\n\tisResolving: boolean;\n}\n\n/**\n * Is the data resolved by now?\n */\ntype HasResolved = boolean;\n\ntype ResourcePermissionsResolution< IdType > = [\n\tHasResolved,\n\tResolutionDetails &\n\t\tGlobalResourcePermissionsResolution &\n\t\t( IdType extends void ? SpecificResourcePermissionsResolution : {} ),\n];\n\ntype EntityResource = { kind: string; name: string; id?: string | number };\n\nfunction useResourcePermissions< IdType = void >(\n\tresource: string,\n\tid?: IdType\n): ResourcePermissionsResolution< IdType >;\n\nfunction useResourcePermissions< IdType = void >(\n\tresource: EntityResource,\n\tid?: never\n): ResourcePermissionsResolution< IdType >;\n\n/**\n * Resolves resource permissions.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param    resource Entity resource to check. Accepts entity object `{ kind: 'postType', name: 'attachment', id: 1 }`\n *                    or REST base as a string - `media`.\n * @param    id       Optional ID of the resource to check, e.g. 10. Note: This argument is discouraged\n *                    when using an entity object as a resource to check permissions and will be ignored.\n *\n * @example\n * ```js\n * import { useResourcePermissions } from '@wordpress/core-data';\n *\n * function PagesList() {\n *   const { canCreate, isResolving } = useResourcePermissions( { kind: 'postType', name: 'page' } );\n *\n *   if ( isResolving ) {\n *     return 'Loading ...';\n *   }\n *\n *   return (\n *     <div>\n *       {canCreate ? (<button>+ Create a new page</button>) : false}\n *       // ...\n *     </div>\n *   );\n * }\n *\n * // Rendered in the application:\n * // <PagesList />\n * ```\n *\n * @example\n * ```js\n * import { useResourcePermissions } from '@wordpress/core-data';\n *\n * function Page({ pageId }) {\n *   const {\n *     canCreate,\n *     canUpdate,\n *     canDelete,\n *     isResolving\n *   } = useResourcePermissions( { kind: 'postType', name: 'page', id: pageId } );\n *\n *   if ( isResolving ) {\n *     return 'Loading ...';\n *   }\n *\n *   return (\n *     <div>\n *       {canCreate ? (<button>+ Create a new page</button>) : false}\n *       {canUpdate ? (<button>Edit page</button>) : false}\n *       {canDelete ? (<button>Delete page</button>) : false}\n *       // ...\n *     </div>\n *   );\n * }\n *\n * // Rendered in the application:\n * // <Page pageId={ 15 } />\n * ```\n *\n * In the above example, when `PagesList` is rendered into an\n * application, the appropriate permissions and the resolution details will be retrieved from\n * the store state using `canUser()`, or resolved if missing.\n *\n * @return Entity records data.\n * @template IdType\n */\nfunction useResourcePermissions< IdType = void >(\n\tresource: string | EntityResource,\n\tid?: IdType\n): ResourcePermissionsResolution< IdType > {\n\t// Serialize `resource` to a string that can be safely used as a React dep.\n\t// We can't just pass `resource` as one of the deps, because if it is passed\n\t// as an object literal, then it will be a different object on each call even\n\t// if the values remain the same.\n\tconst isEntity = typeof resource === 'object';\n\tconst resourceAsString = isEntity ? JSON.stringify( resource ) : resource;\n\n\tif ( isEntity && typeof id !== 'undefined' ) {\n\t\twarning(\n\t\t\t`When 'resource' is an entity object, passing 'id' as a separate argument isn't supported.`\n\t\t);\n\t}\n\n\treturn useQuerySelect(\n\t\t( resolve ) => {\n\t\t\tconst hasId = isEntity ? !! resource.id : !! id;\n\t\t\tconst { canUser } = resolve( coreStore );\n\t\t\tconst create = canUser(\n\t\t\t\t'create',\n\t\t\t\tisEntity\n\t\t\t\t\t? { kind: resource.kind, name: resource.name }\n\t\t\t\t\t: resource\n\t\t\t);\n\n\t\t\tif ( ! hasId ) {\n\t\t\t\tconst read = canUser( 'read', resource );\n\n\t\t\t\tconst isResolving = create.isResolving || read.isResolving;\n\t\t\t\tconst hasResolved = create.hasResolved && read.hasResolved;\n\t\t\t\tlet status = Status.Idle;\n\t\t\t\tif ( isResolving ) {\n\t\t\t\t\tstatus = Status.Resolving;\n\t\t\t\t} else if ( hasResolved ) {\n\t\t\t\t\tstatus = Status.Success;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tstatus,\n\t\t\t\t\tisResolving,\n\t\t\t\t\thasResolved,\n\t\t\t\t\tcanCreate: create.hasResolved && create.data,\n\t\t\t\t\tcanRead: read.hasResolved && read.data,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst read = canUser( 'read', resource, id );\n\t\t\tconst update = canUser( 'update', resource, id );\n\t\t\tconst _delete = canUser( 'delete', resource, id );\n\t\t\tconst isResolving =\n\t\t\t\tread.isResolving ||\n\t\t\t\tcreate.isResolving ||\n\t\t\t\tupdate.isResolving ||\n\t\t\t\t_delete.isResolving;\n\t\t\tconst hasResolved =\n\t\t\t\tread.hasResolved &&\n\t\t\t\tcreate.hasResolved &&\n\t\t\t\tupdate.hasResolved &&\n\t\t\t\t_delete.hasResolved;\n\n\t\t\tlet status = Status.Idle;\n\t\t\tif ( isResolving ) {\n\t\t\t\tstatus = Status.Resolving;\n\t\t\t} else if ( hasResolved ) {\n\t\t\t\tstatus = Status.Success;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus,\n\t\t\t\tisResolving,\n\t\t\t\thasResolved,\n\t\t\t\tcanRead: hasResolved && read.data,\n\t\t\t\tcanCreate: hasResolved && create.data,\n\t\t\t\tcanUpdate: hasResolved && update.data,\n\t\t\t\tcanDelete: hasResolved && _delete.data,\n\t\t\t};\n\t\t},\n\t\t[ resourceAsString, id ]\n\t);\n}\n\nexport default useResourcePermissions;\n\nexport function __experimentalUseResourcePermissions(\n\tresource: string,\n\tid?: unknown\n) {\n\tdeprecated( `wp.data.__experimentalUseResourcePermissions`, {\n\t\talternative: 'wp.data.useResourcePermissions',\n\t\tsince: '6.1',\n\t} );\n\treturn useResourcePermissions( resource, id );\n}\n", "/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { parse, __unstableSerializeAndClean } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from '../name';\nimport useEntityId from './use-entity-id';\nimport { updateFootnotesFromMeta } from '../footnotes';\n\nconst EMPTY_ARRAY = [];\nconst parsedBlocksCache = new WeakMap();\n\n/**\n * Hook that returns block content getters and setters for\n * the nearest provided entity of the specified type.\n *\n * The return value has the shape `[ blocks, onInput, onChange ]`.\n * `onInput` is for block changes that don't create undo levels\n * or dirty the post, non-persistent changes, and `onChange` is for\n * persistent changes. They map directly to the props of a\n * `BlockEditorProvider` and are intended to be used with it,\n * or similar components or hooks.\n *\n * @param {string} kind         The entity kind.\n * @param {string} name         The entity name.\n * @param {Object} options\n * @param {string} [options.id] An entity ID to use instead of the context-provided one.\n *\n * @return {[unknown[], Function, Function]} The block array and setters.\n */\nexport default function useEntityBlockEditor( kind, name, { id: _id } = {} ) {\n\tconst providerId = useEntityId( kind, name );\n\tconst id = _id ?? providerId;\n\tconst { getEntityRecord, getEntityRecordEdits } = useSelect( STORE_NAME );\n\tconst { content, editedBlocks, meta } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! id ) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst { getEditedEntityRecord } = select( STORE_NAME );\n\t\t\tconst editedRecord = getEditedEntityRecord( kind, name, id );\n\t\t\treturn {\n\t\t\t\teditedBlocks: editedRecord.blocks,\n\t\t\t\tcontent: editedRecord.content,\n\t\t\t\tmeta: editedRecord.meta,\n\t\t\t};\n\t\t},\n\t\t[ kind, name, id ]\n\t);\n\tconst { __unstableCreateUndoLevel, editEntityRecord } =\n\t\tuseDispatch( STORE_NAME );\n\n\tconst blocks = useMemo( () => {\n\t\tif ( ! id ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( editedBlocks ) {\n\t\t\treturn editedBlocks;\n\t\t}\n\n\t\tif ( ! content || typeof content !== 'string' ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\t// If there's an edit, cache the parsed blocks by the edit.\n\t\t// If not, cache by the original entity record.\n\t\tconst edits = getEntityRecordEdits( kind, name, id );\n\t\tconst isUnedited = ! edits || ! Object.keys( edits ).length;\n\t\tconst cackeKey = isUnedited ? getEntityRecord( kind, name, id ) : edits;\n\t\tlet _blocks = parsedBlocksCache.get( cackeKey );\n\n\t\tif ( ! _blocks ) {\n\t\t\t_blocks = parse( content );\n\t\t\tparsedBlocksCache.set( cackeKey, _blocks );\n\t\t}\n\n\t\treturn _blocks;\n\t}, [\n\t\tkind,\n\t\tname,\n\t\tid,\n\t\teditedBlocks,\n\t\tcontent,\n\t\tgetEntityRecord,\n\t\tgetEntityRecordEdits,\n\t] );\n\n\tconst onChange = useCallback(\n\t\t( newBlocks, options ) => {\n\t\t\tconst noChange = blocks === newBlocks;\n\t\t\tif ( noChange ) {\n\t\t\t\treturn __unstableCreateUndoLevel( kind, name, id );\n\t\t\t}\n\t\t\tconst { selection, ...rest } = options;\n\n\t\t\t// We create a new function here on every persistent edit\n\t\t\t// to make sure the edit makes the post dirty and creates\n\t\t\t// a new undo level.\n\t\t\tconst edits = {\n\t\t\t\tselection,\n\t\t\t\tcontent: ( { blocks: blocksForSerialization = [] } ) =>\n\t\t\t\t\t__unstableSerializeAndClean( blocksForSerialization ),\n\t\t\t\t...updateFootnotesFromMeta( newBlocks, meta ),\n\t\t\t};\n\n\t\t\teditEntityRecord( kind, name, id, edits, {\n\t\t\t\tisCached: false,\n\t\t\t\t...rest,\n\t\t\t} );\n\t\t},\n\t\t[\n\t\t\tkind,\n\t\t\tname,\n\t\t\tid,\n\t\t\tblocks,\n\t\t\tmeta,\n\t\t\t__unstableCreateUndoLevel,\n\t\t\teditEntityRecord,\n\t\t]\n\t);\n\n\tconst onInput = useCallback(\n\t\t( newBlocks, options ) => {\n\t\t\tconst { selection, ...rest } = options;\n\t\t\tconst footnotesChanges = updateFootnotesFromMeta( newBlocks, meta );\n\t\t\tconst edits = { selection, ...footnotesChanges };\n\n\t\t\teditEntityRecord( kind, name, id, edits, {\n\t\t\t\tisCached: true,\n\t\t\t\t...rest,\n\t\t\t} );\n\t\t},\n\t\t[ kind, name, id, meta, editEntityRecord ]\n\t);\n\n\treturn [ blocks, onInput, onChange ];\n}\n", "/**\n * WordPress dependencies\n */\nimport { useContext } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { EntityContext } from '../entity-context';\n\n/**\n * Hook that returns the ID for the nearest\n * provided entity of the specified type.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n */\nexport default function useEntityId( kind, name ) {\n\tconst context = useContext( EntityContext );\n\treturn context?.[ kind ]?.[ name ];\n}\n", "/**\n * WordPress dependencies\n */\nimport { RichTextData, create, toHTMLString } from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport getFootnotesOrder from './get-footnotes-order';\n\nlet oldFootnotes = {};\n\nexport function updateFootnotesFromMeta( blocks, meta ) {\n\tconst output = { blocks };\n\tif ( ! meta ) {\n\t\treturn output;\n\t}\n\n\t// If meta.footnotes is empty, it means the meta is not registered.\n\tif ( meta.footnotes === undefined ) {\n\t\treturn output;\n\t}\n\n\tconst newOrder = getFootnotesOrder( blocks );\n\n\tconst footnotes = meta.footnotes ? JSON.parse( meta.footnotes ) : [];\n\tconst currentOrder = footnotes.map( ( fn ) => fn.id );\n\n\tif ( currentOrder.join( '' ) === newOrder.join( '' ) ) {\n\t\treturn output;\n\t}\n\n\tconst newFootnotes = newOrder.map(\n\t\t( fnId ) =>\n\t\t\tfootnotes.find( ( fn ) => fn.id === fnId ) ||\n\t\t\toldFootnotes[ fnId ] || {\n\t\t\t\tid: fnId,\n\t\t\t\tcontent: '',\n\t\t\t}\n\t);\n\n\tfunction updateAttributes( attributes ) {\n\t\t// Only attempt to update attributes, if attributes is an object.\n\t\tif (\n\t\t\t! attributes ||\n\t\t\tArray.isArray( attributes ) ||\n\t\t\ttypeof attributes !== 'object'\n\t\t) {\n\t\t\treturn attributes;\n\t\t}\n\n\t\tattributes = { ...attributes };\n\n\t\tfor ( const key in attributes ) {\n\t\t\tconst value = attributes[ key ];\n\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\tattributes[ key ] = value.map( updateAttributes );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// To do, remove support for string values?\n\t\t\tif (\n\t\t\t\ttypeof value !== 'string' &&\n\t\t\t\t! ( value instanceof RichTextData )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst richTextValue =\n\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t? RichTextData.fromHTMLString( value )\n\t\t\t\t\t: new RichTextData( value );\n\n\t\t\tlet hasFootnotes = false;\n\n\t\t\trichTextValue.replacements.forEach( ( replacement ) => {\n\t\t\t\tif ( replacement.type === 'core/footnote' ) {\n\t\t\t\t\tconst id = replacement.attributes[ 'data-fn' ];\n\t\t\t\t\tconst index = newOrder.indexOf( id );\n\t\t\t\t\t// The innerHTML contains the count wrapped in a link.\n\t\t\t\t\tconst countValue = create( {\n\t\t\t\t\t\thtml: replacement.innerHTML,\n\t\t\t\t\t} );\n\t\t\t\t\tcountValue.text = String( index + 1 );\n\t\t\t\t\tcountValue.formats = Array.from(\n\t\t\t\t\t\t{ length: countValue.text.length },\n\t\t\t\t\t\t() => countValue.formats[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t\tcountValue.replacements = Array.from(\n\t\t\t\t\t\t{ length: countValue.text.length },\n\t\t\t\t\t\t() => countValue.replacements[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t\treplacement.innerHTML = toHTMLString( {\n\t\t\t\t\t\tvalue: countValue,\n\t\t\t\t\t} );\n\t\t\t\t\thasFootnotes = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( hasFootnotes ) {\n\t\t\t\tattributes[ key ] =\n\t\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t\t? richTextValue.toHTMLString()\n\t\t\t\t\t\t: richTextValue;\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n\tfunction updateBlocksAttributes( __blocks ) {\n\t\treturn __blocks.map( ( block ) => {\n\t\t\treturn {\n\t\t\t\t...block,\n\t\t\t\tattributes: updateAttributes( block.attributes ),\n\t\t\t\tinnerBlocks: updateBlocksAttributes( block.innerBlocks ),\n\t\t\t};\n\t\t} );\n\t}\n\n\t// We need to go through all block attributes deeply and update the\n\t// footnote anchor numbering (textContent) to match the new order.\n\tconst newBlocks = updateBlocksAttributes( blocks );\n\n\toldFootnotes = {\n\t\t...oldFootnotes,\n\t\t...footnotes.reduce( ( acc, fn ) => {\n\t\t\tif ( ! newOrder.includes( fn.id ) ) {\n\t\t\t\tacc[ fn.id ] = fn;\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} ),\n\t};\n\n\treturn {\n\t\tmeta: {\n\t\t\t...meta,\n\t\t\tfootnotes: JSON.stringify( newFootnotes ),\n\t\t},\n\t\tblocks: newBlocks,\n\t};\n}\n", "/**\n * WordPress dependencies\n */\nimport { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\n\n// TODO: The following line should have been:\n//\n//   const unlockedApis = unlock( blockEditorPrivateApis );\n//\n// But there are hidden circular dependencies in RNMobile code, specifically in\n// certain native components in the `components` package that depend on\n// `block-editor`. What follows is a workaround that defers the `unlock` call\n// to prevent native code from failing.\n//\n// Fix once https://github.com/WordPress/gutenberg/issues/52692 is closed.\nlet unlockedApis;\n\nconst cache = new WeakMap();\n\nexport default function getRichTextValuesCached( block ) {\n\tif ( ! unlockedApis ) {\n\t\tunlockedApis = unlock( blockEditorPrivateApis );\n\t}\n\n\tif ( ! cache.has( block ) ) {\n\t\tconst values = unlockedApis.getRichTextValues( [ block ] );\n\t\tcache.set( block, values );\n\t}\n\treturn cache.get( block );\n}\n", "/**\n * Internal dependencies\n */\nimport getRichTextValuesCached from './get-rich-text-values-cached';\n\nconst cache = new WeakMap();\n\nfunction getBlockFootnotesOrder( block ) {\n\tif ( ! cache.has( block ) ) {\n\t\tconst order = [];\n\t\tfor ( const value of getRichTextValuesCached( block ) ) {\n\t\t\tif ( ! value ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// replacements is a sparse array, use forEach to skip empty slots.\n\t\t\tvalue.replacements.forEach( ( { type, attributes } ) => {\n\t\t\t\tif ( type === 'core/footnote' ) {\n\t\t\t\t\torder.push( attributes[ 'data-fn' ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\tcache.set( block, order );\n\t}\n\n\treturn cache.get( block );\n}\n\nexport default function getFootnotesOrder( blocks ) {\n\t// We can only separate getting order from blocks at the root level. For\n\t// deeper inner blocks, this will not work since it's possible to have both\n\t// inner blocks and block attributes, so order needs to be computed from the\n\t// Edit functions as a whole.\n\treturn blocks.flatMap( getBlockFootnotesOrder );\n}\n", "/**\n * WordPress dependencies\n */\nimport { useCallback } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from '../name';\nimport useEntityId from './use-entity-id';\n\n/**\n * Hook that returns the value and a setter for the\n * specified property of the nearest provided\n * entity of the specified type.\n *\n * @param {string}        kind  The entity kind.\n * @param {string}        name  The entity name.\n * @param {string}        prop  The property name.\n * @param {number|string} [_id] An entity ID to use instead of the context-provided one.\n *\n * @return {[*, Function, *]} An array where the first item is the\n *                            property value, the second is the\n *                            setter and the third is the full value\n * \t\t\t\t\t\t\t  object from REST API containing more\n * \t\t\t\t\t\t\t  information like `raw`, `rendered` and\n * \t\t\t\t\t\t\t  `protected` props.\n */\nexport default function useEntityProp( kind, name, prop, _id ) {\n\tconst providerId = useEntityId( kind, name );\n\tconst id = _id ?? providerId;\n\n\tconst { value, fullValue } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEntityRecord, getEditedEntityRecord } =\n\t\t\t\tselect( STORE_NAME );\n\t\t\tconst record = getEntityRecord( kind, name, id ); // Trigger resolver.\n\t\t\tconst editedRecord = getEditedEntityRecord( kind, name, id );\n\t\t\treturn record && editedRecord\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: editedRecord[ prop ],\n\t\t\t\t\t\tfullValue: record[ prop ],\n\t\t\t\t  }\n\t\t\t\t: {};\n\t\t},\n\t\t[ kind, name, id, prop ]\n\t);\n\tconst { editEntityRecord } = useDispatch( STORE_NAME );\n\tconst setValue = useCallback(\n\t\t( newValue ) => {\n\t\t\teditEntityRecord( kind, name, id, {\n\t\t\t\t[ prop ]: newValue,\n\t\t\t} );\n\t\t},\n\t\t[ editEntityRecord, kind, name, id, prop ]\n\t);\n\n\treturn [ value, setValue, fullValue ];\n}\n", "/**\n * Internal dependencies\n */\nimport { useEntityRecordsWithPermissions } from './hooks/use-entity-records';\nimport { RECEIVE_INTERMEDIATE_RESULTS } from './utils';\nimport { lock } from './lock-unlock';\n\nexport const privateApis = {};\nlock( privateApis, {\n\tuseEntityRecordsWithPermissions,\n\tRECEIVE_INTERMEDIATE_RESULTS,\n} );\n"],
  "mappings": "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",
  "names": ["length", "keys", "obj", "map", "EquivalentKeyMap", "forEach", "global", "exports", "self", "last", "tokenize", "value", "diffChars", "obj", "line", "operation", "hunk", "toPos", "j", "content", "err", "_loop", "i", "import_data", "import_es6", "import_compose", "import_data", "import_undo_manager", "fastDeepEqual", "args", "cache", "entity", "id", "id", "items", "keys", "items", "EquivalentKeyMap", "import_data", "__assign", "input", "re", "import_blocks", "map", "create", "create", "args", "args", "isNaN", "parseInt", "create", "create", "length", "length", "length", "append", "keys", "create", "create", "create", "create", "args", "create", "args", "style", "create", "id", "length", "i", "store", "create", "doc", "any", "users", "clientid", "snapshot", "struct", "hasContent", "undoManager", "from", "keys", "map", "items", "text", "element", "item", "import_es6", "import_es6", "AttributeMap", "compose", "copy", "isEqual", "Op", "length", "Iterator", "length", "cloneDeep", "Iterator", "length", "isEqual", "document", "popStackItem", "um", "doc", "id", "undoManager", "providerCreators", "create", "import_es6", "import_blocks", "getRandomValues", "import_es6", "doc", "fastDeepEqual", "fastDeepEqual", "map", "apiFetch", "entity", "entities", "id", "nextEdits", "fastDeepEqual", "id", "reducer_default", "import_data", "import_url", "import_deprecated", "import_data", "deprecated", "id", "deprecated", "id", "entity", "args", "autosaves", "currentTheme", "currentGlobalStylesId", "import_es6", "import_api_fetch", "import_url", "import_deprecated", "import_api_fetch", "cache", "apiFetch", "id", "args", "users", "currentUser", "entities", "currentTheme", "currentGlobalStylesId", "deprecated", "apiFetch", "lock", "fastDeepEqual", "autosaves", "import_api_fetch", "registeredPostMeta", "apiFetch", "lock", "import_url", "import_html_entities", "import_api_fetch", "import_api_fetch", "import_api_fetch", "import_url", "import_i18n", "editorSettings", "queries", "apiFetch", "results", "text", "import_api_fetch", "import_url", "args", "apiFetch", "apiFetch", "getAuthors", "users", "apiFetch", "getCurrentUser", "currentUser", "getEntityRecord", "lock", "getRawEntityRecord", "getEditedEntityRecord", "getEntityRecords", "getEntityRecordsTotalItems", "getEntityRecordsTotalPages", "getCurrentTheme", "getThemeSupports", "getEmbedPreview", "canUser", "id", "canUserEditEntityRecord", "getAutosaves", "autosaves", "getAutosave", "__experimentalGetCurrentGlobalStylesId", "__experimentalGetCurrentThemeBaseGlobalStyles", "currentTheme", "__experimentalGetCurrentThemeGlobalStylesVariations", "getCurrentThemeGlobalStylesRevisions", "getBlockPatterns", "getBlockPatternCategories", "getUserPatternCategories", "getNavigationFallbackId", "getDefaultTemplateId", "getRevisions", "getRevision", "getRegisteredPostMeta", "getEntitiesConfig", "getEditorSettings", "getEditorAssets", "locks", "lock", "lock", "store", "store", "locks", "node", "store", "lock", "locks", "store", "lock", "import_element", "id", "import_data", "import_deprecated", "import_element", "import_data", "args", "Status", "store", "args", "EMPTY_OBJECT", "editEntityRecord", "saveEditedEntityRecord", "record", "deprecated", "import_url", "import_deprecated", "import_data", "import_element", "deprecated", "getEntityRecordsPermissions", "import_deprecated", "id", "warning", "canUser", "create", "read", "isResolving", "hasResolved", "status", "deprecated", "import_element", "import_data", "import_blocks", "import_element", "import_rich_text", "blockEditorPrivateApis", "cache", "id", "EMPTY_ARRAY", "id", "getEntityRecord", "getEntityRecordEdits", "getEditedEntityRecord", "__unstableCreateUndoLevel", "editEntityRecord", "import_element", "import_data", "id", "getEntityRecord", "getEditedEntityRecord", "editEntityRecord", "entitiesConfig", "entity", "getEntityRecord", "args", "getEntityRecords", "reducer_default"]
}