@fluidframework/merge-tree 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/api-report/merge-tree.legacy.alpha.api.md +20 -0
  3. package/dist/attributionCollection.d.ts.map +1 -1
  4. package/dist/attributionCollection.js +1 -29
  5. package/dist/attributionCollection.js.map +1 -1
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +3 -4
  8. package/dist/client.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/legacy.d.ts +1 -0
  13. package/dist/localReference.d.ts.map +1 -1
  14. package/dist/localReference.js +0 -2
  15. package/dist/localReference.js.map +1 -1
  16. package/dist/mergeTree.d.ts +1 -30
  17. package/dist/mergeTree.d.ts.map +1 -1
  18. package/dist/mergeTree.js +131 -167
  19. package/dist/mergeTree.js.map +1 -1
  20. package/dist/mergeTreeNodes.d.ts +16 -1
  21. package/dist/mergeTreeNodes.d.ts.map +1 -1
  22. package/dist/mergeTreeNodes.js +5 -2
  23. package/dist/mergeTreeNodes.js.map +1 -1
  24. package/dist/partialLengths.d.ts.map +1 -1
  25. package/dist/partialLengths.js +8 -54
  26. package/dist/partialLengths.js.map +1 -1
  27. package/dist/properties.d.ts.map +1 -1
  28. package/dist/properties.js +0 -2
  29. package/dist/properties.js.map +1 -1
  30. package/dist/revertibles.d.ts.map +1 -1
  31. package/dist/revertibles.js +0 -14
  32. package/dist/revertibles.js.map +1 -1
  33. package/dist/segmentGroupCollection.d.ts.map +1 -1
  34. package/dist/segmentGroupCollection.js +0 -2
  35. package/dist/segmentGroupCollection.js.map +1 -1
  36. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  37. package/dist/segmentPropertiesManager.js +1 -3
  38. package/dist/segmentPropertiesManager.js.map +1 -1
  39. package/dist/snapshotLoader.d.ts.map +1 -1
  40. package/dist/snapshotLoader.js +1 -4
  41. package/dist/snapshotLoader.js.map +1 -1
  42. package/dist/snapshotV1.d.ts.map +1 -1
  43. package/dist/snapshotV1.js +1 -11
  44. package/dist/snapshotV1.js.map +1 -1
  45. package/dist/snapshotlegacy.d.ts.map +1 -1
  46. package/dist/snapshotlegacy.js +0 -1
  47. package/dist/snapshotlegacy.js.map +1 -1
  48. package/dist/sortedSegmentSet.d.ts +0 -1
  49. package/dist/sortedSegmentSet.d.ts.map +1 -1
  50. package/dist/sortedSegmentSet.js +1 -9
  51. package/dist/sortedSegmentSet.js.map +1 -1
  52. package/dist/sortedSet.d.ts.map +1 -1
  53. package/dist/sortedSet.js +0 -4
  54. package/dist/sortedSet.js.map +1 -1
  55. package/dist/test/client.conflictFarm.spec.d.ts.map +1 -1
  56. package/dist/test/client.conflictFarm.spec.js +36 -27
  57. package/dist/test/client.conflictFarm.spec.js.map +1 -1
  58. package/dist/test/client.replay.spec.js +1 -1
  59. package/dist/test/client.replay.spec.js.map +1 -1
  60. package/dist/test/mergeTreeOperationRunner.d.ts +2 -1
  61. package/dist/test/mergeTreeOperationRunner.d.ts.map +1 -1
  62. package/dist/test/mergeTreeOperationRunner.js +29 -11
  63. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  64. package/dist/test/obliterate.spec.js +55 -0
  65. package/dist/test/obliterate.spec.js.map +1 -1
  66. package/dist/test/reconnectHelper.d.ts +0 -1
  67. package/dist/test/reconnectHelper.d.ts.map +1 -1
  68. package/dist/test/reconnectHelper.js +1 -1
  69. package/dist/test/reconnectHelper.js.map +1 -1
  70. package/dist/test/testClientLogger.d.ts.map +1 -1
  71. package/dist/test/testClientLogger.js +17 -7
  72. package/dist/test/testClientLogger.js.map +1 -1
  73. package/dist/zamboni.d.ts.map +1 -1
  74. package/dist/zamboni.js +0 -4
  75. package/dist/zamboni.js.map +1 -1
  76. package/lib/attributionCollection.d.ts.map +1 -1
  77. package/lib/attributionCollection.js +1 -29
  78. package/lib/attributionCollection.js.map +1 -1
  79. package/lib/client.d.ts.map +1 -1
  80. package/lib/client.js +3 -4
  81. package/lib/client.js.map +1 -1
  82. package/lib/index.d.ts +1 -1
  83. package/lib/index.d.ts.map +1 -1
  84. package/lib/index.js.map +1 -1
  85. package/lib/legacy.d.ts +1 -0
  86. package/lib/localReference.d.ts.map +1 -1
  87. package/lib/localReference.js +0 -2
  88. package/lib/localReference.js.map +1 -1
  89. package/lib/mergeTree.d.ts +1 -30
  90. package/lib/mergeTree.d.ts.map +1 -1
  91. package/lib/mergeTree.js +132 -168
  92. package/lib/mergeTree.js.map +1 -1
  93. package/lib/mergeTreeNodes.d.ts +16 -1
  94. package/lib/mergeTreeNodes.d.ts.map +1 -1
  95. package/lib/mergeTreeNodes.js +5 -2
  96. package/lib/mergeTreeNodes.js.map +1 -1
  97. package/lib/partialLengths.d.ts.map +1 -1
  98. package/lib/partialLengths.js +8 -54
  99. package/lib/partialLengths.js.map +1 -1
  100. package/lib/properties.d.ts.map +1 -1
  101. package/lib/properties.js +0 -2
  102. package/lib/properties.js.map +1 -1
  103. package/lib/revertibles.d.ts.map +1 -1
  104. package/lib/revertibles.js +0 -14
  105. package/lib/revertibles.js.map +1 -1
  106. package/lib/segmentGroupCollection.d.ts.map +1 -1
  107. package/lib/segmentGroupCollection.js +0 -2
  108. package/lib/segmentGroupCollection.js.map +1 -1
  109. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  110. package/lib/segmentPropertiesManager.js +1 -3
  111. package/lib/segmentPropertiesManager.js.map +1 -1
  112. package/lib/snapshotLoader.d.ts.map +1 -1
  113. package/lib/snapshotLoader.js +1 -4
  114. package/lib/snapshotLoader.js.map +1 -1
  115. package/lib/snapshotV1.d.ts.map +1 -1
  116. package/lib/snapshotV1.js +1 -11
  117. package/lib/snapshotV1.js.map +1 -1
  118. package/lib/snapshotlegacy.d.ts.map +1 -1
  119. package/lib/snapshotlegacy.js +0 -1
  120. package/lib/snapshotlegacy.js.map +1 -1
  121. package/lib/sortedSegmentSet.d.ts +0 -1
  122. package/lib/sortedSegmentSet.d.ts.map +1 -1
  123. package/lib/sortedSegmentSet.js +1 -9
  124. package/lib/sortedSegmentSet.js.map +1 -1
  125. package/lib/sortedSet.d.ts.map +1 -1
  126. package/lib/sortedSet.js +0 -4
  127. package/lib/sortedSet.js.map +1 -1
  128. package/lib/test/client.conflictFarm.spec.d.ts.map +1 -1
  129. package/lib/test/client.conflictFarm.spec.js +37 -28
  130. package/lib/test/client.conflictFarm.spec.js.map +1 -1
  131. package/lib/test/client.replay.spec.js +1 -1
  132. package/lib/test/client.replay.spec.js.map +1 -1
  133. package/lib/test/mergeTreeOperationRunner.d.ts +2 -1
  134. package/lib/test/mergeTreeOperationRunner.d.ts.map +1 -1
  135. package/lib/test/mergeTreeOperationRunner.js +30 -12
  136. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  137. package/lib/test/obliterate.spec.js +55 -0
  138. package/lib/test/obliterate.spec.js.map +1 -1
  139. package/lib/test/reconnectHelper.d.ts +0 -1
  140. package/lib/test/reconnectHelper.d.ts.map +1 -1
  141. package/lib/test/reconnectHelper.js +1 -1
  142. package/lib/test/reconnectHelper.js.map +1 -1
  143. package/lib/test/testClientLogger.d.ts.map +1 -1
  144. package/lib/test/testClientLogger.js +18 -8
  145. package/lib/test/testClientLogger.js.map +1 -1
  146. package/lib/tsdoc-metadata.json +1 -1
  147. package/lib/zamboni.d.ts.map +1 -1
  148. package/lib/zamboni.js +0 -4
  149. package/lib/zamboni.js.map +1 -1
  150. package/package.json +22 -21
  151. package/src/attributionCollection.ts +14 -42
  152. package/src/client.ts +8 -9
  153. package/src/index.ts +1 -0
  154. package/src/localReference.ts +1 -3
  155. package/src/mergeTree.ts +185 -208
  156. package/src/mergeTreeNodes.ts +22 -3
  157. package/src/partialLengths.ts +23 -68
  158. package/src/properties.ts +1 -3
  159. package/src/revertibles.ts +7 -21
  160. package/src/segmentGroupCollection.ts +1 -3
  161. package/src/segmentPropertiesManager.ts +0 -1
  162. package/src/snapshotLoader.ts +2 -4
  163. package/src/snapshotV1.ts +5 -15
  164. package/src/snapshotlegacy.ts +1 -2
  165. package/src/sortedSegmentSet.ts +3 -10
  166. package/src/sortedSet.ts +2 -6
  167. package/src/zamboni.ts +4 -8
  168. package/tsconfig.json +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { Property, RedBlackTree } from \"./collections/index.js\";\nimport { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tCollaborationWindow,\n\tIMergeNode,\n\tIMoveInfo,\n\tIRemovalInfo,\n\tISegment,\n\tcompareNumbers,\n\tseqLTE,\n\ttoMoveInfo,\n\ttoRemovalInfo,\n\ttype MergeBlock,\n} from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { SortedSet } from \"./sortedSet.js\";\n\n// eslint-disable-next-line import/no-deprecated\nclass PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number> {\n\tprotected getKey(item: PartialSequenceLength): number {\n\t\treturn item.seq;\n\t}\n\n\tpublic addOrUpdate(\n\t\tnewItem: PartialSequenceLength,\n\t\tupdate?: (existingItem: PartialSequenceLength, newItem: PartialSequenceLength) => void,\n\t): void {\n\t\tconst prev = this.latestLeq(newItem.seq);\n\n\t\tif (prev?.seq !== newItem.seq) {\n\t\t\t// new element, update len\n\t\t\tnewItem.len = (prev?.len ?? 0) + newItem.seglen;\n\t\t}\n\n\t\t// update the len of all following elements\n\t\tfor (let i = this.keySortedItems.length - 1; i >= 0; i--) {\n\t\t\tconst element = this.keySortedItems[i];\n\t\t\tif (!element || element.seq <= newItem.seq) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\telement.len += newItem.seglen;\n\t\t}\n\n\t\tsuper.addOrUpdate(newItem, (currentPartial, partialLength) => {\n\t\t\tcurrentPartial.seglen += partialLength.seglen;\n\n\t\t\tif (partialLength.remoteObliteratedLen) {\n\t\t\t\tcurrentPartial.remoteObliteratedLen ??= 0;\n\t\t\t\tcurrentPartial.remoteObliteratedLen += partialLength.remoteObliteratedLen;\n\t\t\t}\n\n\t\t\tcurrentPartial.len += partialLength.seglen;\n\t\t\tcombineOverlapClients(currentPartial, partialLength);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the partial length whose sequence number is the greatest sequence\n\t * number that is less than or equal to key.\n\t * @param key - sequence number\n\t */\n\tlatestLeq(key: number): PartialSequenceLength | undefined {\n\t\treturn this.keySortedItems[this.latestLeqIndex(key)];\n\t}\n\n\t/**\n\t * Returns the partial length whose sequence number is the lowest sequence\n\t * number that is greater than or equal to key.\n\t * @param key - sequence number\n\t */\n\tfirstGte(key: number): PartialSequenceLength | undefined {\n\t\tconst { index } = this.findItemPosition({ seq: key, len: 0, seglen: 0 });\n\t\treturn this.keySortedItems[index];\n\t}\n\n\tprivate latestLeqIndex(key: number): number {\n\t\tconst { exists, index } = this.findItemPosition({ seq: key, len: 0, seglen: 0 });\n\t\treturn exists ? index : index - 1;\n\t}\n\n\tcopyDown(minSeq: number): number {\n\t\tconst mindex = this.latestLeqIndex(minSeq);\n\t\tlet minLength = 0;\n\t\tif (mindex >= 0) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tminLength = this.keySortedItems[mindex]!.len;\n\t\t\tconst seqCount = this.size;\n\t\t\tif (mindex <= seqCount - 1) {\n\t\t\t\t// Still some entries remaining\n\t\t\t\tconst remainingCount = seqCount - mindex - 1;\n\t\t\t\t// Copy down\n\t\t\t\tfor (let i = 0; i < remainingCount; i++) {\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tthis.keySortedItems[i] = this.keySortedItems[i + mindex + 1]!;\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tthis.keySortedItems[i]!.len -= minLength;\n\t\t\t\t}\n\t\t\t\tthis.keySortedItems.length = remainingCount;\n\t\t\t}\n\t\t}\n\t\treturn minLength;\n\t}\n}\n\ninterface IOverlapClient {\n\tclientId: number;\n\tseglen: number;\n}\n\n/**\n * Tracks length information for a part of a MergeTree (block) at a given time (seq).\n * These objects are associated with internal nodes (i.e. blocks).\n */\nexport interface PartialSequenceLength {\n\t/**\n\t * Sequence number\n\t */\n\tseq: number;\n\t/**\n\t * The length of the associated block.\n\t */\n\tlen: number;\n\t/**\n\t * The delta between the current length of the associated block and its length at the previous seq number.\n\t */\n\tseglen: number;\n\t/**\n\t * clientId for the client that submitted the op with sequence number `seq`.\n\t */\n\tclientId?: number;\n\t/**\n\t * If this partial length obliterated remote segments, this is the length of\n\t * those segments\n\t */\n\tremoteObliteratedLen?: number;\n\t/**\n\t * This field maps each client to the size of the intersection between segments deleted at this seq\n\t * and segments concurrently deleted by that client.\n\t *\n\t * For example, this PartialSequenceLength:\n\t * ```typescript\n\t * {\n\t * seq: 5,\n\t * len: 100,\n\t * seglen: -10,\n\t * clientId: 0,\n\t * overlapRemoveClients: <RedBlack tree with key-values expressed by>{\n\t * 1: { clientId: 1, seglen: -5 },\n\t * 3: { clientId: 3, seglen: -10 }\n\t * }\n\t * }\n\t * ```\n\t *\n\t * corresponds to an op submitted by client 0 which:\n\t * - reduces the length of this block by 10 (it may have deleted a single segment of length 10,\n\t * several segments totalling length 10, or even delete and add content for a total reduction of 10 length)\n\t * - was concurrent to one or more ops submitted by client 1 that also removed some of the same segments,\n\t * whose length totalled 5\n\t * - was concurrent to one or more ops submitted by client 3 that removed some of the same segments,\n\t * whose length totalled 10\n\t */\n\toverlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n\t/**\n\t * This field is the same as `overlapRemoveClients`, except that it tracks\n\t * overlapping obliterates rather than removes.\n\t */\n\toverlapObliterateClients?: RedBlackTree<number, IOverlapClient>;\n}\n\ninterface UnsequencedPartialLengthInfo {\n\t/**\n\t * Contains entries for all local operations.\n\t * The \"seq\" field of each entry actually corresponds to the delta at that localSeq on the local client.\n\t */\n\tpartialLengths: PartialSequenceLengthsSet;\n\n\t/**\n\t * Only contains entries for segments (or aggregates thereof) which were concurrently deleted\n\t * by another client. Ordered by `seq` of the removing client.\n\t *\n\t * The \"length\" field of these entries is not populated. This is because pre-computing the lengths\n\t * of segments doesn't help given the usage pattern.\n\t *\n\t * These entries need both `seq` and `localSeq`, because a given segment remove is double-counted iff\n\t * the refSeq exceeds the seq of the remote remove AND the localSeq exceeds the localSeq of the local remove.\n\t */\n\toverlappingRemoves: LocalPartialSequenceLength[];\n\n\t/**\n\t * Cached keyed on refSeq which stores length information for the total overlap of removed segments at\n\t * that refSeq.\n\t * This information is derivable from the entries of `overlappingRemoves`.\n\t *\n\t * Like the `partialLengths` field, `seq` on each entry is actually the local seq.\n\t * See `computeOverlappingLocalRemoves` for more information.\n\t */\n\tcachedOverlappingByRefSeq: Map<number, PartialSequenceLengthsSet>;\n}\n\ninterface LocalPartialSequenceLength extends PartialSequenceLength {\n\t/**\n\t * Local sequence number\n\t */\n\tlocalSeq: number;\n}\n\nexport interface PartialSequenceLengthsOptions {\n\tverifier?: (partialLengths: PartialSequenceLengths) => void;\n\tverifyExpected?: (\n\t\tmergeTree: MergeTree,\n\t\tnode: MergeBlock,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t) => void;\n\tzamboni: boolean;\n}\n\n/**\n * Keeps track of partial sums of segment lengths for all sequence numbers in the current collaboration window.\n * Only used during active collaboration.\n *\n * This class is associated with an internal node (block) of a MergeTree. It efficiently answers queries of the form\n * \"What is the length of `block` from the perspective of some particular seq and clientId?\".\n *\n * It also supports incremental updating of state for newly-sequenced ops that don't affect the structure of the\n * MergeTree.\n *\n * To answer these queries, it pre-builds several lists which track the length of the block at a per-sequence-number\n * level. These lists are:\n *\n * 1. (`partialLengths`): Stores the total length of the block.\n * 2. (`clientSeqNumbers[clientId]`): Stores only the total lengths of segments submitted by `clientId`. [see footnote]\n *\n * The reason both lists are necessary is that resolving the length of the block from the perspective of\n * (clientId, refSeq) requires including both of the following types of segments:\n * 1. Segments sequenced before `refSeq`\n * 2. Segments submitted by `clientId`\n *\n * This is possible with the above bookkeeping, using:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (clientSeqNumbers total length at most recent op)\n * - (clientSeqNumbers total length at refSeq)\n *\n * where the subtraction avoids double-counting segments submitted by clientId sequenced within the collab window.\n *\n * To enable reconnect, if constructed with `computeLocalPartials === true` it also supports querying for the length of\n * the block from the perspective of the local client at a particular `refSeq` and `localSeq`. This computation is\n * similar to the above:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (unsequenced edits' total length submitted before localSeq)\n * - (overlapping remove of the unsequenced edits' total length at refSeq)\n *\n * This algorithm scales roughly linearly with number of editing clients and the size of the collab window.\n * (certain unlikely sequences of operations may introduce log factors on those variables)\n *\n * Note: there is some slight complication with clientSeqNumbers resulting from the possibility of different clients\n * concurrently removing the same segment. See the field's documentation for more details.\n */\nexport class PartialSequenceLengths {\n\tpublic static options: PartialSequenceLengthsOptions = {\n\t\tzamboni: true,\n\t};\n\n\t/**\n\t * Combine the partial lengths of block's children\n\t * @param block - an interior node. If `recur` is false, it is assumed that each interior node child of this block\n\t * has its partials up to date.\n\t * @param collabWindow - segment window of the segment tree containing `block`.\n\t * @param recur - whether to recursively compute partial lengths for internal children of `block`.\n\t * This incurs more work, but gives correct bookkeeping in the case that a descendant in the merge tree has been\n\t * modified without bubbling up the resulting partial length change to this block's partials.\n\t * @param computeLocalPartials - whether to compute partial length information about local unsequenced ops.\n\t * This enables querying for the length of the block at a given localSeq, but incurs extra work.\n\t * Local partial information doesn't support `update`.\n\t */\n\tpublic static combine(\n\t\tblock: MergeBlock,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t\trecur = false,\n\t\tcomputeLocalPartials = false,\n\t): PartialSequenceLengths {\n\t\tconst leafPartialLengths = PartialSequenceLengths.fromLeaves(\n\t\t\tblock,\n\t\t\tcollabWindow,\n\t\t\tcomputeLocalPartials,\n\t\t);\n\n\t\tlet hasInternalChild = false;\n\t\tconst childPartials: PartialSequenceLengths[] = [];\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst child = block.children[i]!;\n\t\t\tif (!child.isLeaf()) {\n\t\t\t\thasInternalChild = true;\n\t\t\t\tif (recur) {\n\t\t\t\t\tchild.partialLengths = PartialSequenceLengths.combine(\n\t\t\t\t\t\tchild,\n\t\t\t\t\t\tcollabWindow,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tcomputeLocalPartials,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tchildPartials.push(child.partialLengths!);\n\t\t\t}\n\t\t}\n\n\t\t// If there are no internal children, the PartialSequenceLengths returns from `fromLeaves` is exactly correct.\n\t\t// Otherwise, we must additively combine all of the children partial lengths to get this block's totals.\n\t\tconst combinedPartialLengths = hasInternalChild\n\t\t\t? new PartialSequenceLengths(collabWindow.minSeq, computeLocalPartials)\n\t\t\t: leafPartialLengths;\n\t\tif (hasInternalChild) {\n\t\t\tif (leafPartialLengths.partialLengths.size > 0) {\n\t\t\t\t// Some children were leaves; add combined partials from these segments\n\t\t\t\tchildPartials.push(leafPartialLengths);\n\t\t\t}\n\n\t\t\tconst childPartialsLen = childPartials.length;\n\n\t\t\tconst childPartialLengths: PartialSequenceLength[][] = [];\n\t\t\tconst childUnsequencedPartialLengths: PartialSequenceLength[][] = [];\n\t\t\tconst childOverlapRemoves: LocalPartialSequenceLength[][] = [];\n\t\t\tfor (let i = 0; i < childPartialsLen; i++) {\n\t\t\t\tconst { segmentCount, minLength, partialLengths, unsequencedRecords } =\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tchildPartials[i]!;\n\t\t\t\tcombinedPartialLengths.segmentCount += segmentCount;\n\t\t\t\tcombinedPartialLengths.minLength += minLength;\n\t\t\t\tchildPartialLengths.push(partialLengths.items as PartialSequenceLength[]);\n\t\t\t\tif (unsequencedRecords) {\n\t\t\t\t\tchildUnsequencedPartialLengths.push(\n\t\t\t\t\t\tunsequencedRecords.partialLengths.items as PartialSequenceLength[],\n\t\t\t\t\t);\n\t\t\t\t\tchildOverlapRemoves.push(unsequencedRecords.overlappingRemoves);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmergePartialLengths(childPartialLengths, combinedPartialLengths.partialLengths);\n\n\t\t\tif (computeLocalPartials) {\n\t\t\t\tcombinedPartialLengths.unsequencedRecords = {\n\t\t\t\t\tpartialLengths: mergePartialLengths(childUnsequencedPartialLengths),\n\t\t\t\t\toverlappingRemoves: [...mergeSortedListsBySeq(childOverlapRemoves)],\n\t\t\t\t\tcachedOverlappingByRefSeq: new Map(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (const partial of combinedPartialLengths.partialLengths.items) {\n\t\t\t\tcombinedPartialLengths.addClientSeqNumberFromPartial(partial);\n\t\t\t}\n\t\t}\n\t\t// TODO: incremental zamboni during build\n\t\tif (PartialSequenceLengths.options.zamboni) {\n\t\t\tcombinedPartialLengths.zamboni(collabWindow);\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(combinedPartialLengths);\n\t\treturn combinedPartialLengths;\n\t}\n\n\t/**\n\t * Creates and returns a PartialSequenceLengths structure that tracks the lengths of only the\n\t * leaf children of the provided MergeBlock.\n\t */\n\tprivate static fromLeaves(\n\t\tblock: MergeBlock,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t\tcomputeLocalPartials: boolean,\n\t): PartialSequenceLengths {\n\t\tconst combinedPartialLengths = new PartialSequenceLengths(\n\t\t\tcollabWindow.minSeq,\n\t\t\tcomputeLocalPartials,\n\t\t);\n\t\tcombinedPartialLengths.segmentCount = block.childCount;\n\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst child = block.children[i]!;\n\t\t\tif (child.isLeaf()) {\n\t\t\t\t// Leaf segment\n\t\t\t\tconst segment = child;\n\t\t\t\tif (segment.seq !== undefined && seqLTE(segment.seq, collabWindow.minSeq)) {\n\t\t\t\t\tcombinedPartialLengths.minLength += segment.cachedLength;\n\t\t\t\t} else {\n\t\t\t\t\tPartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n\t\t\t\t}\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\t\t\t\tif (\n\t\t\t\t\t(removalInfo?.removedSeq !== undefined &&\n\t\t\t\t\t\tseqLTE(removalInfo.removedSeq, collabWindow.minSeq)) ||\n\t\t\t\t\t(moveInfo?.movedSeq !== undefined && seqLTE(moveInfo.movedSeq, collabWindow.minSeq))\n\t\t\t\t) {\n\t\t\t\t\tcombinedPartialLengths.minLength -= segment.cachedLength;\n\t\t\t\t} else if (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t\t\tPartialSequenceLengths.insertSegment(\n\t\t\t\t\t\tcombinedPartialLengths,\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tremovalInfo,\n\t\t\t\t\t\tmoveInfo,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Post-process correctly-ordered partials computing sums and creating\n\t\t// lists for each present client id\n\t\tconst seqPartials = combinedPartialLengths.partialLengths;\n\n\t\tlet prevLen = 0;\n\t\tfor (const partial of seqPartials.items) {\n\t\t\tpartial.len = prevLen + partial.seglen;\n\t\t\tprevLen = partial.len;\n\t\t\tcombinedPartialLengths.addClientSeqNumberFromPartial(partial);\n\t\t}\n\t\tprevLen = 0;\n\n\t\tif (combinedPartialLengths.unsequencedRecords !== undefined) {\n\t\t\tconst localPartials = combinedPartialLengths.unsequencedRecords.partialLengths;\n\t\t\tfor (const partial of localPartials.items) {\n\t\t\t\tpartial.len = prevLen + partial.seglen;\n\t\t\t\tprevLen = partial.len;\n\t\t\t}\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(combinedPartialLengths);\n\t\treturn combinedPartialLengths;\n\t}\n\n\tprivate static getOverlapClients(\n\t\toverlapClientIds: number[],\n\t\tseglen: number,\n\t): RedBlackTree<number, IOverlapClient> {\n\t\tconst bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n\t\tfor (const clientId of overlapClientIds) {\n\t\t\tbst.put(clientId, { clientId, seglen });\n\t\t}\n\t\treturn bst;\n\t}\n\n\tprivate static accumulateRemoveClientOverlap(\n\t\tpartialLength: PartialSequenceLength,\n\t\toverlapRemoveClientIds: number[],\n\t\tseglen: number,\n\t): void {\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\tfor (const clientId of overlapRemoveClientIds) {\n\t\t\t\tconst overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n\t\t\t\tif (overlapClientNode) {\n\t\t\t\t\toverlapClientNode.data.seglen += seglen;\n\t\t\t\t} else {\n\t\t\t\t\tpartialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tpartialLength.overlapRemoveClients = PartialSequenceLengths.getOverlapClients(\n\t\t\t\toverlapRemoveClientIds,\n\t\t\t\tseglen,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate static accumulateMoveClientOverlap(\n\t\tpartialLength: PartialSequenceLength,\n\t\toverlapMoveClientIds: number[],\n\t\tseglen: number,\n\t): void {\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\tfor (const clientId of overlapMoveClientIds) {\n\t\t\t\tconst overlapClientNode = partialLength.overlapObliterateClients.get(clientId);\n\t\t\t\tif (overlapClientNode) {\n\t\t\t\t\toverlapClientNode.data.seglen += seglen;\n\t\t\t\t} else {\n\t\t\t\t\tpartialLength.overlapObliterateClients.put(clientId, { clientId, seglen });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tpartialLength.overlapObliterateClients = PartialSequenceLengths.getOverlapClients(\n\t\t\t\toverlapMoveClientIds,\n\t\t\t\tseglen,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Coalesce overlapping move lengths for a partial length entry that already\n\t * exists\n\t *\n\t * @param segmentLen - Length of segment with overlapping moves\n\t * @param segment - Segment with overlapping moves\n\t * @param firstGte - Existing partial length entry\n\t * @param clientIds - Ids of clients that concurrently obliterated this segment\n\t */\n\tstatic accumulateMoveOverlapForExisting(\n\t\tsegmentLen: number,\n\t\tsegment: ISegment,\n\t\tfirstGte: PartialSequenceLength,\n\t\tclientIds: number[],\n\t): void {\n\t\tconst nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);\n\n\t\tPartialSequenceLengths.accumulateMoveClientOverlap(\n\t\t\tfirstGte,\n\t\t\tnonInsertingClientIds,\n\t\t\tsegmentLen,\n\t\t);\n\n\t\t// if this segment was obliterated by the client that inserted it,\n\t\t// and if it overlaps with the obliterate of another client, we need to\n\t\t// take into account whether it was obliterated on insert by the other\n\t\t// client\n\t\tif (clientIds.length !== nonInsertingClientIds.length) {\n\t\t\tPartialSequenceLengths.accumulateMoveClientOverlap(\n\t\t\t\tfirstGte,\n\t\t\t\t[segment.clientId],\n\t\t\t\tsegment.wasMovedOnInsert ? -segment.cachedLength : segmentLen,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Tracks which clients have made concurrent obliterates.\n\t *\n\t * @param obliterateOverlapLen - Length of segment with overlap\n\t * @param clientIds - Ids of clients that have concurrently obliterated this\n\t * segment\n\t */\n\tprivate static getMoveOverlapForExisting(\n\t\tsegment: ISegment,\n\t\tobliterateOverlapLen: number,\n\t\tclientIds: number[],\n\t): RedBlackTree<number, IOverlapClient> {\n\t\tconst nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);\n\t\tconst overlapObliterateClients = PartialSequenceLengths.getOverlapClients(\n\t\t\tnonInsertingClientIds,\n\t\t\tobliterateOverlapLen,\n\t\t);\n\n\t\tif (clientIds.length !== nonInsertingClientIds.length) {\n\t\t\toverlapObliterateClients.put(segment.clientId, {\n\t\t\t\tclientId: segment.clientId,\n\t\t\t\tseglen: segment.wasMovedOnInsert ? -segment.cachedLength : obliterateOverlapLen,\n\t\t\t});\n\t\t}\n\n\t\treturn overlapObliterateClients;\n\t}\n\n\tprivate static updatePartialsAfterInsertion(\n\t\tsegment: ISegment,\n\t\tsegmentLen: number,\n\t\tremoteObliteratedLen: number | undefined,\n\t\tobliterateOverlapLen: number = segmentLen,\n\t\tpartials: PartialSequenceLengthsSet,\n\t\tseq: number,\n\t\tclientId: number,\n\t\tremoveClientOverlap: number[] | undefined,\n\t\tmoveClientOverlap: number[] | undefined,\n\t): void {\n\t\tconst firstGte = partials.firstGte(seq);\n\n\t\tlet partialLengthEntry: PartialSequenceLength;\n\t\tif (firstGte?.seq === seq) {\n\t\t\tpartialLengthEntry = firstGte;\n\t\t\t// Existing entry at this seq--this occurs for ops that insert/delete\n\t\t\t// more than one segment.\n\t\t\tpartialLengthEntry.seglen += segmentLen;\n\t\t\tif (remoteObliteratedLen) {\n\t\t\t\tpartialLengthEntry.remoteObliteratedLen ??= 0;\n\t\t\t\tpartialLengthEntry.remoteObliteratedLen += remoteObliteratedLen;\n\t\t\t}\n\t\t\tif (removeClientOverlap) {\n\t\t\t\tPartialSequenceLengths.accumulateRemoveClientOverlap(\n\t\t\t\t\tfirstGte,\n\t\t\t\t\tremoveClientOverlap,\n\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (moveClientOverlap) {\n\t\t\t\tPartialSequenceLengths.accumulateMoveOverlapForExisting(\n\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\tsegment,\n\t\t\t\t\tfirstGte,\n\t\t\t\t\tmoveClientOverlap,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconst overlapObliterateClients = moveClientOverlap\n\t\t\t\t? PartialSequenceLengths.getMoveOverlapForExisting(\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\t\tmoveClientOverlap,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\n\t\t\tpartialLengthEntry = {\n\t\t\t\tseq,\n\t\t\t\tclientId,\n\t\t\t\tlen: 0,\n\t\t\t\tseglen: segmentLen,\n\t\t\t\tremoteObliteratedLen,\n\t\t\t\toverlapRemoveClients: removeClientOverlap\n\t\t\t\t\t? PartialSequenceLengths.getOverlapClients(removeClientOverlap, obliterateOverlapLen)\n\t\t\t\t\t: undefined,\n\t\t\t\toverlapObliterateClients,\n\t\t\t};\n\n\t\t\tpartials.addOrUpdate(partialLengthEntry);\n\t\t}\n\t}\n\n\t/**\n\t * Inserts length information about the insertion of `segment` into\n\t * `combinedPartialLengths.partialLengths`.\n\t *\n\t * Does not update the clientSeqNumbers field to account for this segment.\n\t *\n\t * If `removalInfo` or `moveInfo` are defined, this operation updates the\n\t * bookkeeping to account for the (re)moval of this segment at the (re)movedSeq\n\t * instead.\n\t *\n\t * When the insertion or (re)moval of the segment is un-acked and\n\t * `combinedPartialLengths` is meant to compute such records, this does the\n\t * analogous addition to the bookkeeping for the local segment in\n\t * `combinedPartialLengths.unsequencedRecords`.\n\t */\n\tprivate static insertSegment(\n\t\tcombinedPartialLengths: PartialSequenceLengths,\n\t\tsegment: ISegment,\n\t\tremovalInfo?: IRemovalInfo,\n\t\tmoveInfo?: IMoveInfo,\n\t): void {\n\t\tconst removalIsLocal =\n\t\t\t!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;\n\t\tconst moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;\n\t\tconst isLocal =\n\t\t\tsegment.seq === UnassignedSequenceNumber ||\n\t\t\t(!!removalInfo && removalIsLocal && (!moveInfo || moveIsLocal)) ||\n\t\t\t(!!moveInfo && moveIsLocal && (!removalInfo || removalIsLocal));\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tlet seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq!;\n\t\tlet segmentLen = segment.cachedLength;\n\t\tlet clientId = segment.clientId;\n\t\tlet removeClientOverlap: number[] | undefined;\n\t\tlet moveClientOverlap: number[] | undefined;\n\t\tlet remoteObliteratedLen: number | undefined;\n\n\t\t// it's not possible to have an overlapping obliterate and remove that are both local\n\t\tassert(\n\t\t\t(!moveIsLocal && !removalIsLocal) || moveIsLocal !== removalIsLocal,\n\t\t\t0x870 /* overlapping local obliterate and remove */,\n\t\t);\n\n\t\tconst removeHappenedFirst =\n\t\t\tremovalInfo &&\n\t\t\t(!moveInfo ||\n\t\t\t\tmoveIsLocal ||\n\t\t\t\t(!removalIsLocal && moveInfo.movedSeq > removalInfo.removedSeq));\n\n\t\tif (removeHappenedFirst) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tseqOrLocalSeq = removalIsLocal ? removalInfo.localRemovedSeq! : removalInfo.removedSeq;\n\t\t\tsegmentLen = -segmentLen;\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tclientId = removalInfo.removedClientIds[0]!;\n\t\t\tconst hasOverlap = removalInfo.removedClientIds.length > 1;\n\t\t\tremoveClientOverlap = hasOverlap ? removalInfo.removedClientIds : undefined;\n\t\t} else if (moveInfo) {\n\t\t\t// The client who performed the move is always stored\n\t\t\t// in the first position of moveInfo.\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tclientId = moveInfo.movedClientIds[0]!;\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tseqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;\n\n\t\t\tif (segment.wasMovedOnInsert) {\n\t\t\t\tassert(\n\t\t\t\t\tmoveInfo.movedSeq !== -1,\n\t\t\t\t\t0x871 /* wasMovedOnInsert should only be set on acked obliterates */,\n\t\t\t\t);\n\t\t\t\tsegmentLen = 0;\n\t\t\t} else {\n\t\t\t\tsegmentLen = -segmentLen;\n\t\t\t}\n\n\t\t\tconst hasOverlap = moveInfo.movedClientIds.length > 1;\n\t\t\tmoveClientOverlap = hasOverlap ? moveInfo.movedClientIds : undefined;\n\t\t} else if (segment.wasMovedOnInsert) {\n\t\t\t// if this segment was obliterated on insert, its length is only\n\t\t\t// visible to the client that inserted it\n\t\t\tsegmentLen = 0;\n\t\t\tremoteObliteratedLen = segment.cachedLength;\n\t\t}\n\n\t\tconst partials = isLocal\n\t\t\t? combinedPartialLengths.unsequencedRecords?.partialLengths\n\t\t\t: combinedPartialLengths.partialLengths;\n\t\tif (partials === undefined) {\n\t\t\t// Local partial but its computation isn't required\n\t\t\treturn;\n\t\t}\n\n\t\t// overlapping move and remove, remove happened first\n\t\tif (moveInfo && removalInfo && removeHappenedFirst && !moveIsLocal) {\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst moveClientId = moveInfo.movedClientIds[0]!;\n\t\t\tconst hasOverlap = moveInfo.movedClientIds.length > 1;\n\n\t\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\t\tsegment,\n\t\t\t\t0,\n\t\t\t\t-segment.cachedLength,\n\t\t\t\tsegmentLen,\n\t\t\t\tpartials,\n\t\t\t\tmoveInfo.movedSeq,\n\t\t\t\tmoveClientId,\n\t\t\t\tundefined,\n\t\t\t\thasOverlap ? moveInfo.movedClientIds : undefined,\n\t\t\t);\n\t\t}\n\n\t\tif (removalInfo && !removeHappenedFirst && !removalIsLocal) {\n\t\t\tconst removeSeqOrLocalSeq = removalIsLocal\n\t\t\t\t? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tremovalInfo.localRemovedSeq!\n\t\t\t\t: removalInfo.removedSeq;\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst removeClientId = removalInfo.removedClientIds[0]!;\n\t\t\tconst hasOverlap = removalInfo.removedClientIds.length > 1;\n\n\t\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\t\tsegment,\n\t\t\t\t0,\n\t\t\t\t-segment.cachedLength,\n\t\t\t\tsegmentLen,\n\t\t\t\tpartials,\n\t\t\t\tremoveSeqOrLocalSeq,\n\t\t\t\tremoveClientId,\n\t\t\t\thasOverlap ? removalInfo.removedClientIds : undefined,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t}\n\n\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\tsegment,\n\t\t\tsegmentLen,\n\t\t\tremoteObliteratedLen,\n\t\t\tundefined,\n\t\t\tpartials,\n\t\t\tseqOrLocalSeq,\n\t\t\tclientId,\n\t\t\tremoveClientOverlap,\n\t\t\tmoveClientOverlap,\n\t\t);\n\n\t\t// todo: the below block needs to be changed to handle obliterate, which\n\t\t// doesn't have great support for reconnect at the moment. see ADO #3714\n\t\tconst { unsequencedRecords } = combinedPartialLengths;\n\t\tif (unsequencedRecords && removeClientOverlap && segment.localRemovedSeq !== undefined) {\n\t\t\tconst localSeq = segment.localRemovedSeq;\n\t\t\tconst localPartialLengthEntry: LocalPartialSequenceLength = {\n\t\t\t\tseq: seqOrLocalSeq,\n\t\t\t\tlocalSeq,\n\t\t\t\tclientId,\n\t\t\t\tlen: 0,\n\t\t\t\tseglen: segmentLen,\n\t\t\t};\n\t\t\tlet localIndexFirstGTE = 0;\n\t\t\tfor (\n\t\t\t\t;\n\t\t\t\tlocalIndexFirstGTE < unsequencedRecords.overlappingRemoves.length;\n\t\t\t\tlocalIndexFirstGTE++\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tunsequencedRecords.overlappingRemoves[localIndexFirstGTE]!.seq >= seqOrLocalSeq\n\t\t\t\t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinsertIntoList(\n\t\t\t\tunsequencedRecords.overlappingRemoves,\n\t\t\t\tlocalIndexFirstGTE,\n\t\t\t\tlocalPartialLengthEntry,\n\t\t\t);\n\n\t\t\tconst tweakedLocalPartialEntry = {\n\t\t\t\t...localPartialLengthEntry,\n\t\t\t\tseq: localSeq,\n\t\t\t};\n\n\t\t\tunsequencedRecords.partialLengths.addOrUpdate(tweakedLocalPartialEntry);\n\t\t}\n\t}\n\n\tprivate static addSeq(\n\t\tpartialLengths: PartialSequenceLengthsSet,\n\t\tseq: number,\n\t\tseqSeglen: number,\n\t\tremoteObliteratedLen?: number,\n\t\tclientId?: number,\n\t): void {\n\t\tlet seqPartialLen: PartialSequenceLength | undefined;\n\t\tlet penultPartialLen: PartialSequenceLength | undefined;\n\t\tlet pLen = partialLengths.latestLeq(seq);\n\t\tif (pLen) {\n\t\t\tif (pLen.seq === seq) {\n\t\t\t\tseqPartialLen = pLen;\n\t\t\t\tpLen = partialLengths.latestLeq(seq - 1);\n\t\t\t\tif (pLen) {\n\t\t\t\t\tpenultPartialLen = pLen;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpenultPartialLen = pLen;\n\t\t\t}\n\t\t}\n\t\tconst len = penultPartialLen === undefined ? seqSeglen : penultPartialLen.len + seqSeglen;\n\t\tif (seqPartialLen === undefined) {\n\t\t\tseqPartialLen = {\n\t\t\t\tclientId,\n\t\t\t\tlen,\n\t\t\t\tseglen: seqSeglen,\n\t\t\t\tseq,\n\t\t\t\tremoteObliteratedLen,\n\t\t\t};\n\t\t\tpartialLengths.addOrUpdate(seqPartialLen);\n\t\t} else {\n\t\t\tseqPartialLen.remoteObliteratedLen = remoteObliteratedLen;\n\t\t\tseqPartialLen.seglen = seqSeglen;\n\t\t\tseqPartialLen.len = len;\n\t\t\t// Assert client id matches\n\t\t}\n\t}\n\n\t/**\n\t * Length of the block this PartialSequenceLength corresponds to when viewed at `minSeq`.\n\t */\n\tprivate minLength = 0;\n\n\t/**\n\t * Total number of segments in the subtree rooted at the block this PartialSequenceLength corresponds to.\n\t */\n\tprivate segmentCount = 0;\n\n\t/**\n\t * List of PartialSequenceLength objects--ordered by increasing seq--giving length information about\n\t * the block associated with this PartialSequenceLengths object.\n\t *\n\t * `partialLengths[i].len` contains the length of this block considering only sequenced segments with\n\t * `sequenceNumber <= partialLengths[i].seq`.\n\t */\n\tprivate readonly partialLengths: PartialSequenceLengthsSet = new PartialSequenceLengthsSet();\n\n\t/**\n\t * clientSeqNumbers[clientId] is a list of partial lengths for sequenced ops which either:\n\t * - were submitted by `clientId`.\n\t * - deleted a range containing segments that were concurrently deleted by `clientId`\n\t *\n\t * The second case is referred to as the \"overlapping delete\" case. It is necessary to avoid double-counting\n\t * the removal of those segments in queries including clientId.\n\t */\n\tprivate readonly clientSeqNumbers: PartialSequenceLengthsSet[] = [];\n\n\t/**\n\t * Contains information required to answer queries for the length of this segment from the perspective of\n\t * the local client but not including all local segments (i.e., `localSeq !== collabWindow.localSeq`).\n\t * This field is only computed if requested in the constructor (i.e. `computeLocalPartials === true`).\n\t */\n\tprivate unsequencedRecords: UnsequencedPartialLengthInfo | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * The minimumSequenceNumber as defined by the collab window used in the last call to `update`,\n\t\t * or if no such calls have been made, the one used on construction.\n\t\t */\n\t\tpublic minSeq: number,\n\t\tcomputeLocalPartials: boolean,\n\t) {\n\t\tif (computeLocalPartials) {\n\t\t\tthis.unsequencedRecords = {\n\t\t\t\tpartialLengths: new PartialSequenceLengthsSet(),\n\t\t\t\toverlappingRemoves: [],\n\t\t\t\tcachedOverlappingByRefSeq: new Map(),\n\t\t\t};\n\t\t}\n\t}\n\n\t// Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n\t// with sequence number seq has been added within the sub-tree (and `update` has been called\n\t// on all descendant PartialSequenceLengths)\n\t// TODO: assert client id matches\n\tpublic update(\n\t\tnode: MergeBlock,\n\t\tseq: number,\n\t\tclientId: number,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t): void {\n\t\tlet seqSeglen = 0;\n\t\tlet remoteObliteratedLen = 0;\n\t\tlet segCount = 0;\n\t\t// Compute length for seq across children\n\t\tfor (let i = 0; i < node.childCount; i++) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst child = node.children[i]!;\n\t\t\tif (child.isLeaf()) {\n\t\t\t\tconst segment = child;\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\tconst removalIsLocal =\n\t\t\t\t\t!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;\n\t\t\t\tconst moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;\n\n\t\t\t\tconst removeHappenedFirst =\n\t\t\t\t\tremovalInfo &&\n\t\t\t\t\t(!moveInfo ||\n\t\t\t\t\t\tmoveIsLocal ||\n\t\t\t\t\t\t(!removalIsLocal && moveInfo.movedSeq > removalInfo.removedSeq));\n\n\t\t\t\tif (seq === segment.seq) {\n\t\t\t\t\t// if this segment was moved on insert, its length should\n\t\t\t\t\t// only be visible to the inserting client\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.wasMovedOnInsert &&\n\t\t\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\t\t\tmoveInfo &&\n\t\t\t\t\t\tmoveInfo.movedSeq < segment.seq\n\t\t\t\t\t) {\n\t\t\t\t\t\tremoteObliteratedLen += segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tseqSeglen += segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seq === removalInfo?.removedSeq) {\n\t\t\t\t\t// if the remove op happened before an overlapping obliterate,\n\t\t\t\t\t// all clients can see the remove at this seq. otherwise, only\n\t\t\t\t\t// the removing client is aware of the remove\n\t\t\t\t\tif (removeHappenedFirst) {\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tremoteObliteratedLen -= segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seq === moveInfo?.movedSeq) {\n\t\t\t\t\tif (removeHappenedFirst) {\n\t\t\t\t\t\tremoteObliteratedLen -= segment.cachedLength;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tsegment.wasMovedOnInsert &&\n\t\t\t\t\t\tsegment.seq !== UnassignedSequenceNumber &&\n\t\t\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\t\t\tmoveInfo.movedSeq > segment.seq\n\t\t\t\t\t) {\n\t\t\t\t\t\tremoteObliteratedLen += segment.cachedLength;\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t} else if (segment.seq !== UnassignedSequenceNumber) {\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsegCount++;\n\t\t\t} else {\n\t\t\t\tconst childBlock = child;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst branchPartialLengths = childBlock.partialLengths!;\n\t\t\t\tconst partialLengths = branchPartialLengths.partialLengths;\n\t\t\t\tconst leqPartial = partialLengths.latestLeq(seq);\n\t\t\t\tif (leqPartial && leqPartial.seq === seq) {\n\t\t\t\t\tseqSeglen += leqPartial.seglen;\n\t\t\t\t\tremoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;\n\t\t\t\t}\n\t\t\t\tsegCount += branchPartialLengths.segmentCount;\n\t\t\t}\n\t\t}\n\t\tthis.segmentCount = segCount;\n\t\tthis.unsequencedRecords = undefined;\n\n\t\tPartialSequenceLengths.addSeq(\n\t\t\tthis.partialLengths,\n\t\t\tseq,\n\t\t\tseqSeglen,\n\t\t\tremoteObliteratedLen,\n\t\t\tclientId,\n\t\t);\n\t\tthis.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();\n\t\tPartialSequenceLengths.addSeq(\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.clientSeqNumbers[clientId]!,\n\t\t\tseq,\n\t\t\tseqSeglen + remoteObliteratedLen,\n\t\t\tundefined,\n\t\t\tclientId,\n\t\t);\n\t\tif (PartialSequenceLengths.options.zamboni) {\n\t\t\tthis.zamboni(collabWindow);\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(this);\n\t}\n\n\t/**\n\t * Returns the length of this block as viewed from the perspective of `clientId` at `refSeq`.\n\t * This is the total length of all segments sequenced at or before refSeq OR submitted by `clientId`.\n\t * If `clientId` is the local client, `localSeq` can also be provided. In that case, it is the total\n\t * length of all segments submitted at or before `refSeq` in addition to any local, unacked segments\n\t * with `segment.localSeq <= localSeq`.\n\t *\n\t * Note: the local case (where `localSeq !== undefined`) is only supported on a PartialSequenceLength object\n\t * constructed with `computeLocalPartials` set to true and not subsequently updated with `update`.\n\t */\n\tpublic getPartialLength(refSeq: number, clientId: number, localSeq?: number): number {\n\t\tlet pLen = this.minLength;\n\t\tconst cliLatestIndex = this.cliLatest(clientId);\n\t\t// TODO Non null asserting, why is this not null?\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst cliSeq = this.clientSeqNumbers[clientId]!;\n\t\tpLen += this.partialLengths.latestLeq(refSeq)?.len ?? 0;\n\n\t\tif (localSeq === undefined) {\n\t\t\tif (cliLatestIndex >= 0) {\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst cliLatest = cliSeq.items[cliLatestIndex]!;\n\t\t\t\tif (cliLatest.seq > refSeq) {\n\t\t\t\t\t// The client has local edits after refSeq, add in the length adjustments\n\t\t\t\t\tpLen += cliLatest.len;\n\t\t\t\t\tconst precedingCli = this.cliLatestLEQ(clientId, refSeq);\n\t\t\t\t\tif (precedingCli) {\n\t\t\t\t\t\t// Subtract out double-counted lengths: segments still in the collab window but before\n\t\t\t\t\t\t// the refSeq submitted by the client we're querying for were counted in each addition above.\n\t\t\t\t\t\tpLen -= precedingCli.len;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.unsequencedRecords !== undefined,\n\t\t\t\t0x39f /* Local getPartialLength invoked without computing local partials. */,\n\t\t\t);\n\t\t\tconst unsequencedPartialLengths = this.unsequencedRecords.partialLengths;\n\t\t\t// Local segments at or before localSeq should also be included\n\t\t\tconst local = unsequencedPartialLengths.latestLeq(localSeq);\n\t\t\tif (local) {\n\t\t\t\tpLen += local.len;\n\n\t\t\t\t// Lastly, we must subtract out any double-counted removes, which occur if a currently un-acked local\n\t\t\t\t// remove overlaps with a remote client's remove that occurred at sequence number <=refSeq.\n\t\t\t\tpLen -= this.computeOverlappingLocalRemoves(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t\treturn pLen;\n\t}\n\n\t/**\n\t * Computes the seglen for the double-counted removed overlap at (refSeq, localSeq). This logic is equivalent\n\t * to the following:\n\t *\n\t * ```typescript\n\t * let total = 0;\n\t * for (const partialLength of this.unsequencedRecords!.overlappingRemoves) {\n\t * if (partialLength.seq > refSeq) {\n\t * break;\n\t * }\n\t *\n\t * if (partialLength.localSeq <= localSeq) {\n\t * total += partialLength.seglen;\n\t * }\n\t * }\n\t *\n\t * return total;\n\t * ```\n\t *\n\t * Reconnect happens to only need to compute these lengths for two refSeq values: before and\n\t * after the rebase. Since these lists potentially scale with O(collab window * number of local edits)\n\t * and potentially need to be queried for each local op that gets rebased,\n\t * we cache the results for a given refSeq in `this.unsequencedRecords.cachedOverlappingByRefSeq` so\n\t * that they can be binary-searched the same way the usual partialLengths lists are.\n\t */\n\tprivate computeOverlappingLocalRemoves(refSeq: number, localSeq: number): number {\n\t\tif (this.unsequencedRecords === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet cachedOverlapPartials = this.unsequencedRecords.cachedOverlappingByRefSeq.get(refSeq);\n\t\tif (!cachedOverlapPartials) {\n\t\t\tconst partials: PartialSequenceLengthsSet = new PartialSequenceLengthsSet();\n\t\t\tfor (const partial of this.unsequencedRecords.overlappingRemoves) {\n\t\t\t\tif (partial.seq > refSeq) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpartials.addOrUpdate({ ...partial, seq: partial.localSeq, len: 0 });\n\t\t\t}\n\t\t\t// This coalesces entries with the same localSeq as well as computes overall lengths.\n\t\t\tcachedOverlapPartials = partials;\n\t\t\tthis.unsequencedRecords.cachedOverlappingByRefSeq.set(refSeq, cachedOverlapPartials);\n\t\t}\n\n\t\tconst overlap = cachedOverlapPartials.latestLeq(localSeq);\n\t\treturn overlap?.len ?? 0;\n\t}\n\n\tpublic toString(glc?: (id: number) => string, indentCount = 0): string {\n\t\tlet buf = \"\";\n\t\tfor (const partial of this.partialLengths.items) {\n\t\t\tbuf += `(${partial.seq},${partial.len}) `;\n\t\t}\n\n\t\t// TODO Non null asserting, why is this not null?\n\t\t// eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax, guard-for-in\n\t\tfor (const clientId in this.clientSeqNumbers) {\n\t\t\tconst seqNumber = this.clientSeqNumbers[clientId];\n\t\t\tif (seqNumber !== undefined && seqNumber.size > 0) {\n\t\t\t\tbuf += `Client `;\n\t\t\t\tbuf += glc ? `${glc(+clientId)}` : `${clientId}`;\n\t\t\t\tbuf += \"[\";\n\t\t\t\tfor (const partial of seqNumber.items) {\n\t\t\t\t\tbuf += `(${partial.seq},${partial.len})`;\n\t\t\t\t}\n\t\t\t\tbuf += \"]\";\n\t\t\t}\n\t\t}\n\t\tbuf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n\t\treturn buf;\n\t}\n\n\t// Clear away partial sums for sequence numbers earlier than the current window\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate zamboni(segmentWindow: CollaborationWindow): void {\n\t\tthis.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);\n\t\tthis.minSeq = segmentWindow.minSeq;\n\t\t// eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n\t\tfor (const clientId in this.clientSeqNumbers) {\n\t\t\tconst cliPartials = this.clientSeqNumbers[clientId];\n\t\t\tif (cliPartials) {\n\t\t\t\tcliPartials.copyDown(segmentWindow.minSeq);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addClientSeqNumber(clientId: number, seq: number, seglen: number): void {\n\t\tthis.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();\n\t\t// TODO Non null asserting, why is this not null?\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tconst cli = this.clientSeqNumbers[clientId]!;\n\t\tcli.addOrUpdate({ seq, len: 0, seglen });\n\t}\n\n\t// Assumes sequence number already coalesced and that this is called in increasing `seq` order.\n\tprivate addClientSeqNumberFromPartial(partialLength: PartialSequenceLength): void {\n\t\tconst seglen = partialLength.seglen + (partialLength.remoteObliteratedLen ?? 0);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tthis.addClientSeqNumber(partialLength.clientId!, partialLength.seq, seglen);\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\tpartialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n\t\t\t\t// Original client entry was handled above\n\t\t\t\tif (partialLength.clientId !== oc.data.clientId) {\n\t\t\t\t\tthis.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\tpartialLength.overlapObliterateClients.map((oc: Property<number, IOverlapClient>) => {\n\t\t\t\t// Original client entry was handled above\n\t\t\t\tif (partialLength.clientId !== oc.data.clientId) {\n\t\t\t\t\tthis.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate cliLatestLEQ(clientId: number, refSeq: number): PartialSequenceLength | undefined {\n\t\treturn this.clientSeqNumbers[clientId]?.latestLeq(refSeq);\n\t}\n\n\tprivate cliLatest(clientId: number): number {\n\t\tconst cliSeqs = this.clientSeqNumbers[clientId];\n\t\treturn cliSeqs && cliSeqs.size > 0 ? cliSeqs.size - 1 : -1;\n\t}\n}\n\n/* eslint-disable @typescript-eslint/dot-notation */\nfunction verifyPartialLengthsInner(\n\tpartialSeqLengths: PartialSequenceLengths,\n\tpartialLengths: PartialSequenceLengthsSet,\n\tclientPartials: boolean,\n): number {\n\tif (partialLengths.size === 0) {\n\t\treturn 0;\n\t}\n\n\tlet lastSeqNum = 0;\n\tlet accumSegLen = 0;\n\tlet count = 0;\n\n\tfor (const partialLength of partialLengths.items) {\n\t\t// Count total number of partial length entries\n\t\tcount++;\n\n\t\t// Sequence number should be larger or equal to minseq\n\t\tassert(\n\t\t\tpartialSeqLengths.minSeq <= partialLength.seq,\n\t\t\t0x054 /* \"Sequence number less than minSeq!\" */,\n\t\t);\n\n\t\t// Sequence number should be sorted\n\t\tassert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n\t\tlastSeqNum = partialLength.seq;\n\n\t\t// Len is a accumulation of all the seglen adjustments\n\t\taccumSegLen += partialLength.seglen;\n\t\tif (accumSegLen !== partialLength.len) {\n\t\t\tassert(\n\t\t\t\tfalse,\n\t\t\t\t0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */,\n\t\t\t);\n\t\t}\n\n\t\tif (clientPartials) {\n\t\t\t// Client partials used to track local edits so we can account for them some refSeq.\n\t\t\t// But the information we keep track of are since minSeq, so we keep track of more history\n\t\t\t// then needed, and some of them doesn't make sense to be used for length calculations\n\t\t\t// e.g. if you have this sequence, where the minSeq is #5 because of other clients\n\t\t\t// seq 10: client 1: insert seg #1\n\t\t\t// seq 11: client 2: delete seg #2 refseq: 10\n\t\t\t// minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n\t\t\t// So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n\t\t\t// However, that combination is invalid, since we should never see any ops with refseq < 10 for\n\t\t\t// client 2 after seq 11.\n\t\t} else {\n\t\t\t// Len adjustment should not make length negative\n\t\t\tif (partialSeqLengths[\"minLength\"] + partialLength.len < 0) {\n\t\t\t\tassert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n\t\t\t}\n\t\t}\n\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\t// Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n\t\t\tassert(\n\t\t\t\t!clientPartials,\n\t\t\t\t0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */,\n\t\t\t);\n\n\t\t\t// Each overlap client counts as one, but the first remove to sequence was already counted.\n\t\t\t// (this aligns with the logic to omit the removing client in `addClientSeqNumberFromPartial`)\n\t\t\tcount += partialLength.overlapRemoveClients.size() - 1;\n\t\t}\n\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\t// Only the flat partialLengths can have overlapObliterateClients, the per client view shouldn't\n\t\t\tassert(\n\t\t\t\t!clientPartials,\n\t\t\t\t0x872 /* Both overlapObliterateClients and clientPartials are set! */,\n\t\t\t);\n\n\t\t\t// Each overlap client counts as one, but the first move to sequence was already counted.\n\t\t\t// (this aligns with the logic to omit the moving client in `addClientSeqNumberFromPartial`)\n\t\t\tcount += partialLength.overlapObliterateClients.size() - 1;\n\t\t}\n\t}\n\treturn count;\n}\n\nexport function verifyExpectedPartialLengths(\n\tmergeTree: MergeTree,\n\tnode: MergeBlock,\n\trefSeq: number,\n\tclientId: number,\n\tlocalSeq?: number,\n): void {\n\tif (\n\t\t(!mergeTree.collabWindow.collaborating || mergeTree.collabWindow.clientId === clientId) &&\n\t\t(node.isLeaf() || localSeq === undefined)\n\t) {\n\t\treturn;\n\t}\n\n\tconst partialLen = node.partialLengths?.getPartialLength(refSeq, clientId, localSeq);\n\n\tlet expected = 0;\n\tconst nodesToVisit: IMergeNode[] = [node];\n\n\twhile (nodesToVisit.length > 0) {\n\t\tconst thisNode = nodesToVisit.pop();\n\t\tif (!thisNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (thisNode.isLeaf()) {\n\t\t\texpected += mergeTree[\"nodeLength\"](thisNode, refSeq, clientId, localSeq) ?? 0;\n\t\t} else {\n\t\t\tnodesToVisit.push(...thisNode.children.slice(0, thisNode.childCount));\n\t\t}\n\t}\n\n\tif (expected !== partialLen) {\n\t\tnode.partialLengths?.getPartialLength(refSeq, clientId, localSeq);\n\t\tthrow new Error(\n\t\t\t`expected partial length of ${expected} but found ${partialLen}. refSeq: ${refSeq}, clientId: ${clientId}`,\n\t\t);\n\t}\n}\n\nexport function verifyPartialLengths(partialSeqLengths: PartialSequenceLengths): void {\n\tif (partialSeqLengths[\"clientSeqNumbers\"]) {\n\t\tfor (const cliSeq of partialSeqLengths[\"clientSeqNumbers\"]) {\n\t\t\tif (cliSeq) {\n\t\t\t\tverifyPartialLengthsInner(partialSeqLengths, cliSeq, true);\n\t\t\t}\n\t\t}\n\n\t\t// If we have client view, we should have the flat view\n\t\tassert(\n\t\t\t!!partialSeqLengths[\"partialLengths\"],\n\t\t\t0x059 /* \"Client view exists but flat view does not!\" */,\n\t\t);\n\n\t\tverifyPartialLengthsInner(partialSeqLengths, partialSeqLengths[\"partialLengths\"], false);\n\t} else {\n\t\t// If we don't have a client view, we shouldn't have the flat view either\n\t\tassert(\n\t\t\t!partialSeqLengths[\"partialLengths\"],\n\t\t\t0x05b /* \"Flat view exists but client view does not!\" */,\n\t\t);\n\t}\n}\n/* eslint-enable @typescript-eslint/dot-notation */\n\n/**\n * Clones an `overlapRemoveClients` red-black tree.\n */\nfunction cloneOverlapRemoveClients(\n\toldTree: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n\tif (!oldTree) {\n\t\treturn undefined;\n\t}\n\tconst newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n\toldTree.map((bProp: Property<number, IOverlapClient>) => {\n\t\tnewTree.put(bProp.data.clientId, { ...bProp.data });\n\t\treturn true;\n\t});\n\treturn newTree;\n}\n\nfunction combineForOverlapClients(\n\ttreeA: RedBlackTree<number, IOverlapClient> | undefined,\n\ttreeB: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n\tif (treeA) {\n\t\tif (treeB) {\n\t\t\ttreeB.map((bProp: Property<number, IOverlapClient>) => {\n\t\t\t\tconst aProp = treeA.get(bProp.key);\n\t\t\t\tif (aProp) {\n\t\t\t\t\taProp.data.seglen += bProp.data.seglen;\n\t\t\t\t} else {\n\t\t\t\t\ttreeA.put(bProp.data.clientId, { ...bProp.data });\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t} else {\n\t\treturn cloneOverlapRemoveClients(treeB);\n\t}\n}\n\n/**\n * Combines the `overlapRemoveClients` and `overlapObliterateClients` fields of\n * two `PartialSequenceLength` objects, modifying the first PartialSequenceLength's\n * bookkeeping in-place.\n *\n * Combination is performed additively on `seglen` on a per-client basis.\n */\nexport function combineOverlapClients(\n\ta: PartialSequenceLength,\n\tb: PartialSequenceLength,\n): void {\n\tconst overlapRemoveClients = combineForOverlapClients(\n\t\ta.overlapRemoveClients,\n\t\tb.overlapRemoveClients,\n\t);\n\tif (overlapRemoveClients) {\n\t\ta.overlapRemoveClients = overlapRemoveClients;\n\t}\n\n\tconst overlapObliterateClients = combineForOverlapClients(\n\t\ta.overlapObliterateClients,\n\t\tb.overlapObliterateClients,\n\t);\n\tif (overlapObliterateClients) {\n\t\ta.overlapObliterateClients = overlapObliterateClients;\n\t}\n}\n\n/**\n * Given a number of seq-sorted `partialLength` lists, merges them into a combined seq-sorted `partialLength`\n * list. This merge includes coalescing `PartialSequenceLength` entries at the same seq.\n *\n * Ex: merging the following two lists (some information omitted on each PartialSequenceLength):\n * ```typescript\n * [{ seq: 1, seglen: 5 }, { seq: 3, seglen: -1 }]\n * [{ seq: 1, seglen: -3 }, { seq: 2: seglen: 4 }]\n * ```\n * would produce\n * ```typescript\n * [{ seq: 1, seglen: 2 }, { seq: 2, seglen: 4 }, { seq: 3, seglen: -1 }]\n * ```\n */\nfunction mergePartialLengths(\n\tchildPartialLengths: PartialSequenceLength[][],\n\tmergedLengths: PartialSequenceLengthsSet = new PartialSequenceLengthsSet(),\n): PartialSequenceLengthsSet {\n\tfor (const partialLength of mergeSortedListsBySeq(childPartialLengths)) {\n\t\tmergedLengths.addOrUpdate({\n\t\t\t...partialLength,\n\t\t\toverlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n\t\t\toverlapObliterateClients: cloneOverlapRemoveClients(\n\t\t\t\tpartialLength.overlapObliterateClients,\n\t\t\t),\n\t\t});\n\t}\n\treturn mergedLengths;\n}\n\n/**\n * Given a collection of PartialSequenceLength lists--each sorted by sequence number--returns an iterable that yields\n * each PartialSequenceLength in sequence order.\n *\n * This is equivalent to flattening the input list and sorting it by sequence number. If the number of lists to merge is\n * a constant, however, this approach is advantageous asymptotically.\n */\nfunction mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): Iterable<T> {\n\tclass PartialSequenceLengthIterator {\n\t\t/**\n\t\t * nextSmallestIndex[i] is the next element of sublists[i] to check.\n\t\t * In other words, the iterator has already yielded elements of sublists[i] *up through*\n\t\t * sublists[i][nextSmallestIndex[i] - 1].\n\t\t */\n\t\tprivate readonly nextSmallestIndex: number[];\n\n\t\tconstructor(private readonly sublists: T[][]) {\n\t\t\tthis.nextSmallestIndex = Array.from({ length: sublists.length });\n\t\t\tfor (let i = 0; i < sublists.length; i++) {\n\t\t\t\tthis.nextSmallestIndex[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic next(): { value: T; done: false } | { value: undefined; done: true } {\n\t\t\tconst len = this.sublists.length;\n\t\t\tlet currentMin: T | undefined;\n\t\t\tlet currentMinIndex: number | undefined;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst candidateIndex = this.nextSmallestIndex[i]!;\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst list = this.sublists[i]!;\n\t\t\t\tif (candidateIndex < list.length) {\n\t\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tconst candidate = list[candidateIndex]!;\n\t\t\t\t\tif (!currentMin || candidate.seq < currentMin.seq) {\n\t\t\t\t\t\tcurrentMin = candidate;\n\t\t\t\t\t\tcurrentMinIndex = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentMin) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.nextSmallestIndex[currentMinIndex!]++;\n\t\t\t\treturn { value: currentMin, done: false };\n\t\t\t} else {\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { [Symbol.iterator]: () => new PartialSequenceLengthIterator(lists) };\n}\n\nfunction insertIntoList<T>(list: T[], index: number, elem: T): void {\n\tif (index < list.length) {\n\t\tfor (let k = list.length; k > index; k--) {\n\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tlist[k] = list[k - 1]!;\n\t\t}\n\t\tlist[index] = elem;\n\t} else {\n\t\tlist.push(elem);\n\t}\n}\n"]}
