@fluidframework/merge-tree 0.57.1 → 0.58.0-55561

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 (90) hide show
  1. package/dist/base.d.ts +0 -1
  2. package/dist/base.d.ts.map +1 -1
  3. package/dist/base.js.map +1 -1
  4. package/dist/client.d.ts +0 -2
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +8 -29
  7. package/dist/client.js.map +1 -1
  8. package/dist/collections.d.ts +0 -3
  9. package/dist/collections.d.ts.map +1 -1
  10. package/dist/collections.js +6 -22
  11. package/dist/collections.js.map +1 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +0 -3
  15. package/dist/index.js.map +1 -1
  16. package/dist/mergeTree.d.ts +8 -26
  17. package/dist/mergeTree.d.ts.map +1 -1
  18. package/dist/mergeTree.js +16 -277
  19. package/dist/mergeTree.js.map +1 -1
  20. package/dist/ops.d.ts +0 -6
  21. package/dist/ops.d.ts.map +1 -1
  22. package/dist/ops.js +1 -8
  23. package/dist/ops.js.map +1 -1
  24. package/dist/partialLengths.d.ts.map +1 -1
  25. package/dist/partialLengths.js +0 -9
  26. package/dist/partialLengths.js.map +1 -1
  27. package/dist/properties.d.ts.map +1 -1
  28. package/dist/properties.js +2 -15
  29. package/dist/properties.js.map +1 -1
  30. package/dist/snapshotlegacy.d.ts.map +1 -1
  31. package/dist/snapshotlegacy.js +3 -6
  32. package/dist/snapshotlegacy.js.map +1 -1
  33. package/dist/textSegment.d.ts.map +1 -1
  34. package/dist/textSegment.js +0 -14
  35. package/dist/textSegment.js.map +1 -1
  36. package/lib/base.d.ts +0 -1
  37. package/lib/base.d.ts.map +1 -1
  38. package/lib/base.js.map +1 -1
  39. package/lib/client.d.ts +0 -2
  40. package/lib/client.d.ts.map +1 -1
  41. package/lib/client.js +5 -26
  42. package/lib/client.js.map +1 -1
  43. package/lib/collections.d.ts +0 -3
  44. package/lib/collections.d.ts.map +1 -1
  45. package/lib/collections.js +6 -22
  46. package/lib/collections.js.map +1 -1
  47. package/lib/index.d.ts +0 -1
  48. package/lib/index.d.ts.map +1 -1
  49. package/lib/index.js +0 -1
  50. package/lib/index.js.map +1 -1
  51. package/lib/mergeTree.d.ts +8 -26
  52. package/lib/mergeTree.d.ts.map +1 -1
  53. package/lib/mergeTree.js +15 -274
  54. package/lib/mergeTree.js.map +1 -1
  55. package/lib/ops.d.ts +0 -6
  56. package/lib/ops.d.ts.map +1 -1
  57. package/lib/ops.js +0 -7
  58. package/lib/ops.js.map +1 -1
  59. package/lib/partialLengths.d.ts.map +1 -1
  60. package/lib/partialLengths.js +0 -9
  61. package/lib/partialLengths.js.map +1 -1
  62. package/lib/properties.d.ts.map +1 -1
  63. package/lib/properties.js +2 -15
  64. package/lib/properties.js.map +1 -1
  65. package/lib/snapshotlegacy.d.ts.map +1 -1
  66. package/lib/snapshotlegacy.js +3 -6
  67. package/lib/snapshotlegacy.js.map +1 -1
  68. package/lib/textSegment.d.ts.map +1 -1
  69. package/lib/textSegment.js +1 -15
  70. package/lib/textSegment.js.map +1 -1
  71. package/package.json +10 -10
  72. package/src/base.ts +0 -1
  73. package/src/client.ts +5 -29
  74. package/src/collections.ts +7 -24
  75. package/src/index.ts +0 -1
  76. package/src/mergeTree.ts +31 -306
  77. package/src/ops.ts +0 -7
  78. package/src/partialLengths.ts +0 -10
  79. package/src/properties.ts +7 -15
  80. package/src/snapshotlegacy.ts +4 -6
  81. package/src/textSegment.ts +2 -17
  82. package/dist/text.d.ts +0 -8
  83. package/dist/text.d.ts.map +0 -1
  84. package/dist/text.js +0 -78
  85. package/dist/text.js.map +0 -1
  86. package/lib/text.d.ts +0 -8
  87. package/lib/text.d.ts.map +0 -1
  88. package/lib/text.js +0 -73
  89. package/lib/text.js.map +0 -1
  90. package/src/text.ts +0 -83
