@fluid-tools/fetch-tool 2.118.1 → 3.0.1

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.
package/CHANGELOG.md CHANGED
@@ -1,12 +1,23 @@
1
1
  # @fluid-tools/fetch-tool
2
2
 
3
- ## 2.118.0
3
+ ## 3.0.0
4
4
 
5
- Dependency updates only.
5
+ ### Minor Changes
6
6
 
7
- ## 2.117.0
7
+ - Client packages now target ES2022 ([#27846](https://github.com/microsoft/FluidFramework/pull/27846)) [91c78541bdd](https://github.com/microsoft/FluidFramework/commit/91c78541bddcbca5d6c5f357b023eeaee617d885)
8
8
 
9
- Dependency updates only.
9
+ The TypeScript compilation `target` and `lib` for the Fluid Framework client packages have been raised from ES2021/ES2020 to **ES2022**.
10
+ The published JavaScript now uses ES2022 language features (with correspondingly less down-leveling), so consuming these packages requires a runtime that supports ES2022.
11
+ All actively supported Node.js versions and evergreen browsers already meet this requirement.
12
+
13
+ Note that Fluid Framework has not officially supported targets older than ES2022 since before 2.0: this is documented in [ClientRequirements.md](https://github.com/microsoft/FluidFramework/blob/main/ClientRequirements.md) as well as the README for every client package.
14
+
15
+ It is possible this change could impact users of less up to date JavaScript runtimes.
16
+ Impacted users can use a tool like [babel](https://babeljs.io/) to transpile out unsupported language features.
17
+
18
+ - Build with TypeScript 6 ([#28052](https://github.com/microsoft/FluidFramework/pull/28052)) [7ab015c49de](https://github.com/microsoft/FluidFramework/commit/7ab015c49deec84833cdfe1fb5e1606b901f6e81)
19
+
20
+ FluidFramework Client SDK is now built using TypeScript 6. Consumers should build with TypeScript v6 or v7 or compatible tooling.
10
21
 
11
22
  ## 2.116.0
12
23
 
package/README.md CHANGED
@@ -9,13 +9,13 @@ Beware that to use fetch-tool on documents in the Microsoft tenant, you will nee
9
9
  <!-- prettier-ignore-start -->
10
10
  <!-- NOTE: This section is automatically generated using @fluid-tools/markdown-magic. Do not update these generated contents directly. -->
11
11
 
12
- **NOTE: This package is a library intended for use within the [microsoft/FluidFramework](https://github.com/microsoft/FluidFramework) repository.**
13
- **It is not intended for public use.**
14
- **We make no stability guarantees regarding this library and its APIs.**
12
+ **NOTE: This package is a library for use in the [microsoft/FluidFramework](https://github.com/microsoft/FluidFramework) repository.**
13
+ **Do not use this package as a public dependency.**
14
+ **We do not guarantee the stability of this package or its APIs.**
15
15
 
16
16
  ## Installation
17
17
 
18
- To get started, install the package by running the following command:
18
+ Run this command to install the package:
19
19
 
20
20
  ```bash
21
21
  npm i @fluid-tools/fetch-tool -D
@@ -156,17 +156,18 @@ describe("fetch tool", () => {
156
156
 
157
157
  ## Contribution Guidelines
158
158
 
159
- There are many ways to [contribute](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md) to Fluid.
159
+ You can [contribute](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md) to Fluid Framework in these ways:
160
160
 
161
- - Participate in Q&A in our [GitHub Discussions](https://github.com/microsoft/FluidFramework/discussions).
162
- - [Submit bugs](https://github.com/microsoft/FluidFramework/issues) and help us verify fixes as they are checked in.
163
- - Review the [source code changes](https://github.com/microsoft/FluidFramework/pulls).
161
+ - Answer questions in [GitHub Discussions](https://github.com/microsoft/FluidFramework/discussions).
162
+ - [Submit bug reports](https://github.com/microsoft/FluidFramework/issues) and help verify fixes.
163
+ - Review [source code changes](https://github.com/microsoft/FluidFramework/pulls).
164
164
  - [Contribute bug fixes](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md).
165
165
 
166
- Detailed instructions for working in the repo can be found in the [Wiki](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Home.md).
166
+ For detailed instructions, read the [repo documentation](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Home.md).
167
167
 
168
- This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
169
- For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
168
+ This project follows the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
169
+ For more information, read the [Code of Conduct frequently asked questions](https://opensource.microsoft.com/codeofconduct/faq/).
170
+ For questions or comments, contact [opencode@microsoft.com](mailto:opencode@microsoft.com).
170
171
 
171
172
  This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.
172
173
  Use of these trademarks or logos must follow Microsoft’s [Trademark & Brand Guidelines](https://www.microsoft.com/trademarks).
@@ -174,13 +175,9 @@ Use of Microsoft trademarks or logos in modified versions of this project must n
174
175
 
175
176
  ## Help
176
177
 
177
- Not finding what you're looking for in this README?
178
- Check out [fluidframework.com](https://fluidframework.com/docs/).
178
+ Read the [Fluid Framework documentation](https://fluidframework.com/docs/) for information about Fluid Framework concepts and APIs.
179
179
 
180
- Still not finding what you're looking for?
181
- Please [file an issue](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Contributing/Submitting-Bugs-and-Feature-Requests.md).
182
-
183
- Thank you!
180
+ To request information that the documentation does not contain, [create an issue](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Contributing/Submitting-Bugs-and-Feature-Requests.md).
184
181
 
185
182
  ## Trademark
186
183
 
@@ -1 +1 @@
1
- {"version":3,"file":"fluidAnalyzeMessages.d.ts","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAMN,KAAK,yBAAyB,EAC9B,MAAM,6CAA6C,CAAC;AA2DrD,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,MACU,CAAC;AA+YtD,wBAAsB,iBAAiB,CACtC,SAAS,EAAE,cAAc,CAAC,yBAAyB,EAAE,CAAC,EACtD,gBAAgB,EAAE,OAAO,EACzB,YAAY,EAAE,OAAO,EACrB,iBAAiB,GAAE,GAAG,CAAC,MAAM,CAAqB,GAChD,OAAO,CAAC,IAAI,CAAC,CAwCf"}
1
+ {"version":3,"file":"fluidAnalyzeMessages.d.ts","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAMN,KAAK,yBAAyB,EAC9B,MAAM,6CAA6C,CAAC;AA2DrD,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MACU,CAAC;AA+YtD,wBAAsB,iBAAiB,CACtC,SAAS,EAAE,cAAc,CAAC,yBAAyB,EAAE,CAAC,EACtD,gBAAgB,EAAE,OAAO,EACzB,YAAY,EAAE,OAAO,EACrB,iBAAiB,GAAE,GAAG,CAAC,MAAM,CAAqB,GAChD,OAAO,CAAC,IAAI,CAAC,CAwCf"}
@@ -4,7 +4,8 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.printMessageStats = exports.formatNumber = void 0;
7
+ exports.formatNumber = void 0;
8
+ exports.printMessageStats = printMessageStats;
8
9
  const internal_1 = require("@fluidframework/container-runtime/internal");
9
10
  const internal_2 = require("@fluidframework/core-utils/internal");
10
11
  const internal_3 = require("@fluidframework/datastore/internal");
@@ -26,13 +27,15 @@ function incr(map, key, size, count = 1) {
26
27
  * Helper class to track session statistics
27
28
  */
28
29
  class ActiveSession {
30
+ email;
31
+ startMessage;
29
32
  static create(email, message) {
30
33
  return new ActiveSession(email, message);
31
34
  }
35
+ opCount = 0;
32
36
  constructor(email, startMessage) {
33
37
  this.email = email;
34
38
  this.startMessage = startMessage;
35
- this.opCount = 0;
36
39
  }
37
40
  reportOp(timestamp) {
38
41
  this.opCount++;
@@ -118,12 +121,10 @@ const getObjectId = (dataStoreId, id) => `[${dataStoreId}]/${id}`;
118
121
  * Analyzer for sessions
119
122
  */
120
123
  class SessionAnalyzer {
121
- constructor() {
122
- this.sessionsInProgress = new Map();
123
- this.sessions = new Map();
124
- this.users = new Map();
125
- this.first = true;
126
- }
124
+ sessionsInProgress = new Map();
125
+ sessions = new Map();
126
+ users = new Map();
127
+ first = true;
127
128
  processOp(message, msgSize, skipMessage) {
128
129
  if (this.first) {
129
130
  this.first = false;
@@ -165,13 +166,11 @@ class SessionAnalyzer {
165
166
  * Analyzer for data structures
166
167
  */
167
168
  class DataStructureAnalyzer {
168
- constructor() {
169
- this.messageTypeStats = new Map();
170
- this.dataType = new Map();
171
- this.dataTypeStats = new Map();
172
- this.objectStats = new Map();
173
- this.chunkMap = new Map();
174
- }
169
+ messageTypeStats = new Map();
170
+ dataType = new Map();
171
+ dataTypeStats = new Map();
172
+ objectStats = new Map();
173
+ chunkMap = new Map();
175
174
  processOp(message, msgSize, skipMessage) {
176
175
  if (!skipMessage) {
177
176
  processOp(message, this.dataType, this.objectStats, msgSize, this.dataTypeStats, this.messageTypeStats, this.chunkMap);
@@ -200,13 +199,11 @@ class DataStructureAnalyzer {
200
199
  * Helper class to report if we filtered out any messages.
201
200
  */
202
201
  class FilteredMessageAnalyzer {
203
- constructor() {
204
- this.sizeTotal = 0;
205
- this.opsTotal = 0;
206
- this.sizeFiltered = 0;
207
- this.opsFiltered = 0;
208
- this.filtered = false;
209
- }
202
+ sizeTotal = 0;
203
+ opsTotal = 0;
204
+ sizeFiltered = 0;
205
+ opsFiltered = 0;
206
+ filtered = false;
210
207
  processOp(message, msgSize, skipMessage) {
211
208
  this.sizeTotal += msgSize;
212
209
  this.opsTotal++;
@@ -231,14 +228,12 @@ class FilteredMessageAnalyzer {
231
228
  * Helper class to find places where we generated too many ops
232
229
  */
233
230
  class MessageDensityAnalyzer {
234
- constructor() {
235
- this.opChunk = 1000;
236
- this.opLimit = 1;
237
- this.size = 0;
238
- this.timeStart = 0;
239
- this.doctimerStart = 0;
240
- this.ranges = new Map();
241
- }
231
+ opChunk = 1000;
232
+ opLimit = 1;
233
+ size = 0;
234
+ timeStart = 0;
235
+ doctimerStart = 0;
236
+ ranges = new Map();
242
237
  processOp(message, msgSize, skipMessage) {
243
238
  if (message.sequenceNumber >= this.opLimit) {
244
239
  if (message.sequenceNumber !== 1) {
@@ -273,10 +268,8 @@ class MessageDensityAnalyzer {
273
268
  * Helper class to analyze collab window size
274
269
  */
275
270
  class CollabWindowSizeAnalyzer {
276
- constructor() {
277
- this.maxCollabWindow = 0;
278
- this.opSeq = 0;
279
- }
271
+ maxCollabWindow = 0;
272
+ opSeq = 0;
280
273
  processOp(message, msgSize, skipMessage) {
281
274
  const value = message.sequenceNumber - message.minimumSequenceNumber;
282
275
  if (value > this.maxCollabWindow) {
@@ -292,15 +285,13 @@ class CollabWindowSizeAnalyzer {
292
285
  * Helper class to analyze frequency of summaries
293
286
  */
294
287
  class SummaryAnalyzer {
295
- constructor() {
296
- this.lastSummaryOp = 0;
297
- this.maxDistance = 0;
298
- this.maxSeq = 0;
299
- this.minDistance = Number.MAX_SAFE_INTEGER;
300
- this.minSeq = 0;
301
- this.maxResponse = 0;
302
- this.maxResponseSeq = 0;
303
- }
288
+ lastSummaryOp = 0;
289
+ maxDistance = 0;
290
+ maxSeq = 0;
291
+ minDistance = Number.MAX_SAFE_INTEGER;
292
+ minSeq = 0;
293
+ maxResponse = 0;
294
+ maxResponseSeq = 0;
304
295
  processOp(message, msgSize, skipMessage) {
305
296
  if (message.type === internal_4.MessageType.SummaryAck) {
306
297
  const distance = message.sequenceNumber - this.lastSummaryOp - 1;
@@ -388,7 +379,6 @@ async function printMessageStats(generator, dumpMessageStats, dumpMessages, mess
388
379
  }
389
380
  console.log("");
390
381
  }
391
- exports.printMessageStats = printMessageStats;
392
382
  function processOp(runtimeMessage, dataType, objectStats, msgSize, dataTypeStats, messageTypeStats, chunkMap) {
393
383
  let type = runtimeMessage.type;
394
384
  let recorded = false;
@@ -1 +1 @@
1
- {"version":3,"file":"fluidAnalyzeMessages.js","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.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 {\n\tContainerMessageType,\n\ttype IChunkedOp,\n\tunpackRuntimeMessage,\n} from \"@fluidframework/container-runtime/internal\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore/internal\";\nimport {\n\ttype ISummaryAck,\n\ttype ISummaryNack,\n\ttype ISummaryProposal,\n\tMessageType,\n\tTreeEntry,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions/internal\";\n\nconst noClientName = \"No Client\";\nconst objectTypePrefix = \"https://graph.microsoft.com/types/\";\n\nfunction incr(map: Map<string, [number, number]>, key: string, size: number, count = 1): void {\n\tconst value = map.get(key);\n\tif (value === undefined) {\n\t\tmap.set(key, [count, size]);\n\t} else {\n\t\tvalue[0] += count;\n\t\tvalue[1] += size;\n\t\tmap.set(key, value);\n\t}\n}\n\ninterface ISessionInfo {\n\tstartSeq: number;\n\topCount: number;\n\temail: string;\n\tduration: number;\n}\n\ninterface IMessageAnalyzer {\n\tprocessOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n\treportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n\tpublic static create(email: string, message: ISequencedDocumentMessage): ActiveSession {\n\t\treturn new ActiveSession(email, message);\n\t}\n\n\tprivate opCount = 0;\n\n\tconstructor(\n\t\tprivate readonly email: string,\n\t\tprivate readonly startMessage: ISequencedDocumentMessage,\n\t) {}\n\n\tpublic reportOp(timestamp: number): void {\n\t\tthis.opCount++;\n\t}\n\n\tpublic leave(timestamp: number): ISessionInfo {\n\t\treturn {\n\t\t\topCount: this.opCount,\n\t\t\temail: this.email,\n\t\t\tstartSeq: this.startMessage.sequenceNumber,\n\t\t\tduration: timestamp - this.startMessage.timestamp,\n\t\t};\n\t}\n}\n\n// Format a number separating 3 digits by comma\nexport const formatNumber = (num: number): string =>\n\tnum.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n\tmap: Map<string, [number, number]>,\n\tprops: {\n\t\ttitle: string;\n\t\theaders: [string, string];\n\t\tlines?: number;\n\t\torderByFirstColumn?: boolean;\n\t\treverseColumnsInUI?: boolean;\n\t\tremoveTotals?: boolean;\n\t\treverseSort?: boolean;\n\t},\n): void {\n\tconst fieldSizes = [10, 14];\n\tconst nameLength = 72;\n\tconst fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n\tlet headers = props.headers;\n\n\tlet recordsToShow = props.lines ?? 10;\n\tif (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {\n\t\trecordsToShow--;\n\t}\n\n\tlet sorted: [string, [number, number]][];\n\tconst sortIndex = props.orderByFirstColumn === true ? 0 : 1;\n\tlet add: string;\n\tif (props.reverseSort !== undefined) {\n\t\tsorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n\t\tadd = \"↑\";\n\t} else {\n\t\tsorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n\t\tadd = \"↓\";\n\t}\n\theaders[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n\tif (props.reverseColumnsInUI !== undefined) {\n\t\theaders = [headers[1], headers[0]];\n\t\tconst sorted2: [string, [number, number]][] = [];\n\t\tfor (const [name, [count, size]] of sorted) {\n\t\t\tsorted2.push([name, [size, count]]);\n\t\t}\n\t\tsorted = sorted2;\n\t}\n\n\tlet totalCount = 0;\n\tlet sizeTotal = 0;\n\n\tprops.title = `${props.title} (${sorted.length})`;\n\tconst header0 = headers[0].padStart(fieldSizes[0]);\n\tlet overflow = header0.length - fieldSizes[0];\n\tconsole.log(\n\t\t`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(\n\t\t\tfieldSizes[1] - overflow,\n\t\t)}`,\n\t);\n\n\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\tlet index = 0;\n\tlet allOtherCount = 0;\n\tlet allOtherSize = 0;\n\tfor (const [name, [count, size]] of sorted) {\n\t\tindex++;\n\t\ttotalCount += count;\n\t\tsizeTotal += size;\n\t\tif (index <= recordsToShow) {\n\t\t\tconst item = name.padEnd(nameLength);\n\t\t\toverflow = item.length - nameLength;\n\t\t\tconst col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n\t\t\toverflow += col1.length - fieldSizes[0];\n\t\t\tconst col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n\t\t\tconsole.log(`${item} │ ${col1} ${col2}`);\n\t\t} else {\n\t\t\tallOtherCount += count;\n\t\t\tallOtherSize += size;\n\t\t}\n\t}\n\n\tif (props.removeTotals === undefined) {\n\t\tif (allOtherCount || allOtherSize) {\n\t\t\tconsole.log(\n\t\t\t\t`${`All Others (${sorted.length - recordsToShow})`.padEnd(\n\t\t\t\t\tnameLength,\n\t\t\t\t)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(\n\t\t\t\t\tallOtherSize,\n\t\t\t\t).padStart(fieldSizes[1])}`,\n\t\t\t);\n\t\t}\n\t\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\t\tconsole.log(\n\t\t\t`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(\n\t\t\t\tfieldSizes[0],\n\t\t\t)} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`,\n\t\t);\n\t}\n}\n\nconst getObjectId = (dataStoreId: string, id: string): string => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n\tprivate readonly sessionsInProgress = new Map<string, ActiveSession>();\n\tprivate readonly sessions = new Map<string, [number, number]>();\n\tprivate readonly users = new Map<string, [number, number]>();\n\n\tprivate first = true;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (this.first) {\n\t\t\tthis.first = false;\n\t\t\t// Start of the road.\n\t\t\tconst noNameSession = ActiveSession.create(noClientName, message);\n\t\t\tthis.sessionsInProgress.set(noClientName, noNameSession);\n\t\t}\n\t\tconst session = processQuorumMessages(\n\t\t\tmessage,\n\t\t\tskipMessage,\n\t\t\tthis.sessionsInProgress,\n\t\t\tthis.sessions,\n\t\t\tthis.users,\n\t\t);\n\t\tif (!skipMessage && session) {\n\t\t\tsession.reportOp(message.timestamp);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\t// Close any open sessions\n\t\treportOpenSessions(lastOp.timestamp, this.sessionsInProgress, this.sessions, this.users);\n\t\tdumpStats(this.users, {\n\t\t\ttitle: \"Users\",\n\t\t\theaders: [\"Sessions\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseColumnsInUI: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 5,\n\t\t});\n\t}\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n\tprivate readonly messageTypeStats = new Map<string, [number, number]>();\n\tprivate readonly dataType = new Map<string, string>();\n\tprivate readonly dataTypeStats = new Map<string, [number, number]>();\n\tprivate readonly objectStats = new Map<string, [number, number]>();\n\tprivate readonly chunkMap = new Map<string, { chunks: string[]; totalSize: number }>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tprocessOp(\n\t\t\t\tmessage,\n\t\t\t\tthis.dataType,\n\t\t\t\tthis.objectStats,\n\t\t\t\tmsgSize,\n\t\t\t\tthis.dataTypeStats,\n\t\t\t\tthis.messageTypeStats,\n\t\t\t\tthis.chunkMap,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.messageTypeStats, {\n\t\t\ttitle: \"Message Type\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 20,\n\t\t});\n\t\tdumpStats(calcChannelStats(this.dataType, this.objectStats), {\n\t\t\ttitle: \"Channel name\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 7,\n\t\t});\n\t\t/*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n\t}\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n\tprivate sizeTotal = 0;\n\tprivate opsTotal = 0;\n\tprivate sizeFiltered = 0;\n\tprivate opsFiltered = 0;\n\tprivate filtered = false;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tthis.sizeTotal += msgSize;\n\t\tthis.opsTotal++;\n\t\tif (!skipMessage) {\n\t\t\tthis.sizeFiltered += msgSize;\n\t\t\tthis.opsFiltered++;\n\t\t} else {\n\t\t\tthis.filtered = true;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tif (this.filtered) {\n\t\t\tconsole.log(\n\t\t\t\t`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`,\n\t\t\t);\n\t\t}\n\t\tif (this.opsTotal === 0) {\n\t\t\tconsole.error(\"No ops were found\");\n\t\t}\n\t}\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n\tprivate readonly opChunk = 1000;\n\tprivate opLimit = 1;\n\tprivate size = 0;\n\tprivate timeStart = 0;\n\tprivate doctimerStart = 0;\n\tprivate readonly ranges = new Map<string, [number, number]>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.sequenceNumber >= this.opLimit) {\n\t\t\tif (message.sequenceNumber !== 1) {\n\t\t\t\tconst timeDiff = durationFromTime(message.timestamp - this.timeStart);\n\t\t\t\tconst opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(\n\t\t\t\t\t26,\n\t\t\t\t);\n\t\t\t\tconst timeString = `time = [${durationFromTime(\n\t\t\t\t\tthis.timeStart - this.doctimerStart,\n\t\t\t\t)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n\t\t\t\tthis.ranges.set(`${opsString} ${timeString}`, [timeDiff, this.size]);\n\t\t\t} else {\n\t\t\t\tthis.doctimerStart = message.timestamp;\n\t\t\t}\n\t\t\tthis.opLimit += this.opChunk;\n\t\t\tthis.size = 0;\n\t\t\tthis.timeStart = message.timestamp;\n\t\t}\n\t\tif (!skipMessage) {\n\t\t\tthis.size += msgSize;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.ranges, {\n\t\t\ttitle: \"Fastest 1000 op ranges\",\n\t\t\theaders: [\"Duration(s)\", \"Bytes\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseSort: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 3,\n\t\t});\n\t}\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n\tprivate maxCollabWindow = 0;\n\tprivate opSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tconst value = message.sequenceNumber - message.minimumSequenceNumber;\n\t\tif (value > this.maxCollabWindow) {\n\t\t\tthis.maxCollabWindow = value;\n\t\t\tthis.opSeq = message.sequenceNumber;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconsole.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n\t}\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n\tprivate lastSummaryOp = 0;\n\tprivate maxDistance = 0;\n\tprivate maxSeq = 0;\n\tprivate minDistance = Number.MAX_SAFE_INTEGER;\n\tprivate minSeq = 0;\n\tprivate maxResponse = 0;\n\tprivate maxResponseSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.type === MessageType.SummaryAck) {\n\t\t\tconst distance = message.sequenceNumber - this.lastSummaryOp - 1;\n\t\t\tif (this.maxDistance < distance) {\n\t\t\t\tthis.maxDistance = distance;\n\t\t\t\tthis.maxSeq = message.sequenceNumber;\n\t\t\t}\n\t\t\tif (this.minDistance > distance) {\n\t\t\t\tthis.minDistance = distance;\n\t\t\t\tthis.minSeq = message.sequenceNumber;\n\t\t\t}\n\n\t\t\tthis.lastSummaryOp = message.sequenceNumber;\n\t\t}\n\t\tif (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n\t\t\tconst contents: ISummaryProposal = (message.contents as ISummaryAck | ISummaryNack)\n\t\t\t\t.summaryProposal;\n\t\t\tconst distance = message.sequenceNumber - contents.summarySequenceNumber;\n\t\t\tif (distance > this.maxResponse) {\n\t\t\t\tthis.maxResponse = distance;\n\t\t\t\tthis.maxResponseSeq = message.sequenceNumber;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconst distance = lastOp.sequenceNumber - this.lastSummaryOp;\n\t\tif (this.maxDistance < distance) {\n\t\t\tthis.maxDistance = distance;\n\t\t\tthis.maxSeq = lastOp.sequenceNumber + 1;\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tif (this.minDistance === Number.MAX_SAFE_INTEGER) {\n\t\t\tconsole.log(\"No summaries found in this document\");\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tconsole.log(JSON.stringify(message, undefined, 2));\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {}\n}\n\nexport async function printMessageStats(\n\tgenerator: AsyncGenerator<ISequencedDocumentMessage[]>,\n\tdumpMessageStats: boolean,\n\tdumpMessages: boolean,\n\tmessageTypeFilter: Set<string> = new Set<string>(),\n): Promise<void> {\n\tlet lastMessage: ISequencedDocumentMessage | undefined;\n\n\tconst analyzers: IMessageAnalyzer[] = [\n\t\tnew FilteredMessageAnalyzer(), // Should come first\n\t\tnew SessionAnalyzer(),\n\t\tnew DataStructureAnalyzer(),\n\t\tnew MessageDensityAnalyzer(),\n\t\tnew CollabWindowSizeAnalyzer(),\n\t\tnew SummaryAnalyzer(),\n\t];\n\n\tif (dumpMessages) {\n\t\tanalyzers.push(new MessageDumper());\n\t}\n\n\tfor await (const messages of generator) {\n\t\tfor (const message of messages) {\n\t\t\tconst msgSize = JSON.stringify(message).length;\n\t\t\tlastMessage = message;\n\n\t\t\tconst skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.processOp(message, msgSize, skipMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastMessage !== undefined) {\n\t\tif (dumpMessageStats) {\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.reportAnalyzes(lastMessage);\n\t\t\t}\n\t\t} else {\n\t\t\t// Warn about filtered messages\n\t\t\tanalyzers[0].reportAnalyzes(lastMessage);\n\t\t}\n\t}\n\tconsole.log(\"\");\n}\n\nfunction processOp(\n\truntimeMessage: ISequencedDocumentMessage,\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n\tmsgSize: number,\n\tdataTypeStats: Map<string, [number, number]>,\n\tmessageTypeStats: Map<string, [number, number]>,\n\tchunkMap: Map<string, { chunks: string[]; totalSize: number }>,\n): void {\n\tlet type = runtimeMessage.type;\n\tlet recorded = false;\n\tlet totalMsgSize = msgSize;\n\tlet opCount = 1;\n\tif (unpackRuntimeMessage(runtimeMessage)) {\n\t\tconst messageType = runtimeMessage.type as ContainerMessageType;\n\t\tswitch (messageType) {\n\t\t\tcase ContainerMessageType.Attach: {\n\t\t\t\tconst attachMessage = runtimeMessage.contents as IAttachMessage;\n\t\t\t\tprocessDataStoreAttachOp(attachMessage, dataType);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// skip for now because these ops do not have contents\n\t\t\tcase ContainerMessageType.BlobAttach: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// The default method to count stats should be used for GC messages.\n\t\t\tcase ContainerMessageType.GC: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.DocumentSchemaChange: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.ChunkedOp: {\n\t\t\t\tconst chunk = runtimeMessage.contents as IChunkedOp;\n\t\t\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\t\t\tif (!chunkMap.has(runtimeMessage.clientId as string)) {\n\t\t\t\t\tchunkMap.set(runtimeMessage.clientId as string, {\n\t\t\t\t\t\tchunks: new Array<string>(chunk.totalChunks),\n\t\t\t\t\t\ttotalSize: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst value = chunkMap.get(runtimeMessage.clientId as string);\n\t\t\t\tassert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n\t\t\t\tconst chunks = value.chunks;\n\t\t\t\tconst chunkIndex = chunk.chunkId - 1;\n\t\t\t\tif (chunks[chunkIndex] !== undefined) {\n\t\t\t\t\tthrow new Error(\"Chunk already assigned\");\n\t\t\t\t}\n\t\t\t\tchunks[chunkIndex] = chunk.contents;\n\t\t\t\tvalue.totalSize += msgSize;\n\t\t\t\tif (chunk.chunkId === chunk.totalChunks) {\n\t\t\t\t\topCount = chunk.totalChunks; // 1 op for each chunk.\n\t\t\t\t\tconst patchedMessage = Object.create(runtimeMessage);\n\t\t\t\t\tpatchedMessage.contents = chunks.join(\"\");\n\t\t\t\t\ttype = (chunk as any).originalType;\n\t\t\t\t\tpatchedMessage.type = type;\n\t\t\t\t\ttotalMsgSize = value.totalSize;\n\t\t\t\t\tchunkMap.delete(patchedMessage.clientId);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ContainerMessageType.IdAllocation:\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\tcase ContainerMessageType.Rejoin: {\n\t\t\t\tlet envelope = runtimeMessage.contents as IEnvelope;\n\t\t\t\t// TODO: Legacy?\n\t\t\t\tif (envelope !== undefined && typeof envelope === \"string\") {\n\t\t\t\t\tenvelope = JSON.parse(envelope);\n\t\t\t\t}\n\t\t\t\tconst innerContent = envelope.contents as {\n\t\t\t\t\tcontent: any;\n\t\t\t\t\ttype: string;\n\t\t\t\t};\n\t\t\t\tconst address = envelope.address;\n\t\t\t\ttype = `${type}/${innerContent.type}`;\n\t\t\t\tswitch (innerContent.type) {\n\t\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\t\tconst attachMessage = innerContent.content as IAttachMessage;\n\t\t\t\t\t\tlet objectType = attachMessage.type;\n\t\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataType.set(getObjectId(address, attachMessage.id), objectType);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tconst innerEnvelope = innerContent.content as IEnvelope;\n\t\t\t\t\t\tconst innerContent2 = innerEnvelope.contents as {\n\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\tvalue?: any;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst objectId = getObjectId(address, innerEnvelope.address);\n\t\t\t\t\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\t\t\t\t\tlet objectType = dataType.get(objectId);\n\t\t\t\t\t\tif (objectType === undefined) {\n\t\t\t\t\t\t\t// Somehow we do not have data...\n\t\t\t\t\t\t\tdataType.set(objectId, objectId);\n\t\t\t\t\t\t\tobjectType = objectId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t\t\t\t\t\trecorded = true;\n\n\t\t\t\t\t\tlet subType = innerContent2.type;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinnerContent2.type === \"set\" &&\n\t\t\t\t\t\t\ttypeof innerContent2.value === \"object\" &&\n\t\t\t\t\t\t\tinnerContent2.value !== null\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t\tsubType = innerContent2.value.type;\n\t\t\t\t\t\t} else if (objectType === \"mergeTree\" && subType !== undefined) {\n\t\t\t\t\t\t\tconst types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n\t\t\t\t\t\t\tif (types[subType] !== undefined) {\n\t\t\t\t\t\t\t\tsubType = types[subType];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (subType !== undefined) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttype = `${type} (${objectType})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(messageType, \"Message type not recognized!\");\n\t\t}\n\t}\n\n\tincr(messageTypeStats, type, totalMsgSize, opCount);\n\tif (!recorded) {\n\t\t// const objectId = `${type} (system)`;\n\t\tconst objectId = `(system messages)`;\n\t\tconst objectType = objectId;\n\t\tif (dataType.get(objectId) === undefined) {\n\t\t\tdataType.set(objectId, objectId);\n\t\t}\n\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t}\n}\n\nfunction processDataStoreAttachOp(\n\tattachMessage: IAttachMessage | string,\n\tdataType: Map<string, string>,\n): void {\n\t// dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n\t// That's data store, and it brings a bunch of data structures.\n\t// Let's try to crack it.\n\tconst parsedAttachMessage =\n\t\ttypeof attachMessage === \"string\" ? JSON.parse(attachMessage) : attachMessage;\n\tfor (const entry of parsedAttachMessage.snapshot.entries) {\n\t\tif (entry.type === TreeEntry.Tree) {\n\t\t\tfor (const entry2 of entry.value.entries) {\n\t\t\t\tif (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n\t\t\t\t\tconst attrib = JSON.parse(entry2.value.contents);\n\t\t\t\t\tlet objectType: string = attrib.type;\n\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\tdataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportOpenSessions(\n\tlastOpTimestamp: number,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): void {\n\tconst activeSessions = new Map<string, [number, number]>();\n\n\tfor (const [clientId, ses] of sessionsInProgress) {\n\t\tconst sessionInfo = ses.leave(lastOpTimestamp);\n\t\tif (clientId !== noClientName) {\n\t\t\tconst sessionName = `${clientId} (${sessionInfo.email})`;\n\t\t\tconst sessionPayload: [number, number] = [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t];\n\t\t\tsessions.set(sessionName, sessionPayload);\n\t\t\tactiveSessions.set(sessionName, sessionPayload);\n\t\t} else {\n\t\t\tsessions.set(`Full file lifespan (noClient messages)`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t}\n\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t}\n\n\tif (activeSessions.size > 0) {\n\t\tdumpStats(activeSessions, {\n\t\t\ttitle: \"Active sessions\",\n\t\t\theaders: [\"Duration\", \"Op count\"],\n\t\t\tlines: 6,\n\t\t\torderByFirstColumn: true,\n\t\t\tremoveTotals: true,\n\t\t});\n\t}\n}\n\nfunction calcChannelStats(\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n): Map<string, [number, number]> {\n\tconst channelStats = new Map<string, [number, number]>();\n\tfor (const [objectId, type] of dataType) {\n\t\tlet value = objectStats.get(objectId);\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (value === undefined) {\n\t\t\tvalue = [0, 0];\n\t\t}\n\t\tif (type === objectId) {\n\t\t\tchannelStats.set(`${objectId}`, value);\n\t\t} else {\n\t\t\tchannelStats.set(`${objectId} (${type})`, value);\n\t\t}\n\t}\n\treturn channelStats;\n}\n\nfunction processQuorumMessages(\n\tmessage: ISequencedDocumentMessage,\n\tskipMessage: boolean,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): ActiveSession | undefined {\n\tlet session: ActiveSession | undefined;\n\tconst dataString = (message as any).data;\n\tif (message.type === \"join\") {\n\t\tconst data = JSON.parse(dataString);\n\t\tsession = ActiveSession.create(data.detail.user.id, message);\n\t\tsessionsInProgress.set(data.clientId, session);\n\t} else if (message.type === \"leave\") {\n\t\tconst clientId = JSON.parse(dataString);\n\t\tsession = sessionsInProgress.get(clientId);\n\t\tsessionsInProgress.delete(clientId);\n\t\tassert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n\t\tif (session !== undefined) {\n\t\t\tif (!skipMessage) {\n\t\t\t\tsession.reportOp(message.timestamp);\n\t\t\t}\n\t\t\tconst sessionInfo: ISessionInfo = session.leave(message.timestamp);\n\t\t\tsessions.set(`${clientId} (${sessionInfo.email})`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t\t\tsession = undefined; // Do not record it second time\n\t\t}\n\t} else {\n\t\t// message.clientId can be null\n\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\tsession = sessionsInProgress.get(message.clientId as string);\n\t\tif (session === undefined) {\n\t\t\tsession = sessionsInProgress.get(noClientName);\n\t\t\tassert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n\t\t}\n\t}\n\treturn session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
1
+ {"version":3,"file":"fluidAnalyzeMessages.js","sourceRoot":"","sources":["../src/fluidAnalyzeMessages.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA2dH,8CA6CC;AAtgBD,yEAIoD;AACpD,kEAA8E;AAC9E,iEAA0E;AAC1E,0EAOqD;AAGrD,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAE9D,SAAS,IAAI,CAAC,GAAkC,EAAE,GAAW,EAAE,IAAY,EAAE,KAAK,GAAG,CAAC;IACrF,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAClB,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACjB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;AACF,CAAC;AAcD;;GAEG;AACH,MAAM,aAAa;IAQA;IACA;IARX,MAAM,CAAC,MAAM,CAAC,KAAa,EAAE,OAAkC;QACrE,OAAO,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,OAAO,GAAG,CAAC,CAAC;IAEpB,YACkB,KAAa,EACb,YAAuC;QADvC,UAAK,GAAL,KAAK,CAAQ;QACb,iBAAY,GAAZ,YAAY,CAA2B;IACtD,CAAC;IAEG,QAAQ,CAAC,SAAiB;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,SAAiB;QAC7B,OAAO;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc;YAC1C,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS;SACjD,CAAC;IACH,CAAC;CACD;AAED,+CAA+C;AACxC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE,CACnD,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AADzC,QAAA,YAAY,gBAC6B;AAEtD,SAAS,SAAS,CACjB,GAAkC,EAClC,KAQC;IAED,MAAM,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE5B,IAAI,aAAa,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IACtC,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACzF,aAAa,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,MAAoC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,GAAW,CAAC;IAChB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,GAAG,GAAG,GAAG,CAAC;IACX,CAAC;SAAM,CAAC;QACP,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,GAAG,GAAG,GAAG,CAAC;IACX,CAAC;IACD,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC;IAEpD,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAiC,EAAE,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,GAAG,OAAO,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CACV,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CACxE,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CACxB,EAAE,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QAC5C,KAAK,EAAE,CAAC;QACR,UAAU,IAAI,KAAK,CAAC;QACpB,SAAS,IAAI,IAAI,CAAC;QAClB,IAAI,KAAK,IAAI,aAAa,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrC,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACpC,MAAM,IAAI,GAAG,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YACpE,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,IAAA,oBAAY,EAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACP,aAAa,IAAI,KAAK,CAAC;YACvB,YAAY,IAAI,IAAI,CAAC;QACtB,CAAC;IACF,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,aAAa,IAAI,YAAY,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CACV,GAAG,eAAe,MAAM,CAAC,MAAM,GAAG,aAAa,GAAG,CAAC,MAAM,CACxD,UAAU,CACV,MAAM,IAAA,oBAAY,EAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAA,oBAAY,EACzE,YAAY,CACZ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CACV,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,IAAA,oBAAY,EAAC,UAAU,CAAC,CAAC,QAAQ,CACnE,UAAU,CAAC,CAAC,CAAC,CACb,IAAI,IAAA,oBAAY,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CACtD,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,WAAmB,EAAE,EAAU,EAAU,EAAE,CAAC,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;AAE1F;;GAEG;AACH,MAAM,eAAe;IACH,kBAAkB,GAAG,IAAI,GAAG,EAAyB,CAAC;IACtD,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC/C,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAErD,KAAK,GAAG,IAAI,CAAC;IAEd,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,qBAAqB;YACrB,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAClE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,OAAO,GAAG,qBAAqB,CACpC,OAAO,EACP,WAAW,EACX,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,CACV,CAAC;QACF,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC;QACtD,0BAA0B;QAC1B,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzF,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE;YACrB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YACjC,kBAAkB,EAAE,IAAI;YACxB,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE;YACxB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;YACpC,kBAAkB,EAAE,IAAI;YACxB,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE;YACxB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;YACpC,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;IACJ,CAAC;CACD;AAED;;GAEG;AACH,MAAM,qBAAqB;IACT,gBAAgB,GAAG,IAAI,GAAG,EAA4B,CAAC;IACvD,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;IACpD,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,QAAQ,GAAG,IAAI,GAAG,EAAmD,CAAC;IAEhF,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,SAAS,CACR,OAAO,EACP,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,OAAO,EACP,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,QAAQ,CACb,CAAC;QACH,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC;QACtD,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChC,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;YAC9B,KAAK,EAAE,EAAE;SACT,CAAC,CAAC;QACH,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE;YAC5D,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;YAC9B,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;QACH;;;;;UAKQ;IACT,CAAC;CACD;AAED;;GAEG;AACH,MAAM,uBAAuB;IACpB,SAAS,GAAG,CAAC,CAAC;IACd,QAAQ,GAAG,CAAC,CAAC;IACb,YAAY,GAAG,CAAC,CAAC;IACjB,WAAW,GAAG,CAAC,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IAElB,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC;YAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC;QACtD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CACV,+EAA+E,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,QAAQ,EAAE,CACvK,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;CACD;AAED;;GAEG;AACH,MAAM,sBAAsB;IACV,OAAO,GAAG,IAAI,CAAC;IACxB,OAAO,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,CAAC,CAAC;IACT,SAAS,GAAG,CAAC,CAAC;IACd,aAAa,GAAG,CAAC,CAAC;IACT,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEvD,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtE,MAAM,SAAS,GAAG,UAAU,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CACrF,EAAE,CACF,CAAC;gBACF,MAAM,UAAU,GAAG,WAAW,gBAAgB,CAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CACnC,KAAK,gBAAgB,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;gBAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,UAAU,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;YAC7B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;QACtB,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC;QACtD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;YACtB,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC;YACjC,kBAAkB,EAAE,IAAI;YACxB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;IACJ,CAAC;CACD;AAED;;GAEG;AACH,MAAM,wBAAwB;IACrB,eAAe,GAAG,CAAC,CAAC;IACpB,KAAK,GAAG,CAAC,CAAC;IAEX,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC;QACrE,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAClC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC;QACrC,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC;QACtD,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,eAAe,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC;CACD;AAED;;GAEG;AACH,MAAM,eAAe;IACZ,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,MAAM,GAAG,CAAC,CAAC;IACX,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACtC,MAAM,GAAG,CAAC,CAAC;IACX,WAAW,GAAG,CAAC,CAAC;IAChB,cAAc,GAAG,CAAC,CAAC;IAEpB,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAW,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YACtC,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YACtC,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAW,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAW,CAAC,WAAW,EAAE,CAAC;YACzF,MAAM,QAAQ,GAAsB,OAAO,CAAC,QAAuC;iBACjF,eAAe,CAAC;YAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAC,qBAAqB,CAAC;YACzE,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAC9C,CAAC;QACF,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QAC5D,IAAI,IAAI,CAAC,WAAW,GAAG,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACV,uCAAuC,IAAI,CAAC,WAAW,UAAU,IAAI,CAAC,MAAM,EAAE,CAC9E,CAAC;YACF,OAAO,CAAC,GAAG,CACV,wCAAwC,IAAI,CAAC,WAAW,UAAU,IAAI,CAAC,cAAc,EAAE,CACvF,CAAC;YACF,OAAO,CAAC,GAAG,CACV,uCAAuC,IAAI,CAAC,WAAW,UAAU,IAAI,CAAC,MAAM,EAAE,CAC9E,CAAC;QACH,CAAC;IACF,CAAC;CACD;AAED;;GAEG;AACH,MAAM,aAAa;IACX,SAAS,CACf,OAAkC,EAClC,OAAe,EACf,WAAoB;QAEpB,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAEM,cAAc,CAAC,MAAiC,IAAS,CAAC;CACjE;AAEM,KAAK,UAAU,iBAAiB,CACtC,SAAsD,EACtD,gBAAyB,EACzB,YAAqB,EACrB,oBAAiC,IAAI,GAAG,EAAU;IAElD,IAAI,WAAkD,CAAC;IAEvD,MAAM,SAAS,GAAuB;QACrC,IAAI,uBAAuB,EAAE,EAAE,oBAAoB;QACnD,IAAI,eAAe,EAAE;QACrB,IAAI,qBAAqB,EAAE;QAC3B,IAAI,sBAAsB,EAAE;QAC5B,IAAI,wBAAwB,EAAE;QAC9B,IAAI,eAAe,EAAE;KACrB,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QAClB,SAAS,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAC/C,WAAW,GAAG,OAAO,CAAC;YAEtB,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEzF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAClC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACnD,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,gBAAgB,EAAE,CAAC;YACtB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAClC,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;aAAM,CAAC;YACP,+BAA+B;YAC/B,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CACjB,cAAyC,EACzC,QAA6B,EAC7B,WAA0C,EAC1C,OAAe,EACf,aAA4C,EAC5C,gBAA+C,EAC/C,QAA8D;IAE9D,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAY,GAAG,OAAO,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,IAAA,+BAAoB,EAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,cAAc,CAAC,IAA4B,CAAC;QAChE,QAAQ,WAAW,EAAE,CAAC;YACrB,KAAK,+BAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,MAAM,aAAa,GAAG,cAAc,CAAC,QAA0B,CAAC;gBAChE,wBAAwB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAClD,MAAM;YACP,CAAC;YACD,sDAAsD;YACtD,KAAK,+BAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;gBACtC,MAAM;YACP,CAAC;YACD,oEAAoE;YACpE,KAAK,+BAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9B,MAAM;YACP,CAAC;YACD,KAAK,+BAAoB,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAChD,MAAM;YACP,CAAC;YACD,KAAK,+BAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,cAAc,CAAC,QAAsB,CAAC;gBACpD,+FAA+F;gBAE/F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,QAAkB,CAAC,EAAE,CAAC;oBACtD,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,QAAkB,EAAE;wBAC/C,MAAM,EAAE,IAAI,KAAK,CAAS,KAAK,CAAC,WAAW,CAAC;wBAC5C,SAAS,EAAE,CAAC;qBACZ,CAAC,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,QAAkB,CAAC,CAAC;gBAC9D,IAAA,iBAAM,EAAC,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;oBACtC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;gBACpC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;oBACzC,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,uBAAuB;oBACpD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;oBACrD,cAAc,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC1C,IAAI,GAAI,KAAa,CAAC,YAAY,CAAC;oBACnC,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC;oBAC3B,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC;oBAC/B,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACP,OAAO;gBACR,CAAC;YACF,CAAC;YACD,KAAK,+BAAoB,CAAC,YAAY,CAAC;YACvC,KAAK,+BAAoB,CAAC,gBAAgB,CAAC;YAC3C,KAAK,+BAAoB,CAAC,KAAK,CAAC;YAChC,KAAK,+BAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ,GAAG,cAAc,CAAC,QAAqB,CAAC;gBACpD,gBAAgB;gBAChB,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC5D,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;gBACD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAG7B,CAAC;gBACF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACjC,IAAI,GAAG,GAAG,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;gBACtC,QAAQ,YAAY,CAAC,IAAI,EAAE,CAAC;oBAC3B,KAAK,+BAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;wBAClC,MAAM,aAAa,GAAG,YAAY,CAAC,OAAyB,CAAC;wBAC7D,IAAI,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC;wBACpC,IAAI,UAAU,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BAC7C,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;wBAC5D,CAAC;wBACD,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;wBACjE,MAAM;oBACP,CAAC;oBACD,KAAK,+BAAoB,CAAC,SAAS,CAAC;oBACpC,OAAO,CAAC,CAAC,CAAC;wBACT,MAAM,aAAa,GAAG,YAAY,CAAC,OAAoB,CAAC;wBACxD,MAAM,aAAa,GAAG,aAAa,CAAC,QAGnC,CAAC;wBAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;wBAC7D,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;wBACnD,IAAI,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;4BAC9B,iCAAiC;4BACjC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;4BACjC,UAAU,GAAG,QAAQ,CAAC;wBACvB,CAAC;wBACD,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;wBACvD,QAAQ,GAAG,IAAI,CAAC;wBAEhB,IAAI,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC;wBACjC,IACC,aAAa,CAAC,IAAI,KAAK,KAAK;4BAC5B,OAAO,aAAa,CAAC,KAAK,KAAK,QAAQ;4BACvC,aAAa,CAAC,KAAK,KAAK,IAAI,EAC3B,CAAC;4BACF,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;4BAC5B,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;wBACpC,CAAC;6BAAM,IAAI,UAAU,KAAK,WAAW,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BAChE,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;4BACxD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;gCAClC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;4BAC1B,CAAC;wBACF,CAAC;wBACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BAC3B,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;wBAC7B,CAAC;wBAED,IAAI,GAAG,GAAG,IAAI,KAAK,UAAU,GAAG,CAAC;oBAClC,CAAC;gBACF,CAAC;gBACD,MAAM;YACP,CAAC;YACD;gBACC,IAAA,0BAAe,EAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;IAED,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,uCAAuC;QACvC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;QACrC,MAAM,UAAU,GAAG,QAAQ,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAChC,aAAsC,EACtC,QAA6B;IAE7B,mEAAmE;IAEnE,+DAA+D;IAC/D,yBAAyB;IACzB,MAAM,mBAAmB,GACxB,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAC/E,KAAK,MAAM,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAS,CAAC,IAAI,EAAE,CAAC;YACnC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAS,CAAC,IAAI,EAAE,CAAC;oBACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACjD,IAAI,UAAU,GAAW,MAAM,CAAC,IAAI,CAAC;oBACrC,IAAI,UAAU,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAC7C,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;oBAC5D,CAAC;oBACD,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC3E,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAC1B,eAAuB,EACvB,kBAA8C,EAC9C,QAAuC,EACvC,KAAoC;IAEpC,MAAM,cAAc,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE3D,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,kBAAkB,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,GAAG,QAAQ,KAAK,WAAW,CAAC,KAAK,GAAG,CAAC;YACzD,MAAM,cAAc,GAAqB;gBACxC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACtC,WAAW,CAAC,OAAO;aACnB,CAAC;YACF,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC1C,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,GAAG,CAAC,wCAAwC,EAAE;gBACtD,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACtC,WAAW,CAAC,OAAO;aACnB,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,cAAc,EAAE;YACzB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YACjC,KAAK,EAAE,CAAC;YACR,kBAAkB,EAAE,IAAI;YACxB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CACxB,QAA6B,EAC7B,WAA0C;IAE1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAA4B,CAAC;IACzD,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzC,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,6HAA6H;QAC7H,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,YAAY,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACP,YAAY,CAAC,GAAG,CAAC,GAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,SAAS,qBAAqB,CAC7B,OAAkC,EAClC,WAAoB,EACpB,kBAA8C,EAC9C,QAAuC,EACvC,KAAoC;IAEpC,IAAI,OAAkC,CAAC;IACvC,MAAM,UAAU,GAAI,OAAe,CAAC,IAAI,CAAC;IACzC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAA,iBAAM,EAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAClF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,WAAW,GAAiB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACnE,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,KAAK,WAAW,CAAC,KAAK,GAAG,EAAE;gBAClD,gBAAgB,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACtC,WAAW,CAAC,OAAO;aACnB,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,GAAG,SAAS,CAAC,CAAC,+BAA+B;QACrD,CAAC;IACF,CAAC;SAAM,CAAC;QACP,+BAA+B;QAC/B,+FAA+F;QAE/F,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAkB,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAA,iBAAM,EAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tContainerMessageType,\n\ttype IChunkedOp,\n\tunpackRuntimeMessage,\n} from \"@fluidframework/container-runtime/internal\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils/internal\";\nimport { DataStoreMessageType } from \"@fluidframework/datastore/internal\";\nimport {\n\ttype ISummaryAck,\n\ttype ISummaryNack,\n\ttype ISummaryProposal,\n\tMessageType,\n\tTreeEntry,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport type { IAttachMessage, IEnvelope } from \"@fluidframework/runtime-definitions/internal\";\n\nconst noClientName = \"No Client\";\nconst objectTypePrefix = \"https://graph.microsoft.com/types/\";\n\nfunction incr(map: Map<string, [number, number]>, key: string, size: number, count = 1): void {\n\tconst value = map.get(key);\n\tif (value === undefined) {\n\t\tmap.set(key, [count, size]);\n\t} else {\n\t\tvalue[0] += count;\n\t\tvalue[1] += size;\n\t\tmap.set(key, value);\n\t}\n}\n\ninterface ISessionInfo {\n\tstartSeq: number;\n\topCount: number;\n\temail: string;\n\tduration: number;\n}\n\ninterface IMessageAnalyzer {\n\tprocessOp(op: ISequencedDocumentMessage, msgSize: number, filteredOutOp: boolean): void;\n\treportAnalyzes(lastOp: ISequencedDocumentMessage): void;\n}\n\n/**\n * Helper class to track session statistics\n */\nclass ActiveSession {\n\tpublic static create(email: string, message: ISequencedDocumentMessage): ActiveSession {\n\t\treturn new ActiveSession(email, message);\n\t}\n\n\tprivate opCount = 0;\n\n\tconstructor(\n\t\tprivate readonly email: string,\n\t\tprivate readonly startMessage: ISequencedDocumentMessage,\n\t) {}\n\n\tpublic reportOp(timestamp: number): void {\n\t\tthis.opCount++;\n\t}\n\n\tpublic leave(timestamp: number): ISessionInfo {\n\t\treturn {\n\t\t\topCount: this.opCount,\n\t\t\temail: this.email,\n\t\t\tstartSeq: this.startMessage.sequenceNumber,\n\t\t\tduration: timestamp - this.startMessage.timestamp,\n\t\t};\n\t}\n}\n\n// Format a number separating 3 digits by comma\nexport const formatNumber = (num: number): string =>\n\tnum.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nfunction dumpStats(\n\tmap: Map<string, [number, number]>,\n\tprops: {\n\t\ttitle: string;\n\t\theaders: [string, string];\n\t\tlines?: number;\n\t\torderByFirstColumn?: boolean;\n\t\treverseColumnsInUI?: boolean;\n\t\tremoveTotals?: boolean;\n\t\treverseSort?: boolean;\n\t},\n): void {\n\tconst fieldSizes = [10, 14];\n\tconst nameLength = 72;\n\tconst fieldsLength = fieldSizes[0] + fieldSizes[1] + 1;\n\tlet headers = props.headers;\n\n\tlet recordsToShow = props.lines ?? 10;\n\tif (map.size !== recordsToShow && props.removeTotals === undefined && recordsToShow > 1) {\n\t\trecordsToShow--;\n\t}\n\n\tlet sorted: [string, [number, number]][];\n\tconst sortIndex = props.orderByFirstColumn === true ? 0 : 1;\n\tlet add: string;\n\tif (props.reverseSort !== undefined) {\n\t\tsorted = [...map.entries()].sort((a, b) => a[1][sortIndex] - b[1][sortIndex]);\n\t\tadd = \"↑\";\n\t} else {\n\t\tsorted = [...map.entries()].sort((a, b) => b[1][sortIndex] - a[1][sortIndex]);\n\t\tadd = \"↓\";\n\t}\n\theaders[sortIndex] = `${headers[sortIndex]} ${add}`;\n\n\tif (props.reverseColumnsInUI !== undefined) {\n\t\theaders = [headers[1], headers[0]];\n\t\tconst sorted2: [string, [number, number]][] = [];\n\t\tfor (const [name, [count, size]] of sorted) {\n\t\t\tsorted2.push([name, [size, count]]);\n\t\t}\n\t\tsorted = sorted2;\n\t}\n\n\tlet totalCount = 0;\n\tlet sizeTotal = 0;\n\n\tprops.title = `${props.title} (${sorted.length})`;\n\tconst header0 = headers[0].padStart(fieldSizes[0]);\n\tlet overflow = header0.length - fieldSizes[0];\n\tconsole.log(\n\t\t`\\n\\n${props.title.padEnd(nameLength)} │ ${header0} ${headers[1].padStart(\n\t\t\tfieldSizes[1] - overflow,\n\t\t)}`,\n\t);\n\n\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\tlet index = 0;\n\tlet allOtherCount = 0;\n\tlet allOtherSize = 0;\n\tfor (const [name, [count, size]] of sorted) {\n\t\tindex++;\n\t\ttotalCount += count;\n\t\tsizeTotal += size;\n\t\tif (index <= recordsToShow) {\n\t\t\tconst item = name.padEnd(nameLength);\n\t\t\toverflow = item.length - nameLength;\n\t\t\tconst col1 = formatNumber(count).padStart(fieldSizes[0] - overflow);\n\t\t\toverflow += col1.length - fieldSizes[0];\n\t\t\tconst col2 = formatNumber(size).padStart(fieldSizes[1] - overflow);\n\t\t\tconsole.log(`${item} │ ${col1} ${col2}`);\n\t\t} else {\n\t\t\tallOtherCount += count;\n\t\t\tallOtherSize += size;\n\t\t}\n\t}\n\n\tif (props.removeTotals === undefined) {\n\t\tif (allOtherCount || allOtherSize) {\n\t\t\tconsole.log(\n\t\t\t\t`${`All Others (${sorted.length - recordsToShow})`.padEnd(\n\t\t\t\t\tnameLength,\n\t\t\t\t)} │ ${formatNumber(allOtherCount).padStart(fieldSizes[0])} ${formatNumber(\n\t\t\t\t\tallOtherSize,\n\t\t\t\t).padStart(fieldSizes[1])}`,\n\t\t\t);\n\t\t}\n\t\tconsole.log(`${\"─\".repeat(nameLength + 1)}┼${\"─\".repeat(fieldsLength + 1)}`);\n\t\tconsole.log(\n\t\t\t`${\"Total\".padEnd(nameLength)} │ ${formatNumber(totalCount).padStart(\n\t\t\t\tfieldSizes[0],\n\t\t\t)} ${formatNumber(sizeTotal).padStart(fieldSizes[1])}`,\n\t\t);\n\t}\n}\n\nconst getObjectId = (dataStoreId: string, id: string): string => `[${dataStoreId}]/${id}`;\n\n/**\n * Analyzer for sessions\n */\nclass SessionAnalyzer implements IMessageAnalyzer {\n\tprivate readonly sessionsInProgress = new Map<string, ActiveSession>();\n\tprivate readonly sessions = new Map<string, [number, number]>();\n\tprivate readonly users = new Map<string, [number, number]>();\n\n\tprivate first = true;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (this.first) {\n\t\t\tthis.first = false;\n\t\t\t// Start of the road.\n\t\t\tconst noNameSession = ActiveSession.create(noClientName, message);\n\t\t\tthis.sessionsInProgress.set(noClientName, noNameSession);\n\t\t}\n\t\tconst session = processQuorumMessages(\n\t\t\tmessage,\n\t\t\tskipMessage,\n\t\t\tthis.sessionsInProgress,\n\t\t\tthis.sessions,\n\t\t\tthis.users,\n\t\t);\n\t\tif (!skipMessage && session) {\n\t\t\tsession.reportOp(message.timestamp);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\t// Close any open sessions\n\t\treportOpenSessions(lastOp.timestamp, this.sessionsInProgress, this.sessions, this.users);\n\t\tdumpStats(this.users, {\n\t\t\ttitle: \"Users\",\n\t\t\theaders: [\"Sessions\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\treverseColumnsInUI: true,\n\t\t\tlines: 6,\n\t\t});\n\t\tdumpStats(this.sessions, {\n\t\t\ttitle: \"Sessions\",\n\t\t\theaders: [\"Duration(s)\", \"Op count\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseColumnsInUI: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 5,\n\t\t});\n\t}\n}\n\n/**\n * Analyzer for data structures\n */\nclass DataStructureAnalyzer implements IMessageAnalyzer {\n\tprivate readonly messageTypeStats = new Map<string, [number, number]>();\n\tprivate readonly dataType = new Map<string, string>();\n\tprivate readonly dataTypeStats = new Map<string, [number, number]>();\n\tprivate readonly objectStats = new Map<string, [number, number]>();\n\tprivate readonly chunkMap = new Map<string, { chunks: string[]; totalSize: number }>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tprocessOp(\n\t\t\t\tmessage,\n\t\t\t\tthis.dataType,\n\t\t\t\tthis.objectStats,\n\t\t\t\tmsgSize,\n\t\t\t\tthis.dataTypeStats,\n\t\t\t\tthis.messageTypeStats,\n\t\t\t\tthis.chunkMap,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.messageTypeStats, {\n\t\t\ttitle: \"Message Type\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 20,\n\t\t});\n\t\tdumpStats(calcChannelStats(this.dataType, this.objectStats), {\n\t\t\ttitle: \"Channel name\",\n\t\t\theaders: [\"Op count\", \"Bytes\"],\n\t\t\tlines: 7,\n\t\t});\n\t\t/*\n dumpStats(this.dataTypeStats, {\n title: \"Channel type\",\n headers: [\"Op count\", \"Bytes\"],\n });\n */\n\t}\n}\n\n/**\n * Helper class to report if we filtered out any messages.\n */\nclass FilteredMessageAnalyzer implements IMessageAnalyzer {\n\tprivate sizeTotal = 0;\n\tprivate opsTotal = 0;\n\tprivate sizeFiltered = 0;\n\tprivate opsFiltered = 0;\n\tprivate filtered = false;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tthis.sizeTotal += msgSize;\n\t\tthis.opsTotal++;\n\t\tif (!skipMessage) {\n\t\t\tthis.sizeFiltered += msgSize;\n\t\t\tthis.opsFiltered++;\n\t\t} else {\n\t\t\tthis.filtered = true;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tif (this.filtered) {\n\t\t\tconsole.log(\n\t\t\t\t`\\nData is filtered according to --filter:messageType argument(s):\\nOp size: ${this.sizeFiltered} / ${this.sizeTotal}\\nOp count ${this.opsFiltered} / ${this.opsTotal}`,\n\t\t\t);\n\t\t}\n\t\tif (this.opsTotal === 0) {\n\t\t\tconsole.error(\"No ops were found\");\n\t\t}\n\t}\n}\n\n/**\n * Helper class to find places where we generated too many ops\n */\nclass MessageDensityAnalyzer implements IMessageAnalyzer {\n\tprivate readonly opChunk = 1000;\n\tprivate opLimit = 1;\n\tprivate size = 0;\n\tprivate timeStart = 0;\n\tprivate doctimerStart = 0;\n\tprivate readonly ranges = new Map<string, [number, number]>();\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.sequenceNumber >= this.opLimit) {\n\t\t\tif (message.sequenceNumber !== 1) {\n\t\t\t\tconst timeDiff = durationFromTime(message.timestamp - this.timeStart);\n\t\t\t\tconst opsString = `ops = [${this.opLimit - this.opChunk}, ${this.opLimit - 1}]`.padEnd(\n\t\t\t\t\t26,\n\t\t\t\t);\n\t\t\t\tconst timeString = `time = [${durationFromTime(\n\t\t\t\t\tthis.timeStart - this.doctimerStart,\n\t\t\t\t)}, ${durationFromTime(message.timestamp - this.doctimerStart)}]`;\n\t\t\t\tthis.ranges.set(`${opsString} ${timeString}`, [timeDiff, this.size]);\n\t\t\t} else {\n\t\t\t\tthis.doctimerStart = message.timestamp;\n\t\t\t}\n\t\t\tthis.opLimit += this.opChunk;\n\t\t\tthis.size = 0;\n\t\t\tthis.timeStart = message.timestamp;\n\t\t}\n\t\tif (!skipMessage) {\n\t\t\tthis.size += msgSize;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tdumpStats(this.ranges, {\n\t\t\ttitle: \"Fastest 1000 op ranges\",\n\t\t\theaders: [\"Duration(s)\", \"Bytes\"],\n\t\t\torderByFirstColumn: true,\n\t\t\treverseSort: true,\n\t\t\tremoveTotals: true,\n\t\t\tlines: 3,\n\t\t});\n\t}\n}\n\n/**\n * Helper class to analyze collab window size\n */\nclass CollabWindowSizeAnalyzer implements IMessageAnalyzer {\n\tprivate maxCollabWindow = 0;\n\tprivate opSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tconst value = message.sequenceNumber - message.minimumSequenceNumber;\n\t\tif (value > this.maxCollabWindow) {\n\t\t\tthis.maxCollabWindow = value;\n\t\t\tthis.opSeq = message.sequenceNumber;\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconsole.log(`\\nMaximum collab window size: ${this.maxCollabWindow}, seq# ${this.opSeq}`);\n\t}\n}\n\n/**\n * Helper class to analyze frequency of summaries\n */\nclass SummaryAnalyzer implements IMessageAnalyzer {\n\tprivate lastSummaryOp = 0;\n\tprivate maxDistance = 0;\n\tprivate maxSeq = 0;\n\tprivate minDistance = Number.MAX_SAFE_INTEGER;\n\tprivate minSeq = 0;\n\tprivate maxResponse = 0;\n\tprivate maxResponseSeq = 0;\n\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (message.type === MessageType.SummaryAck) {\n\t\t\tconst distance = message.sequenceNumber - this.lastSummaryOp - 1;\n\t\t\tif (this.maxDistance < distance) {\n\t\t\t\tthis.maxDistance = distance;\n\t\t\t\tthis.maxSeq = message.sequenceNumber;\n\t\t\t}\n\t\t\tif (this.minDistance > distance) {\n\t\t\t\tthis.minDistance = distance;\n\t\t\t\tthis.minSeq = message.sequenceNumber;\n\t\t\t}\n\n\t\t\tthis.lastSummaryOp = message.sequenceNumber;\n\t\t}\n\t\tif (message.type === MessageType.SummaryAck || message.type === MessageType.SummaryNack) {\n\t\t\tconst contents: ISummaryProposal = (message.contents as ISummaryAck | ISummaryNack)\n\t\t\t\t.summaryProposal;\n\t\t\tconst distance = message.sequenceNumber - contents.summarySequenceNumber;\n\t\t\tif (distance > this.maxResponse) {\n\t\t\t\tthis.maxResponse = distance;\n\t\t\t\tthis.maxResponseSeq = message.sequenceNumber;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {\n\t\tconst distance = lastOp.sequenceNumber - this.lastSummaryOp;\n\t\tif (this.maxDistance < distance) {\n\t\t\tthis.maxDistance = distance;\n\t\t\tthis.maxSeq = lastOp.sequenceNumber + 1;\n\t\t}\n\n\t\tconsole.log(\"\");\n\t\tif (this.minDistance === Number.MAX_SAFE_INTEGER) {\n\t\t\tconsole.log(\"No summaries found in this document\");\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`Maximum distance between summaries: ${this.maxDistance}, seq# ${this.maxSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Maximum server response for summary: ${this.maxResponse}, seq# ${this.maxResponseSeq}`,\n\t\t\t);\n\t\t\tconsole.log(\n\t\t\t\t`Minimum distance between summaries: ${this.minDistance}, seq# ${this.minSeq}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Helper class to dump messages to console\n */\nclass MessageDumper implements IMessageAnalyzer {\n\tpublic processOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tmsgSize: number,\n\t\tskipMessage: boolean,\n\t): void {\n\t\tif (!skipMessage) {\n\t\t\tconsole.log(JSON.stringify(message, undefined, 2));\n\t\t}\n\t}\n\n\tpublic reportAnalyzes(lastOp: ISequencedDocumentMessage): void {}\n}\n\nexport async function printMessageStats(\n\tgenerator: AsyncGenerator<ISequencedDocumentMessage[]>,\n\tdumpMessageStats: boolean,\n\tdumpMessages: boolean,\n\tmessageTypeFilter: Set<string> = new Set<string>(),\n): Promise<void> {\n\tlet lastMessage: ISequencedDocumentMessage | undefined;\n\n\tconst analyzers: IMessageAnalyzer[] = [\n\t\tnew FilteredMessageAnalyzer(), // Should come first\n\t\tnew SessionAnalyzer(),\n\t\tnew DataStructureAnalyzer(),\n\t\tnew MessageDensityAnalyzer(),\n\t\tnew CollabWindowSizeAnalyzer(),\n\t\tnew SummaryAnalyzer(),\n\t];\n\n\tif (dumpMessages) {\n\t\tanalyzers.push(new MessageDumper());\n\t}\n\n\tfor await (const messages of generator) {\n\t\tfor (const message of messages) {\n\t\t\tconst msgSize = JSON.stringify(message).length;\n\t\t\tlastMessage = message;\n\n\t\t\tconst skipMessage = messageTypeFilter.size !== 0 && !messageTypeFilter.has(message.type);\n\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.processOp(message, msgSize, skipMessage);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lastMessage !== undefined) {\n\t\tif (dumpMessageStats) {\n\t\t\tfor (const analyzer of analyzers) {\n\t\t\t\tanalyzer.reportAnalyzes(lastMessage);\n\t\t\t}\n\t\t} else {\n\t\t\t// Warn about filtered messages\n\t\t\tanalyzers[0].reportAnalyzes(lastMessage);\n\t\t}\n\t}\n\tconsole.log(\"\");\n}\n\nfunction processOp(\n\truntimeMessage: ISequencedDocumentMessage,\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n\tmsgSize: number,\n\tdataTypeStats: Map<string, [number, number]>,\n\tmessageTypeStats: Map<string, [number, number]>,\n\tchunkMap: Map<string, { chunks: string[]; totalSize: number }>,\n): void {\n\tlet type = runtimeMessage.type;\n\tlet recorded = false;\n\tlet totalMsgSize = msgSize;\n\tlet opCount = 1;\n\tif (unpackRuntimeMessage(runtimeMessage)) {\n\t\tconst messageType = runtimeMessage.type as ContainerMessageType;\n\t\tswitch (messageType) {\n\t\t\tcase ContainerMessageType.Attach: {\n\t\t\t\tconst attachMessage = runtimeMessage.contents as IAttachMessage;\n\t\t\t\tprocessDataStoreAttachOp(attachMessage, dataType);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// skip for now because these ops do not have contents\n\t\t\tcase ContainerMessageType.BlobAttach: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// The default method to count stats should be used for GC messages.\n\t\t\tcase ContainerMessageType.GC: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.DocumentSchemaChange: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ContainerMessageType.ChunkedOp: {\n\t\t\t\tconst chunk = runtimeMessage.contents as IChunkedOp;\n\t\t\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\t\t\tif (!chunkMap.has(runtimeMessage.clientId as string)) {\n\t\t\t\t\tchunkMap.set(runtimeMessage.clientId as string, {\n\t\t\t\t\t\tchunks: new Array<string>(chunk.totalChunks),\n\t\t\t\t\t\ttotalSize: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst value = chunkMap.get(runtimeMessage.clientId as string);\n\t\t\t\tassert(value !== undefined, 0x2b8 /* \"Chunk should be set in map\" */);\n\t\t\t\tconst chunks = value.chunks;\n\t\t\t\tconst chunkIndex = chunk.chunkId - 1;\n\t\t\t\tif (chunks[chunkIndex] !== undefined) {\n\t\t\t\t\tthrow new Error(\"Chunk already assigned\");\n\t\t\t\t}\n\t\t\t\tchunks[chunkIndex] = chunk.contents;\n\t\t\t\tvalue.totalSize += msgSize;\n\t\t\t\tif (chunk.chunkId === chunk.totalChunks) {\n\t\t\t\t\topCount = chunk.totalChunks; // 1 op for each chunk.\n\t\t\t\t\tconst patchedMessage = Object.create(runtimeMessage);\n\t\t\t\t\tpatchedMessage.contents = chunks.join(\"\");\n\t\t\t\t\ttype = (chunk as any).originalType;\n\t\t\t\t\tpatchedMessage.type = type;\n\t\t\t\t\ttotalMsgSize = value.totalSize;\n\t\t\t\t\tchunkMap.delete(patchedMessage.clientId);\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase ContainerMessageType.IdAllocation:\n\t\t\tcase ContainerMessageType.FluidDataStoreOp:\n\t\t\tcase ContainerMessageType.Alias:\n\t\t\tcase ContainerMessageType.Rejoin: {\n\t\t\t\tlet envelope = runtimeMessage.contents as IEnvelope;\n\t\t\t\t// TODO: Legacy?\n\t\t\t\tif (envelope !== undefined && typeof envelope === \"string\") {\n\t\t\t\t\tenvelope = JSON.parse(envelope);\n\t\t\t\t}\n\t\t\t\tconst innerContent = envelope.contents as {\n\t\t\t\t\tcontent: any;\n\t\t\t\t\ttype: string;\n\t\t\t\t};\n\t\t\t\tconst address = envelope.address;\n\t\t\t\ttype = `${type}/${innerContent.type}`;\n\t\t\t\tswitch (innerContent.type) {\n\t\t\t\t\tcase DataStoreMessageType.Attach: {\n\t\t\t\t\t\tconst attachMessage = innerContent.content as IAttachMessage;\n\t\t\t\t\t\tlet objectType = attachMessage.type;\n\t\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdataType.set(getObjectId(address, attachMessage.id), objectType);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase DataStoreMessageType.ChannelOp:\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tconst innerEnvelope = innerContent.content as IEnvelope;\n\t\t\t\t\t\tconst innerContent2 = innerEnvelope.contents as {\n\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\tvalue?: any;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst objectId = getObjectId(address, innerEnvelope.address);\n\t\t\t\t\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\t\t\t\t\tlet objectType = dataType.get(objectId);\n\t\t\t\t\t\tif (objectType === undefined) {\n\t\t\t\t\t\t\t// Somehow we do not have data...\n\t\t\t\t\t\t\tdataType.set(objectId, objectId);\n\t\t\t\t\t\t\tobjectType = objectId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t\t\t\t\t\trecorded = true;\n\n\t\t\t\t\t\tlet subType = innerContent2.type;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinnerContent2.type === \"set\" &&\n\t\t\t\t\t\t\ttypeof innerContent2.value === \"object\" &&\n\t\t\t\t\t\t\tinnerContent2.value !== null\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t\tsubType = innerContent2.value.type;\n\t\t\t\t\t\t} else if (objectType === \"mergeTree\" && subType !== undefined) {\n\t\t\t\t\t\t\tconst types = [\"insert\", \"remove\", \"annotate\", \"group\"];\n\t\t\t\t\t\t\tif (types[subType] !== undefined) {\n\t\t\t\t\t\t\t\tsubType = types[subType];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (subType !== undefined) {\n\t\t\t\t\t\t\ttype = `${type}/${subType}`;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttype = `${type} (${objectType})`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tunreachableCase(messageType, \"Message type not recognized!\");\n\t\t}\n\t}\n\n\tincr(messageTypeStats, type, totalMsgSize, opCount);\n\tif (!recorded) {\n\t\t// const objectId = `${type} (system)`;\n\t\tconst objectId = `(system messages)`;\n\t\tconst objectType = objectId;\n\t\tif (dataType.get(objectId) === undefined) {\n\t\t\tdataType.set(objectId, objectId);\n\t\t}\n\t\tincr(objectStats, objectId, totalMsgSize, opCount);\n\t\tincr(dataTypeStats, objectType, totalMsgSize, opCount);\n\t}\n}\n\nfunction processDataStoreAttachOp(\n\tattachMessage: IAttachMessage | string,\n\tdataType: Map<string, string>,\n): void {\n\t// dataType.set(getObjectId(attachMessage.id), attachMessage.type);\n\n\t// That's data store, and it brings a bunch of data structures.\n\t// Let's try to crack it.\n\tconst parsedAttachMessage =\n\t\ttypeof attachMessage === \"string\" ? JSON.parse(attachMessage) : attachMessage;\n\tfor (const entry of parsedAttachMessage.snapshot.entries) {\n\t\tif (entry.type === TreeEntry.Tree) {\n\t\t\tfor (const entry2 of entry.value.entries) {\n\t\t\t\tif (entry2.path === \".attributes\" && entry2.type === TreeEntry.Blob) {\n\t\t\t\t\tconst attrib = JSON.parse(entry2.value.contents);\n\t\t\t\t\tlet objectType: string = attrib.type;\n\t\t\t\t\tif (objectType.startsWith(objectTypePrefix)) {\n\t\t\t\t\t\tobjectType = objectType.substring(objectTypePrefix.length);\n\t\t\t\t\t}\n\t\t\t\t\tdataType.set(getObjectId(parsedAttachMessage.id, entry.path), objectType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction reportOpenSessions(\n\tlastOpTimestamp: number,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): void {\n\tconst activeSessions = new Map<string, [number, number]>();\n\n\tfor (const [clientId, ses] of sessionsInProgress) {\n\t\tconst sessionInfo = ses.leave(lastOpTimestamp);\n\t\tif (clientId !== noClientName) {\n\t\t\tconst sessionName = `${clientId} (${sessionInfo.email})`;\n\t\t\tconst sessionPayload: [number, number] = [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t];\n\t\t\tsessions.set(sessionName, sessionPayload);\n\t\t\tactiveSessions.set(sessionName, sessionPayload);\n\t\t} else {\n\t\t\tsessions.set(`Full file lifespan (noClient messages)`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t}\n\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t}\n\n\tif (activeSessions.size > 0) {\n\t\tdumpStats(activeSessions, {\n\t\t\ttitle: \"Active sessions\",\n\t\t\theaders: [\"Duration\", \"Op count\"],\n\t\t\tlines: 6,\n\t\t\torderByFirstColumn: true,\n\t\t\tremoveTotals: true,\n\t\t});\n\t}\n}\n\nfunction calcChannelStats(\n\tdataType: Map<string, string>,\n\tobjectStats: Map<string, [number, number]>,\n): Map<string, [number, number]> {\n\tconst channelStats = new Map<string, [number, number]>();\n\tfor (const [objectId, type] of dataType) {\n\t\tlet value = objectStats.get(objectId);\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (value === undefined) {\n\t\t\tvalue = [0, 0];\n\t\t}\n\t\tif (type === objectId) {\n\t\t\tchannelStats.set(`${objectId}`, value);\n\t\t} else {\n\t\t\tchannelStats.set(`${objectId} (${type})`, value);\n\t\t}\n\t}\n\treturn channelStats;\n}\n\nfunction processQuorumMessages(\n\tmessage: ISequencedDocumentMessage,\n\tskipMessage: boolean,\n\tsessionsInProgress: Map<string, ActiveSession>,\n\tsessions: Map<string, [number, number]>,\n\tusers: Map<string, [number, number]>,\n): ActiveSession | undefined {\n\tlet session: ActiveSession | undefined;\n\tconst dataString = (message as any).data;\n\tif (message.type === \"join\") {\n\t\tconst data = JSON.parse(dataString);\n\t\tsession = ActiveSession.create(data.detail.user.id, message);\n\t\tsessionsInProgress.set(data.clientId, session);\n\t} else if (message.type === \"leave\") {\n\t\tconst clientId = JSON.parse(dataString);\n\t\tsession = sessionsInProgress.get(clientId);\n\t\tsessionsInProgress.delete(clientId);\n\t\tassert(!!session, 0x1b7 /* \"Bad session state for processing quorum messages\" */);\n\t\tif (session !== undefined) {\n\t\t\tif (!skipMessage) {\n\t\t\t\tsession.reportOp(message.timestamp);\n\t\t\t}\n\t\t\tconst sessionInfo: ISessionInfo = session.leave(message.timestamp);\n\t\t\tsessions.set(`${clientId} (${sessionInfo.email})`, [\n\t\t\t\tdurationFromTime(sessionInfo.duration),\n\t\t\t\tsessionInfo.opCount,\n\t\t\t]);\n\t\t\tincr(users, sessionInfo.email, sessionInfo.opCount);\n\t\t\tsession = undefined; // Do not record it second time\n\t\t}\n\t} else {\n\t\t// message.clientId can be null\n\t\t// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)\n\n\t\tsession = sessionsInProgress.get(message.clientId as string);\n\t\tif (session === undefined) {\n\t\t\tsession = sessionsInProgress.get(noClientName);\n\t\t\tassert(!!session, 0x1b8 /* \"Bad session state for processing quorum messages\" */);\n\t\t}\n\t}\n\treturn session;\n}\n\nconst durationFromTime = (time: number): number => Math.floor(time / 1000);\n"]}
@@ -7,7 +7,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.parseArguments = exports.setArguments = exports.loginHint = exports.localDataOnly = exports.connectToWebSocket = exports.paramJWT = exports.paramURL = exports.messageTypeFilter = exports.paramSaveDir = exports.paramActualFormatting = exports.paramNumSnapshotVersions = exports.paramSnapshotVersionIndex = exports.overWrite = exports.dumpSnapshotVersions = exports.dumpSnapshotTrees = exports.dumpSnapshotStats = exports.dumpMessageStats = exports.dumpMessages = void 0;
10
+ exports.loginHint = exports.localDataOnly = exports.connectToWebSocket = exports.paramJWT = exports.paramURL = exports.messageTypeFilter = exports.paramSaveDir = exports.paramActualFormatting = exports.paramNumSnapshotVersions = exports.paramSnapshotVersionIndex = exports.overWrite = exports.dumpSnapshotVersions = exports.dumpSnapshotTrees = exports.dumpSnapshotStats = exports.dumpMessageStats = exports.dumpMessages = void 0;
11
+ exports.setArguments = setArguments;
12
+ exports.parseArguments = parseArguments;
11
13
  const fs_1 = __importDefault(require("fs"));
12
14
  exports.dumpMessages = false;
13
15
  exports.dumpMessageStats = false;
@@ -59,7 +61,6 @@ function setArguments(values) {
59
61
  exports.dumpSnapshotTrees = values.dumpSnapshotTrees ?? exports.dumpSnapshotTrees;
60
62
  exports.overWrite = values.overWrite ?? exports.overWrite;
61
63
  }
62
- exports.setArguments = setArguments;
63
64
  function parseArguments() {
64
65
  for (let i = 2; i < process.argv.length; i++) {
65
66
  const arg = process.argv[i];
@@ -140,7 +141,6 @@ function parseArguments() {
140
141
  }
141
142
  checkArgs();
142
143
  }
143
- exports.parseArguments = parseArguments;
144
144
  function parseStrArg(i, name) {
145
145
  if (i + 1 >= process.argv.length) {
146
146
  console.error(`ERROR: Missing ${name}`);
@@ -1 +1 @@
1
- {"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.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 fs from \"fs\";\n\nexport let dumpMessages = false;\nexport let dumpMessageStats = false;\nexport let dumpSnapshotStats = false;\nexport let dumpSnapshotTrees = false;\nexport let dumpSnapshotVersions = false;\nexport let overWrite = false;\nexport let paramSnapshotVersionIndex: number | undefined;\nexport let paramNumSnapshotVersions = 10;\nexport let paramActualFormatting = false;\n\nexport let paramSaveDir: string | undefined;\nexport const messageTypeFilter = new Set<string>();\n\nexport let paramURL: string | undefined;\nexport let paramJWT: string;\n\nexport let connectToWebSocket = false;\n\nexport let localDataOnly = false;\nexport let loginHint: string | undefined;\n\nconst optionsArray = [\n\t[\"--dump:rawmessage\", \"dump all messages\"],\n\t[\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n\t[\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n\t[\"--stat:message\", \"show message type, channel type, data type statistics\"],\n\t[\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n\t[\"--stat\", \"Show both messages & snapshot stats\"],\n\t[\"--filter:messageType <type>\", \"filter message by <type>\"],\n\t[\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n\t[\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n\t[\n\t\t\"--actualPayload\",\n\t\t\"Do not format json payloads nicely, preserve actual bytes / formatting in storage\",\n\t],\n\t[\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n\t[\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n\t[\"--websocket\", \"Connect to web socket to download initial messages\"],\n\t[\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n\t[\"--loginHint\", \"login hint for the user with document access.\"],\n];\n\nfunction printUsage(): void {\n\tconsole.log(\"Usage: fluid-fetch [options] URL\");\n\tconsole.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n\tconsole.log(\"Options:\");\n\tfor (const i of optionsArray) {\n\t\tconsole.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n\t}\n}\n\n// Can be used in unit test to pass in customized argument values\n// More argument options can be added when needed\nexport function setArguments(values: {\n\tsaveDir: string;\n\tparamURL: string;\n\tdumpMessages?: boolean;\n\tdumpMessageStats?: boolean;\n\tdumpSnapshotStats?: boolean;\n\tdumpSnapshotTrees?: boolean;\n\toverWrite?: boolean;\n}): void {\n\tparamSaveDir = values.saveDir;\n\tparamURL = values.paramURL;\n\tdumpMessages = values.dumpMessages ?? dumpMessages;\n\tdumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n\tdumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n\tdumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n\toverWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments(): void {\n\tfor (let i = 2; i < process.argv.length; i++) {\n\t\tconst arg = process.argv[i];\n\t\tswitch (arg) {\n\t\t\tcase \"--dump:rawmessage\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:rawmessage:overwrite\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\toverWrite = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:message\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--filter:messageType\":\n\t\t\t\tmessageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:snapshot\":\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotVersion\":\n\t\t\t\tdumpSnapshotVersions = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotTree\":\n\t\t\t\tdumpSnapshotTrees = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--help\":\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(0);\n\t\t\tcase \"--jwt\":\n\t\t\t\tparamJWT = parseStrArg(i++, \"jwt token\");\n\t\t\t\tbreak;\n\t\t\tcase \"--snapshotVersionIndex\":\n\t\t\t\tparamSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n\t\t\t\tbreak;\n\t\t\tcase \"--numSnapshotVersions\":\n\t\t\t\tparamNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n\t\t\t\tbreak;\n\t\t\tcase \"--actualPayload\":\n\t\t\t\tparamActualFormatting = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--saveDir\":\n\t\t\t\tparamSaveDir = parseStrArg(i++, \"save data path\");\n\t\t\t\tbreak;\n\t\t\tcase \"--websocket\":\n\t\t\t\tconnectToWebSocket = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--local\":\n\t\t\t\tlocalDataOnly = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--loginHint\":\n\t\t\t\tloginHint = parseStrArg(i++, \"login hint\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttry {\n\t\t\t\t\tconst url = new URL(arg);\n\t\t\t\t\tif (url.protocol === \"https:\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\n\t\t\t\tconsole.error(`ERROR: Invalid argument ${arg}`);\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(-1);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcheckArgs();\n}\n\nfunction parseStrArg(i: number, name: string): string {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean): number {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\tconst numStr = process.argv[i + 1];\n\tconst paramNumber = parseInt(numStr, 10);\n\tif (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n\t\tconsole.error(`ERROR: Invalid ${name} ${numStr}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn paramNumber;\n}\n\nfunction checkArgs(): void {\n\tif (paramSnapshotVersionIndex !== undefined) {\n\t\tparamNumSnapshotVersions = Math.max(\n\t\t\tparamSnapshotVersionIndex + 1,\n\t\t\tparamNumSnapshotVersions,\n\t\t);\n\t}\n\n\tif (paramURL === undefined) {\n\t\tif (paramSaveDir !== undefined) {\n\t\t\tconst file = `${paramSaveDir}/info.json`;\n\t\t\tif (fs.existsSync(file)) {\n\t\t\t\tconst info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n\t\t\t\tparamURL = info.url;\n\t\t\t} else {\n\t\t\t\tconsole.log(`Can't find file ${file}`);\n\t\t\t}\n\t\t}\n\n\t\tif (paramURL === undefined) {\n\t\t\tconsole.error(\"ERROR: Missing URL\");\n\t\t\tprintUsage();\n\t\t\tprocess.exit(-1);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"fluidFetchArgs.js","sourceRoot":"","sources":["../src/fluidFetchArgs.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAyDH,oCAgBC;AAED,wCA+EC;AAxJD,4CAAoB;AAET,QAAA,YAAY,GAAG,KAAK,CAAC;AACrB,QAAA,gBAAgB,GAAG,KAAK,CAAC;AACzB,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAC1B,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAC1B,QAAA,oBAAoB,GAAG,KAAK,CAAC;AAC7B,QAAA,SAAS,GAAG,KAAK,CAAC;AAElB,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAC9B,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAG5B,QAAA,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;AAKxC,QAAA,kBAAkB,GAAG,KAAK,CAAC;AAE3B,QAAA,aAAa,GAAG,KAAK,CAAC;AAGjC,MAAM,YAAY,GAAG;IACpB,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAC1C,CAAC,wBAAwB,EAAE,iCAAiC,CAAC;IAC7D,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;IAClD,CAAC,gBAAgB,EAAE,uDAAuD,CAAC;IAC3E,CAAC,iBAAiB,EAAE,6CAA6C,CAAC;IAClE,CAAC,QAAQ,EAAE,qCAAqC,CAAC;IACjD,CAAC,6BAA6B,EAAE,0BAA0B,CAAC;IAC3D,CAAC,eAAe,EAAE,yCAAyC,CAAC;IAC5D,CAAC,gCAAgC,EAAE,yCAAyC,CAAC;IAC7E;QACC,iBAAiB;QACjB,mFAAmF;KACnF;IACD,CAAC,oBAAoB,EAAE,yCAAyC,CAAC;IACjE,CAAC,iCAAiC,EAAE,8BAA8B,CAAC;IACnE,CAAC,aAAa,EAAE,oDAAoD,CAAC;IACrE,CAAC,SAAS,EAAE,6EAA6E,CAAC;IAC1F,CAAC,aAAa,EAAE,+CAA+C,CAAC;CAChE,CAAC;AAEF,SAAS,UAAU;IAClB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;AACF,CAAC;AAED,iEAAiE;AACjE,iDAAiD;AACjD,SAAgB,YAAY,CAAC,MAQ5B;IACA,oBAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,gBAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,oBAAY,GAAG,MAAM,CAAC,YAAY,IAAI,oBAAY,CAAC;IACnD,wBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,wBAAgB,CAAC;IAC/D,yBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,yBAAiB,CAAC;IAClE,yBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,yBAAiB,CAAC;IAClE,iBAAS,GAAG,MAAM,CAAC,SAAS,IAAI,iBAAS,CAAC;AAC3C,CAAC;AAED,SAAgB,cAAc;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,GAAG,EAAE,CAAC;YACb,KAAK,mBAAmB;gBACvB,oBAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACP,KAAK,6BAA6B;gBACjC,oBAAY,GAAG,IAAI,CAAC;gBACpB,iBAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACP,KAAK,gBAAgB;gBACpB,wBAAgB,GAAG,IAAI,CAAC;gBACxB,MAAM;YACP,KAAK,QAAQ;gBACZ,wBAAgB,GAAG,IAAI,CAAC;gBACxB,yBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACP,KAAK,sBAAsB;gBAC1B,yBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,kCAAkC,CAAC,CAAC,CAAC;gBAC5E,MAAM;YACP,KAAK,iBAAiB;gBACrB,yBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACP,KAAK,wBAAwB;gBAC5B,4BAAoB,GAAG,IAAI,CAAC;gBAC5B,MAAM;YACP,KAAK,qBAAqB;gBACzB,yBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;YACP,KAAK,QAAQ;gBACZ,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,KAAK,OAAO;gBACX,gBAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBACzC,MAAM;YACP,KAAK,wBAAwB;gBAC5B,iCAAyB,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;gBACpE,MAAM;YACP,KAAK,uBAAuB;gBAC3B,gCAAwB,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;gBACzE,MAAM;YACP,KAAK,iBAAiB;gBACrB,6BAAqB,GAAG,IAAI,CAAC;gBAC7B,MAAM;YACP,KAAK,WAAW;gBACf,oBAAY,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAClD,MAAM;YACP,KAAK,aAAa;gBACjB,0BAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM;YACP,KAAK,SAAS;gBACb,qBAAa,GAAG,IAAI,CAAC;gBACrB,MAAM;YACP,KAAK,aAAa;gBACjB,iBAAS,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;gBAC3C,MAAM;YACP;gBACC,IAAI,CAAC;oBACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzB,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC/B,gBAAQ,GAAG,GAAG,CAAC;wBACf,MAAM;oBACP,CAAC;oBACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;wBAC9D,gBAAQ,GAAG,GAAG,CAAC;wBACf,MAAM;oBACP,CAAC;gBACF,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;gBAChD,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjB,MAAM;QACR,CAAC;IACF,CAAC;IACD,SAAS,EAAE,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,IAAY;IAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACxC,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC;AACD,SAAS,WAAW,CAAC,CAAS,EAAE,IAAY,EAAE,SAAkB;IAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;QACxC,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,kBAAkB,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QAClD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,SAAS;IACjB,IAAI,iCAAyB,KAAK,SAAS,EAAE,CAAC;QAC7C,gCAAwB,GAAG,IAAI,CAAC,GAAG,CAClC,iCAAyB,GAAG,CAAC,EAC7B,gCAAwB,CACxB,CAAC;IACH,CAAC;IAED,IAAI,gBAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,oBAAY,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,GAAG,oBAAY,YAAY,CAAC;YACzC,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACtE,gBAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;QACF,CAAC;QAED,IAAI,gBAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport fs from \"fs\";\n\nexport let dumpMessages = false;\nexport let dumpMessageStats = false;\nexport let dumpSnapshotStats = false;\nexport let dumpSnapshotTrees = false;\nexport let dumpSnapshotVersions = false;\nexport let overWrite = false;\nexport let paramSnapshotVersionIndex: number | undefined;\nexport let paramNumSnapshotVersions = 10;\nexport let paramActualFormatting = false;\n\nexport let paramSaveDir: string | undefined;\nexport const messageTypeFilter = new Set<string>();\n\nexport let paramURL: string | undefined;\nexport let paramJWT: string;\n\nexport let connectToWebSocket = false;\n\nexport let localDataOnly = false;\nexport let loginHint: string | undefined;\n\nconst optionsArray = [\n\t[\"--dump:rawmessage\", \"dump all messages\"],\n\t[\"--dump:snapshotVersion\", \"dump a list of snapshot version\"],\n\t[\"--dump:snapshotTree\", \"dump the snapshot trees\"],\n\t[\"--stat:message\", \"show message type, channel type, data type statistics\"],\n\t[\"--stat:snapshot\", \"show a table of snapshot path and blob size\"],\n\t[\"--stat\", \"Show both messages & snapshot stats\"],\n\t[\"--filter:messageType <type>\", \"filter message by <type>\"],\n\t[\"--jwt <token>\", \"token to be used for routerlicious URLs\"],\n\t[\"--numSnapshotVersions <number>\", \"Number of versions to load (default:10)\"],\n\t[\n\t\t\"--actualPayload\",\n\t\t\"Do not format json payloads nicely, preserve actual bytes / formatting in storage\",\n\t],\n\t[\"--saveDir <outdir>\", \"Save data of the snapshots and messages\"],\n\t[\"--snapshotVersionIndex <number>\", \"Index of the version to dump\"],\n\t[\"--websocket\", \"Connect to web socket to download initial messages\"],\n\t[\"--local\", \"Do not connect to storage, use earlier downloaded data. Requires --saveDir.\"],\n\t[\"--loginHint\", \"login hint for the user with document access.\"],\n];\n\nfunction printUsage(): void {\n\tconsole.log(\"Usage: fluid-fetch [options] URL\");\n\tconsole.log(\"URL: <ODSP URL>|<Routerlicious URL>\");\n\tconsole.log(\"Options:\");\n\tfor (const i of optionsArray) {\n\t\tconsole.log(` ${i[0].padEnd(32)}: ${i[1]}`);\n\t}\n}\n\n// Can be used in unit test to pass in customized argument values\n// More argument options can be added when needed\nexport function setArguments(values: {\n\tsaveDir: string;\n\tparamURL: string;\n\tdumpMessages?: boolean;\n\tdumpMessageStats?: boolean;\n\tdumpSnapshotStats?: boolean;\n\tdumpSnapshotTrees?: boolean;\n\toverWrite?: boolean;\n}): void {\n\tparamSaveDir = values.saveDir;\n\tparamURL = values.paramURL;\n\tdumpMessages = values.dumpMessages ?? dumpMessages;\n\tdumpMessageStats = values.dumpMessageStats ?? dumpMessageStats;\n\tdumpSnapshotStats = values.dumpSnapshotStats ?? dumpSnapshotStats;\n\tdumpSnapshotTrees = values.dumpSnapshotTrees ?? dumpSnapshotTrees;\n\toverWrite = values.overWrite ?? overWrite;\n}\n\nexport function parseArguments(): void {\n\tfor (let i = 2; i < process.argv.length; i++) {\n\t\tconst arg = process.argv[i];\n\t\tswitch (arg) {\n\t\t\tcase \"--dump:rawmessage\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:rawmessage:overwrite\":\n\t\t\t\tdumpMessages = true;\n\t\t\t\toverWrite = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:message\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--stat\":\n\t\t\t\tdumpMessageStats = true;\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--filter:messageType\":\n\t\t\t\tmessageTypeFilter.add(parseStrArg(i++, \"type name for messageType filter\"));\n\t\t\t\tbreak;\n\t\t\tcase \"--stat:snapshot\":\n\t\t\t\tdumpSnapshotStats = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotVersion\":\n\t\t\t\tdumpSnapshotVersions = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--dump:snapshotTree\":\n\t\t\t\tdumpSnapshotTrees = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--help\":\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(0);\n\t\t\tcase \"--jwt\":\n\t\t\t\tparamJWT = parseStrArg(i++, \"jwt token\");\n\t\t\t\tbreak;\n\t\t\tcase \"--snapshotVersionIndex\":\n\t\t\t\tparamSnapshotVersionIndex = parseIntArg(i++, \"version index\", true);\n\t\t\t\tbreak;\n\t\t\tcase \"--numSnapshotVersions\":\n\t\t\t\tparamNumSnapshotVersions = parseIntArg(i++, \"number of versions\", false);\n\t\t\t\tbreak;\n\t\t\tcase \"--actualPayload\":\n\t\t\t\tparamActualFormatting = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--saveDir\":\n\t\t\t\tparamSaveDir = parseStrArg(i++, \"save data path\");\n\t\t\t\tbreak;\n\t\t\tcase \"--websocket\":\n\t\t\t\tconnectToWebSocket = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--local\":\n\t\t\t\tlocalDataOnly = true;\n\t\t\t\tbreak;\n\t\t\tcase \"--loginHint\":\n\t\t\t\tloginHint = parseStrArg(i++, \"login hint\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttry {\n\t\t\t\t\tconst url = new URL(arg);\n\t\t\t\t\tif (url.protocol === \"https:\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (url.protocol === \"http:\" && url.hostname === \"localhost\") {\n\t\t\t\t\t\tparamURL = arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\n\t\t\t\tconsole.error(`ERROR: Invalid argument ${arg}`);\n\t\t\t\tprintUsage();\n\t\t\t\tprocess.exit(-1);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tcheckArgs();\n}\n\nfunction parseStrArg(i: number, name: string): string {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn process.argv[i + 1];\n}\nfunction parseIntArg(i: number, name: string, allowZero: boolean): number {\n\tif (i + 1 >= process.argv.length) {\n\t\tconsole.error(`ERROR: Missing ${name}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\tconst numStr = process.argv[i + 1];\n\tconst paramNumber = parseInt(numStr, 10);\n\tif (isNaN(paramNumber) || (allowZero ? paramNumber < 0 : paramNumber <= 0)) {\n\t\tconsole.error(`ERROR: Invalid ${name} ${numStr}`);\n\t\tprintUsage();\n\t\tprocess.exit(-1);\n\t}\n\treturn paramNumber;\n}\n\nfunction checkArgs(): void {\n\tif (paramSnapshotVersionIndex !== undefined) {\n\t\tparamNumSnapshotVersions = Math.max(\n\t\t\tparamSnapshotVersionIndex + 1,\n\t\t\tparamNumSnapshotVersions,\n\t\t);\n\t}\n\n\tif (paramURL === undefined) {\n\t\tif (paramSaveDir !== undefined) {\n\t\t\tconst file = `${paramSaveDir}/info.json`;\n\t\t\tif (fs.existsSync(file)) {\n\t\t\t\tconst info = JSON.parse(fs.readFileSync(file, { encoding: \"utf-8\" }));\n\t\t\t\tparamURL = info.url;\n\t\t\t} else {\n\t\t\t\tconsole.log(`Can't find file ${file}`);\n\t\t\t}\n\t\t}\n\n\t\tif (paramURL === undefined) {\n\t\t\tconsole.error(\"ERROR: Missing URL\");\n\t\t\tprintUsage();\n\t\t\tprocess.exit(-1);\n\t\t}\n\t}\n}\n"]}
@@ -19,15 +19,26 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
19
19
  }) : function(o, v) {
20
20
  o["default"] = v;
21
21
  });
22
- var __importStar = (this && this.__importStar) || function (mod) {
23
- if (mod && mod.__esModule) return mod;
24
- var result = {};
25
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
- __setModuleDefault(result, mod);
27
- return result;
28
- };
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
29
39
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.fluidFetchInit = exports.connectionInfo = exports.latestVersionsId = void 0;
40
+ exports.connectionInfo = exports.latestVersionsId = void 0;
41
+ exports.fluidFetchInit = fluidFetchInit;
31
42
  const odsp = __importStar(require("@fluidframework/odsp-driver/internal"));
32
43
  const internal_1 = require("@fluidframework/odsp-urlresolver/internal");
33
44
  const r11s = __importStar(require("@fluidframework/routerlicious-driver/internal"));
@@ -138,5 +149,4 @@ async function fluidFetchInit(urlStr) {
138
149
  return initializeR11s(server, url.pathname, fluidResolvedUrl);
139
150
  }
140
151
  }
141
- exports.fluidFetchInit = fluidFetchInit;
142
152
  //# sourceMappingURL=fluidFetchInit.js.map