1
+ {"version":3,"file":"partialLengths.js","sourceRoot":"","sources":["../src/partialLengths.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nimport { Property, RedBlackTree } from \"./collections/index.js\";\nimport { UnassignedSequenceNumber } from \"./constants.js\";\nimport { MergeTree } from \"./mergeTree.js\";\nimport {\n\t// eslint-disable-next-line import/no-deprecated\n\tCollaborationWindow,\n\tIMergeNode,\n\tIMoveInfo,\n\tIRemovalInfo,\n\tISegment,\n\tcompareNumbers,\n\tseqLTE,\n\ttoMoveInfo,\n\ttoRemovalInfo,\n\ttype MergeBlock,\n} from \"./mergeTreeNodes.js\";\n// eslint-disable-next-line import/no-deprecated\nimport { SortedSet } from \"./sortedSet.js\";\n\n// eslint-disable-next-line import/no-deprecated\nclass PartialSequenceLengthsSet extends SortedSet<PartialSequenceLength, number> {\n\tprotected getKey(item: PartialSequenceLength): number {\n\t\treturn item.seq;\n\t}\n\n\tpublic addOrUpdate(\n\t\tnewItem: PartialSequenceLength,\n\t\tupdate?: (existingItem: PartialSequenceLength, newItem: PartialSequenceLength) => void,\n\t): void {\n\t\tconst prev = this.latestLeq(newItem.seq);\n\n\t\tif (prev?.seq !== newItem.seq) {\n\t\t\t// new element, update len\n\t\t\tnewItem.len = (prev?.len ?? 0) + newItem.seglen;\n\t\t}\n\n\t\t// update the len of all following elements\n\t\tfor (let i = this.keySortedItems.length - 1; i >= 0; i--) {\n\t\t\tconst element = this.keySortedItems[i];\n\t\t\tif (!element || element.seq <= newItem.seq) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\telement.len += newItem.seglen;\n\t\t}\n\n\t\tsuper.addOrUpdate(newItem, (currentPartial, partialLength) => {\n\t\t\tcurrentPartial.seglen += partialLength.seglen;\n\n\t\t\tif (partialLength.remoteObliteratedLen) {\n\t\t\t\tcurrentPartial.remoteObliteratedLen ??= 0;\n\t\t\t\tcurrentPartial.remoteObliteratedLen += partialLength.remoteObliteratedLen;\n\t\t\t}\n\n\t\t\tcurrentPartial.len += partialLength.seglen;\n\t\t\tcombineOverlapClients(currentPartial, partialLength);\n\t\t});\n\t}\n\n\t/**\n\t * Returns the partial length whose sequence number is the greatest sequence\n\t * number that is less than or equal to key.\n\t * @param key - sequence number\n\t */\n\tlatestLeq(key: number): PartialSequenceLength | undefined {\n\t\treturn this.keySortedItems[this.latestLeqIndex(key)];\n\t}\n\n\t/**\n\t * Returns the partial length whose sequence number is the lowest sequence\n\t * number that is greater than or equal to key.\n\t * @param key - sequence number\n\t */\n\tfirstGte(key: number): PartialSequenceLength | undefined {\n\t\tconst { index } = this.findItemPosition({ seq: key, len: 0, seglen: 0 });\n\t\treturn this.keySortedItems[index];\n\t}\n\n\tprivate latestLeqIndex(key: number): number {\n\t\tconst { exists, index } = this.findItemPosition({ seq: key, len: 0, seglen: 0 });\n\t\treturn exists ? index : index - 1;\n\t}\n\n\tcopyDown(minSeq: number): number {\n\t\tconst mindex = this.latestLeqIndex(minSeq);\n\t\tlet minLength = 0;\n\t\tif (mindex >= 0) {\n\t\t\tminLength = this.keySortedItems[mindex].len;\n\t\t\tconst seqCount = this.size;\n\t\t\tif (mindex <= seqCount - 1) {\n\t\t\t\t// Still some entries remaining\n\t\t\t\tconst remainingCount = seqCount - mindex - 1;\n\t\t\t\t// Copy down\n\t\t\t\tfor (let i = 0; i < remainingCount; i++) {\n\t\t\t\t\tthis.keySortedItems[i] = this.keySortedItems[i + mindex + 1];\n\t\t\t\t\tthis.keySortedItems[i].len -= minLength;\n\t\t\t\t}\n\t\t\t\tthis.keySortedItems.length = remainingCount;\n\t\t\t}\n\t\t}\n\t\treturn minLength;\n\t}\n}\n\ninterface IOverlapClient {\n\tclientId: number;\n\tseglen: number;\n}\n\n/**\n * Tracks length information for a part of a MergeTree (block) at a given time (seq).\n * These objects are associated with internal nodes (i.e. blocks).\n */\nexport interface PartialSequenceLength {\n\t/**\n\t * Sequence number\n\t */\n\tseq: number;\n\t/**\n\t * The length of the associated block.\n\t */\n\tlen: number;\n\t/**\n\t * The delta between the current length of the associated block and its length at the previous seq number.\n\t */\n\tseglen: number;\n\t/**\n\t * clientId for the client that submitted the op with sequence number `seq`.\n\t */\n\tclientId?: number;\n\t/**\n\t * If this partial length obliterated remote segments, this is the length of\n\t * those segments\n\t */\n\tremoteObliteratedLen?: number;\n\t/**\n\t * This field maps each client to the size of the intersection between segments deleted at this seq\n\t * and segments concurrently deleted by that client.\n\t *\n\t * For example, this PartialSequenceLength:\n\t * ```typescript\n\t * {\n\t * seq: 5,\n\t * len: 100,\n\t * seglen: -10,\n\t * clientId: 0,\n\t * overlapRemoveClients: <RedBlack tree with key-values expressed by>{\n\t * 1: { clientId: 1, seglen: -5 },\n\t * 3: { clientId: 3, seglen: -10 }\n\t * }\n\t * }\n\t * ```\n\t *\n\t * corresponds to an op submitted by client 0 which:\n\t * - reduces the length of this block by 10 (it may have deleted a single segment of length 10,\n\t * several segments totalling length 10, or even delete and add content for a total reduction of 10 length)\n\t * - was concurrent to one or more ops submitted by client 1 that also removed some of the same segments,\n\t * whose length totalled 5\n\t * - was concurrent to one or more ops submitted by client 3 that removed some of the same segments,\n\t * whose length totalled 10\n\t */\n\toverlapRemoveClients?: RedBlackTree<number, IOverlapClient>;\n\t/**\n\t * This field is the same as `overlapRemoveClients`, except that it tracks\n\t * overlapping obliterates rather than removes.\n\t */\n\toverlapObliterateClients?: RedBlackTree<number, IOverlapClient>;\n}\n\ninterface UnsequencedPartialLengthInfo {\n\t/**\n\t * Contains entries for all local operations.\n\t * The \"seq\" field of each entry actually corresponds to the delta at that localSeq on the local client.\n\t */\n\tpartialLengths: PartialSequenceLengthsSet;\n\n\t/**\n\t * Only contains entries for segments (or aggregates thereof) which were concurrently deleted\n\t * by another client. Ordered by `seq` of the removing client.\n\t *\n\t * The \"length\" field of these entries is not populated. This is because pre-computing the lengths\n\t * of segments doesn't help given the usage pattern.\n\t *\n\t * These entries need both `seq` and `localSeq`, because a given segment remove is double-counted iff\n\t * the refSeq exceeds the seq of the remote remove AND the localSeq exceeds the localSeq of the local remove.\n\t */\n\toverlappingRemoves: LocalPartialSequenceLength[];\n\n\t/**\n\t * Cached keyed on refSeq which stores length information for the total overlap of removed segments at\n\t * that refSeq.\n\t * This information is derivable from the entries of `overlappingRemoves`.\n\t *\n\t * Like the `partialLengths` field, `seq` on each entry is actually the local seq.\n\t * See `computeOverlappingLocalRemoves` for more information.\n\t */\n\tcachedOverlappingByRefSeq: Map<number, PartialSequenceLengthsSet>;\n}\n\ninterface LocalPartialSequenceLength extends PartialSequenceLength {\n\t/**\n\t * Local sequence number\n\t */\n\tlocalSeq: number;\n}\n\nexport interface PartialSequenceLengthsOptions {\n\tverifier?: (partialLengths: PartialSequenceLengths) => void;\n\tverifyExpected?: (\n\t\tmergeTree: MergeTree,\n\t\tnode: MergeBlock,\n\t\trefSeq: number,\n\t\tclientId: number,\n\t\tlocalSeq?: number,\n\t) => void;\n\tzamboni: boolean;\n}\n\n/**\n * Keeps track of partial sums of segment lengths for all sequence numbers in the current collaboration window.\n * Only used during active collaboration.\n *\n * This class is associated with an internal node (block) of a MergeTree. It efficiently answers queries of the form\n * \"What is the length of `block` from the perspective of some particular seq and clientId?\".\n *\n * It also supports incremental updating of state for newly-sequenced ops that don't affect the structure of the\n * MergeTree.\n *\n * To answer these queries, it pre-builds several lists which track the length of the block at a per-sequence-number\n * level. These lists are:\n *\n * 1. (`partialLengths`): Stores the total length of the block.\n * 2. (`clientSeqNumbers[clientId]`): Stores only the total lengths of segments submitted by `clientId`. [see footnote]\n *\n * The reason both lists are necessary is that resolving the length of the block from the perspective of\n * (clientId, refSeq) requires including both of the following types of segments:\n * 1. Segments sequenced before `refSeq`\n * 2. Segments submitted by `clientId`\n *\n * This is possible with the above bookkeeping, using:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (clientSeqNumbers total length at most recent op)\n * - (clientSeqNumbers total length at refSeq)\n *\n * where the subtraction avoids double-counting segments submitted by clientId sequenced within the collab window.\n *\n * To enable reconnect, if constructed with `computeLocalPartials === true` it also supports querying for the length of\n * the block from the perspective of the local client at a particular `refSeq` and `localSeq`. This computation is\n * similar to the above:\n *\n * (length of the block at the minimum sequence number)\n * + (partialLengths total length at refSeq)\n * + (unsequenced edits' total length submitted before localSeq)\n * - (overlapping remove of the unsequenced edits' total length at refSeq)\n *\n * This algorithm scales roughly linearly with number of editing clients and the size of the collab window.\n * (certain unlikely sequences of operations may introduce log factors on those variables)\n *\n * Note: there is some slight complication with clientSeqNumbers resulting from the possibility of different clients\n * concurrently removing the same segment. See the field's documentation for more details.\n */\nexport class PartialSequenceLengths {\n\tpublic static options: PartialSequenceLengthsOptions = {\n\t\tzamboni: true,\n\t};\n\n\t/**\n\t * Combine the partial lengths of block's children\n\t * @param block - an interior node. If `recur` is false, it is assumed that each interior node child of this block\n\t * has its partials up to date.\n\t * @param collabWindow - segment window of the segment tree containing `block`.\n\t * @param recur - whether to recursively compute partial lengths for internal children of `block`.\n\t * This incurs more work, but gives correct bookkeeping in the case that a descendant in the merge tree has been\n\t * modified without bubbling up the resulting partial length change to this block's partials.\n\t * @param computeLocalPartials - whether to compute partial length information about local unsequenced ops.\n\t * This enables querying for the length of the block at a given localSeq, but incurs extra work.\n\t * Local partial information doesn't support `update`.\n\t */\n\tpublic static combine(\n\t\tblock: MergeBlock,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t\trecur = false,\n\t\tcomputeLocalPartials = false,\n\t): PartialSequenceLengths {\n\t\tconst leafPartialLengths = PartialSequenceLengths.fromLeaves(\n\t\t\tblock,\n\t\t\tcollabWindow,\n\t\t\tcomputeLocalPartials,\n\t\t);\n\n\t\tlet hasInternalChild = false;\n\t\tconst childPartials: PartialSequenceLengths[] = [];\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tif (!child.isLeaf()) {\n\t\t\t\thasInternalChild = true;\n\t\t\t\tif (recur) {\n\t\t\t\t\tchild.partialLengths = PartialSequenceLengths.combine(\n\t\t\t\t\t\tchild,\n\t\t\t\t\t\tcollabWindow,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tcomputeLocalPartials,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tchildPartials.push(child.partialLengths!);\n\t\t\t}\n\t\t}\n\n\t\t// If there are no internal children, the PartialSequenceLengths returns from `fromLeaves` is exactly correct.\n\t\t// Otherwise, we must additively combine all of the children partial lengths to get this block's totals.\n\t\tconst combinedPartialLengths = hasInternalChild\n\t\t\t? new PartialSequenceLengths(collabWindow.minSeq, computeLocalPartials)\n\t\t\t: leafPartialLengths;\n\t\tif (hasInternalChild) {\n\t\t\tif (leafPartialLengths.partialLengths.size > 0) {\n\t\t\t\t// Some children were leaves; add combined partials from these segments\n\t\t\t\tchildPartials.push(leafPartialLengths);\n\t\t\t}\n\n\t\t\tconst childPartialsLen = childPartials.length;\n\n\t\t\tconst childPartialLengths: PartialSequenceLength[][] = [];\n\t\t\tconst childUnsequencedPartialLengths: PartialSequenceLength[][] = [];\n\t\t\tconst childOverlapRemoves: LocalPartialSequenceLength[][] = [];\n\t\t\tfor (let i = 0; i < childPartialsLen; i++) {\n\t\t\t\tconst { segmentCount, minLength, partialLengths, unsequencedRecords } =\n\t\t\t\t\tchildPartials[i];\n\t\t\t\tcombinedPartialLengths.segmentCount += segmentCount;\n\t\t\t\tcombinedPartialLengths.minLength += minLength;\n\t\t\t\tchildPartialLengths.push(partialLengths.items as PartialSequenceLength[]);\n\t\t\t\tif (unsequencedRecords) {\n\t\t\t\t\tchildUnsequencedPartialLengths.push(\n\t\t\t\t\t\tunsequencedRecords.partialLengths.items as PartialSequenceLength[],\n\t\t\t\t\t);\n\t\t\t\t\tchildOverlapRemoves.push(unsequencedRecords.overlappingRemoves);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmergePartialLengths(childPartialLengths, combinedPartialLengths.partialLengths);\n\n\t\t\tif (computeLocalPartials) {\n\t\t\t\tcombinedPartialLengths.unsequencedRecords = {\n\t\t\t\t\tpartialLengths: mergePartialLengths(childUnsequencedPartialLengths),\n\t\t\t\t\toverlappingRemoves: [...mergeSortedListsBySeq(childOverlapRemoves)],\n\t\t\t\t\tcachedOverlappingByRefSeq: new Map(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfor (const partial of combinedPartialLengths.partialLengths.items) {\n\t\t\t\tcombinedPartialLengths.addClientSeqNumberFromPartial(partial);\n\t\t\t}\n\t\t}\n\t\t// TODO: incremental zamboni during build\n\t\tif (PartialSequenceLengths.options.zamboni) {\n\t\t\tcombinedPartialLengths.zamboni(collabWindow);\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(combinedPartialLengths);\n\t\treturn combinedPartialLengths;\n\t}\n\n\t/**\n\t * Creates and returns a PartialSequenceLengths structure that tracks the lengths of only the\n\t * leaf children of the provided MergeBlock.\n\t */\n\tprivate static fromLeaves(\n\t\tblock: MergeBlock,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t\tcomputeLocalPartials: boolean,\n\t): PartialSequenceLengths {\n\t\tconst combinedPartialLengths = new PartialSequenceLengths(\n\t\t\tcollabWindow.minSeq,\n\t\t\tcomputeLocalPartials,\n\t\t);\n\t\tcombinedPartialLengths.segmentCount = block.childCount;\n\n\t\tfor (let i = 0; i < block.childCount; i++) {\n\t\t\tconst child = block.children[i];\n\t\t\tif (child.isLeaf()) {\n\t\t\t\t// Leaf segment\n\t\t\t\tconst segment = child;\n\t\t\t\tif (segment.seq !== undefined && seqLTE(segment.seq, collabWindow.minSeq)) {\n\t\t\t\t\tcombinedPartialLengths.minLength += segment.cachedLength;\n\t\t\t\t} else {\n\t\t\t\t\tPartialSequenceLengths.insertSegment(combinedPartialLengths, segment);\n\t\t\t\t}\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\t\t\t\tif (\n\t\t\t\t\t(removalInfo?.removedSeq !== undefined &&\n\t\t\t\t\t\tseqLTE(removalInfo.removedSeq, collabWindow.minSeq)) ||\n\t\t\t\t\t(moveInfo?.movedSeq !== undefined && seqLTE(moveInfo.movedSeq, collabWindow.minSeq))\n\t\t\t\t) {\n\t\t\t\t\tcombinedPartialLengths.minLength -= segment.cachedLength;\n\t\t\t\t} else if (removalInfo !== undefined || moveInfo !== undefined) {\n\t\t\t\t\tPartialSequenceLengths.insertSegment(\n\t\t\t\t\t\tcombinedPartialLengths,\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tremovalInfo,\n\t\t\t\t\t\tmoveInfo,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Post-process correctly-ordered partials computing sums and creating\n\t\t// lists for each present client id\n\t\tconst seqPartials = combinedPartialLengths.partialLengths;\n\n\t\tlet prevLen = 0;\n\t\tfor (const partial of seqPartials.items) {\n\t\t\tpartial.len = prevLen + partial.seglen;\n\t\t\tprevLen = partial.len;\n\t\t\tcombinedPartialLengths.addClientSeqNumberFromPartial(partial);\n\t\t}\n\t\tprevLen = 0;\n\n\t\tif (combinedPartialLengths.unsequencedRecords !== undefined) {\n\t\t\tconst localPartials = combinedPartialLengths.unsequencedRecords.partialLengths;\n\t\t\tfor (const partial of localPartials.items) {\n\t\t\t\tpartial.len = prevLen + partial.seglen;\n\t\t\t\tprevLen = partial.len;\n\t\t\t}\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(combinedPartialLengths);\n\t\treturn combinedPartialLengths;\n\t}\n\n\tprivate static getOverlapClients(\n\t\toverlapClientIds: number[],\n\t\tseglen: number,\n\t): RedBlackTree<number, IOverlapClient> {\n\t\tconst bst = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n\t\tfor (const clientId of overlapClientIds) {\n\t\t\tbst.put(clientId, { clientId, seglen });\n\t\t}\n\t\treturn bst;\n\t}\n\n\tprivate static accumulateRemoveClientOverlap(\n\t\tpartialLength: PartialSequenceLength,\n\t\toverlapRemoveClientIds: number[],\n\t\tseglen: number,\n\t): void {\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\tfor (const clientId of overlapRemoveClientIds) {\n\t\t\t\tconst overlapClientNode = partialLength.overlapRemoveClients.get(clientId);\n\t\t\t\tif (overlapClientNode) {\n\t\t\t\t\toverlapClientNode.data.seglen += seglen;\n\t\t\t\t} else {\n\t\t\t\t\tpartialLength.overlapRemoveClients.put(clientId, { clientId, seglen });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tpartialLength.overlapRemoveClients = PartialSequenceLengths.getOverlapClients(\n\t\t\t\toverlapRemoveClientIds,\n\t\t\t\tseglen,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate static accumulateMoveClientOverlap(\n\t\tpartialLength: PartialSequenceLength,\n\t\toverlapMoveClientIds: number[],\n\t\tseglen: number,\n\t): void {\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\tfor (const clientId of overlapMoveClientIds) {\n\t\t\t\tconst overlapClientNode = partialLength.overlapObliterateClients.get(clientId);\n\t\t\t\tif (overlapClientNode) {\n\t\t\t\t\toverlapClientNode.data.seglen += seglen;\n\t\t\t\t} else {\n\t\t\t\t\tpartialLength.overlapObliterateClients.put(clientId, { clientId, seglen });\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tpartialLength.overlapObliterateClients = PartialSequenceLengths.getOverlapClients(\n\t\t\t\toverlapMoveClientIds,\n\t\t\t\tseglen,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Coalesce overlapping move lengths for a partial length entry that already\n\t * exists\n\t *\n\t * @param segmentLen - Length of segment with overlapping moves\n\t * @param segment - Segment with overlapping moves\n\t * @param firstGte - Existing partial length entry\n\t * @param clientIds - Ids of clients that concurrently obliterated this segment\n\t */\n\tstatic accumulateMoveOverlapForExisting(\n\t\tsegmentLen: number,\n\t\tsegment: ISegment,\n\t\tfirstGte: PartialSequenceLength,\n\t\tclientIds: number[],\n\t): void {\n\t\tconst nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);\n\n\t\tPartialSequenceLengths.accumulateMoveClientOverlap(\n\t\t\tfirstGte,\n\t\t\tnonInsertingClientIds,\n\t\t\tsegmentLen,\n\t\t);\n\n\t\t// if this segment was obliterated by the client that inserted it,\n\t\t// and if it overlaps with the obliterate of another client, we need to\n\t\t// take into account whether it was obliterated on insert by the other\n\t\t// client\n\t\tif (clientIds.length !== nonInsertingClientIds.length) {\n\t\t\tPartialSequenceLengths.accumulateMoveClientOverlap(\n\t\t\t\tfirstGte,\n\t\t\t\t[segment.clientId],\n\t\t\t\tsegment.wasMovedOnInsert ? -segment.cachedLength : segmentLen,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Tracks which clients have made concurrent obliterates.\n\t *\n\t * @param obliterateOverlapLen - Length of segment with overlap\n\t * @param clientIds - Ids of clients that have concurrently obliterated this\n\t * segment\n\t */\n\tprivate static getMoveOverlapForExisting(\n\t\tsegment: ISegment,\n\t\tobliterateOverlapLen: number,\n\t\tclientIds: number[],\n\t): RedBlackTree<number, IOverlapClient> {\n\t\tconst nonInsertingClientIds = clientIds.filter((id) => id !== segment.clientId);\n\t\tconst overlapObliterateClients = PartialSequenceLengths.getOverlapClients(\n\t\t\tnonInsertingClientIds,\n\t\t\tobliterateOverlapLen,\n\t\t);\n\n\t\tif (clientIds.length !== nonInsertingClientIds.length) {\n\t\t\toverlapObliterateClients.put(segment.clientId, {\n\t\t\t\tclientId: segment.clientId,\n\t\t\t\tseglen: segment.wasMovedOnInsert ? -segment.cachedLength : obliterateOverlapLen,\n\t\t\t});\n\t\t}\n\n\t\treturn overlapObliterateClients;\n\t}\n\n\tprivate static updatePartialsAfterInsertion(\n\t\tsegment: ISegment,\n\t\tsegmentLen: number,\n\t\tremoteObliteratedLen: number | undefined,\n\t\tobliterateOverlapLen: number = segmentLen,\n\t\tpartials: PartialSequenceLengthsSet,\n\t\tseq: number,\n\t\tclientId: number,\n\t\tremoveClientOverlap: number[] | undefined,\n\t\tmoveClientOverlap: number[] | undefined,\n\t): void {\n\t\tconst firstGte = partials.firstGte(seq);\n\n\t\tlet partialLengthEntry: PartialSequenceLength;\n\t\tif (firstGte?.seq === seq) {\n\t\t\tpartialLengthEntry = firstGte;\n\t\t\t// Existing entry at this seq--this occurs for ops that insert/delete\n\t\t\t// more than one segment.\n\t\t\tpartialLengthEntry.seglen += segmentLen;\n\t\t\tif (remoteObliteratedLen) {\n\t\t\t\tpartialLengthEntry.remoteObliteratedLen ??= 0;\n\t\t\t\tpartialLengthEntry.remoteObliteratedLen += remoteObliteratedLen;\n\t\t\t}\n\t\t\tif (removeClientOverlap) {\n\t\t\t\tPartialSequenceLengths.accumulateRemoveClientOverlap(\n\t\t\t\t\tfirstGte,\n\t\t\t\t\tremoveClientOverlap,\n\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (moveClientOverlap) {\n\t\t\t\tPartialSequenceLengths.accumulateMoveOverlapForExisting(\n\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\tsegment,\n\t\t\t\t\tfirstGte,\n\t\t\t\t\tmoveClientOverlap,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tconst overlapObliterateClients = moveClientOverlap\n\t\t\t\t? PartialSequenceLengths.getMoveOverlapForExisting(\n\t\t\t\t\t\tsegment,\n\t\t\t\t\t\tobliterateOverlapLen,\n\t\t\t\t\t\tmoveClientOverlap,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\n\t\t\tpartialLengthEntry = {\n\t\t\t\tseq,\n\t\t\t\tclientId,\n\t\t\t\tlen: 0,\n\t\t\t\tseglen: segmentLen,\n\t\t\t\tremoteObliteratedLen,\n\t\t\t\toverlapRemoveClients: removeClientOverlap\n\t\t\t\t\t? PartialSequenceLengths.getOverlapClients(removeClientOverlap, obliterateOverlapLen)\n\t\t\t\t\t: undefined,\n\t\t\t\toverlapObliterateClients,\n\t\t\t};\n\n\t\t\tpartials.addOrUpdate(partialLengthEntry);\n\t\t}\n\t}\n\n\t/**\n\t * Inserts length information about the insertion of `segment` into\n\t * `combinedPartialLengths.partialLengths`.\n\t *\n\t * Does not update the clientSeqNumbers field to account for this segment.\n\t *\n\t * If `removalInfo` or `moveInfo` are defined, this operation updates the\n\t * bookkeeping to account for the (re)moval of this segment at the (re)movedSeq\n\t * instead.\n\t *\n\t * When the insertion or (re)moval of the segment is un-acked and\n\t * `combinedPartialLengths` is meant to compute such records, this does the\n\t * analogous addition to the bookkeeping for the local segment in\n\t * `combinedPartialLengths.unsequencedRecords`.\n\t */\n\tprivate static insertSegment(\n\t\tcombinedPartialLengths: PartialSequenceLengths,\n\t\tsegment: ISegment,\n\t\tremovalInfo?: IRemovalInfo,\n\t\tmoveInfo?: IMoveInfo,\n\t): void {\n\t\tconst removalIsLocal =\n\t\t\t!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;\n\t\tconst moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;\n\t\tconst isLocal =\n\t\t\tsegment.seq === UnassignedSequenceNumber ||\n\t\t\t(!!removalInfo && removalIsLocal && (!moveInfo || moveIsLocal)) ||\n\t\t\t(!!moveInfo && moveIsLocal && (!removalInfo || removalIsLocal));\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tlet seqOrLocalSeq = isLocal ? segment.localSeq! : segment.seq!;\n\t\tlet segmentLen = segment.cachedLength;\n\t\tlet clientId = segment.clientId;\n\t\tlet removeClientOverlap: number[] | undefined;\n\t\tlet moveClientOverlap: number[] | undefined;\n\t\tlet remoteObliteratedLen: number | undefined;\n\n\t\t// it's not possible to have an overlapping obliterate and remove that are both local\n\t\tassert(\n\t\t\t(!moveIsLocal && !removalIsLocal) || moveIsLocal !== removalIsLocal,\n\t\t\t0x870 /* overlapping local obliterate and remove */,\n\t\t);\n\n\t\tconst removeHappenedFirst =\n\t\t\tremovalInfo &&\n\t\t\t(!moveInfo ||\n\t\t\t\tmoveIsLocal ||\n\t\t\t\t(!removalIsLocal && moveInfo.movedSeq > removalInfo.removedSeq));\n\n\t\tif (removeHappenedFirst) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tseqOrLocalSeq = removalIsLocal ? removalInfo.localRemovedSeq! : removalInfo.removedSeq;\n\t\t\tsegmentLen = -segmentLen;\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\tclientId = removalInfo.removedClientIds[0];\n\t\t\tconst hasOverlap = removalInfo.removedClientIds.length > 1;\n\t\t\tremoveClientOverlap = hasOverlap ? removalInfo.removedClientIds : undefined;\n\t\t} else if (moveInfo) {\n\t\t\t// The client who performed the move is always stored\n\t\t\t// in the first position of moveInfo.\n\t\t\tclientId = moveInfo.movedClientIds[0];\n\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tseqOrLocalSeq = moveIsLocal ? moveInfo.localMovedSeq! : moveInfo.movedSeq;\n\n\t\t\tif (segment.wasMovedOnInsert) {\n\t\t\t\tassert(\n\t\t\t\t\tmoveInfo.movedSeq !== -1,\n\t\t\t\t\t0x871 /* wasMovedOnInsert should only be set on acked obliterates */,\n\t\t\t\t);\n\t\t\t\tsegmentLen = 0;\n\t\t\t} else {\n\t\t\t\tsegmentLen = -segmentLen;\n\t\t\t}\n\n\t\t\tconst hasOverlap = moveInfo.movedClientIds.length > 1;\n\t\t\tmoveClientOverlap = hasOverlap ? moveInfo.movedClientIds : undefined;\n\t\t} else if (segment.wasMovedOnInsert) {\n\t\t\t// if this segment was obliterated on insert, its length is only\n\t\t\t// visible to the client that inserted it\n\t\t\tsegmentLen = 0;\n\t\t\tremoteObliteratedLen = segment.cachedLength;\n\t\t}\n\n\t\tconst partials = isLocal\n\t\t\t? combinedPartialLengths.unsequencedRecords?.partialLengths\n\t\t\t: combinedPartialLengths.partialLengths;\n\t\tif (partials === undefined) {\n\t\t\t// Local partial but its computation isn't required\n\t\t\treturn;\n\t\t}\n\n\t\t// overlapping move and remove, remove happened first\n\t\tif (moveInfo && removalInfo && removeHappenedFirst && !moveIsLocal) {\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\tconst moveClientId = moveInfo.movedClientIds[0];\n\t\t\tconst hasOverlap = moveInfo.movedClientIds.length > 1;\n\n\t\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\t\tsegment,\n\t\t\t\t0,\n\t\t\t\t-segment.cachedLength,\n\t\t\t\tsegmentLen,\n\t\t\t\tpartials,\n\t\t\t\tmoveInfo.movedSeq,\n\t\t\t\tmoveClientId,\n\t\t\t\tundefined,\n\t\t\t\thasOverlap ? moveInfo.movedClientIds : undefined,\n\t\t\t);\n\t\t}\n\n\t\tif (removalInfo && !removeHappenedFirst && !removalIsLocal) {\n\t\t\tconst removeSeqOrLocalSeq = removalIsLocal\n\t\t\t\t? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tremovalInfo.localRemovedSeq!\n\t\t\t\t: removalInfo.removedSeq;\n\t\t\t// The client who performed the remove is always stored\n\t\t\t// in the first position of removalInfo.\n\t\t\tconst removeClientId = removalInfo.removedClientIds[0];\n\t\t\tconst hasOverlap = removalInfo.removedClientIds.length > 1;\n\n\t\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\t\tsegment,\n\t\t\t\t0,\n\t\t\t\t-segment.cachedLength,\n\t\t\t\tsegmentLen,\n\t\t\t\tpartials,\n\t\t\t\tremoveSeqOrLocalSeq,\n\t\t\t\tremoveClientId,\n\t\t\t\thasOverlap ? removalInfo.removedClientIds : undefined,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t}\n\n\t\tPartialSequenceLengths.updatePartialsAfterInsertion(\n\t\t\tsegment,\n\t\t\tsegmentLen,\n\t\t\tremoteObliteratedLen,\n\t\t\tundefined,\n\t\t\tpartials,\n\t\t\tseqOrLocalSeq,\n\t\t\tclientId,\n\t\t\tremoveClientOverlap,\n\t\t\tmoveClientOverlap,\n\t\t);\n\n\t\t// todo: the below block needs to be changed to handle obliterate, which\n\t\t// doesn't have great support for reconnect at the moment. see ADO #3714\n\t\tconst { unsequencedRecords } = combinedPartialLengths;\n\t\tif (unsequencedRecords && removeClientOverlap && segment.localRemovedSeq !== undefined) {\n\t\t\tconst localSeq = segment.localRemovedSeq;\n\t\t\tconst localPartialLengthEntry: LocalPartialSequenceLength = {\n\t\t\t\tseq: seqOrLocalSeq,\n\t\t\t\tlocalSeq,\n\t\t\t\tclientId,\n\t\t\t\tlen: 0,\n\t\t\t\tseglen: segmentLen,\n\t\t\t};\n\t\t\tlet localIndexFirstGTE = 0;\n\t\t\tfor (\n\t\t\t\t;\n\t\t\t\tlocalIndexFirstGTE < unsequencedRecords.overlappingRemoves.length;\n\t\t\t\tlocalIndexFirstGTE++\n\t\t\t) {\n\t\t\t\tif (unsequencedRecords.overlappingRemoves[localIndexFirstGTE].seq >= seqOrLocalSeq) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinsertIntoList(\n\t\t\t\tunsequencedRecords.overlappingRemoves,\n\t\t\t\tlocalIndexFirstGTE,\n\t\t\t\tlocalPartialLengthEntry,\n\t\t\t);\n\n\t\t\tconst tweakedLocalPartialEntry = {\n\t\t\t\t...localPartialLengthEntry,\n\t\t\t\tseq: localSeq,\n\t\t\t};\n\n\t\t\tunsequencedRecords.partialLengths.addOrUpdate(tweakedLocalPartialEntry);\n\t\t}\n\t}\n\n\tprivate static addSeq(\n\t\tpartialLengths: PartialSequenceLengthsSet,\n\t\tseq: number,\n\t\tseqSeglen: number,\n\t\tremoteObliteratedLen?: number,\n\t\tclientId?: number,\n\t): void {\n\t\tlet seqPartialLen: PartialSequenceLength | undefined;\n\t\tlet penultPartialLen: PartialSequenceLength | undefined;\n\t\tlet pLen = partialLengths.latestLeq(seq);\n\t\tif (pLen) {\n\t\t\tif (pLen.seq === seq) {\n\t\t\t\tseqPartialLen = pLen;\n\t\t\t\tpLen = partialLengths.latestLeq(seq - 1);\n\t\t\t\tif (pLen) {\n\t\t\t\t\tpenultPartialLen = pLen;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpenultPartialLen = pLen;\n\t\t\t}\n\t\t}\n\t\tconst len = penultPartialLen === undefined ? seqSeglen : penultPartialLen.len + seqSeglen;\n\t\tif (seqPartialLen === undefined) {\n\t\t\tseqPartialLen = {\n\t\t\t\tclientId,\n\t\t\t\tlen,\n\t\t\t\tseglen: seqSeglen,\n\t\t\t\tseq,\n\t\t\t\tremoteObliteratedLen,\n\t\t\t};\n\t\t\tpartialLengths.addOrUpdate(seqPartialLen);\n\t\t} else {\n\t\t\tseqPartialLen.remoteObliteratedLen = remoteObliteratedLen;\n\t\t\tseqPartialLen.seglen = seqSeglen;\n\t\t\tseqPartialLen.len = len;\n\t\t\t// Assert client id matches\n\t\t}\n\t}\n\n\t/**\n\t * Length of the block this PartialSequenceLength corresponds to when viewed at `minSeq`.\n\t */\n\tprivate minLength = 0;\n\n\t/**\n\t * Total number of segments in the subtree rooted at the block this PartialSequenceLength corresponds to.\n\t */\n\tprivate segmentCount = 0;\n\n\t/**\n\t * List of PartialSequenceLength objects--ordered by increasing seq--giving length information about\n\t * the block associated with this PartialSequenceLengths object.\n\t *\n\t * `partialLengths[i].len` contains the length of this block considering only sequenced segments with\n\t * `sequenceNumber <= partialLengths[i].seq`.\n\t */\n\tprivate readonly partialLengths: PartialSequenceLengthsSet = new PartialSequenceLengthsSet();\n\n\t/**\n\t * clientSeqNumbers[clientId] is a list of partial lengths for sequenced ops which either:\n\t * - were submitted by `clientId`.\n\t * - deleted a range containing segments that were concurrently deleted by `clientId`\n\t *\n\t * The second case is referred to as the \"overlapping delete\" case. It is necessary to avoid double-counting\n\t * the removal of those segments in queries including clientId.\n\t */\n\tprivate readonly clientSeqNumbers: PartialSequenceLengthsSet[] = [];\n\n\t/**\n\t * Contains information required to answer queries for the length of this segment from the perspective of\n\t * the local client but not including all local segments (i.e., `localSeq !== collabWindow.localSeq`).\n\t * This field is only computed if requested in the constructor (i.e. `computeLocalPartials === true`).\n\t */\n\tprivate unsequencedRecords: UnsequencedPartialLengthInfo | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * The minimumSequenceNumber as defined by the collab window used in the last call to `update`,\n\t\t * or if no such calls have been made, the one used on construction.\n\t\t */\n\t\tpublic minSeq: number,\n\t\tcomputeLocalPartials: boolean,\n\t) {\n\t\tif (computeLocalPartials) {\n\t\t\tthis.unsequencedRecords = {\n\t\t\t\tpartialLengths: new PartialSequenceLengthsSet(),\n\t\t\t\toverlappingRemoves: [],\n\t\t\t\tcachedOverlappingByRefSeq: new Map(),\n\t\t\t};\n\t\t}\n\t}\n\n\t// Assume: seq is latest sequence number; no structural change to sub-tree, but a segment\n\t// with sequence number seq has been added within the sub-tree (and `update` has been called\n\t// on all descendant PartialSequenceLengths)\n\t// TODO: assert client id matches\n\tpublic update(\n\t\tnode: MergeBlock,\n\t\tseq: number,\n\t\tclientId: number,\n\t\t// eslint-disable-next-line import/no-deprecated\n\t\tcollabWindow: CollaborationWindow,\n\t): void {\n\t\tlet seqSeglen = 0;\n\t\tlet remoteObliteratedLen = 0;\n\t\tlet segCount = 0;\n\t\t// Compute length for seq across children\n\t\tfor (let i = 0; i < node.childCount; i++) {\n\t\t\tconst child = node.children[i];\n\t\t\tif (child.isLeaf()) {\n\t\t\t\tconst segment = child;\n\t\t\t\tconst removalInfo = toRemovalInfo(segment);\n\t\t\t\tconst moveInfo = toMoveInfo(segment);\n\n\t\t\t\tconst removalIsLocal =\n\t\t\t\t\t!!removalInfo && removalInfo.removedSeq === UnassignedSequenceNumber;\n\t\t\t\tconst moveIsLocal = !!moveInfo && moveInfo.movedSeq === UnassignedSequenceNumber;\n\n\t\t\t\tconst removeHappenedFirst =\n\t\t\t\t\tremovalInfo &&\n\t\t\t\t\t(!moveInfo ||\n\t\t\t\t\t\tmoveIsLocal ||\n\t\t\t\t\t\t(!removalIsLocal && moveInfo.movedSeq > removalInfo.removedSeq));\n\n\t\t\t\tif (seq === segment.seq) {\n\t\t\t\t\t// if this segment was moved on insert, its length should\n\t\t\t\t\t// only be visible to the inserting client\n\t\t\t\t\tif (\n\t\t\t\t\t\tsegment.wasMovedOnInsert &&\n\t\t\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\t\t\tmoveInfo &&\n\t\t\t\t\t\tmoveInfo.movedSeq < segment.seq\n\t\t\t\t\t) {\n\t\t\t\t\t\tremoteObliteratedLen += segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tseqSeglen += segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seq === removalInfo?.removedSeq) {\n\t\t\t\t\t// if the remove op happened before an overlapping obliterate,\n\t\t\t\t\t// all clients can see the remove at this seq. otherwise, only\n\t\t\t\t\t// the removing client is aware of the remove\n\t\t\t\t\tif (removeHappenedFirst) {\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tremoteObliteratedLen -= segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (seq === moveInfo?.movedSeq) {\n\t\t\t\t\tif (removeHappenedFirst) {\n\t\t\t\t\t\tremoteObliteratedLen -= segment.cachedLength;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tsegment.wasMovedOnInsert &&\n\t\t\t\t\t\tsegment.seq !== UnassignedSequenceNumber &&\n\t\t\t\t\t\tsegment.seq !== undefined &&\n\t\t\t\t\t\tmoveInfo.movedSeq > segment.seq\n\t\t\t\t\t) {\n\t\t\t\t\t\tremoteObliteratedLen += segment.cachedLength;\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t} else if (segment.seq !== UnassignedSequenceNumber) {\n\t\t\t\t\t\tseqSeglen -= segment.cachedLength;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsegCount++;\n\t\t\t} else {\n\t\t\t\tconst childBlock = child;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tconst branchPartialLengths = childBlock.partialLengths!;\n\t\t\t\tconst partialLengths = branchPartialLengths.partialLengths;\n\t\t\t\tconst leqPartial = partialLengths.latestLeq(seq);\n\t\t\t\tif (leqPartial && leqPartial.seq === seq) {\n\t\t\t\t\tseqSeglen += leqPartial.seglen;\n\t\t\t\t\tremoteObliteratedLen += leqPartial.remoteObliteratedLen ?? 0;\n\t\t\t\t}\n\t\t\t\tsegCount += branchPartialLengths.segmentCount;\n\t\t\t}\n\t\t}\n\t\tthis.segmentCount = segCount;\n\t\tthis.unsequencedRecords = undefined;\n\n\t\tPartialSequenceLengths.addSeq(\n\t\t\tthis.partialLengths,\n\t\t\tseq,\n\t\t\tseqSeglen,\n\t\t\tremoteObliteratedLen,\n\t\t\tclientId,\n\t\t);\n\t\tthis.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();\n\t\tPartialSequenceLengths.addSeq(\n\t\t\tthis.clientSeqNumbers[clientId],\n\t\t\tseq,\n\t\t\tseqSeglen + remoteObliteratedLen,\n\t\t\tundefined,\n\t\t\tclientId,\n\t\t);\n\t\tif (PartialSequenceLengths.options.zamboni) {\n\t\t\tthis.zamboni(collabWindow);\n\t\t}\n\n\t\tPartialSequenceLengths.options.verifier?.(this);\n\t}\n\n\t/**\n\t * Returns the length of this block as viewed from the perspective of `clientId` at `refSeq`.\n\t * This is the total length of all segments sequenced at or before refSeq OR submitted by `clientId`.\n\t * If `clientId` is the local client, `localSeq` can also be provided. In that case, it is the total\n\t * length of all segments submitted at or before `refSeq` in addition to any local, unacked segments\n\t * with `segment.localSeq <= localSeq`.\n\t *\n\t * Note: the local case (where `localSeq !== undefined`) is only supported on a PartialSequenceLength object\n\t * constructed with `computeLocalPartials` set to true and not subsequently updated with `update`.\n\t */\n\tpublic getPartialLength(refSeq: number, clientId: number, localSeq?: number): number {\n\t\tlet pLen = this.minLength;\n\t\tconst cliLatestIndex = this.cliLatest(clientId);\n\t\tconst cliSeq = this.clientSeqNumbers[clientId];\n\t\tpLen += this.partialLengths.latestLeq(refSeq)?.len ?? 0;\n\n\t\tif (localSeq === undefined) {\n\t\t\tif (cliLatestIndex >= 0) {\n\t\t\t\tconst cliLatest = cliSeq.items[cliLatestIndex];\n\t\t\t\tif (cliLatest.seq > refSeq) {\n\t\t\t\t\t// The client has local edits after refSeq, add in the length adjustments\n\t\t\t\t\tpLen += cliLatest.len;\n\t\t\t\t\tconst precedingCli = this.cliLatestLEQ(clientId, refSeq);\n\t\t\t\t\tif (precedingCli) {\n\t\t\t\t\t\t// Subtract out double-counted lengths: segments still in the collab window but before\n\t\t\t\t\t\t// the refSeq submitted by the client we're querying for were counted in each addition above.\n\t\t\t\t\t\tpLen -= precedingCli.len;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tassert(\n\t\t\t\tthis.unsequencedRecords !== undefined,\n\t\t\t\t0x39f /* Local getPartialLength invoked without computing local partials. */,\n\t\t\t);\n\t\t\tconst unsequencedPartialLengths = this.unsequencedRecords.partialLengths;\n\t\t\t// Local segments at or before localSeq should also be included\n\t\t\tconst local = unsequencedPartialLengths.latestLeq(localSeq);\n\t\t\tif (local) {\n\t\t\t\tpLen += local.len;\n\n\t\t\t\t// Lastly, we must subtract out any double-counted removes, which occur if a currently un-acked local\n\t\t\t\t// remove overlaps with a remote client's remove that occurred at sequence number <=refSeq.\n\t\t\t\tpLen -= this.computeOverlappingLocalRemoves(refSeq, localSeq);\n\t\t\t}\n\t\t}\n\t\treturn pLen;\n\t}\n\n\t/**\n\t * Computes the seglen for the double-counted removed overlap at (refSeq, localSeq). This logic is equivalent\n\t * to the following:\n\t *\n\t * ```typescript\n\t * let total = 0;\n\t * for (const partialLength of this.unsequencedRecords!.overlappingRemoves) {\n\t * if (partialLength.seq > refSeq) {\n\t * break;\n\t * }\n\t *\n\t * if (partialLength.localSeq <= localSeq) {\n\t * total += partialLength.seglen;\n\t * }\n\t * }\n\t *\n\t * return total;\n\t * ```\n\t *\n\t * Reconnect happens to only need to compute these lengths for two refSeq values: before and\n\t * after the rebase. Since these lists potentially scale with O(collab window * number of local edits)\n\t * and potentially need to be queried for each local op that gets rebased,\n\t * we cache the results for a given refSeq in `this.unsequencedRecords.cachedOverlappingByRefSeq` so\n\t * that they can be binary-searched the same way the usual partialLengths lists are.\n\t */\n\tprivate computeOverlappingLocalRemoves(refSeq: number, localSeq: number): number {\n\t\tif (this.unsequencedRecords === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet cachedOverlapPartials = this.unsequencedRecords.cachedOverlappingByRefSeq.get(refSeq);\n\t\tif (!cachedOverlapPartials) {\n\t\t\tconst partials: PartialSequenceLengthsSet = new PartialSequenceLengthsSet();\n\t\t\tfor (const partial of this.unsequencedRecords.overlappingRemoves) {\n\t\t\t\tif (partial.seq > refSeq) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpartials.addOrUpdate({ ...partial, seq: partial.localSeq, len: 0 });\n\t\t\t}\n\t\t\t// This coalesces entries with the same localSeq as well as computes overall lengths.\n\t\t\tcachedOverlapPartials = partials;\n\t\t\tthis.unsequencedRecords.cachedOverlappingByRefSeq.set(refSeq, cachedOverlapPartials);\n\t\t}\n\n\t\tconst overlap = cachedOverlapPartials.latestLeq(localSeq);\n\t\treturn overlap?.len ?? 0;\n\t}\n\n\tpublic toString(glc?: (id: number) => string, indentCount = 0): string {\n\t\tlet buf = \"\";\n\t\tfor (const partial of this.partialLengths.items) {\n\t\t\tbuf += `(${partial.seq},${partial.len}) `;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-for-in-array, no-restricted-syntax\n\t\tfor (const clientId in this.clientSeqNumbers) {\n\t\t\tif (this.clientSeqNumbers[clientId].size > 0) {\n\t\t\t\tbuf += `Client `;\n\t\t\t\tbuf += glc ? `${glc(+clientId)}` : `${clientId}`;\n\t\t\t\tbuf += \"[\";\n\t\t\t\tfor (const partial of this.clientSeqNumbers[clientId].items) {\n\t\t\t\t\tbuf += `(${partial.seq},${partial.len})`;\n\t\t\t\t}\n\t\t\t\tbuf += \"]\";\n\t\t\t}\n\t\t}\n\t\tbuf = `min(seq ${this.minSeq}): ${this.minLength}; sc: ${this.segmentCount};${buf}`;\n\t\treturn buf;\n\t}\n\n\t// Clear away partial sums for sequence numbers earlier than the current window\n\t// eslint-disable-next-line import/no-deprecated\n\tprivate zamboni(segmentWindow: CollaborationWindow): void {\n\t\tthis.minLength += this.partialLengths.copyDown(segmentWindow.minSeq);\n\t\tthis.minSeq = segmentWindow.minSeq;\n\t\t// eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in, no-restricted-syntax\n\t\tfor (const clientId in this.clientSeqNumbers) {\n\t\t\tconst cliPartials = this.clientSeqNumbers[clientId];\n\t\t\tif (cliPartials) {\n\t\t\t\tcliPartials.copyDown(segmentWindow.minSeq);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addClientSeqNumber(clientId: number, seq: number, seglen: number): void {\n\t\tthis.clientSeqNumbers[clientId] ??= new PartialSequenceLengthsSet();\n\t\tconst cli = this.clientSeqNumbers[clientId];\n\t\tcli.addOrUpdate({ seq, len: 0, seglen });\n\t}\n\n\t// Assumes sequence number already coalesced and that this is called in increasing `seq` order.\n\tprivate addClientSeqNumberFromPartial(partialLength: PartialSequenceLength): void {\n\t\tconst seglen = partialLength.seglen + (partialLength.remoteObliteratedLen ?? 0);\n\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\tthis.addClientSeqNumber(partialLength.clientId!, partialLength.seq, seglen);\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\tpartialLength.overlapRemoveClients.map((oc: Property<number, IOverlapClient>) => {\n\t\t\t\t// Original client entry was handled above\n\t\t\t\tif (partialLength.clientId !== oc.data.clientId) {\n\t\t\t\t\tthis.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\tpartialLength.overlapObliterateClients.map((oc: Property<number, IOverlapClient>) => {\n\t\t\t\t// Original client entry was handled above\n\t\t\t\tif (partialLength.clientId !== oc.data.clientId) {\n\t\t\t\t\tthis.addClientSeqNumber(oc.data.clientId, partialLength.seq, oc.data.seglen);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate cliLatestLEQ(clientId: number, refSeq: number): PartialSequenceLength | undefined {\n\t\treturn this.clientSeqNumbers[clientId]?.latestLeq(refSeq);\n\t}\n\n\tprivate cliLatest(clientId: number): number {\n\t\tconst cliSeqs = this.clientSeqNumbers[clientId];\n\t\treturn cliSeqs && cliSeqs.size > 0 ? cliSeqs.size - 1 : -1;\n\t}\n}\n\n/* eslint-disable @typescript-eslint/dot-notation */\nfunction verifyPartialLengthsInner(\n\tpartialSeqLengths: PartialSequenceLengths,\n\tpartialLengths: PartialSequenceLengthsSet,\n\tclientPartials: boolean,\n): number {\n\tif (partialLengths.size === 0) {\n\t\treturn 0;\n\t}\n\n\tlet lastSeqNum = 0;\n\tlet accumSegLen = 0;\n\tlet count = 0;\n\n\tfor (const partialLength of partialLengths.items) {\n\t\t// Count total number of partial length entries\n\t\tcount++;\n\n\t\t// Sequence number should be larger or equal to minseq\n\t\tassert(\n\t\t\tpartialSeqLengths.minSeq <= partialLength.seq,\n\t\t\t0x054 /* \"Sequence number less than minSeq!\" */,\n\t\t);\n\n\t\t// Sequence number should be sorted\n\t\tassert(lastSeqNum < partialLength.seq, 0x055 /* \"Sequence number is not sorted!\" */);\n\t\tlastSeqNum = partialLength.seq;\n\n\t\t// Len is a accumulation of all the seglen adjustments\n\t\taccumSegLen += partialLength.seglen;\n\t\tif (accumSegLen !== partialLength.len) {\n\t\t\tassert(\n\t\t\t\tfalse,\n\t\t\t\t0x056 /* \"Unexpected total for accumulation of all seglen adjustments!\" */,\n\t\t\t);\n\t\t}\n\n\t\tif (clientPartials) {\n\t\t\t// Client partials used to track local edits so we can account for them some refSeq.\n\t\t\t// But the information we keep track of are since minSeq, so we keep track of more history\n\t\t\t// then needed, and some of them doesn't make sense to be used for length calculations\n\t\t\t// e.g. if you have this sequence, where the minSeq is #5 because of other clients\n\t\t\t// seq 10: client 1: insert seg #1\n\t\t\t// seq 11: client 2: delete seg #2 refseq: 10\n\t\t\t// minLength is 0, we would have keep a record of seglen: -1 for clientPartialLengths for client 2\n\t\t\t// So if you ask for partial length for client 2 @ seq 5, we will have return -1.\n\t\t\t// However, that combination is invalid, since we should never see any ops with refseq < 10 for\n\t\t\t// client 2 after seq 11.\n\t\t} else {\n\t\t\t// Len adjustment should not make length negative\n\t\t\tif (partialSeqLengths[\"minLength\"] + partialLength.len < 0) {\n\t\t\t\tassert(false, 0x057 /* \"Negative length after length adjustment!\" */);\n\t\t\t}\n\t\t}\n\n\t\tif (partialLength.overlapRemoveClients) {\n\t\t\t// Only the flat partialLengths can have overlapRemoveClients, the per client view shouldn't\n\t\t\tassert(\n\t\t\t\t!clientPartials,\n\t\t\t\t0x058 /* \"Both overlapRemoveClients and clientPartials are set!\" */,\n\t\t\t);\n\n\t\t\t// Each overlap client counts as one, but the first remove to sequence was already counted.\n\t\t\t// (this aligns with the logic to omit the removing client in `addClientSeqNumberFromPartial`)\n\t\t\tcount += partialLength.overlapRemoveClients.size() - 1;\n\t\t}\n\n\t\tif (partialLength.overlapObliterateClients) {\n\t\t\t// Only the flat partialLengths can have overlapObliterateClients, the per client view shouldn't\n\t\t\tassert(\n\t\t\t\t!clientPartials,\n\t\t\t\t0x872 /* Both overlapObliterateClients and clientPartials are set! */,\n\t\t\t);\n\n\t\t\t// Each overlap client counts as one, but the first move to sequence was already counted.\n\t\t\t// (this aligns with the logic to omit the moving client in `addClientSeqNumberFromPartial`)\n\t\t\tcount += partialLength.overlapObliterateClients.size() - 1;\n\t\t}\n\t}\n\treturn count;\n}\n\nexport function verifyExpectedPartialLengths(\n\tmergeTree: MergeTree,\n\tnode: MergeBlock,\n\trefSeq: number,\n\tclientId: number,\n\tlocalSeq?: number,\n): void {\n\tif (\n\t\t(!mergeTree.collabWindow.collaborating || mergeTree.collabWindow.clientId === clientId) &&\n\t\t(node.isLeaf() || localSeq === undefined)\n\t) {\n\t\treturn;\n\t}\n\n\tconst partialLen = node.partialLengths?.getPartialLength(refSeq, clientId, localSeq);\n\n\tlet expected = 0;\n\tconst nodesToVisit: IMergeNode[] = [node];\n\n\twhile (nodesToVisit.length > 0) {\n\t\tconst thisNode = nodesToVisit.pop();\n\t\tif (!thisNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (thisNode.isLeaf()) {\n\t\t\texpected += mergeTree[\"nodeLength\"](thisNode, refSeq, clientId, localSeq) ?? 0;\n\t\t} else {\n\t\t\tnodesToVisit.push(...thisNode.children.slice(0, thisNode.childCount));\n\t\t}\n\t}\n\n\tif (expected !== partialLen) {\n\t\tnode.partialLengths?.getPartialLength(refSeq, clientId, localSeq);\n\t\tthrow new Error(\n\t\t\t`expected partial length of ${expected} but found ${partialLen}. refSeq: ${refSeq}, clientId: ${clientId}`,\n\t\t);\n\t}\n}\n\nexport function verifyPartialLengths(partialSeqLengths: PartialSequenceLengths): void {\n\tif (partialSeqLengths[\"clientSeqNumbers\"]) {\n\t\tfor (const cliSeq of partialSeqLengths[\"clientSeqNumbers\"]) {\n\t\t\tif (cliSeq) {\n\t\t\t\tverifyPartialLengthsInner(partialSeqLengths, cliSeq, true);\n\t\t\t}\n\t\t}\n\n\t\t// If we have client view, we should have the flat view\n\t\tassert(\n\t\t\t!!partialSeqLengths[\"partialLengths\"],\n\t\t\t0x059 /* \"Client view exists but flat view does not!\" */,\n\t\t);\n\n\t\tverifyPartialLengthsInner(partialSeqLengths, partialSeqLengths[\"partialLengths\"], false);\n\t} else {\n\t\t// If we don't have a client view, we shouldn't have the flat view either\n\t\tassert(\n\t\t\t!partialSeqLengths[\"partialLengths\"],\n\t\t\t0x05b /* \"Flat view exists but client view does not!\" */,\n\t\t);\n\t}\n}\n/* eslint-enable @typescript-eslint/dot-notation */\n\n/**\n * Clones an `overlapRemoveClients` red-black tree.\n */\nfunction cloneOverlapRemoveClients(\n\toldTree: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n\tif (!oldTree) {\n\t\treturn undefined;\n\t}\n\tconst newTree = new RedBlackTree<number, IOverlapClient>(compareNumbers);\n\toldTree.map((bProp: Property<number, IOverlapClient>) => {\n\t\tnewTree.put(bProp.data.clientId, { ...bProp.data });\n\t\treturn true;\n\t});\n\treturn newTree;\n}\n\nfunction combineForOverlapClients(\n\ttreeA: RedBlackTree<number, IOverlapClient> | undefined,\n\ttreeB: RedBlackTree<number, IOverlapClient> | undefined,\n): RedBlackTree<number, IOverlapClient> | undefined {\n\tif (treeA) {\n\t\tif (treeB) {\n\t\t\ttreeB.map((bProp: Property<number, IOverlapClient>) => {\n\t\t\t\tconst aProp = treeA.get(bProp.key);\n\t\t\t\tif (aProp) {\n\t\t\t\t\taProp.data.seglen += bProp.data.seglen;\n\t\t\t\t} else {\n\t\t\t\t\ttreeA.put(bProp.data.clientId, { ...bProp.data });\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t} else {\n\t\treturn cloneOverlapRemoveClients(treeB);\n\t}\n}\n\n/**\n * Combines the `overlapRemoveClients` and `overlapObliterateClients` fields of\n * two `PartialSequenceLength` objects, modifying the first PartialSequenceLength's\n * bookkeeping in-place.\n *\n * Combination is performed additively on `seglen` on a per-client basis.\n */\nexport function combineOverlapClients(\n\ta: PartialSequenceLength,\n\tb: PartialSequenceLength,\n): void {\n\tconst overlapRemoveClients = combineForOverlapClients(\n\t\ta.overlapRemoveClients,\n\t\tb.overlapRemoveClients,\n\t);\n\tif (overlapRemoveClients) {\n\t\ta.overlapRemoveClients = overlapRemoveClients;\n\t}\n\n\tconst overlapObliterateClients = combineForOverlapClients(\n\t\ta.overlapObliterateClients,\n\t\tb.overlapObliterateClients,\n\t);\n\tif (overlapObliterateClients) {\n\t\ta.overlapObliterateClients = overlapObliterateClients;\n\t}\n}\n\n/**\n * Given a number of seq-sorted `partialLength` lists, merges them into a combined seq-sorted `partialLength`\n * list. This merge includes coalescing `PartialSequenceLength` entries at the same seq.\n *\n * Ex: merging the following two lists (some information omitted on each PartialSequenceLength):\n * ```typescript\n * [{ seq: 1, seglen: 5 }, { seq: 3, seglen: -1 }]\n * [{ seq: 1, seglen: -3 }, { seq: 2: seglen: 4 }]\n * ```\n * would produce\n * ```typescript\n * [{ seq: 1, seglen: 2 }, { seq: 2, seglen: 4 }, { seq: 3, seglen: -1 }]\n * ```\n */\nfunction mergePartialLengths(\n\tchildPartialLengths: PartialSequenceLength[][],\n\tmergedLengths: PartialSequenceLengthsSet = new PartialSequenceLengthsSet(),\n): PartialSequenceLengthsSet {\n\tfor (const partialLength of mergeSortedListsBySeq(childPartialLengths)) {\n\t\tmergedLengths.addOrUpdate({\n\t\t\t...partialLength,\n\t\t\toverlapRemoveClients: cloneOverlapRemoveClients(partialLength.overlapRemoveClients),\n\t\t\toverlapObliterateClients: cloneOverlapRemoveClients(\n\t\t\t\tpartialLength.overlapObliterateClients,\n\t\t\t),\n\t\t});\n\t}\n\treturn mergedLengths;\n}\n\n/**\n * Given a collection of PartialSequenceLength lists--each sorted by sequence number--returns an iterable that yields\n * each PartialSequenceLength in sequence order.\n *\n * This is equivalent to flattening the input list and sorting it by sequence number. If the number of lists to merge is\n * a constant, however, this approach is advantageous asymptotically.\n */\nfunction mergeSortedListsBySeq<T extends PartialSequenceLength>(lists: T[][]): Iterable<T> {\n\tclass PartialSequenceLengthIterator {\n\t\t/**\n\t\t * nextSmallestIndex[i] is the next element of sublists[i] to check.\n\t\t * In other words, the iterator has already yielded elements of sublists[i] *up through*\n\t\t * sublists[i][nextSmallestIndex[i] - 1].\n\t\t */\n\t\tprivate readonly nextSmallestIndex: number[];\n\n\t\tconstructor(private readonly sublists: T[][]) {\n\t\t\tthis.nextSmallestIndex = Array.from({ length: sublists.length });\n\t\t\tfor (let i = 0; i < sublists.length; i++) {\n\t\t\t\tthis.nextSmallestIndex[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic next(): { value: T; done: false } | { value: undefined; done: true } {\n\t\t\tconst len = this.sublists.length;\n\t\t\tlet currentMin: T | undefined;\n\t\t\tlet currentMinIndex: number | undefined;\n\t\t\tfor (let i = 0; i < len; i++) {\n\t\t\t\tconst candidateIndex = this.nextSmallestIndex[i];\n\t\t\t\tif (candidateIndex < this.sublists[i].length) {\n\t\t\t\t\tconst candidate = this.sublists[i][candidateIndex];\n\t\t\t\t\tif (!currentMin || candidate.seq < currentMin.seq) {\n\t\t\t\t\t\tcurrentMin = candidate;\n\t\t\t\t\t\tcurrentMinIndex = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentMin) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tthis.nextSmallestIndex[currentMinIndex!]++;\n\t\t\t\treturn { value: currentMin, done: false };\n\t\t\t} else {\n\t\t\t\treturn { value: undefined, done: true };\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { [Symbol.iterator]: () => new PartialSequenceLengthIterator(lists) };\n}\n\nfunction insertIntoList<T>(list: T[], index: number, elem: T): void {\n\tif (index < list.length) {\n\t\tfor (let k = list.length; k > index; k--) {\n\t\t\tlist[k] = list[k - 1];\n\t\t}\n\t\tlist[index] = elem;\n\t} else {\n\t\tlist.push(elem);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACzB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAEvC;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,CAAC,EAAE,WAAW,GAAG,SAAS,EAC1B,CAAC,EAAE,WAAW,GAAG,SAAS,GACxB,OAAO,CA0BT;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAczF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAMlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,GACnB,WAAW,CAEb;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAC/B,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACzB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAEvC;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,CAAC,EAAE,WAAW,GAAG,SAAS,EAC1B,CAAC,EAAE,WAAW,GAAG,SAAS,GACxB,OAAO,CA0BT;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAczF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAMlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,QAAQ,EAAE,WAAW,GACnB,WAAW,CAEb;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAClC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,GAC/B,OAAO,CAAC,CAAC,CAAC,CAUZ;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAEzC"}
@@ -92,8 +92,6 @@ function extendIfUndefined(base, extension) {
92
92
  // eslint-disable-next-line no-restricted-syntax
93
93
  for (const key in extension) {
94
94
  if (base[key] === undefined) {
95
- // TODO Non null asserting, why is this not null?
96
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
97
95
  base[key] = extension[key];
98
96
  }
99
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Any mapping from a string to values of type `T`\n * @legacy\n * @alpha\n */\nexport interface MapLike<T> {\n\t[index: string]: T;\n}\n\n/**\n * A loosely-typed mapping from strings to any value.\n *\n * @remarks Property sets are expected to be JSON-stringify-able.\n *\n * @privateRemarks PropertySet is typed using `any` because when you include\n * custom methods such as toJSON(), JSON.stringify accepts most types other than\n * functions\n * @legacy\n * @alpha\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PropertySet = MapLike<any>;\n\n/**\n * Compares two PropertySets for equality.\n *\n * @internal\n */\nexport function matchProperties(\n\ta: PropertySet | undefined,\n\tb: PropertySet | undefined,\n): boolean {\n\tif (!a && !b) {\n\t\treturn true;\n\t}\n\n\tconst keysA = a ? Object.keys(a) : [];\n\tconst keysB = b ? Object.keys(b) : [];\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\tfor (const key of keysA) {\n\t\tif (b?.[key] === undefined) {\n\t\t\treturn false;\n\t\t} else if (typeof b[key] === \"object\") {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tif (!matchProperties(a?.[key], b[key])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (b[key] !== a?.[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Adds properties from one PropertySet to another.\n *\n * @internal\n */\nexport function extend<T>(base: MapLike<T>, extension: MapLike<T> | undefined): MapLike<T> {\n\tif (extension !== undefined) {\n\t\tfor (const [key, v] of Object.entries(extension)) {\n\t\t\tif (v === undefined) {\n\t\t\t\tcontinue;\n\t\t\t} else if (v === null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete base[key];\n\t\t\t} else {\n\t\t\t\tbase[key] = v;\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * Clones properties in a given PropertySet into a new PropertySet.\n *\n * @internal\n */\nexport function clone<T>(extension: MapLike<T> | undefined): MapLike<T> | undefined {\n\tif (extension === undefined) {\n\t\treturn undefined;\n\t}\n\tconst cloneMap = createMap<T>();\n\treturn extend(cloneMap, extension);\n}\n\n/**\n * Add properties in one PropertySet to another PropertySet. If the PropertySet we are adding\n * to does not exist, create one.\n *\n * @internal\n */\nexport function addProperties(\n\toldProps: PropertySet | undefined,\n\tnewProps: PropertySet,\n): PropertySet {\n\treturn extend(oldProps ?? createMap<unknown>(), newProps);\n}\n\n/**\n * Replace values of undefined in one PropertySet with values for the same key from another PropertySet.\n *\n * @internal\n */\nexport function extendIfUndefined<T>(\n\tbase: MapLike<T>,\n\textension: MapLike<T> | undefined,\n): MapLike<T> {\n\tif (extension !== undefined) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const key in extension) {\n\t\t\tif (base[key] === undefined) {\n\t\t\t\t// TODO Non null asserting, why is this not null?\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\tbase[key] = extension[key]!;\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * Create a MapLike with good performance.\n *\n * @internal\n */\nexport function createMap<T>(): MapLike<T> {\n\treturn Object.create(null) as MapLike<T>;\n}\n"]}
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * Any mapping from a string to values of type `T`\n * @legacy\n * @alpha\n */\nexport interface MapLike<T> {\n\t[index: string]: T;\n}\n\n/**\n * A loosely-typed mapping from strings to any value.\n *\n * @remarks Property sets are expected to be JSON-stringify-able.\n *\n * @privateRemarks PropertySet is typed using `any` because when you include\n * custom methods such as toJSON(), JSON.stringify accepts most types other than\n * functions\n * @legacy\n * @alpha\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PropertySet = MapLike<any>;\n\n/**\n * Compares two PropertySets for equality.\n *\n * @internal\n */\nexport function matchProperties(\n\ta: PropertySet | undefined,\n\tb: PropertySet | undefined,\n): boolean {\n\tif (!a && !b) {\n\t\treturn true;\n\t}\n\n\tconst keysA = a ? Object.keys(a) : [];\n\tconst keysB = b ? Object.keys(b) : [];\n\n\tif (keysA.length !== keysB.length) {\n\t\treturn false;\n\t}\n\n\tfor (const key of keysA) {\n\t\tif (b?.[key] === undefined) {\n\t\t\treturn false;\n\t\t} else if (typeof b[key] === \"object\") {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\tif (!matchProperties(a?.[key], b[key])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (b[key] !== a?.[key]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Adds properties from one PropertySet to another.\n *\n * @internal\n */\nexport function extend<T>(base: MapLike<T>, extension: MapLike<T> | undefined): MapLike<T> {\n\tif (extension !== undefined) {\n\t\tfor (const [key, v] of Object.entries(extension)) {\n\t\t\tif (v === undefined) {\n\t\t\t\tcontinue;\n\t\t\t} else if (v === null) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete base[key];\n\t\t\t} else {\n\t\t\t\tbase[key] = v;\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * Clones properties in a given PropertySet into a new PropertySet.\n *\n * @internal\n */\nexport function clone<T>(extension: MapLike<T> | undefined): MapLike<T> | undefined {\n\tif (extension === undefined) {\n\t\treturn undefined;\n\t}\n\tconst cloneMap = createMap<T>();\n\treturn extend(cloneMap, extension);\n}\n\n/**\n * Add properties in one PropertySet to another PropertySet. If the PropertySet we are adding\n * to does not exist, create one.\n *\n * @internal\n */\nexport function addProperties(\n\toldProps: PropertySet | undefined,\n\tnewProps: PropertySet,\n): PropertySet {\n\treturn extend(oldProps ?? createMap<unknown>(), newProps);\n}\n\n/**\n * Replace values of undefined in one PropertySet with values for the same key from another PropertySet.\n *\n * @internal\n */\nexport function extendIfUndefined<T>(\n\tbase: MapLike<T>,\n\textension: MapLike<T> | undefined,\n): MapLike<T> {\n\tif (extension !== undefined) {\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\tfor (const key in extension) {\n\t\t\tif (base[key] === undefined) {\n\t\t\t\tbase[key] = extension[key];\n\t\t\t}\n\t\t}\n\t}\n\treturn base;\n}\n\n/**\n * Create a MapLike with good performance.\n *\n * @internal\n */\nexport function createMap<T>(): MapLike<T> {\n\treturn Object.create(null) as MapLike<T>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"revertibles.d.ts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAA4B,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAiB,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAG/D;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GACjC;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,cAAc,CAAC;CAC7B,GACD;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,cAAc,CAAC;CAC7B,GACD;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IAC9C,aAAa,EAAE,cAAc,CAAC;IAC9B,cAAc,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEL;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,wBAAwB,CAEpF;AAkBD;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CACpE;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACrD,qBAAqB,EAAE;QACtB,kBAAkB,EAAE,gBAAgB,CAAC;QACrC,YAAY,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC;KAClD,CAAC;CACF;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAkHjF;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAChD,SAAS,EAAE,2BAA2B,EACtC,WAAW,EAAE,wBAAwB,EAAE,GACrC,IAAI,CA0BN;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,WAAW,EAAE,wBAAwB,EAAE,GACrC,IAAI,CAUN;AA2JD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,yBAAyB,EACjC,WAAW,EAAE,wBAAwB,EAAE,GACrC,IAAI,CA8BN"}
1
+ {"version":3,"file":"revertibles.d.ts","sourceRoot":"","sources":["../src/revertibles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAA4B,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAiB,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAG/D;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GACjC;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,cAAc,CAAC;CAC7B,GACD;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,cAAc,CAAC;CAC7B,GACD;IACA,SAAS,EAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IAC9C,aAAa,EAAE,cAAc,CAAC;IAC9B,cAAc,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEL;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,wBAAwB,CAEpF;AAkBD;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CACpE;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACrD,qBAAqB,EAAE;QACtB,kBAAkB,EAAE,gBAAgB,CAAC;QACrC,YAAY,EAAE,sBAAsB,CAAC,WAAW,CAAC,CAAC;KAClD,CAAC;CACF;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AA4GjF;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAChD,SAAS,EAAE,2BAA2B,EACtC,WAAW,EAAE,wBAAwB,EAAE,GACrC,IAAI,CA0BN;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,WAAW,EAAE,wBAAwB,EAAE,GACrC,IAAI,CAUN;AAqJD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,yBAAyB,EACjC,WAAW,EAAE,wBAAwB,EAAE,GACrC,IAAI,CA4BN"}
@@ -54,8 +54,6 @@ function appendLocalInsertToRevertibles(deltaArgs, revertibles) {
54
54
  trackingGroup: new mergeTreeTracking_js_1.UnorderedTrackingGroup(),
55
55
  });
56
56
  }
57
- // TODO Non null asserting, why is this not null?
58
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
59
57
  const last = revertibles[revertibles.length - 1];
60
58
  for (const t of deltaArgs.deltaSegments)
61
59
  last.trackingGroup.link(t.segment);
@@ -68,11 +66,7 @@ function appendLocalRemoveToRevertibles(deltaArgs, revertibles) {
68
66
  trackingGroup: new mergeTreeTracking_js_1.UnorderedTrackingGroup(),
69
67
  });
70
68
  }
71
- // TODO Non null asserting, why is this not null?
72
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
73
69
  const last = revertibles[revertibles.length - 1];
74
- // TODO Non null asserting, why is this not null?
75
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
76
70
  const mergeTreeWithRevert = findMergeTreeWithRevert(deltaArgs.deltaSegments[0].segment);
77
71
  for (const t of deltaArgs.deltaSegments) {
78
72
  const props = {
@@ -162,8 +156,6 @@ function discardMergeTreeDeltaRevertible(revertibles) {
162
156
  exports.discardMergeTreeDeltaRevertible = discardMergeTreeDeltaRevertible;
163
157
  function revertLocalInsert(driver, mergeTreeWithRevert, revertible) {
164
158
  while (revertible.trackingGroup.size > 0) {
165
- // TODO Non null asserting, why is this not null?
166
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
167
159
  const tracked = revertible.trackingGroup.tracked[0];
168
160
  (0, internal_1.assert)(tracked.trackingCollection.unlink(revertible.trackingGroup), 0x3f1 /* tracking group removed */);
169
161
  (0, internal_1.assert)(tracked.isLeaf(), 0x3f2 /* inserts must track segments */);
@@ -175,8 +167,6 @@ function revertLocalInsert(driver, mergeTreeWithRevert, revertible) {
175
167
  }
176
168
  function revertLocalRemove(driver, mergeTreeWithRevert, revertible) {
177
169
  while (revertible.trackingGroup.size > 0) {
178
- // TODO Non null asserting, why is this not null?
179
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
180
170
  const tracked = revertible.trackingGroup.tracked[0];
181
171
  (0, internal_1.assert)(tracked.trackingCollection.unlink(revertible.trackingGroup), 0x3f3 /* tracking group removed */);
182
172
  (0, internal_1.assert)(!tracked.isLeaf(), 0x3f4 /* removes must track local refs */);
@@ -247,8 +237,6 @@ function revertLocalRemove(driver, mergeTreeWithRevert, revertible) {
247
237
  }
248
238
  function revertLocalAnnotate(driver, mergeTreeWithRevert, revertible) {
249
239
  while (revertible.trackingGroup.size > 0) {
250
- // TODO Non null asserting, why is this not null?
251
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
252
240
  const tracked = revertible.trackingGroup.tracked[0];
253
241
  const unlinked = tracked.trackingCollection.unlink(revertible.trackingGroup);
254
242
  (0, internal_1.assert)(unlinked && tracked.isLeaf(), 0x3f7 /* annotates must track segments */);
@@ -274,8 +262,6 @@ function revertMergeTreeDeltaRevertibles(driver, revertibles) {
274
262
  const r = revertibles.pop();
275
263
  const operation = r.operation;
276
264
  if (r.trackingGroup.size > 0) {
277
- // TODO Non null asserting, why is this not null?
278
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
279
265
  mergeTreeWithRevert ?? (mergeTreeWithRevert = findMergeTreeWithRevert(r.trackingGroup.tracked[0]));
280
266
  switch (operation) {
281
267
  case ops_js_1.MergeTreeDeltaType.INSERT: {