@@ -113,12 +113,6 @@ class MergeTreeTextHelper {
113
113
  this.gatherText = (segment, pos, refSeq, clientId, start, end, accumText) => {
114
114
  let _start = start;
115
115
  if (TextSegment.is(segment)) {
116
- if (mergeTree_1.MergeTree.traceGatherText) {
117
- console.log(
118
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
119
- `@cli ${this.mergeTree.getLongClientId(this.mergeTree.collabWindow.clientId)} ` +
120
- `gather seg seq ${segment.seq} rseq ${segment.removedSeq} text ${segment.text}`);
121
- }
122
116
  let beginTags = "";
123
117
  let endTags = "";
124
118
  if (isTextAndMarkerAccumulator(accumText)) {
@@ -213,20 +207,12 @@ class MergeTreeTextHelper {
213
207
  tagsInProgress: [],
214
208
  textSegment: new TextSegment(""),
215
209
  };
216
- if (mergeTree_1.MergeTree.traceGatherText) {
217
- console.log(`get text on cli ${mergeTree_1.glc(this.mergeTree, this.mergeTree.collabWindow.clientId)} ` +
218
- `ref cli ${mergeTree_1.glc(this.mergeTree, clientId)} refSeq ${refSeq}`);
219
- }
220
210
  this.mergeTree.mapRange({ leaf: this.gatherText }, refSeq, clientId, accum, range.start, range.end);
221
211
  return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };
222
212
  }
223
213
  getText(refSeq, clientId, placeholder = "", start, end) {
224
214
  const range = this.getValidRange(start, end, refSeq, clientId);
225
215
  const accum = { textSegment: new TextSegment(""), placeholder };
226
- if (mergeTree_1.MergeTree.traceGatherText) {
227
- console.log(`get text on cli ${mergeTree_1.glc(this.mergeTree, this.mergeTree.collabWindow.clientId)} ` +
228
- `ref cli ${mergeTree_1.glc(this.mergeTree, clientId)} refSeq ${refSeq}`);
229
- }
230
216
  this.mergeTree.mapRange({ leaf: this.gatherText }, refSeq, clientId, accum, range.start, range.end);
231
217
  return accum.textSegment.text;
232
218
  }
@@ -1 +1 @@
1
- {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.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 { IIntegerRange } from \"./base\";\nimport { BaseSegment, glc, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const tseg = new TextSegment(text);\n if (props) {\n tseg.addProperties(props);\n }\n return tseg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n if (MergeTree.traceGatherText) {\n console.log(\n `get text on cli ${glc(this.mergeTree, this.mergeTree.collabWindow.clientId)} ` +\n `ref cli ${glc(this.mergeTree, clientId)} refSeq ${refSeq}`);\n }\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n if (MergeTree.traceGatherText) {\n console.log(\n `get text on cli ${glc(this.mergeTree, this.mergeTree.collabWindow.clientId)} ` +\n `ref cli ${glc(this.mergeTree, clientId)} refSeq ${refSeq}`);\n }\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n if (MergeTree.traceGatherText) {\n console.log(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n `@cli ${this.mergeTree.getLongClientId!(this.mergeTree.collabWindow.clientId)} ` +\n `gather seg seq ${segment.seq} rseq ${segment.removedSeq} text ${segment.text}`);\n }\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties && (segment.properties[\"font-weight\"])) {\n tags.push(\"b\");\n }\n if (segment.properties && (segment.properties[\"text-decoration\"])) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
1
+ {"version":3,"file":"textSegment.js","sourceRoot":"","sources":["../src/textSegment.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 { IIntegerRange } from \"./base\";\nimport { BaseSegment, ISegment, Marker, MergeTree } from \"./mergeTree\";\nimport { IJSONSegment } from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { LocalReferenceCollection } from \"./localReference\";\n\n// Maximum length of text segment to be considered to be merged with other segment.\n// Maximum segment length is at least 2x of it (not taking into account initial segment creation).\n// The bigger it is, the more expensive it is to break segment into sub-segments (on edits)\n// The smaller it is, the more segments we have in snapshots (and in memory) - it's more expensive to load snapshots.\n// Small number also makes ReplayTool produce false positives (\"same\" snapshots have slightly different binary\n// representations). More measurements needs to be done, but it's very likely the right spot is somewhere between\n// 1K-2K mark. That said, we also break segments on newline and there are very few segments that are longer than 256\n// because of it. Must be an even number\nconst TextSegmentGranularity = 256;\n\nexport interface IJSONTextSegment extends IJSONSegment {\n text: string;\n}\n\nexport class TextSegment extends BaseSegment {\n public static readonly type = \"TextSegment\";\n\n public static is(segment: ISegment): segment is TextSegment {\n return segment.type === TextSegment.type;\n }\n\n public static make(text: string, props?: PropertySet) {\n const tseg = new TextSegment(text);\n if (props) {\n tseg.addProperties(props);\n }\n return tseg;\n }\n\n public static fromJSONObject(spec: any) {\n if (typeof spec === \"string\") {\n return new TextSegment(spec);\n } else if (spec && typeof spec === \"object\" && \"text\" in spec) {\n const textSpec = spec as IJSONTextSegment;\n return TextSegment.make(textSpec.text, textSpec.props as PropertySet);\n }\n return undefined;\n }\n\n public readonly type = TextSegment.type;\n\n constructor(public text: string) {\n super();\n this.cachedLength = text.length;\n }\n\n public toJSONObject() {\n // To reduce snapshot/ops size, we serialize a TextSegment as a plain 'string' if it is\n // not annotated.\n return this.properties\n ? { text: this.text, props: this.properties }\n : this.text;\n }\n\n public clone(start = 0, end?: number) {\n const text = this.text.substring(start, end);\n const b = TextSegment.make(text, this.properties);\n this.cloneInto(b);\n return b;\n }\n\n public canAppend(segment: ISegment): boolean {\n return !this.text.endsWith(\"\\n\")\n && TextSegment.is(segment)\n && (this.cachedLength <= TextSegmentGranularity ||\n segment.cachedLength <= TextSegmentGranularity);\n }\n\n public toString() {\n return this.text;\n }\n\n public append(segment: ISegment) {\n if (TextSegment.is(segment)) {\n // Note: Must call 'appendLocalRefs' before modifying this segment's length as\n // 'this.cachedLength' is used to adjust the offsets of the local refs.\n LocalReferenceCollection.append(this, segment);\n\n this.text += segment.text;\n this.cachedLength = this.text.length;\n } else {\n throw new Error(\"can only append text segment\");\n }\n }\n\n // TODO: retain removed text for undo\n // returns true if entire string removed\n public removeRange(start: number, end: number) {\n let remnantString = \"\";\n const len = this.text.length;\n if (start > 0) {\n remnantString += this.text.substring(0, start);\n }\n if (end < len) {\n remnantString += this.text.substring(end);\n }\n this.text = remnantString;\n this.cachedLength = remnantString.length;\n return (remnantString.length === 0);\n }\n\n protected createSplitSegmentAt(pos: number) {\n if (pos > 0) {\n const remainingText = this.text.substring(pos);\n this.text = this.text.substring(0, pos);\n this.cachedLength = this.text.length;\n const leafSegment = new TextSegment(remainingText);\n return leafSegment;\n }\n }\n}\n\ninterface ITextAccumulator {\n textSegment: TextSegment;\n placeholder?: string;\n parallelArrays?: boolean;\n}\n\ninterface ITextAndMarkerAccumulator extends ITextAccumulator {\n parallelArrays: true;\n parallelText: string[];\n parallelMarkers: Marker[];\n parallelMarkerLabel: string;\n tagsInProgress: string[];\n}\n\nfunction isTextAndMarkerAccumulator(accum: ITextAccumulator): accum is ITextAndMarkerAccumulator {\n return accum.parallelArrays === true;\n}\n\ntype ITextAccumulatorType = ITextAccumulator | ITextAndMarkerAccumulator;\nexport class MergeTreeTextHelper {\n constructor(private readonly mergeTree: MergeTree) { }\n\n public getTextAndMarkers(refSeq: number, clientId: number, label: string, start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n const accum: ITextAndMarkerAccumulator = {\n parallelArrays: true,\n parallelMarkerLabel: label,\n parallelMarkers: [],\n parallelText: [],\n tagsInProgress: [],\n textSegment: new TextSegment(\"\"),\n };\n\n this.mergeTree.mapRange<ITextAndMarkerAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n\n return { parallelText: accum.parallelText, parallelMarkers: accum.parallelMarkers };\n }\n\n public getText(refSeq: number, clientId: number, placeholder = \"\", start?: number, end?: number) {\n const range = this.getValidRange(start, end, refSeq, clientId);\n\n const accum: ITextAccumulator = { textSegment: new TextSegment(\"\"), placeholder };\n\n this.mergeTree.mapRange<ITextAccumulator>(\n { leaf: this.gatherText },\n refSeq,\n clientId,\n accum,\n range.start,\n range.end);\n return accum.textSegment.text;\n }\n\n private getValidRange(\n start: number | undefined,\n end: number | undefined,\n refSeq: number,\n clientId: number,\n ): IIntegerRange {\n const range: IIntegerRange = {\n end: end ?? this.mergeTree.getLength(refSeq, clientId),\n start: start ?? 0,\n };\n return range;\n }\n\n private readonly gatherText = (segment: ISegment, pos: number, refSeq: number, clientId: number, start: number,\n end: number, accumText: ITextAccumulatorType) => {\n let _start = start;\n if (TextSegment.is(segment)) {\n\n let beginTags = \"\";\n let endTags = \"\";\n if (isTextAndMarkerAccumulator(accumText)) {\n // TODO: let clients pass in function to get tag\n const tags = [] as string[];\n const initTags = [] as string[];\n\n if (segment.properties && (segment.properties[\"font-weight\"])) {\n tags.push(\"b\");\n }\n if (segment.properties && (segment.properties[\"text-decoration\"])) {\n tags.push(\"u\");\n }\n const remTags = [] as string[];\n if (tags.length > 0) {\n for (const tag of tags) {\n if (!accumText.tagsInProgress.includes(tag)) {\n beginTags += `<${tag}>`;\n initTags.push(tag);\n }\n }\n for (const accumTag of accumText.tagsInProgress) {\n if (!tags.includes(accumTag)) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const initTag of initTags.reverse()) {\n accumText.tagsInProgress.push(initTag);\n }\n } else {\n for (const accumTag of accumText.tagsInProgress) {\n endTags += `</${accumTag}>`;\n remTags.push(accumTag);\n }\n }\n for (const remTag of remTags) {\n const remdex = accumText.tagsInProgress.indexOf(remTag);\n if (remdex >= 0) {\n accumText.tagsInProgress.splice(remdex, 1);\n }\n }\n }\n accumText.textSegment.text += endTags;\n accumText.textSegment.text += beginTags;\n if ((_start <= 0) && (end >= segment.text.length)) {\n accumText.textSegment.text += segment.text;\n } else {\n if (_start < 0) {\n _start = 0;\n }\n if (end >= segment.text.length) {\n accumText.textSegment.text += segment.text.substring(_start);\n } else {\n accumText.textSegment.text += segment.text.substring(_start, end);\n }\n }\n } else {\n if (accumText.placeholder && (accumText.placeholder.length > 0)) {\n if (accumText.placeholder === \"*\") {\n const marker = segment as Marker;\n accumText.textSegment.text += `\\n${marker.toString()}`;\n } else {\n for (let i = 0; i < segment.cachedLength; i++) {\n accumText.textSegment.text += accumText.placeholder;\n }\n }\n } else if (isTextAndMarkerAccumulator(accumText)) {\n const marker = segment as Marker;\n if (marker.hasTileLabel(accumText.parallelMarkerLabel)) {\n accumText.parallelMarkers.push(marker);\n accumText.parallelText.push(accumText.textSegment.text);\n accumText.textSegment.text = \"\";\n }\n }\n }\n\n return true;\n };\n}\n"]}
package/lib/base.d.ts CHANGED
@@ -19,7 +19,6 @@ export interface Dictionary<TKey, TData> {
19
19
  put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;
20
20
  remove(key: TKey): void;
21
21
  map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;
22
- diag(): void;
23
22
  }
24
23
  export interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {
25
24
  max(): Property<TKey, TData> | undefined;
package/lib/base.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ,CAAC,IAAI,EAAE,KAAK;IACjC,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,SAAS,CAAC,IAAI,EAAE,KAAK;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,EAAE,KAAK;IAEvC,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/D;AAED,oBAAY,cAAc,CAAC,IAAI,EAAE,KAAK,IAClC,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,KAAK,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAE7F,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,KAAK;IACnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IAClD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1E,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvE,IAAI,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAE,SAAQ,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;IAC1E,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACzC,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzG;AAED,MAAM,WAAW,WAAW,CAAC,IAAI;IAE7B,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CAC9B;AACD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ,CAAC,IAAI,EAAE,KAAK;IACjC,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,SAAS,CAAC,IAAI,EAAE,KAAK;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,KAAK,CAAC;CAChB;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,EAAE,KAAK;IAEvC,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/D;AAED,oBAAY,cAAc,CAAC,IAAI,EAAE,KAAK,IAClC,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,KAAK,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAE7F,MAAM,WAAW,UAAU,CAAC,IAAI,EAAE,KAAK;IACnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IAClD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IAC1E,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1E;AAED,MAAM,WAAW,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAE,SAAQ,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;IAC1E,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACzC,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzG;AAED,MAAM,WAAW,WAAW,CAAC,IAAI;IAE7B,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CAC9B;AACD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf"}
package/lib/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface Property<TKey, TData> {\n key: TKey;\n data: TData;\n}\n\nexport interface QProperty<TKey, TData> {\n key?: TKey;\n data?: TData;\n}\n\nexport interface PropertyAction<TKey, TData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n <TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;\n}\n\nexport type ConflictAction<TKey, TData> =\n (key: TKey, currentKey: TKey, data: TData, currentData: TData) => QProperty<TKey, TData>;\n\nexport interface Dictionary<TKey, TData> {\n get(key: TKey): Property<TKey, TData> | undefined;\n put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;\n remove(key: TKey): void;\n map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;\n diag(): void;\n}\n\nexport interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {\n max(): Property<TKey, TData> | undefined;\n min(): Property<TKey, TData> | undefined;\n mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;\n}\n\nexport interface KeyComparer<TKey> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (a: TKey, b: TKey): number;\n}\n/**\n * A range [start, end)\n */\nexport interface IIntegerRange {\n start: number;\n end: number;\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface Property<TKey, TData> {\n key: TKey;\n data: TData;\n}\n\nexport interface QProperty<TKey, TData> {\n key?: TKey;\n data?: TData;\n}\n\nexport interface PropertyAction<TKey, TData> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n <TAccum>(p: Property<TKey, TData>, accum?: TAccum): boolean;\n}\n\nexport type ConflictAction<TKey, TData> =\n (key: TKey, currentKey: TKey, data: TData, currentData: TData) => QProperty<TKey, TData>;\n\nexport interface Dictionary<TKey, TData> {\n get(key: TKey): Property<TKey, TData> | undefined;\n put(key: TKey, data: TData, conflict?: ConflictAction<TKey, TData>): void;\n remove(key: TKey): void;\n map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void;\n}\n\nexport interface SortedDictionary<TKey, TData> extends Dictionary<TKey, TData> {\n max(): Property<TKey, TData> | undefined;\n min(): Property<TKey, TData> | undefined;\n mapRange<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum, start?: TKey, end?: TKey): void;\n}\n\nexport interface KeyComparer<TKey> {\n // eslint-disable-next-line @typescript-eslint/prefer-function-type\n (a: TKey, b: TKey): number;\n}\n/**\n * A range [start, end)\n */\nexport interface IIntegerRange {\n start: number;\n end: number;\n}\n"]}
package/lib/client.d.ts CHANGED
@@ -18,8 +18,6 @@ import { MergeTreeMaintenanceCallback, ReferencePosition } from "./index";
18
18
  export declare class Client {
19
19
  readonly specToSegment: (spec: IJSONSegment) => ISegment;
20
20
  readonly logger: ITelemetryLogger;
21
- verboseOps: boolean;
22
- noVerboseRemoteAnnotate: boolean;
23
21
  measureOps: boolean;
24
22
  accumTime: number;
25
23
  localTime: number;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/lib/client.js CHANGED
@@ -8,20 +8,21 @@ import { LoggingError } from "@fluidframework/telemetry-utils";
8
8
  import { RedBlackTree } from "./collections";
9
9
  import { UnassignedSequenceNumber, UniversalSequenceNumber } from "./constants";
10
10
  import { LocalReference } from "./localReference";
11
- import { compareStrings, elapsedMicroseconds, MergeTree, } from "./mergeTree";
11
+ import { compareStrings, MergeTree, } from "./mergeTree";
12
12
  import { createAnnotateMarkerOp, createAnnotateRangeOp, createGroupOp, createInsertSegmentOp, createRemoveRangeOp, } from "./opBuilder";
13
13
  import { SnapshotLegacy } from "./snapshotlegacy";
14
14
  import { SnapshotLoader } from "./snapshotLoader";
15
15
  import { MergeTreeTextHelper } from "./textSegment";
16
16
  import { SnapshotV1 } from "./snapshotV1";
17
+ function elapsedMicroseconds(trace) {
18
+ return trace.trace().duration * 1000;
19
+ }
17
20
  export class Client {
18
21
  constructor(
19
22
  // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence
20
23
  specToSegment, logger, options) {
21
24
  this.specToSegment = specToSegment;
22
25
  this.logger = logger;
23
- this.verboseOps = false;
24
- this.noVerboseRemoteAnnotate = false;
25
26
  this.measureOps = false;
26
27
  this.accumTime = 0;
27
28
  this.localTime = 0;
@@ -311,12 +312,6 @@ export class Client {
311
312
  this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);
312
313
  }
313
314
  }
314
- if (this.verboseOps && (!opArgs.sequencedMessage || !this.noVerboseRemoteAnnotate)) {
315
- console.log(`@cli ${this.getLongClientId(this.getCollabWindow().clientId)} ` +
316
- `seq ${clientArgs.sequenceNumber} ${opArgs.op.type} local ${!opArgs.sequencedMessage} ` +
317
- `start ${range.start} end ${range.end} refseq ${clientArgs.referenceSequenceNumber} ` +
318
- `cli ${clientArgs.clientId}`);
319
- }
320
315
  }
321
316
  /**
322
317
  * Returns a valid range for the op, or undefined
@@ -366,7 +361,6 @@ export class Client {
366
361
  });
367
362
  }
368
363
  }
369
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
370
364
  return { start, end };
371
365
  }
372
366
  /**
@@ -395,12 +389,11 @@ export class Client {
395
389
  }
396
390
  ackPendingSegment(opArgs) {
397
391
  const ackOp = (deltaOpArgs) => {
398
- var _a;
399
392
  let trace;
400
393
  if (this.measureOps) {
401
394
  trace = Trace.start();
402
395
  }
403
- this.mergeTree.ackPendingSegment(deltaOpArgs, this.verboseOps);
396
+ this.mergeTree.ackPendingSegment(deltaOpArgs);
404
397
  if (deltaOpArgs.op.type === 2 /* ANNOTATE */) {
405
398
  if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === "consensus")) {
406
399
  this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage);
@@ -411,10 +404,6 @@ export class Client {
411
404
  this.accumOps++;
412
405
  this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);
413
406
  }
414
- if (this.verboseOps) {
415
- console.log(`@cli ${this.getLongClientId(this.getCollabWindow().clientId)} ` +
416
- `ack seq # ${(_a = deltaOpArgs.sequencedMessage) === null || _a === void 0 ? void 0 : _a.sequenceNumber}`);
417
- }
418
407
  };
419
408
  if (opArgs.op.type === 3 /* GROUP */) {
420
409
  for (const memberOp of opArgs.op.ops) {
@@ -727,11 +716,6 @@ export class Client {
727
716
  return this.mergeTree.getContainingSegment(pos, segWindow.currentSeq, segWindow.clientId);
728
717
  }
729
718
  getPropertiesAtPosition(pos) {
730
- const segWindow = this.getCollabWindow();
731
- if (this.verboseOps) {
732
- // eslint-disable-next-line max-len
733
- console.log(`getPropertiesAtPosition cli ${this.getLongClientId(segWindow.clientId)} ref seq ${segWindow.currentSeq}`);
734
- }
735
719
  let propertiesAtPosition;
736
720
  const segoff = this.getContainingSegment(pos);
737
721
  const seg = segoff.segment;
@@ -741,11 +725,6 @@ export class Client {
741
725
  return propertiesAtPosition;
742
726
  }
743
727
  getRangeExtentsOfPosition(pos) {
744
- const segWindow = this.getCollabWindow();
745
- if (this.verboseOps) {
746
- // eslint-disable-next-line max-len
747
- console.log(`getRangeExtentsOfPosition cli ${this.getLongClientId(segWindow.clientId)} ref seq ${segWindow.currentSeq}`);
748
- }
749
728
  let posStart;
750
729
  let posAfterEnd;
751
730
  const segoff = this.getContainingSegment(pos);
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAA6B,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAI9F,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAEH,cAAc,EACd,mBAAmB,EAKnB,SAAS,GAGZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,aAAa,CAAC;AAcrB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,MAAM,OAAO,MAAM;IAgCf;IACI,8FAA8F;IAC9E,aAA+C,EAC/C,MAAwB,EACxC,OAAqB;QAFL,kBAAa,GAAb,aAAa,CAAkC;QAC/C,WAAM,GAAN,MAAM,CAAkB;QAlCrC,eAAU,GAAG,KAAK,CAAC;QACnB,4BAAuB,GAAG,KAAK,CAAC;QAChC,eAAU,GAAG,KAAK,CAAC;QACnB,cAAS,GAAG,CAAC,CAAC;QACd,cAAS,GAAG,CAAC,CAAC;QACd,aAAQ,GAAG,CAAC,CAAC;QACb,oBAAe,GAAG,CAAC,CAAC;QACpB,gBAAW,GAAG,CAAC,CAAC;QAChB,aAAQ,GAAG,CAAC,CAAC;QACb,kBAAa,GAAG,CAAC,CAAC;QAkBR,oBAAe,GAAG,IAAI,YAAY,CAAiB,cAAc,CAAC,CAAC;QACnE,qBAAgB,GAAa,EAAE,CAAC;QAChC,qBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;QAQlE,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,eAAe,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IA3BD,IAAI,sBAAsB,KAAyC,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAClH,IAAI,sBAAsB,CAAC,QAA4C;QACnE,IAAI,CAAC,SAAS,CAAC,sBAAsB,GAAG,QAAQ,CAAC;IACrD,CAAC;IAED,IAAI,4BAA4B;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,4BAA4B,CAAC;IACvD,CAAC;IAED,IAAI,4BAA4B,CAAC,QAAkD;QAC/E,IAAI,CAAC,SAAS,CAAC,4BAA4B,GAAG,QAAQ,CAAC;IAC3D,CAAC;IAkBD;;;;;;OAMG;IACI,wBAAwB,CAAC,QAAgB,CAAC;;QAC7C,IAAI,KAAK,KAAK,CAAC,EAAE;YACb,aAAO,IAAI,CAAC,SAAS,CAAC,eAAe,0CAAE,IAAI,GAAG;SACjD;QACD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,aAAO,IAAI,CAAC,SAAS,CAAC,eAAe,0CAAE,IAAI,CAAC,GAAG,EAAE;YAC7C,IAAI,KAAK,GAAG,KAAK,EAAE;gBACf,KAAK,EAAE,CAAC;gBACR,OAAO,IAAI,CAAC;aACf;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,EAAE,IAAI,EAAE;IACb,CAAC;IAED;;;;;;OAMG;IACI,6BAA6B,CAChC,MAAc,EACd,KAAkB,EAClB,iBAAsC;QACtC,MAAM,WAAW,GAAiB;YAC9B,IAAI,EAAE,WAAW;SACpB,CAAC;QAEF,MAAM,UAAU,GACZ,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAEpD,IAAI,UAAU,EAAE;YACZ,MAAM,aAAa,GAAmB;gBAClC,QAAQ,EAAE,iBAAiB;gBAC3B,MAAM;aACT,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAG,EAAE,aAAa,CAAC,CAAC;YAC1D,OAAO,UAAU,CAAC;SACrB;aAAM;YACH,OAAO,SAAS,CAAC;SACpB;IACL,CAAC;IACD;;;;;;OAMG;IACI,cAAc,CACjB,MAAc,EACd,KAAkB,EAClB,WAAyB;QACzB,MAAM,UAAU,GACZ,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAE,CAAC;QAExD,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;YAC/C,OAAO,UAAU,CAAC;SACrB;aAAM;YACH,OAAO,SAAS,CAAC;SACpB;IACL,CAAC;IACD;;;;;;;OAOG;IACI,kBAAkB,CACrB,KAAa,EACb,GAAW,EACX,KAAkB,EAClB,WAAqC;QACrC,MAAM,UAAU,GAAG,qBAAqB,CACpC,KAAK,EACL,GAAG,EACH,KAAK,EACL,WAAW,CAAC,CAAC;QAEjB,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;YAC/C,OAAO,UAAU,CAAC;SACrB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,KAAa,EAAE,GAAW;QAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEjD,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YAC3C,OAAO,QAAQ,CAAC;SACnB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,GAAW,EAAE,OAAiB;QACpD,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE;YAC3B,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;YACtC,OAAO,QAAQ,CAAC;SACnB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,8BAA8B,CACjC,MAAyB,EACzB,OAAiB;QAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,gCAAgC,CACvD,MAAM,EACN,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAExB,IAAI,GAAG,KAAK,cAAc,CAAC,gBAAgB,EAAE;YACzC,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,EAAE,GAAG,qBAAqB,CAC5B,GAAG,EACH,OAAO,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC;QACtB,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,yBAAyB,CACpC,MAAM,EACN,OAAO,EACP,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CACjB,MAAM,EACN,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAClC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAClB,UAAU,CAAC,CAAC;QAEhB,OAAO,EAAE,CAAC;IACd,CAAC;IAMM,YAAY,CACf,OAAoC,EACpC,KAAyB,EAAE,GAAuB,EAAE,KAAkB,EAAE,aAAsB,KAAK;QACnG,IAAI,CAAC,SAAS,CAAC,QAAQ,CACnB;YACI,IAAI,EAAE,OAAO;SAChB,EACD,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EACxC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,MAAoB,EAAE,0BAA4C;QACrF,IAAI,CAAC,SAAS,CAAC,eAAe,CAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,EACnB,CAAC,GAAG,EAAE,EAAE;YACJ,sDAAsD;YACtD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE;gBAC9B,0BAA0B,CAAC,SAAS,CAChC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,EAC1B,MAAM,CAAC,CAAC;aACf;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CACJ,CAAC;IACN,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,OAAiB;QAChC,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,MAAK,SAAS,EAAE;YAC/B,OAAO,CAAC,CAAC,CAAC;SACb;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,CAAC;IAEM,iBAAiB,CAAC,IAAoB;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAEM,oBAAoB,CAAC,IAAoB;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAQ,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,WAA8B;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,eAAe,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,MAA6B;QACpD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mBAA8B,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAC3B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,KAAK,EACL,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAAC,MAA6B;QACtD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,qBAAgC,EAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5G,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,aAAa,CACxB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,GAAG,EACT,EAAE,CAAC,KAAK,EACR,EAAE,CAAC,WAAW,EACd,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,MAA6B;QAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,mBAA8B,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxG,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,QAAgC,CAAC;QACrC,IAAI,EAAE,CAAC,GAAG,EAAE;YACR,QAAQ,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACpC,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,UAA6B,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9B;QAED,IAAI,CAAC,SAAS,CAAC,cAAc,CACzB,KAAK,CAAC,KAAK,EACX,QAAQ,EACR,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,cAAc,EACzB,MAAM,CAAC,CAAC;QAEZ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB,CACpB,MAA6B,EAC7B,UAAwC,EACxC,KAA6B,EAC7B,UAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC1B,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;aACnB;SACJ;aAAM;YACH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,UAAU,GAAG,UAAU,CAAC,cAAc,EAC1E,KAAK,CAAC,6EAA6E,CAAC,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,EAC3F,KAAK,CAAC,2EAA2E,CAAC,CAAC;YACvF,IAAI,UAAU,EAAE;gBACZ,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;aAC9E;SACJ;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE;YAChF,OAAO,CAAC,GAAG,CACP,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,GAAG;gBAChE,OAAO,UAAU,CAAC,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,gBAAgB,GAAG;gBACvF,SAAS,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,GAAG,WAAW,UAAU,CAAC,uBAAuB,GAAG;gBACrF,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SACrC;IACL,CAAC;IAED;;;;OAIG;IACK,eAAe,CACnB,EAAqE,EACrE,UAAwC;QACxC,IAAI,KAAK,GAAuB,EAAE,CAAC,IAAI,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,EAAE;YACxC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACrC,EAAE,CAAC,YAAY,EACf,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5B;QAED,IAAI,GAAG,GAAuB,EAAE,CAAC,IAAI,CAAC;QACtC,IAAI,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,YAAY,EAAE;YACtC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CACnC,EAAE,CAAC,YAAY,EACf,UAAU,CAAC,uBAAuB,EAClC,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5B;QAED,uBAAuB;QACvB,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAEhC,MAAM,gBAAgB,GAAa,EAAE,CAAC;YAEtC,0BAA0B;YAC1B,EAAE;YACF,IAAI,KAAK,KAAK,SAAS;mBAChB,KAAK,GAAG,CAAC;mBACT,KAAK,GAAG,MAAM;mBACd,KAAK,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,mBAA8B,EAAE;gBAC9D,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAClC;YACD,gDAAgD;YAChD,EAAE;YACF,IAAI,EAAE,CAAC,IAAI,mBAA8B,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC5D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,IAAI,KAAM,EAAE;oBACpC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBAChC;aACJ;YAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,MAAM,IAAI,YAAY,CAClB,kBAAkB,EAClB;oBACI,UAAU,EAAE,IAAI;oBAChB,GAAG;oBACH,gBAAgB,EAAE,gBAAgB,CAAC,QAAQ,EAAE;oBAC7C,MAAM;oBACN,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,cAAc,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS;oBAC7C,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,cAAc,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS;oBAC7C,MAAM,EAAE,EAAE,CAAC,IAAI;oBACf,KAAK;iBACR,CACJ,CAAC;aACL;SACJ;QAED,yEAAyE;QACzE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAmB,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAAC,MAA6B;QACvD,2DAA2D;QAC3D,kDAAkD;QAClD,EAAE;QACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,OAAO;gBACH,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,uBAAuB,EAAE,SAAS,CAAC,UAAU;gBAC7C,cAAc,EAAE,IAAI,CAAC,sBAAsB,EAAE;aAChD,CAAC;SACL;aAAM;YACH,OAAO;gBACH,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBACjE,uBAAuB,EAAE,MAAM,CAAC,gBAAgB,CAAC,uBAAuB;gBACxE,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,cAAc;aACzD,CAAC;SACL;IACL,CAAC;IAEO,iBAAiB,CAAC,MAA6B;QACnD,MAAM,KAAK,GAAG,CAAC,WAAkC,EAAE,EAAE;;YACjD,IAAI,KAAwB,CAAC;YAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;aACzB;YAED,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,qBAAgC,EAAE;gBACrD,IAAI,WAAW,CAAC,EAAE,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE;oBACjF,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,gBAAiB,CAAC,CAAC;iBAC/E;aACJ;YAED,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;aAC9E;YAED,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,GAAG;oBACxE,aAAa,MAAA,WAAW,CAAC,gBAAgB,0CAAE,cAAc,EAAE,CAAC,CAAC;aACpE;QACL,CAAC,CAAC;QAEF,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,kBAA6B,EAAE;YAC7C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;gBAClC,KAAK,CAAC;oBACF,OAAO,EAAE,MAAM,CAAC,EAAE;oBAClB,EAAE,EAAE,QAAQ;oBACZ,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;iBAC5C,CAAC,CAAC;aACN;SACJ;aAAM;YACH,KAAK,CAAC,MAAM,CAAC,CAAC;SACjB;IACL,CAAC;IAED,wFAAwF;IAExF,iBAAiB;QACb,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzE,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC;QAC/B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,qBAAqB,CAAC,YAAoB;QACtC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;SACtC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IACD,gBAAgB,CAAC,YAAoB;QACjC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC;IACxD,CAAC;IACD,eAAe,CAAC,aAAqB;QACjC,IAAI,aAAa,IAAI,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;SAC/C;aACI;YACD,OAAO,UAAU,CAAC;SACrB;IACL,CAAC;IACD,eAAe,CAAC,YAAoB;QAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;OAQG;IACI,yBAAyB,CAAC,OAAiB,EAAE,QAAgB;QAChE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC5G,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB;;;;;;;UAOE;QACF,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACxD,uFAAuF;YACvF,IAAI,GAAG,KAAK,OAAO,EAAE;gBACjB,OAAO,KAAK,CAAC;aAChB;YAED,sFAAsF;YACtF,wCAAwC;YACxC,EAAE;YACF,qFAAqF;YACrF,6EAA6E;YAC7E,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAgB,cAAc;mBACnF,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,eAAgB,GAAG,QAAQ,CAAC,CAAK,cAAc;cACzF;gBACE,eAAe,IAAI,GAAG,CAAC,YAAY,CAAC;aACvC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IAC3B,CAAC;IAEO,sBAAsB,CAC1B,OAA0B,EAC1B,YAA0B;;QAC1B,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,MAAM,kBAAkB,SAAG,IAAI,CAAC,SAAS,CAAC,eAAe,0CAAE,OAAO,EAAE,CAAC;QACrE,MAAM,CAAC,YAAY,KAAK,kBAAkB,EACtC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,gGAAgG;QAChG,gGAAgG;QAChG,4FAA4F;QAC5F,mGAAmG;QACnG,kDAAkD;QAClD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACxF,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACxD,MAAM,CAAC,YAAY,KAAK,eAAe,EACnC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACtE,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvF,IAAI,KAAoC,CAAC;YACzC,QAAQ,OAAO,CAAC,IAAI,EAAE;gBAClB;oBACI,MAAM,CAAC,OAAA,OAAO,CAAC,eAAe,0CAAE,oBAAoB,QAAO,IAAI,EAC3D,KAAK,CAAC,yCAAyC,CAAC,CAAC;oBACrD,KAAK,GAAG,qBAAqB,CACzB,eAAe,EACf,eAAe,GAAG,OAAO,CAAC,YAAY,EACtC,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,WAAW,CAAC,CAAC;oBACzB,MAAM;gBAEV;oBACI,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,wBAAwB,EAC3C,KAAK,CAAC,oDAAoD,CAAC,CAAC;oBAChE,KAAK,GAAG,qBAAqB,CACzB,eAAe,EACf,OAAO,CAAC,CAAC;oBACb,MAAM;gBAEV;oBACI,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE;wBACvC,KAAK,GAAG,mBAAmB,CACvB,eAAe,EACf,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;qBAC/C;oBACD,MAAM;gBAEV;oBACI,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;aAC1C;YAED,IAAI,KAAK,EAAE;gBACP,MAAM,eAAe,GAAiB,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACxF,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBAC/C,IAAI,CAAC,SAAS,CAAC,eAAgB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtB;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,MAA6B;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,GAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE;YACb;gBACI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM;YACV;gBACI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM;YACV;gBACI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM;YACV,kBAA6B,CAAC,CAAC;gBAC3B,KAAK,MAAM,QAAQ,IAAI,EAAE,CAAC,GAAG,EAAE;oBAC3B,IAAI,CAAC,aAAa,CAAC;wBACf,EAAE,EAAE,QAAQ;wBACZ,OAAO,EAAE,EAAE;wBACX,gBAAgB,EAAE,GAAG;qBACxB,CAAC,CAAC;iBACN;gBACD,MAAM;aACT;YACD;gBACI,MAAM;SACb;IACL,CAAC;IAEM,QAAQ,CAAC,GAA8B;;QAC1C,iCAAiC;QACjC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,gCAAgC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS,EAAE;YACpC,MAAM,MAAM,GAA0B;gBAClC,EAAE,EAAE,GAAG,CAAC,QAAwB;gBAChC,gBAAgB,EAAE,GAAG;aACxB,CAAC;YACF,IAAI,OAAA,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,MAAK,IAAI,CAAC,YAAY,EAAE;gBACzD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;aAClC;iBACI;gBACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC9B;SACJ;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC;IAEM,gBAAgB,CAAC,GAAW,EAAE,GAAW;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACtD,uGAAuG;QACvG,MAAM,CAAC,YAAY,CAAC,UAAU,IAAI,GAAG,EACjC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACjF,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACI,2BAA2B,CAC9B,oBAA4B,EAC5B,kBAA0B,EAC1B,cAAsB;QACtB,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAC7C,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACI,mBAAmB,CACtB,OAAqB,EACrB,YAA2C;QAE3C,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,kBAA6B,EAAE;YAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;gBAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAC7C,KAAK,CAAC,oFAAoF,CAAC,CAAC;gBAEhG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACzC,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACxE;aACJ;iBAAM;gBACH,mFAAmF;gBACnF,8EAA8E;gBAC9E,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAC3B,KAAK,CAAC,oFAAoF,CAAC,CAAC;gBAChG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aAC7E;SACJ;aAAM;YACH,MAAM,CAAE,OAAO,CAAC,IAAY,kBAA6B,EACrD,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACpD,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAC/B,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;SAC9D;QACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,CAAC;IACtE,CAAC;IAEM,gBAAgB;QACnB,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAEM,SAAS,CACZ,OAA+B,EAC/B,MAAoB,EACpB,UAA4B,EAC5B,WAAwC;;QAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC;QAElD,gEAAgE;QAChE,gEAAgE;QAChE,oDAAoD;QAEpD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAE/D,yFAAyF;QACzF,yCAAyC;QACzC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,MAAM,EAC3C,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAE5E,kCAAkC;QAClC,oEAAoE;QACpE,IAAI,OAAA,IAAI,CAAC,SAAS,CAAC,OAAO,0CAAE,0BAA0B,MAAK,IAAI,EAAE;YAC7D,MAAM,CACF,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EACrD,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SACxC;aAAM;YACH,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;SACrD;IACL,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,OAA+B,EAC/B,OAA+B,EAC/B,UAA4B;QAE5B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE1F,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,CAAC,QAAgB,EAAE,WAAqB;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClG,CAAC;IAEO,sBAAsB;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,SAAS,CAAC,aAAa,EAAE;YACzB,OAAO,wBAAwB,CAAC;SACnC;aACI;YACD,OAAO,uBAAuB,CAAC;SAClC;IACL,CAAC;IACD,gBAAgB,CAAC,OAA2B;QACxC,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE;YAC1B,MAAM,MAAM,GAA0B;gBAClC,EAAE;gBACF,OAAO;aACV,CAAC;YACF,QAAQ,EAAE,CAAC,IAAI,EAAE;gBACb;oBACI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM;gBACV;oBACI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAClC,MAAM;gBACV;oBACI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM;gBACV;oBACI,MAAM;aACb;SACJ;IACL,CAAC;IACD,uBAAuB,CAAC,EAAyB,EAAE,GAA8B;QAC7E,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAa,CAAC,EAAG,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,aAAa,EAAE;YACf,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;SACpF;QACD,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,aAAc,CAAC,QAAQ,CAAC,aAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,YAAY,CAAC,MAAc;QACvB,IAAI,KAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;SACzB;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE;YACP,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;YAChC,IAAI,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;gBAC9B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;aAChC;SACJ;IACL,CAAC;IAED,oBAAoB,CAAqB,GAAW;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAI,GAAG,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjG,CAAC;IAED,uBAAuB,CAAC,GAAW;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;SAC1H;QAED,IAAI,oBAA6C,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE;YACL,oBAAoB,GAAG,GAAG,CAAC,UAAU,CAAC;SACzC;QACD,OAAO,oBAAoB,CAAC;IAChC,CAAC;IACD,yBAAyB,CAAC,GAAW;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,mCAAmC;YACnC,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;SAC5H;QAED,IAAI,QAA4B,CAAC;QACjC,IAAI,WAA+B,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,IAAI,GAAG,EAAE;YACL,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,WAAW,GAAG,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;SAC7C;QACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IACD,aAAa;QACT,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,UAAU,CAAC;IAC7C,CAAC;IACD,WAAW;QACP,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED,SAAS,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7C,0BAA0B,CAAC,YAAgC,EAAE,MAAM,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC;QACnF,4DAA4D;QAC5D,kEAAkE;QAClE,yDAAyD;QACzD,uEAAuE;QACvE,YAAY;QACZ,IAAI,YAAY,KAAK,SAAS,EAAE;YAC5B,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;gBACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;aACrE;iBAAM;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAC5D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC;aACjD;SACJ;IACL,CAAC;IAED,QAAQ,CAAC,QAAgB,EAAE,SAAiB,EAAE,SAAS,GAAG,IAAI;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Trace } from \"@fluidframework/common-utils\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReference } from \"./localReference\";\nimport {\n CollaborationWindow,\n compareStrings,\n elapsedMicroseconds,\n IConsensusInfo,\n ISegment,\n ISegmentAction,\n Marker,\n MergeTree,\n RangeStackMap,\n SegmentGroup,\n} from \"./mergeTree\";\nimport { MergeTreeDeltaCallback } from \"./mergeTreeDeltaCallback\";\nimport {\n createAnnotateMarkerOp,\n createAnnotateRangeOp,\n createGroupOp,\n createInsertSegmentOp,\n createRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMergeTreeAnnotateMsg,\n IMergeTreeDeltaOp,\n IMergeTreeGroupMsg,\n IMergeTreeInsertMsg,\n IMergeTreeRemoveMsg,\n IMergeTreeOp,\n IRelativePosition,\n MergeTreeDeltaType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { MergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport {\n IMergeTreeClientSequenceArgs,\n IMergeTreeDeltaOpArgs,\n MergeTreeMaintenanceCallback,\n ReferencePosition,\n} from \"./index\";\n\nexport class Client {\n public verboseOps = false;\n public noVerboseRemoteAnnotate = false;\n public measureOps = false;\n public accumTime = 0;\n public localTime = 0;\n public localOps = 0;\n public accumWindowTime = 0;\n public accumWindow = 0;\n public accumOps = 0;\n public maxWindowTime = 0;\n public longClientId: string | undefined;\n\n get mergeTreeDeltaCallback(): MergeTreeDeltaCallback | undefined { return this.mergeTree.mergeTreeDeltaCallback; }\n set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined) {\n this.mergeTree.mergeTreeDeltaCallback = callback;\n }\n\n get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined {\n return this.mergeTree.mergeTreeMaintenanceCallback;\n }\n\n set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined) {\n this.mergeTree.mergeTreeMaintenanceCallback = callback;\n }\n\n protected readonly mergeTree: MergeTree;\n\n private readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n private readonly shortClientIdMap: string[] = [];\n private readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n constructor(\n // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n public readonly specToSegment: (spec: IJSONSegment) => ISegment,\n public readonly logger: ITelemetryLogger,\n options?: PropertySet,\n ) {\n this.mergeTree = new MergeTree(options);\n this.mergeTree.getLongClientId = (id) => this.getLongClientId(id);\n }\n\n /**\n * The merge tree maintains a queue of segment groups for each local operation.\n * These segment groups track segments modified by an operation.\n * This method peeks the tail of that queue, and returns the segments groups there.\n * It is used to get the segment group(s) for the previous operations.\n * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n */\n public peekPendingSegmentGroups(count: number = 1) {\n if (count === 1) {\n return this.mergeTree.pendingSegments?.last();\n }\n let taken = 0;\n return this.mergeTree.pendingSegments?.some(() => {\n if (taken < count) {\n taken++;\n return true;\n }\n return false;\n }, true);\n }\n\n /**\n * Annotate a maker and call the callback on concensus.\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param consensusCallback - The callback called when consensus is reached\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarkerNotifyConsensus(\n marker: Marker,\n props: PropertySet,\n consensusCallback: (m: Marker) => void): IMergeTreeAnnotateMsg | undefined {\n const combiningOp: ICombiningOp = {\n name: \"consensus\",\n };\n\n const annotateOp =\n this.annotateMarker(marker, props, combiningOp);\n\n if (annotateOp) {\n const consensusInfo: IConsensusInfo = {\n callback: consensusCallback,\n marker,\n };\n this.pendingConsensus.set(marker.getId()!, consensusInfo);\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarker(\n marker: Marker,\n props: PropertySet,\n combiningOp: ICombiningOp): IMergeTreeAnnotateMsg | undefined {\n const annotateOp =\n createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateRangeLocal(\n start: number,\n end: number,\n props: PropertySet,\n combiningOp: ICombiningOp | undefined): IMergeTreeAnnotateMsg | undefined {\n const annotateOp = createAnnotateRangeOp(\n start,\n end,\n props,\n combiningOp);\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n }\n return undefined;\n }\n\n /**\n * Removes the range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n */\n public removeRangeLocal(start: number, end: number) {\n const removeOp = createRemoveRangeOp(start, end);\n\n if (this.applyRemoveRangeOp({ op: removeOp })) {\n return removeOp;\n }\n return undefined;\n }\n\n /**\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n if (segment.cachedLength <= 0) {\n return undefined;\n }\n const insertOp = createInsertSegmentOp(pos, segment);\n if (this.applyInsertOp({ op: insertOp })) {\n return insertOp;\n }\n return undefined;\n }\n\n /**\n * @param refPos - The reference position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertAtReferencePositionLocal(\n refPos: ReferencePosition,\n segment: ISegment,\n ): IMergeTreeInsertMsg | undefined {\n const pos = this.mergeTree.referencePositionToLocalPosition(\n refPos,\n this.getCurrentSeq(),\n this.getClientId());\n\n if (pos === LocalReference.DetachedPosition) {\n return undefined;\n }\n const op = createInsertSegmentOp(\n pos,\n segment);\n\n const opArgs = { op };\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertAtReferencePosition(\n refPos,\n segment,\n opArgs);\n\n this.completeAndLogOp(\n opArgs,\n this.getClientSequenceArgs(opArgs),\n { start: op.pos1 },\n traceStart);\n\n return op;\n }\n\n public walkSegments<TClientData>(handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;\n public walkSegments<undefined>(handler: ISegmentAction<undefined>,\n start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;\n public walkSegments<TClientData>(\n handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange: boolean = false) {\n this.mergeTree.mapRange(\n {\n leaf: handler,\n },\n this.getCurrentSeq(), this.getClientId(),\n accum, start, end, splitRange);\n }\n\n /**\n * Serializes the data required for garbage collection. The IFluidHandles stored in all segements that haven't\n * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n * serializer which keeps track of all serialized handles.\n */\n public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (seg) => {\n // Only serialize segments that have not been removed.\n if (seg.removedSeq === undefined) {\n handleCollectingSerializer.stringify(\n seg.clone().toJSONObject(),\n handle);\n }\n return true;\n },\n );\n }\n\n public getCollabWindow(): CollaborationWindow {\n return this.mergeTree.getCollabWindow();\n }\n\n /**\n * Returns the current position of a segment, and -1 if the segment\n * does not exist in this merge tree\n * @param segment - The segment to get the position of\n */\n public getPosition(segment: ISegment): number {\n if (segment?.parent === undefined) {\n return -1;\n }\n return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());\n }\n\n public addLocalReference(lref: LocalReference) {\n return this.mergeTree.addLocalReference(lref);\n }\n\n public removeLocalReference(lref: LocalReference) {\n return this.mergeTree.removeLocalReference(lref.segment!, lref);\n }\n\n /**\n * Given a position specified relative to a marker id, lookup the marker\n * and convert the position to a character position.\n * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n */\n public posFromRelativePos(relativePos: IRelativePosition) {\n return this.mergeTree.posFromRelativePos(relativePos);\n }\n\n public getMarkerFromId(id: string) {\n return this.mergeTree.getMarkerFromId(id);\n }\n\n /**\n * Performs the remove based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the remove was applied. False if it could not be.\n */\n private applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* \"Unexpected op type on range remove!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.markRangeRemoved(\n range.start,\n range.end,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n false,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the annotate based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the annotate was applied. False if it could not be.\n */\n private applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* \"Unexpected op type on range annotate!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.annotateRange(\n range.start,\n range.end,\n op.props,\n op.combiningOp,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the insert based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the insert was applied. False if it could not be.\n */\n private applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* \"Unexpected op type on range insert!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let segments: ISegment[] | undefined;\n if (op.seg) {\n segments = [this.specToSegment(op.seg)];\n }\n\n if (!segments || segments.length === 0) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertSegments(\n range.start,\n segments,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n *\n * @param opArgs - The op args of the op to complete\n * @param clientArgs - The client args for the op\n * @param range - The range the op applied to\n * @param clockStart - Optional. The clock start if timing data should be updated.\n */\n private completeAndLogOp(\n opArgs: IMergeTreeDeltaOpArgs,\n clientArgs: IMergeTreeClientSequenceArgs,\n range: Partial<IIntegerRange>,\n traceStart?: Trace) {\n if (!opArgs.sequencedMessage) {\n if (traceStart) {\n this.localTime += elapsedMicroseconds(traceStart);\n this.localOps++;\n }\n } else {\n assert(this.mergeTree.getCollabWindow().currentSeq < clientArgs.sequenceNumber,\n 0x030 /* \"Incoming remote op sequence# <= local collabWindow's currentSequence#\" */);\n assert(this.mergeTree.getCollabWindow().minSeq <= opArgs.sequencedMessage.minimumSequenceNumber,\n 0x031 /* \"Incoming remote op minSequence# < local collabWindow's minSequence#\" */);\n if (traceStart) {\n this.accumTime += elapsedMicroseconds(traceStart);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n }\n if (this.verboseOps && (!opArgs.sequencedMessage || !this.noVerboseRemoteAnnotate)) {\n console.log(\n `@cli ${this.getLongClientId(this.getCollabWindow().clientId)} ` +\n `seq ${clientArgs.sequenceNumber} ${opArgs.op.type} local ${!opArgs.sequencedMessage} ` +\n `start ${range.start} end ${range.end} refseq ${clientArgs.referenceSequenceNumber} ` +\n `cli ${clientArgs.clientId}`);\n }\n }\n\n /**\n * Returns a valid range for the op, or undefined\n * @param op - The op to generate the range for\n * @param clientArgs - The client args for the op\n */\n private getValidOpRange(\n op: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n clientArgs: IMergeTreeClientSequenceArgs): IIntegerRange | undefined {\n let start: number | undefined = op.pos1;\n if (start === undefined && op.relativePos1) {\n start = this.mergeTree.posFromRelativePos(\n op.relativePos1,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n let end: number | undefined = op.pos2;\n if (end === undefined && op.relativePos2) {\n end = this.mergeTree.posFromRelativePos(\n op.relativePos2,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n // Validate if local op\n if (clientArgs.clientId === this.getClientId()) {\n const length = this.getLength();\n\n const invalidPositions: string[] = [];\n\n // Validate start position\n //\n if (start === undefined\n || start < 0\n || start > length\n || start === length && op.type !== MergeTreeDeltaType.INSERT) {\n invalidPositions.push(\"start\");\n }\n // Validate end if not insert, or insert has end\n //\n if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n if (end === undefined || end <= start!) {\n invalidPositions.push(\"end\");\n }\n }\n\n if (invalidPositions.length > 0) {\n throw new LoggingError(\n \"RangeOutOfBounds\",\n {\n usageError: true,\n end,\n invalidPositions: invalidPositions.toString(),\n length,\n opPos1: op.pos1,\n opPos1Relative: op.relativePos1 !== undefined,\n opPos2: op.pos2,\n opPos2Relative: op.relativePos2 !== undefined,\n opType: op.type,\n start,\n },\n );\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return { start, end } as IIntegerRange;\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n // If there this no sequenced message, then the op is local\n // and unacked, so use this clients sequenced args\n //\n if (!opArgs.sequencedMessage) {\n const segWindow = this.getCollabWindow();\n return {\n clientId: segWindow.clientId,\n referenceSequenceNumber: segWindow.currentSeq,\n sequenceNumber: this.getLocalSequenceNumber(),\n };\n } else {\n return {\n clientId: this.getShortClientId(opArgs.sequencedMessage.clientId),\n referenceSequenceNumber: opArgs.sequencedMessage.referenceSequenceNumber,\n sequenceNumber: opArgs.sequencedMessage.sequenceNumber,\n };\n }\n }\n\n private ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const ackOp = (deltaOpArgs: IMergeTreeDeltaOpArgs) => {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n\n this.mergeTree.ackPendingSegment(deltaOpArgs, this.verboseOps);\n if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === \"consensus\")) {\n this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage!);\n }\n }\n\n if (trace) {\n this.accumTime += elapsedMicroseconds(trace);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n\n if (this.verboseOps) {\n console.log(`@cli ${this.getLongClientId(this.getCollabWindow().clientId)} ` +\n `ack seq # ${deltaOpArgs.sequencedMessage?.sequenceNumber}`);\n }\n };\n\n if (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n for (const memberOp of opArgs.op.ops) {\n ackOp({\n groupOp: opArgs.op,\n op: memberOp,\n sequencedMessage: opArgs.sequencedMessage,\n });\n }\n } else {\n ackOp(opArgs);\n }\n }\n\n // as functions are modified move them above the eslint-disabled waterline and lint them\n\n cloneFromSegments() {\n const clone = new Client(this.specToSegment, this.logger, this.mergeTree.options);\n const segments: ISegment[] = [];\n const newRoot = this.mergeTree.blockClone(this.mergeTree.root, segments);\n clone.mergeTree.root = newRoot;\n return clone;\n }\n getOrAddShortClientId(longClientId: string) {\n if (!this.clientNameToIds.get(longClientId)) {\n this.addLongClientId(longClientId);\n }\n return this.getShortClientId(longClientId);\n }\n getShortClientId(longClientId: string) {\n return this.clientNameToIds.get(longClientId)!.data;\n }\n getLongClientId(shortClientId: number) {\n if (shortClientId >= 0) {\n return this.shortClientIdMap[shortClientId];\n }\n else {\n return \"original\";\n }\n }\n addLongClientId(longClientId: string) {\n this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n this.shortClientIdMap.push(longClientId);\n }\n\n /**\n * During reconnect, we must find the positions to pending segments\n * relative to other pending segments. This methods computes that\n * position relative to a localSeq. Pending segments above the localSeq\n * will be ignored.\n *\n * @param segment - The segment to find the position for\n * @param localSeq - The localSeq to find the position of the segment at\n */\n public findReconnectionPostition(segment: ISegment, localSeq: number) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* \"localSeq greater than collab window\" */);\n let segmentPosition = 0;\n /*\n Walk the segments up to the current segment, and calculate it's\n position taking into account local segments that were modified,\n after the current segment.\n\n TODO: Consider embedding this information into the tree for\n more efficient look up of pending segment positions.\n */\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n // If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n if (seg === segment) {\n return false;\n }\n\n // Otherwise, advance segmentPosition if the segment has been inserted and not removed\n // with respect to the given 'localSeq'.\n //\n // Note that all ACKed / remote ops are applied and we only need concern ourself with\n // determining if locally pending ops fall before/after the given 'localSeq'.\n if ((seg.localSeq === undefined || seg.localSeq <= localSeq) // Is inserted\n && (seg.removedSeq === undefined || seg.localRemovedSeq! > localSeq) // Not removed\n ) {\n segmentPosition += seg.cachedLength;\n }\n\n return true;\n });\n\n return segmentPosition;\n }\n\n private resetPendingDeltaToOps(\n resetOp: IMergeTreeDeltaOp,\n segmentGroup: SegmentGroup): IMergeTreeDeltaOp[] {\n assert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n const NACKedSegmentGroup = this.mergeTree.pendingSegments?.dequeue();\n assert(segmentGroup === NACKedSegmentGroup,\n 0x034 /* \"Segment group not at head of merge tree pending queue\" */);\n\n const opList: IMergeTreeDeltaOp[] = [];\n // We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n // The reason they need them sorted, as they have the same local sequence number and which means\n // farther segments will take into account nearer segments when calculating their position.\n // By sorting we ensure the nearer segment will be applied and sequenced before the father segments\n // so their recalulated positions will be correct.\n for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {\n const segmentSegGroup = segment.segmentGroups.dequeue();\n assert(segmentGroup === segmentSegGroup,\n 0x035 /* \"Segment group not at head of segment pending queue\" */);\n const segmentPosition = this.findReconnectionPostition(segment, segmentGroup.localSeq);\n let newOp: IMergeTreeDeltaOp | undefined;\n switch (resetOp.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(segment.propertyManager?.hasPendingProperties() === true,\n 0x036 /* \"Segment has no pending properties\" */);\n newOp = createAnnotateRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength,\n resetOp.props,\n resetOp.combiningOp);\n break;\n\n case MergeTreeDeltaType.INSERT:\n assert(segment.seq === UnassignedSequenceNumber,\n 0x037 /* \"Segment already has assigned sequence number\" */);\n newOp = createInsertSegmentOp(\n segmentPosition,\n segment);\n break;\n\n case MergeTreeDeltaType.REMOVE:\n if (segment.localRemovedSeq !== undefined) {\n newOp = createRemoveRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength);\n }\n break;\n\n default:\n throw new Error(`Invalid op type`);\n }\n\n if (newOp) {\n const newSegmentGroup: SegmentGroup = { segments: [], localSeq: segmentGroup.localSeq };\n segment.segmentGroups.enqueue(newSegmentGroup);\n this.mergeTree.pendingSegments!.enqueue(newSegmentGroup);\n opList.push(newOp);\n }\n }\n\n return opList;\n }\n\n private applyRemoteOp(opArgs: IMergeTreeDeltaOpArgs) {\n const op = opArgs.op;\n const msg = opArgs.sequencedMessage;\n this.getOrAddShortClientId(msg!.clientId);\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.GROUP: {\n for (const memberOp of op.ops) {\n this.applyRemoteOp({\n op: memberOp,\n groupOp: op,\n sequencedMessage: msg,\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n public applyMsg(msg: ISequencedDocumentMessage) {\n // Ensure client ID is registered\n this.getOrAddShortClientId(msg.clientId);\n // Apply if an operation message\n if (msg.type === MessageType.Operation) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op: msg.contents as IMergeTreeOp,\n sequencedMessage: msg,\n };\n if (opArgs.sequencedMessage?.clientId === this.longClientId) {\n this.ackPendingSegment(opArgs);\n }\n else {\n this.applyRemoteOp(opArgs);\n }\n }\n\n this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n }\n\n public updateSeqNumbers(min: number, seq: number) {\n const collabWindow = this.mergeTree.getCollabWindow();\n // Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n assert(collabWindow.currentSeq <= seq,\n 0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */);\n collabWindow.currentSeq = seq;\n assert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n this.updateMinSeq(min);\n }\n\n /**\n * Resolves a remote client's position against the local sequence\n * and returns the remote client's position relative to the local\n * sequence\n * @param remoteClientPosition - The remote client's position to resolve\n * @param remoteClientRefSeq - The reference sequence number of the remote client\n * @param remoteClientId - The client id of the remote client\n */\n public resolveRemoteClientPosition(\n remoteClientPosition: number,\n remoteClientRefSeq: number,\n remoteClientId: string): number | undefined {\n const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n return this.mergeTree.resolveRemoteClientPosition(\n remoteClientPosition,\n remoteClientRefSeq,\n shortRemoteClientId);\n }\n\n /**\n * Given an pending operation and segment group, regenerate the op, so it\n * can be resubmitted\n * @param resetOp - The op to reset\n * @param segmentGroup - The segment group associated with the op\n */\n public regeneratePendingOp(\n resetOp: IMergeTreeOp,\n segmentGroup: SegmentGroup | SegmentGroup[],\n ): IMergeTreeOp {\n const opList: IMergeTreeDeltaOp[] = [];\n if (resetOp.type === MergeTreeDeltaType.GROUP) {\n if (Array.isArray(segmentGroup)) {\n assert(resetOp.ops.length === segmentGroup.length,\n 0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n\n for (let i = 0; i < resetOp.ops.length; i++) {\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n }\n } else {\n // A group op containing a single op will pass a direct reference to 'segmentGroup'\n // rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n assert(resetOp.ops.length === 1,\n 0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n }\n } else {\n assert((resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n 0x03c /* \"Reset op has 'group' delta type!\" */);\n assert(!Array.isArray(segmentGroup),\n 0x03d /* \"segmentGroup is array rather than singleton!\" */);\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n }\n return opList.length === 1 ? opList[0] : createGroupOp(...opList);\n }\n\n public createTextHelper() {\n return new MergeTreeTextHelper(this.mergeTree);\n }\n\n public summarize(\n runtime: IFluidDataStoreRuntime,\n handle: IFluidHandle,\n serializer: IFluidSerializer,\n catchUpMsgs: ISequencedDocumentMessage[],\n ): ISummaryTreeWithStats {\n const deltaManager = runtime.deltaManager;\n const minSeq = deltaManager.minimumSequenceNumber;\n\n // Catch up to latest MSN, if we have not had a chance to do it.\n // Required for case where FluidDataStoreRuntime.attachChannel()\n // generates summary right after loading data store.\n\n this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n // Not sure why - need to catch it sooner\n assert(this.getCollabWindow().minSeq === minSeq,\n 0x03e /* \"minSeq mismatch between collab window and delta manager!\" */);\n\n // Must continue to support legacy\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n if (this.mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n assert(\n catchUpMsgs === undefined || catchUpMsgs.length === 0,\n 0x03f /* \"New format should not emit catchup ops\" */);\n const snap = new SnapshotV1(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(serializer, handle);\n } else {\n const snap = new SnapshotLegacy(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(catchUpMsgs, serializer, handle);\n }\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);\n\n return loader.initialize(storage);\n }\n\n getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);\n }\n\n private getLocalSequenceNumber() {\n const segWindow = this.getCollabWindow();\n if (segWindow.collaborating) {\n return UnassignedSequenceNumber;\n }\n else {\n return UniversalSequenceNumber;\n }\n }\n localTransaction(groupOp: IMergeTreeGroupMsg) {\n for (const op of groupOp.ops) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op,\n groupOp,\n };\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n default:\n break;\n }\n }\n }\n updateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n const markerId = op.relativePos1!.id!;\n const consensusInfo = this.pendingConsensus.get(markerId);\n if (consensusInfo) {\n consensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n }\n this.mergeTree.addMinSeqListener(msg.sequenceNumber, () => consensusInfo!.callback(consensusInfo!.marker));\n }\n\n updateMinSeq(minSeq: number) {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n this.mergeTree.setMinSeq(minSeq);\n if (trace) {\n const elapsed = elapsedMicroseconds(trace);\n this.accumWindowTime += elapsed;\n if (elapsed > this.maxWindowTime) {\n this.maxWindowTime = elapsed;\n }\n }\n }\n\n getContainingSegment<T extends ISegment>(pos: number) {\n const segWindow = this.mergeTree.getCollabWindow();\n return this.mergeTree.getContainingSegment<T>(pos, segWindow.currentSeq, segWindow.clientId);\n }\n\n getPropertiesAtPosition(pos: number) {\n const segWindow = this.getCollabWindow();\n if (this.verboseOps) {\n // eslint-disable-next-line max-len\n console.log(`getPropertiesAtPosition cli ${this.getLongClientId(segWindow.clientId)} ref seq ${segWindow.currentSeq}`);\n }\n\n let propertiesAtPosition: PropertySet | undefined;\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n propertiesAtPosition = seg.properties;\n }\n return propertiesAtPosition;\n }\n getRangeExtentsOfPosition(pos: number) {\n const segWindow = this.getCollabWindow();\n if (this.verboseOps) {\n // eslint-disable-next-line max-len\n console.log(`getRangeExtentsOfPosition cli ${this.getLongClientId(segWindow.clientId)} ref seq ${segWindow.currentSeq}`);\n }\n\n let posStart: number | undefined;\n let posAfterEnd: number | undefined;\n\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n posStart = this.getPosition(seg);\n posAfterEnd = posStart + seg.cachedLength;\n }\n return { posStart, posAfterEnd };\n }\n getCurrentSeq() {\n return this.getCollabWindow().currentSeq;\n }\n getClientId() {\n return this.getCollabWindow().clientId;\n }\n\n getLength() { return this.mergeTree.length; }\n\n startOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n // we should always have a client id if we are collaborating\n // if the client id is undefined we are likely bound to a detached\n // container, so we should keep going in local mode. once\n // the container attaches this will be called again on connect with the\n // client id\n if (longClientId !== undefined) {\n if (this.longClientId === undefined) {\n this.longClientId = longClientId;\n this.addLongClientId(this.longClientId);\n this.mergeTree.startCollaboration(\n this.getShortClientId(this.longClientId), minSeq, currentSeq);\n } else {\n const oldClientId = this.longClientId;\n const oldData = this.clientNameToIds.get(oldClientId)!.data;\n this.longClientId = longClientId;\n this.clientNameToIds.put(longClientId, oldData);\n this.shortClientIdMap[oldData] = longClientId;\n }\n }\n }\n\n findTile(startPos: number, tileLabel: string, preceding = true) {\n const clientId = this.getClientId();\n return this.mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.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/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IFluidSerializer } from \"@fluidframework/shared-object-base\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { IFluidDataStoreRuntime, IChannelStorageService } from \"@fluidframework/datastore-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Trace } from \"@fluidframework/common-utils\";\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport { IIntegerRange } from \"./base\";\nimport { RedBlackTree } from \"./collections\";\nimport { UnassignedSequenceNumber, UniversalSequenceNumber } from \"./constants\";\nimport { LocalReference } from \"./localReference\";\nimport {\n CollaborationWindow,\n compareStrings,\n IConsensusInfo,\n ISegment,\n ISegmentAction,\n Marker,\n MergeTree,\n RangeStackMap,\n SegmentGroup,\n} from \"./mergeTree\";\nimport { MergeTreeDeltaCallback } from \"./mergeTreeDeltaCallback\";\nimport {\n createAnnotateMarkerOp,\n createAnnotateRangeOp,\n createGroupOp,\n createInsertSegmentOp,\n createRemoveRangeOp,\n} from \"./opBuilder\";\nimport {\n ICombiningOp,\n IJSONSegment,\n IMergeTreeAnnotateMsg,\n IMergeTreeDeltaOp,\n IMergeTreeGroupMsg,\n IMergeTreeInsertMsg,\n IMergeTreeRemoveMsg,\n IMergeTreeOp,\n IRelativePosition,\n MergeTreeDeltaType,\n} from \"./ops\";\nimport { PropertySet } from \"./properties\";\nimport { SnapshotLegacy } from \"./snapshotlegacy\";\nimport { SnapshotLoader } from \"./snapshotLoader\";\nimport { MergeTreeTextHelper } from \"./textSegment\";\nimport { SnapshotV1 } from \"./snapshotV1\";\nimport {\n IMergeTreeClientSequenceArgs,\n IMergeTreeDeltaOpArgs,\n MergeTreeMaintenanceCallback,\n ReferencePosition,\n} from \"./index\";\n\nfunction elapsedMicroseconds(trace: Trace) {\n return trace.trace().duration * 1000;\n}\n\nexport class Client {\n public measureOps = false;\n public accumTime = 0;\n public localTime = 0;\n public localOps = 0;\n public accumWindowTime = 0;\n public accumWindow = 0;\n public accumOps = 0;\n public maxWindowTime = 0;\n public longClientId: string | undefined;\n\n get mergeTreeDeltaCallback(): MergeTreeDeltaCallback | undefined { return this.mergeTree.mergeTreeDeltaCallback; }\n set mergeTreeDeltaCallback(callback: MergeTreeDeltaCallback | undefined) {\n this.mergeTree.mergeTreeDeltaCallback = callback;\n }\n\n get mergeTreeMaintenanceCallback(): MergeTreeMaintenanceCallback | undefined {\n return this.mergeTree.mergeTreeMaintenanceCallback;\n }\n\n set mergeTreeMaintenanceCallback(callback: MergeTreeMaintenanceCallback | undefined) {\n this.mergeTree.mergeTreeMaintenanceCallback = callback;\n }\n\n protected readonly mergeTree: MergeTree;\n\n private readonly clientNameToIds = new RedBlackTree<string, number>(compareStrings);\n private readonly shortClientIdMap: string[] = [];\n private readonly pendingConsensus = new Map<string, IConsensusInfo>();\n\n constructor(\n // Passing this callback would be unnecessary if Client were merged with SharedSegmentSequence\n public readonly specToSegment: (spec: IJSONSegment) => ISegment,\n public readonly logger: ITelemetryLogger,\n options?: PropertySet,\n ) {\n this.mergeTree = new MergeTree(options);\n this.mergeTree.getLongClientId = (id) => this.getLongClientId(id);\n }\n\n /**\n * The merge tree maintains a queue of segment groups for each local operation.\n * These segment groups track segments modified by an operation.\n * This method peeks the tail of that queue, and returns the segments groups there.\n * It is used to get the segment group(s) for the previous operations.\n * @param count - The number segment groups to get peek from the tail of the queue. Default 1.\n */\n public peekPendingSegmentGroups(count: number = 1) {\n if (count === 1) {\n return this.mergeTree.pendingSegments?.last();\n }\n let taken = 0;\n return this.mergeTree.pendingSegments?.some(() => {\n if (taken < count) {\n taken++;\n return true;\n }\n return false;\n }, true);\n }\n\n /**\n * Annotate a maker and call the callback on concensus.\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param consensusCallback - The callback called when consensus is reached\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarkerNotifyConsensus(\n marker: Marker,\n props: PropertySet,\n consensusCallback: (m: Marker) => void): IMergeTreeAnnotateMsg | undefined {\n const combiningOp: ICombiningOp = {\n name: \"consensus\",\n };\n\n const annotateOp =\n this.annotateMarker(marker, props, combiningOp);\n\n if (annotateOp) {\n const consensusInfo: IConsensusInfo = {\n callback: consensusCallback,\n marker,\n };\n this.pendingConsensus.set(marker.getId()!, consensusInfo);\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the markers with the provided properties\n * @param marker - The marker to annotate\n * @param props - The properties to annotate the marker with\n * @param combiningOp - Optional. Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateMarker(\n marker: Marker,\n props: PropertySet,\n combiningOp: ICombiningOp): IMergeTreeAnnotateMsg | undefined {\n const annotateOp =\n createAnnotateMarkerOp(marker, props, combiningOp)!;\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n } else {\n return undefined;\n }\n }\n /**\n * Annotates the range with the provided properties\n * @param start - The inclusive start position of the range to annotate\n * @param end - The exclusive end position of the range to annotate\n * @param props - The properties to annotate the range with\n * @param combiningOp - Specifies how to combine values for the property, such as \"incr\" for increment.\n * @returns The annotate op if valid, otherwise undefined\n */\n public annotateRangeLocal(\n start: number,\n end: number,\n props: PropertySet,\n combiningOp: ICombiningOp | undefined): IMergeTreeAnnotateMsg | undefined {\n const annotateOp = createAnnotateRangeOp(\n start,\n end,\n props,\n combiningOp);\n\n if (this.applyAnnotateRangeOp({ op: annotateOp })) {\n return annotateOp;\n }\n return undefined;\n }\n\n /**\n * Removes the range\n *\n * @param start - The inclusive start of the range to remove\n * @param end - The exclusive end of the range to remove\n */\n public removeRangeLocal(start: number, end: number) {\n const removeOp = createRemoveRangeOp(start, end);\n\n if (this.applyRemoveRangeOp({ op: removeOp })) {\n return removeOp;\n }\n return undefined;\n }\n\n /**\n * @param pos - The position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertSegmentLocal(pos: number, segment: ISegment): IMergeTreeInsertMsg | undefined {\n if (segment.cachedLength <= 0) {\n return undefined;\n }\n const insertOp = createInsertSegmentOp(pos, segment);\n if (this.applyInsertOp({ op: insertOp })) {\n return insertOp;\n }\n return undefined;\n }\n\n /**\n * @param refPos - The reference position to insert the segment at\n * @param segment - The segment to insert\n */\n public insertAtReferencePositionLocal(\n refPos: ReferencePosition,\n segment: ISegment,\n ): IMergeTreeInsertMsg | undefined {\n const pos = this.mergeTree.referencePositionToLocalPosition(\n refPos,\n this.getCurrentSeq(),\n this.getClientId());\n\n if (pos === LocalReference.DetachedPosition) {\n return undefined;\n }\n const op = createInsertSegmentOp(\n pos,\n segment);\n\n const opArgs = { op };\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertAtReferencePosition(\n refPos,\n segment,\n opArgs);\n\n this.completeAndLogOp(\n opArgs,\n this.getClientSequenceArgs(opArgs),\n { start: op.pos1 },\n traceStart);\n\n return op;\n }\n\n public walkSegments<TClientData>(handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange?: boolean): void;\n public walkSegments<undefined>(handler: ISegmentAction<undefined>,\n start?: number, end?: number, accum?: undefined, splitRange?: boolean): void;\n public walkSegments<TClientData>(\n handler: ISegmentAction<TClientData>,\n start: number | undefined, end: number | undefined, accum: TClientData, splitRange: boolean = false) {\n this.mergeTree.mapRange(\n {\n leaf: handler,\n },\n this.getCurrentSeq(), this.getClientId(),\n accum, start, end, splitRange);\n }\n\n /**\n * Serializes the data required for garbage collection. The IFluidHandles stored in all segements that haven't\n * been removed represent routes to other objects. We serialize the data in these segments using the passed in\n * serializer which keeps track of all serialized handles.\n */\n public serializeGCData(handle: IFluidHandle, handleCollectingSerializer: IFluidSerializer): void {\n this.mergeTree.walkAllSegments(\n this.mergeTree.root,\n (seg) => {\n // Only serialize segments that have not been removed.\n if (seg.removedSeq === undefined) {\n handleCollectingSerializer.stringify(\n seg.clone().toJSONObject(),\n handle);\n }\n return true;\n },\n );\n }\n\n public getCollabWindow(): CollaborationWindow {\n return this.mergeTree.getCollabWindow();\n }\n\n /**\n * Returns the current position of a segment, and -1 if the segment\n * does not exist in this merge tree\n * @param segment - The segment to get the position of\n */\n public getPosition(segment: ISegment): number {\n if (segment?.parent === undefined) {\n return -1;\n }\n return this.mergeTree.getPosition(segment, this.getCurrentSeq(), this.getClientId());\n }\n\n public addLocalReference(lref: LocalReference) {\n return this.mergeTree.addLocalReference(lref);\n }\n\n public removeLocalReference(lref: LocalReference) {\n return this.mergeTree.removeLocalReference(lref.segment!, lref);\n }\n\n /**\n * Given a position specified relative to a marker id, lookup the marker\n * and convert the position to a character position.\n * @param relativePos - Id of marker (may be indirect) and whether position is before or after marker.\n */\n public posFromRelativePos(relativePos: IRelativePosition) {\n return this.mergeTree.posFromRelativePos(relativePos);\n }\n\n public getMarkerFromId(id: string) {\n return this.mergeTree.getMarkerFromId(id);\n }\n\n /**\n * Performs the remove based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the remove was applied. False if it could not be.\n */\n private applyRemoveRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.REMOVE, 0x02d /* \"Unexpected op type on range remove!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.markRangeRemoved(\n range.start,\n range.end,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n false,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the annotate based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the annotate was applied. False if it could not be.\n */\n private applyAnnotateRangeOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.ANNOTATE, 0x02e /* \"Unexpected op type on range annotate!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.annotateRange(\n range.start,\n range.end,\n op.props,\n op.combiningOp,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n * Performs the insert based on the provided op\n * @param opArgs - The ops args for the op\n * @returns True if the insert was applied. False if it could not be.\n */\n private applyInsertOp(opArgs: IMergeTreeDeltaOpArgs): boolean {\n assert(opArgs.op.type === MergeTreeDeltaType.INSERT, 0x02f /* \"Unexpected op type on range insert!\" */);\n const op = opArgs.op;\n const clientArgs = this.getClientSequenceArgs(opArgs);\n const range = this.getValidOpRange(op, clientArgs);\n\n if (!range) {\n return false;\n }\n\n let segments: ISegment[] | undefined;\n if (op.seg) {\n segments = [this.specToSegment(op.seg)];\n }\n\n if (!segments || segments.length === 0) {\n return false;\n }\n\n let traceStart: Trace | undefined;\n if (this.measureOps) {\n traceStart = Trace.start();\n }\n\n this.mergeTree.insertSegments(\n range.start,\n segments,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId,\n clientArgs.sequenceNumber,\n opArgs);\n\n this.completeAndLogOp(opArgs, clientArgs, range, traceStart);\n\n return true;\n }\n\n /**\n *\n * @param opArgs - The op args of the op to complete\n * @param clientArgs - The client args for the op\n * @param range - The range the op applied to\n * @param clockStart - Optional. The clock start if timing data should be updated.\n */\n private completeAndLogOp(\n opArgs: IMergeTreeDeltaOpArgs,\n clientArgs: IMergeTreeClientSequenceArgs,\n range: Partial<IIntegerRange>,\n traceStart?: Trace) {\n if (!opArgs.sequencedMessage) {\n if (traceStart) {\n this.localTime += elapsedMicroseconds(traceStart);\n this.localOps++;\n }\n } else {\n assert(this.mergeTree.getCollabWindow().currentSeq < clientArgs.sequenceNumber,\n 0x030 /* \"Incoming remote op sequence# <= local collabWindow's currentSequence#\" */);\n assert(this.mergeTree.getCollabWindow().minSeq <= opArgs.sequencedMessage.minimumSequenceNumber,\n 0x031 /* \"Incoming remote op minSequence# < local collabWindow's minSequence#\" */);\n if (traceStart) {\n this.accumTime += elapsedMicroseconds(traceStart);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n }\n }\n\n /**\n * Returns a valid range for the op, or undefined\n * @param op - The op to generate the range for\n * @param clientArgs - The client args for the op\n */\n private getValidOpRange(\n op: IMergeTreeAnnotateMsg | IMergeTreeInsertMsg | IMergeTreeRemoveMsg,\n clientArgs: IMergeTreeClientSequenceArgs): IIntegerRange | undefined {\n let start: number | undefined = op.pos1;\n if (start === undefined && op.relativePos1) {\n start = this.mergeTree.posFromRelativePos(\n op.relativePos1,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n let end: number | undefined = op.pos2;\n if (end === undefined && op.relativePos2) {\n end = this.mergeTree.posFromRelativePos(\n op.relativePos2,\n clientArgs.referenceSequenceNumber,\n clientArgs.clientId);\n }\n\n // Validate if local op\n if (clientArgs.clientId === this.getClientId()) {\n const length = this.getLength();\n\n const invalidPositions: string[] = [];\n\n // Validate start position\n //\n if (start === undefined\n || start < 0\n || start > length\n || start === length && op.type !== MergeTreeDeltaType.INSERT) {\n invalidPositions.push(\"start\");\n }\n // Validate end if not insert, or insert has end\n //\n if (op.type !== MergeTreeDeltaType.INSERT || end !== undefined) {\n if (end === undefined || end <= start!) {\n invalidPositions.push(\"end\");\n }\n }\n\n if (invalidPositions.length > 0) {\n throw new LoggingError(\n \"RangeOutOfBounds\",\n {\n usageError: true,\n end,\n invalidPositions: invalidPositions.toString(),\n length,\n opPos1: op.pos1,\n opPos1Relative: op.relativePos1 !== undefined,\n opPos2: op.pos2,\n opPos2Relative: op.relativePos2 !== undefined,\n opType: op.type,\n start,\n },\n );\n }\n }\n\n return { start, end } as IIntegerRange;\n }\n\n /**\n * Gets the client args from the op if remote, otherwise uses the local clients info\n * @param opArgs - The op arg to get the client sequence args for\n */\n private getClientSequenceArgs(opArgs: IMergeTreeDeltaOpArgs): IMergeTreeClientSequenceArgs {\n // If there this no sequenced message, then the op is local\n // and unacked, so use this clients sequenced args\n //\n if (!opArgs.sequencedMessage) {\n const segWindow = this.getCollabWindow();\n return {\n clientId: segWindow.clientId,\n referenceSequenceNumber: segWindow.currentSeq,\n sequenceNumber: this.getLocalSequenceNumber(),\n };\n } else {\n return {\n clientId: this.getShortClientId(opArgs.sequencedMessage.clientId),\n referenceSequenceNumber: opArgs.sequencedMessage.referenceSequenceNumber,\n sequenceNumber: opArgs.sequencedMessage.sequenceNumber,\n };\n }\n }\n\n private ackPendingSegment(opArgs: IMergeTreeDeltaOpArgs) {\n const ackOp = (deltaOpArgs: IMergeTreeDeltaOpArgs) => {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n\n this.mergeTree.ackPendingSegment(deltaOpArgs);\n if (deltaOpArgs.op.type === MergeTreeDeltaType.ANNOTATE) {\n if (deltaOpArgs.op.combiningOp && (deltaOpArgs.op.combiningOp.name === \"consensus\")) {\n this.updateConsensusProperty(deltaOpArgs.op, deltaOpArgs.sequencedMessage!);\n }\n }\n\n if (trace) {\n this.accumTime += elapsedMicroseconds(trace);\n this.accumOps++;\n this.accumWindow += (this.getCurrentSeq() - this.getCollabWindow().minSeq);\n }\n };\n\n if (opArgs.op.type === MergeTreeDeltaType.GROUP) {\n for (const memberOp of opArgs.op.ops) {\n ackOp({\n groupOp: opArgs.op,\n op: memberOp,\n sequencedMessage: opArgs.sequencedMessage,\n });\n }\n } else {\n ackOp(opArgs);\n }\n }\n\n // as functions are modified move them above the eslint-disabled waterline and lint them\n\n cloneFromSegments() {\n const clone = new Client(this.specToSegment, this.logger, this.mergeTree.options);\n const segments: ISegment[] = [];\n const newRoot = this.mergeTree.blockClone(this.mergeTree.root, segments);\n clone.mergeTree.root = newRoot;\n return clone;\n }\n getOrAddShortClientId(longClientId: string) {\n if (!this.clientNameToIds.get(longClientId)) {\n this.addLongClientId(longClientId);\n }\n return this.getShortClientId(longClientId);\n }\n getShortClientId(longClientId: string) {\n return this.clientNameToIds.get(longClientId)!.data;\n }\n getLongClientId(shortClientId: number) {\n if (shortClientId >= 0) {\n return this.shortClientIdMap[shortClientId];\n }\n else {\n return \"original\";\n }\n }\n addLongClientId(longClientId: string) {\n this.clientNameToIds.put(longClientId, this.shortClientIdMap.length);\n this.shortClientIdMap.push(longClientId);\n }\n\n /**\n * During reconnect, we must find the positions to pending segments\n * relative to other pending segments. This methods computes that\n * position relative to a localSeq. Pending segments above the localSeq\n * will be ignored.\n *\n * @param segment - The segment to find the position for\n * @param localSeq - The localSeq to find the position of the segment at\n */\n public findReconnectionPostition(segment: ISegment, localSeq: number) {\n assert(localSeq <= this.mergeTree.collabWindow.localSeq, 0x032 /* \"localSeq greater than collab window\" */);\n let segmentPosition = 0;\n /*\n Walk the segments up to the current segment, and calculate it's\n position taking into account local segments that were modified,\n after the current segment.\n\n TODO: Consider embedding this information into the tree for\n more efficient look up of pending segment positions.\n */\n this.mergeTree.walkAllSegments(this.mergeTree.root, (seg) => {\n // If we've found the desired segment, terminate the walk and return 'segmentPosition'.\n if (seg === segment) {\n return false;\n }\n\n // Otherwise, advance segmentPosition if the segment has been inserted and not removed\n // with respect to the given 'localSeq'.\n //\n // Note that all ACKed / remote ops are applied and we only need concern ourself with\n // determining if locally pending ops fall before/after the given 'localSeq'.\n if ((seg.localSeq === undefined || seg.localSeq <= localSeq) // Is inserted\n && (seg.removedSeq === undefined || seg.localRemovedSeq! > localSeq) // Not removed\n ) {\n segmentPosition += seg.cachedLength;\n }\n\n return true;\n });\n\n return segmentPosition;\n }\n\n private resetPendingDeltaToOps(\n resetOp: IMergeTreeDeltaOp,\n segmentGroup: SegmentGroup): IMergeTreeDeltaOp[] {\n assert(!!segmentGroup, 0x033 /* \"Segment group undefined\" */);\n const NACKedSegmentGroup = this.mergeTree.pendingSegments?.dequeue();\n assert(segmentGroup === NACKedSegmentGroup,\n 0x034 /* \"Segment group not at head of merge tree pending queue\" */);\n\n const opList: IMergeTreeDeltaOp[] = [];\n // We need to sort the segments by ordinal, as the segments are not sorted in the segment group.\n // The reason they need them sorted, as they have the same local sequence number and which means\n // farther segments will take into account nearer segments when calculating their position.\n // By sorting we ensure the nearer segment will be applied and sequenced before the father segments\n // so their recalulated positions will be correct.\n for (const segment of segmentGroup.segments.sort((a, b) => a.ordinal < b.ordinal ? -1 : 1)) {\n const segmentSegGroup = segment.segmentGroups.dequeue();\n assert(segmentGroup === segmentSegGroup,\n 0x035 /* \"Segment group not at head of segment pending queue\" */);\n const segmentPosition = this.findReconnectionPostition(segment, segmentGroup.localSeq);\n let newOp: IMergeTreeDeltaOp | undefined;\n switch (resetOp.type) {\n case MergeTreeDeltaType.ANNOTATE:\n assert(segment.propertyManager?.hasPendingProperties() === true,\n 0x036 /* \"Segment has no pending properties\" */);\n newOp = createAnnotateRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength,\n resetOp.props,\n resetOp.combiningOp);\n break;\n\n case MergeTreeDeltaType.INSERT:\n assert(segment.seq === UnassignedSequenceNumber,\n 0x037 /* \"Segment already has assigned sequence number\" */);\n newOp = createInsertSegmentOp(\n segmentPosition,\n segment);\n break;\n\n case MergeTreeDeltaType.REMOVE:\n if (segment.localRemovedSeq !== undefined) {\n newOp = createRemoveRangeOp(\n segmentPosition,\n segmentPosition + segment.cachedLength);\n }\n break;\n\n default:\n throw new Error(`Invalid op type`);\n }\n\n if (newOp) {\n const newSegmentGroup: SegmentGroup = { segments: [], localSeq: segmentGroup.localSeq };\n segment.segmentGroups.enqueue(newSegmentGroup);\n this.mergeTree.pendingSegments!.enqueue(newSegmentGroup);\n opList.push(newOp);\n }\n }\n\n return opList;\n }\n\n private applyRemoteOp(opArgs: IMergeTreeDeltaOpArgs) {\n const op = opArgs.op;\n const msg = opArgs.sequencedMessage;\n this.getOrAddShortClientId(msg!.clientId);\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.GROUP: {\n for (const memberOp of op.ops) {\n this.applyRemoteOp({\n op: memberOp,\n groupOp: op,\n sequencedMessage: msg,\n });\n }\n break;\n }\n default:\n break;\n }\n }\n\n public applyMsg(msg: ISequencedDocumentMessage) {\n // Ensure client ID is registered\n this.getOrAddShortClientId(msg.clientId);\n // Apply if an operation message\n if (msg.type === MessageType.Operation) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op: msg.contents as IMergeTreeOp,\n sequencedMessage: msg,\n };\n if (opArgs.sequencedMessage?.clientId === this.longClientId) {\n this.ackPendingSegment(opArgs);\n }\n else {\n this.applyRemoteOp(opArgs);\n }\n }\n\n this.updateSeqNumbers(msg.minimumSequenceNumber, msg.sequenceNumber);\n }\n\n public updateSeqNumbers(min: number, seq: number) {\n const collabWindow = this.mergeTree.getCollabWindow();\n // Equal is fine here due to SharedSegmentSequence<>.snapshotContent() potentially updating with same #\n assert(collabWindow.currentSeq <= seq,\n 0x038 /* \"Incoming op sequence# < local collabWindow's currentSequence#\" */);\n collabWindow.currentSeq = seq;\n assert(min <= seq, 0x039 /* \"Incoming op sequence# < minSequence#\" */);\n this.updateMinSeq(min);\n }\n\n /**\n * Resolves a remote client's position against the local sequence\n * and returns the remote client's position relative to the local\n * sequence\n * @param remoteClientPosition - The remote client's position to resolve\n * @param remoteClientRefSeq - The reference sequence number of the remote client\n * @param remoteClientId - The client id of the remote client\n */\n public resolveRemoteClientPosition(\n remoteClientPosition: number,\n remoteClientRefSeq: number,\n remoteClientId: string): number | undefined {\n const shortRemoteClientId = this.getOrAddShortClientId(remoteClientId);\n return this.mergeTree.resolveRemoteClientPosition(\n remoteClientPosition,\n remoteClientRefSeq,\n shortRemoteClientId);\n }\n\n /**\n * Given an pending operation and segment group, regenerate the op, so it\n * can be resubmitted\n * @param resetOp - The op to reset\n * @param segmentGroup - The segment group associated with the op\n */\n public regeneratePendingOp(\n resetOp: IMergeTreeOp,\n segmentGroup: SegmentGroup | SegmentGroup[],\n ): IMergeTreeOp {\n const opList: IMergeTreeDeltaOp[] = [];\n if (resetOp.type === MergeTreeDeltaType.GROUP) {\n if (Array.isArray(segmentGroup)) {\n assert(resetOp.ops.length === segmentGroup.length,\n 0x03a /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n\n for (let i = 0; i < resetOp.ops.length; i++) {\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp.ops[i], segmentGroup[i]));\n }\n } else {\n // A group op containing a single op will pass a direct reference to 'segmentGroup'\n // rather than an array of segment groups. (See 'peekPendingSegmentGroups()')\n assert(resetOp.ops.length === 1,\n 0x03b /* \"Number of ops in 'resetOp' must match the number of segment groups provided.\" */);\n opList.push(...this.resetPendingDeltaToOps(resetOp.ops[0], segmentGroup));\n }\n } else {\n assert((resetOp.type as any) !== MergeTreeDeltaType.GROUP,\n 0x03c /* \"Reset op has 'group' delta type!\" */);\n assert(!Array.isArray(segmentGroup),\n 0x03d /* \"segmentGroup is array rather than singleton!\" */);\n opList.push(\n ...this.resetPendingDeltaToOps(resetOp, segmentGroup));\n }\n return opList.length === 1 ? opList[0] : createGroupOp(...opList);\n }\n\n public createTextHelper() {\n return new MergeTreeTextHelper(this.mergeTree);\n }\n\n public summarize(\n runtime: IFluidDataStoreRuntime,\n handle: IFluidHandle,\n serializer: IFluidSerializer,\n catchUpMsgs: ISequencedDocumentMessage[],\n ): ISummaryTreeWithStats {\n const deltaManager = runtime.deltaManager;\n const minSeq = deltaManager.minimumSequenceNumber;\n\n // Catch up to latest MSN, if we have not had a chance to do it.\n // Required for case where FluidDataStoreRuntime.attachChannel()\n // generates summary right after loading data store.\n\n this.updateSeqNumbers(minSeq, deltaManager.lastSequenceNumber);\n\n // One of the summaries (from SPO) I observed to have chunk.chunkSequenceNumber > minSeq!\n // Not sure why - need to catch it sooner\n assert(this.getCollabWindow().minSeq === minSeq,\n 0x03e /* \"minSeq mismatch between collab window and delta manager!\" */);\n\n // Must continue to support legacy\n // (See https://github.com/microsoft/FluidFramework/issues/84)\n if (this.mergeTree.options?.newMergeTreeSnapshotFormat === true) {\n assert(\n catchUpMsgs === undefined || catchUpMsgs.length === 0,\n 0x03f /* \"New format should not emit catchup ops\" */);\n const snap = new SnapshotV1(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(serializer, handle);\n } else {\n const snap = new SnapshotLegacy(this.mergeTree, this.logger);\n snap.extractSync();\n return snap.emit(catchUpMsgs, serializer, handle);\n }\n }\n\n public async load(\n runtime: IFluidDataStoreRuntime,\n storage: IChannelStorageService,\n serializer: IFluidSerializer,\n ): Promise<{ catchupOpsP: Promise<ISequencedDocumentMessage[]> }> {\n const loader = new SnapshotLoader(runtime, this, this.mergeTree, this.logger, serializer);\n\n return loader.initialize(storage);\n }\n\n getStackContext(startPos: number, rangeLabels: string[]): RangeStackMap {\n return this.mergeTree.getStackContext(startPos, this.getCollabWindow().clientId, rangeLabels);\n }\n\n private getLocalSequenceNumber() {\n const segWindow = this.getCollabWindow();\n if (segWindow.collaborating) {\n return UnassignedSequenceNumber;\n }\n else {\n return UniversalSequenceNumber;\n }\n }\n localTransaction(groupOp: IMergeTreeGroupMsg) {\n for (const op of groupOp.ops) {\n const opArgs: IMergeTreeDeltaOpArgs = {\n op,\n groupOp,\n };\n switch (op.type) {\n case MergeTreeDeltaType.INSERT:\n this.applyInsertOp(opArgs);\n break;\n case MergeTreeDeltaType.ANNOTATE:\n this.applyAnnotateRangeOp(opArgs);\n break;\n case MergeTreeDeltaType.REMOVE:\n this.applyRemoveRangeOp(opArgs);\n break;\n default:\n break;\n }\n }\n }\n updateConsensusProperty(op: IMergeTreeAnnotateMsg, msg: ISequencedDocumentMessage) {\n const markerId = op.relativePos1!.id!;\n const consensusInfo = this.pendingConsensus.get(markerId);\n if (consensusInfo) {\n consensusInfo.marker.addProperties(op.props, op.combiningOp, msg.sequenceNumber);\n }\n this.mergeTree.addMinSeqListener(msg.sequenceNumber, () => consensusInfo!.callback(consensusInfo!.marker));\n }\n\n updateMinSeq(minSeq: number) {\n let trace: Trace | undefined;\n if (this.measureOps) {\n trace = Trace.start();\n }\n this.mergeTree.setMinSeq(minSeq);\n if (trace) {\n const elapsed = elapsedMicroseconds(trace);\n this.accumWindowTime += elapsed;\n if (elapsed > this.maxWindowTime) {\n this.maxWindowTime = elapsed;\n }\n }\n }\n\n getContainingSegment<T extends ISegment>(pos: number) {\n const segWindow = this.mergeTree.getCollabWindow();\n return this.mergeTree.getContainingSegment<T>(pos, segWindow.currentSeq, segWindow.clientId);\n }\n\n getPropertiesAtPosition(pos: number) {\n let propertiesAtPosition: PropertySet | undefined;\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n propertiesAtPosition = seg.properties;\n }\n return propertiesAtPosition;\n }\n getRangeExtentsOfPosition(pos: number) {\n let posStart: number | undefined;\n let posAfterEnd: number | undefined;\n\n const segoff = this.getContainingSegment(pos);\n const seg = segoff.segment;\n if (seg) {\n posStart = this.getPosition(seg);\n posAfterEnd = posStart + seg.cachedLength;\n }\n return { posStart, posAfterEnd };\n }\n getCurrentSeq() {\n return this.getCollabWindow().currentSeq;\n }\n getClientId() {\n return this.getCollabWindow().clientId;\n }\n\n getLength() { return this.mergeTree.length; }\n\n startOrUpdateCollaboration(longClientId: string | undefined, minSeq = 0, currentSeq = 0) {\n // we should always have a client id if we are collaborating\n // if the client id is undefined we are likely bound to a detached\n // container, so we should keep going in local mode. once\n // the container attaches this will be called again on connect with the\n // client id\n if (longClientId !== undefined) {\n if (this.longClientId === undefined) {\n this.longClientId = longClientId;\n this.addLongClientId(this.longClientId);\n this.mergeTree.startCollaboration(\n this.getShortClientId(this.longClientId), minSeq, currentSeq);\n } else {\n const oldClientId = this.longClientId;\n const oldData = this.clientNameToIds.get(oldClientId)!.data;\n this.longClientId = longClientId;\n this.clientNameToIds.put(longClientId, oldData);\n this.shortClientIdMap[oldData] = longClientId;\n }\n }\n }\n\n findTile(startPos: number, tileLabel: string, preceding = true) {\n const clientId = this.getClientId();\n return this.mergeTree.findTile(startPos, clientId, tileLabel, preceding);\n }\n}\n"]}
@@ -95,8 +95,6 @@ export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey,
95
95
  remove(key: TKey): void;
96
96
  removeExisting(key: TKey): void;
97
97
  private nodeRemove;
98
- private height;
99
- private nodeHeight;
100
98
  floor(key: TKey): RBNode<TKey, TData> | undefined;
101
99
  private nodeFloor;
102
100
  ceil(key: TKey): RBNode<TKey, TData> | undefined;
@@ -125,7 +123,6 @@ export declare class RedBlackTree<TKey, TData> implements SortedDictionary<TKey,
125
123
  private nodeWalk;
126
124
  private nodeWalkBackward;
127
125
  private nodeMap;
128
- diag(): void;
129
126
  }
130
127
  export interface AugmentedIntervalNode {
131
128
  minmax: IInterval;