@itwin/core-backend 5.8.0-dev.12 → 5.8.0-dev.14

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.
@@ -10,10 +10,12 @@ import { BriefcaseManager } from "../../BriefcaseManager";
10
10
  import { IModelHost } from "../../IModelHost";
11
11
  import { IModelJsFs } from "../../IModelJsFs";
12
12
  import { HubMock } from "../../internal/HubMock";
13
- import { IModelTestUtils } from "../IModelTestUtils";
13
+ import { ExtensiveTestScenario, IModelTestUtils } from "../IModelTestUtils";
14
14
  import { KnownTestLocations } from "../KnownTestLocations";
15
15
  import { ProgressStatus } from "../../CheckpointManager";
16
16
  import { _hubAccess } from "../../internal/Symbols";
17
+ import { BriefcaseDb, SnapshotDb } from "../../IModelDb";
18
+ import { ChannelControl } from "../../ChannelControl";
17
19
  describe("HubMock", () => {
18
20
  const tmpDir = join(KnownTestLocations.outputDir, "HubMockTest");
19
21
  const iTwinId = Guid.createValue();
@@ -174,7 +176,8 @@ describe("HubMock", () => {
174
176
  assert.equal(lockStat.state, LockState.Shared);
175
177
  assert.equal(lockStat.sharedBy.size, 1);
176
178
  assert.isTrue(lockStat.sharedBy.has(3));
177
- assert.isUndefined(lockStat.lastCsIndex);
179
+ assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);
180
+ assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);
178
181
  localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });
179
182
  assert.equal(localHub.countSharedLocks(), 2);
180
183
  assert.equal(localHub.countLocks(), 1);
@@ -207,18 +210,19 @@ describe("HubMock", () => {
207
210
  assert.equal(localHub.countLocks(), 1);
208
211
  lockStat = localHub.queryLockStatus(lock1.id);
209
212
  assert.equal(lockStat.state, LockState.None);
210
- assert.equal(lockStat.lastCsIndex, cs2.index);
213
+ assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);
211
214
  expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw("pull is required");
212
215
  localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });
213
216
  lockStat = localHub.queryLockStatus(lock1.id);
214
217
  assert.equal(lockStat.state, LockState.Exclusive);
215
218
  assert.equal(lockStat.briefcaseId, 5);
216
- assert.equal(lockStat.lastCsIndex, cs2.index);
219
+ assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);
217
220
  localHub.acquireLock({ state: LockState.Exclusive, id: "0x22" }, { briefcaseId: 5, changeset: cs1 });
218
221
  lockStat = localHub.queryLockStatus("0x22");
219
222
  assert.equal(lockStat.state, LockState.Exclusive);
220
223
  assert.equal(lockStat.briefcaseId, 5);
221
- assert.isUndefined(lockStat.lastCsIndex);
224
+ assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);
225
+ assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);
222
226
  localHub.acquireLock({ state: LockState.Exclusive, id: "0x23" }, { briefcaseId: 6, changeset: cs1 });
223
227
  localHub.acquireLock({ state: LockState.Shared, id: "0x24" }, { briefcaseId: 6, changeset: cs1 });
224
228
  localHub.acquireLock({ state: LockState.Shared, id: "0x24" }, { briefcaseId: 5, changeset: cs1 });
@@ -233,10 +237,11 @@ describe("HubMock", () => {
233
237
  assert.equal(localHub.countSharedLocks(), 0);
234
238
  assert.equal(localHub.countLocks(), 4);
235
239
  lockStat = localHub.queryLockStatus("0x23");
236
- assert.equal(lockStat.lastCsIndex, 3);
240
+ assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, 3);
237
241
  assert.equal(lockStat.state, 0);
238
242
  lockStat = localHub.queryLockStatus("0x24");
239
- assert.equal(lockStat.lastCsIndex, undefined);
243
+ assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, undefined);
244
+ assert.equal(lockStat.lastSharedReleaseChangesetIndex, 3);
240
245
  assert.equal(lockStat.state, 0);
241
246
  await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });
242
247
  });
@@ -339,5 +344,170 @@ describe("HubMock", () => {
339
344
  assert.equal(briefcase.iTwinId, iTwinId);
340
345
  await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });
341
346
  });
347
+ describe("locking behavior", () => {
348
+ const createVersion0 = async () => {
349
+ const dbName = IModelTestUtils.prepareOutputFile("ServerBasedLocks", "ServerBasedLocks.bim");
350
+ const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: "server lock test" } });
351
+ assert.isFalse(sourceDb.locks.isServerBased);
352
+ await ExtensiveTestScenario.prepareDb(sourceDb);
353
+ await ExtensiveTestScenario.populateDb(sourceDb);
354
+ sourceDb.saveChanges();
355
+ sourceDb.close();
356
+ return dbName;
357
+ };
358
+ const accessToken1 = "user1";
359
+ const accessToken2 = "user2";
360
+ let iModelId;
361
+ let briefcase1Props;
362
+ let briefcase2Props;
363
+ //afterEach(() => sinonRestore());
364
+ before(async () => {
365
+ const iModelProps = {
366
+ iModelName: "HubMock locks test",
367
+ iTwinId: HubMock.iTwinId,
368
+ version0: await createVersion0(),
369
+ };
370
+ iModelId = await HubMock.createNewIModel(iModelProps);
371
+ const args = { iTwinId: iModelProps.iTwinId, iModelId };
372
+ briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken1, ...args });
373
+ briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken2, ...args });
374
+ });
375
+ let bc1;
376
+ let bc2;
377
+ beforeEach(async () => {
378
+ bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });
379
+ expect(bc1.locks.isServerBased).to.be.true;
380
+ bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);
381
+ await bc1.pullChanges();
382
+ });
383
+ afterEach(async () => {
384
+ await bc1.discardChanges();
385
+ bc1.close();
386
+ if (bc2 !== undefined) {
387
+ await bc2.discardChanges();
388
+ bc2.close();
389
+ bc2 = undefined;
390
+ }
391
+ });
392
+ it("a pushed change to an element prevents acquiring an exclusive lock on the same element without pulling first", async () => {
393
+ bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });
394
+ expect(bc2.locks.isServerBased).to.be.true;
395
+ bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
396
+ await bc2.pullChanges();
397
+ const childId = IModelTestUtils.queryByUserLabel(bc1, "ChildObject1B");
398
+ await bc1.locks.acquireLocks({ exclusive: childId });
399
+ const element = bc1.elements.getElement(childId);
400
+ element.setUserProperties("foo", Guid.createValue());
401
+ element.update();
402
+ bc1.saveChanges();
403
+ // bc2 should not be able to acquire an exclusive lock because bc1 still holds it.
404
+ await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith("exclusive lock is already held");
405
+ // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire it yet.
406
+ await bc1.pushChanges({ accessToken: accessToken1, description: "test change" });
407
+ await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith("pull is required to obtain lock");
408
+ // Once bc2 pulls, it can successfully acquire the lock.
409
+ await bc2.pullChanges({ accessToken: accessToken2 });
410
+ await bc2.locks.acquireLocks({ exclusive: childId });
411
+ });
412
+ it("parent lock prevents acquiring a child lock without pulling first", async () => {
413
+ bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });
414
+ expect(bc2.locks.isServerBased).to.be.true;
415
+ bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
416
+ const parentId = IModelTestUtils.queryByUserLabel(bc1, "PhysicalObject1");
417
+ const childId = IModelTestUtils.queryByUserLabel(bc1, "ChildObject1B");
418
+ await bc1.locks.acquireLocks({ exclusive: parentId });
419
+ const element = bc1.elements.getElement(childId);
420
+ element.setUserProperties("foo", Guid.createValue());
421
+ element.update();
422
+ bc1.saveChanges();
423
+ // bc2 should not be able to acquire an exclusive lock on the child because bc1 holds a lock on the parent.
424
+ await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith("exclusive lock is already held");
425
+ // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the child lock yet.
426
+ await bc1.pushChanges({ accessToken: accessToken1, description: "test change" });
427
+ await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith("pull is required to obtain lock");
428
+ // Once bc2 pulls, it can successfully acquire the child lock.
429
+ await bc2.pullChanges({ accessToken: accessToken2 });
430
+ await bc2.locks.acquireLocks({ exclusive: childId });
431
+ });
432
+ it("model lock prevents acquiring a child lock without pulling first", async () => {
433
+ bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });
434
+ expect(bc2.locks.isServerBased).to.be.true;
435
+ bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
436
+ await bc2.pullChanges();
437
+ const elementId = IModelTestUtils.queryByUserLabel(bc1, "PhysicalObject1");
438
+ const modelId = bc1.elements.getElementProps(elementId).model;
439
+ await bc1.locks.acquireLocks({ exclusive: modelId });
440
+ const element = bc1.elements.getElement(elementId);
441
+ element.setUserProperties("foo", Guid.createValue());
442
+ element.update();
443
+ bc1.saveChanges();
444
+ // bc2 should not be able to acquire an exclusive lock on the sub-model because bc1 holds a lock on the model.
445
+ await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith("exclusive lock is already held");
446
+ // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the sub-model lock yet.
447
+ await bc1.pushChanges({ accessToken: accessToken1, description: "test change" });
448
+ await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith("pull is required to obtain lock");
449
+ // Once bc2 pulls, it can successfully acquire the sub-model lock.
450
+ await bc2.pullChanges({ accessToken: accessToken2 });
451
+ await bc2.locks.acquireLocks({ exclusive: elementId });
452
+ });
453
+ it("a pushed change to sibling element should not prevent acquiring an exclusive lock", async () => {
454
+ bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });
455
+ expect(bc2.locks.isServerBased).to.be.true;
456
+ bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
457
+ await bc2.pullChanges();
458
+ const child1Id = IModelTestUtils.queryByUserLabel(bc1, "ChildObject1A");
459
+ const child2Id = IModelTestUtils.queryByUserLabel(bc1, "ChildObject1B");
460
+ await bc1.locks.acquireLocks({ exclusive: child1Id });
461
+ const element = bc1.elements.getElement(child1Id);
462
+ element.setUserProperties("foo", Guid.createValue());
463
+ element.update();
464
+ bc1.saveChanges();
465
+ // Pushing bc1's changes will release the lock.
466
+ await bc1.pushChanges({ accessToken: accessToken1, description: "test change" });
467
+ // bc2 should be able to acquire an exclusive lock on a sibling element without pulling.
468
+ await bc2.locks.acquireLocks({ exclusive: child2Id });
469
+ });
470
+ it("edited child prevents acquiring parent lock without pulling first", async () => {
471
+ bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });
472
+ expect(bc2.locks.isServerBased).to.be.true;
473
+ bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
474
+ const parentId = IModelTestUtils.queryByUserLabel(bc1, "PhysicalObject1");
475
+ const childId = IModelTestUtils.queryByUserLabel(bc1, "ChildObject1B");
476
+ await bc1.locks.acquireLocks({ exclusive: childId });
477
+ const element = bc1.elements.getElement(childId);
478
+ element.setUserProperties("foo", Guid.createValue());
479
+ element.update();
480
+ bc1.saveChanges();
481
+ // bc2 should not be able to acquire an exclusive lock on the parent because bc1 holds a lock on the child.
482
+ await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith("shared lock is held");
483
+ // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the parent lock yet.
484
+ await bc1.pushChanges({ accessToken: accessToken1, description: "test change" });
485
+ await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith("pull is required to obtain lock");
486
+ // Once bc2 pulls, it can successfully acquire the parent lock.
487
+ await bc2.pullChanges({ accessToken: accessToken2 });
488
+ await bc2.locks.acquireLocks({ exclusive: parentId });
489
+ });
490
+ it("edited sub-model prevents acquiring model lock without pulling first", async () => {
491
+ bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });
492
+ expect(bc2.locks.isServerBased).to.be.true;
493
+ bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);
494
+ await bc2.pullChanges();
495
+ const elementId = IModelTestUtils.queryByUserLabel(bc1, "PhysicalObject1");
496
+ const modelId = bc1.elements.getElementProps(elementId).model;
497
+ await bc1.locks.acquireLocks({ exclusive: elementId });
498
+ const element = bc1.elements.getElement(elementId);
499
+ element.setUserProperties("foo", Guid.createValue());
500
+ element.update();
501
+ bc1.saveChanges();
502
+ // bc2 should not be able to acquire an exclusive lock on the model because bc1 holds a lock on the sub-model.
503
+ await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith("shared lock is held");
504
+ // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the model lock yet.
505
+ await bc1.pushChanges({ accessToken: accessToken1, description: "test change" });
506
+ await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith("pull is required to obtain lock");
507
+ // Once bc2 pulls, it can successfully acquire the model lock.
508
+ await bc2.pullChanges({ accessToken: accessToken2 });
509
+ await bc2.locks.acquireLocks({ exclusive: modelId });
510
+ });
511
+ });
342
512
  });
343
513
  //# sourceMappingURL=HubMock.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HubMock.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/HubMock.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, expect } from \"chai\";\r\nimport { join } from \"path\";\r\nimport { AccessToken, Guid, Mutable } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps, ChangesetType, LockState } from \"@itwin/core-common\";\r\nimport { LockProps } from \"../../BackendHubAccess\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { LockStatusExclusive, LockStatusShared } from \"../../LocalHub\";\r\nimport { ProgressFunction, ProgressStatus } from \"../../CheckpointManager\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\n\r\ndescribe(\"HubMock\", () => {\r\n const tmpDir = join(KnownTestLocations.outputDir, \"HubMockTest\");\r\n const iTwinId = Guid.createValue();\r\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const accessToken: AccessToken = \"fake token\";\r\n\r\n before(() => {\r\n HubMock.startup(\"HubMockTest\", KnownTestLocations.outputDir);\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n it(\"should be able to create HubMock\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n let checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 1);\r\n assert.equal(checkpoints[0], 0);\r\n\r\n const cp1 = join(tmpDir, \"cp-1.bim\");\r\n localHub.downloadCheckpoint({ changeset: { index: 0 }, targetFile: cp1 });\r\n const stat1 = IModelJsFs.lstatSync(cp1);\r\n const statRev0 = IModelJsFs.lstatSync(version0);\r\n assert.equal(stat1?.size, statRev0?.size);\r\n\r\n assert.equal(2, localHub.acquireNewBriefcaseId(\"user1\", \"user1 briefcase 1\"));\r\n assert.equal(3, localHub.acquireNewBriefcaseId(\"user2\", \"user2 briefcase 1\"));\r\n assert.equal(4, localHub.acquireNewBriefcaseId(\"user3\", \"user3 briefcase 1\"));\r\n\r\n let briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n // releasing a briefcaseId should mark it as unassigned\r\n localHub.releaseBriefcaseId(2);\r\n briefcases = localHub.getBriefcases(false);\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: false });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n localHub.releaseBriefcaseId(4);\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 1);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n\r\n assert.equal(5, localHub.acquireNewBriefcaseId(\"user4\"));\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 2);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 5, user: \"user4\", alias: \"user4 (5)\", assigned: true });\r\n\r\n let pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n let fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n // try pushing changesets\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user1\", pathname, size: fileSize,\r\n };\r\n cs1.index = localHub.addChangeset(cs1); // first changeset\r\n const changesets1 = localHub.queryChangesets();\r\n assert.equal(changesets1.length, 1);\r\n assert.equal(changesets1[0].id, cs1.id);\r\n assert.equal(changesets1[0].description, cs1.description);\r\n assert.equal(changesets1[0].changesType, cs1.changesType);\r\n assert.equal(changesets1[0].index, 1);\r\n assert.equal(changesets1[0].briefcaseId, 5);\r\n assert.isAtLeast(changesets1[0].size, 1);\r\n assert.equal(changesets1[0].parentId, \"\");\r\n assert.isDefined(changesets1[0].pushDate);\r\n assert.equal(cs1.id, localHub.getLatestChangeset().id);\r\n\r\n pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\");\r\n fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n size: fileSize,\r\n };\r\n cs2.index = localHub.addChangeset(cs2); // second changeset, parent = cs1\r\n const changesets2 = localHub.queryChangesets();\r\n assert.equal(changesets2.length, 2);\r\n assert.deepEqual(changesets1[0], changesets2[0]);\r\n assert.equal(changesets2[1].id, cs2.id);\r\n assert.equal(changesets2[1].parentId, cs2.parentId);\r\n assert.equal(changesets2[1].description, cs2.description);\r\n assert.equal(changesets2[1].changesType, cs2.changesType);\r\n assert.equal(changesets2[1].index, 2);\r\n assert.equal(changesets2[1].briefcaseId, 5);\r\n assert.isAtLeast(changesets2[1].size, 1);\r\n assert.isDefined(changesets2[1].pushDate);\r\n assert.equal(cs2.id, localHub.getLatestChangeset().id);\r\n\r\n localHub.uploadCheckpoint({ changesetIndex: cs2.index, localFile: version0 });\r\n checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 2);\r\n assert.equal(checkpoints[1], 2);\r\n\r\n // test named versions\r\n const version1 = \"release 1\";\r\n const version2 = \"release 2\";\r\n localHub.addNamedVersion({ versionName: version1, csIndex: cs1.index });\r\n localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index });\r\n assert.equal(localHub.findNamedVersion(version1).index, cs1.index);\r\n expect(() => localHub.findNamedVersion(\"not there\")).throws(\"not found\");\r\n expect(() => localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index })).throws(\"insert\");\r\n localHub.deleteNamedVersion(version1);\r\n expect(() => localHub.findNamedVersion(version1)).throws(\"not found\");\r\n\r\n // test for duplicate changeset id fails\r\n const cs3: ChangesetFileProps = {\r\n id: \"changeset0\", parentId: \"changeset1\",\r\n description: \"third changeset\", changesType: ChangesetType.Regular, pathname: cs1.pathname, briefcaseId: 500, userCreated: \"\", pushDate: \"\", index: 0,\r\n size: fileSize,\r\n };\r\n expect(() => localHub.addChangeset(cs3)).throws(\"no briefcase with that id\");\r\n cs3.briefcaseId = 5;\r\n expect(() => localHub.addChangeset(cs3)).throws(\"can't insert\");\r\n // now test for valid changeset id, but bad parentId\r\n const cs4 = { ...cs3, id: \"changeset4\", parentId: \"bad\", description: \"fourth changeset\" };\r\n expect(() => localHub.addChangeset(cs4)).throws(\"bad not found\");\r\n\r\n cs3.id = \"changeset3\";\r\n cs3.parentId = cs2.id;\r\n cs3.index = localHub.addChangeset(cs3);\r\n assert.equal(0, localHub.queryPreviousCheckpoint(0));\r\n assert.equal(0, localHub.queryPreviousCheckpoint(cs1.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs2.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs3.index));\r\n\r\n // downloading changesets\r\n const cSets = localHub.downloadChangesets({ range: { first: cs1.index, end: cs2.index }, targetDir: tmpDir });\r\n assert.equal(cSets.length, 2);\r\n assert.equal(cSets[0].id, cs1.id);\r\n assert.equal(cSets[0].changesType, cs1.changesType);\r\n assert.equal(cSets[0].userCreated, cs1.userCreated);\r\n assert.equal(cSets[0].parentId, cs1.parentId);\r\n assert.equal(cSets[0].description, cs1.description);\r\n\r\n assert.equal(cSets[1].id, cs2.id);\r\n assert.equal(cSets[1].changesType, cs2.changesType);\r\n assert.equal(cSets[1].userCreated, cs2.userCreated);\r\n assert.equal(cSets[1].parentId, cs2.parentId);\r\n assert.equal(cSets[1].description, cs2.description);\r\n\r\n const orig1 = IModelJsFs.readFileSync(cs1.pathname);\r\n const downloaded1 = IModelJsFs.readFileSync(cSets[0].pathname);\r\n assert.deepEqual(orig1, downloaded1);\r\n\r\n const orig2 = IModelJsFs.readFileSync(cs2.pathname);\r\n const downloaded2 = IModelJsFs.readFileSync(cSets[1].pathname);\r\n assert.deepEqual(orig2, downloaded2);\r\n assert.notDeepEqual(orig1, orig2);\r\n\r\n const latest = await BriefcaseManager.getLatestChangeset({ iModelId });\r\n expect(latest.index).to.equal(cs3.index);\r\n expect(latest.id).to.equal(cs3.id);\r\n expect(latest.parentId).to.equal(cs3.parentId);\r\n\r\n const cs1q = await BriefcaseManager.queryChangeset({ changeset: { index: cs1.index }, iModelId });\r\n expect(cs1q.description).to.equal(cs1.description);\r\n\r\n const changes = await BriefcaseManager.queryChangesets({ range: { first: cs1.index }, iModelId });\r\n expect(changes.length).to.equal(3);\r\n\r\n // test locks\r\n const lock1: Mutable<LockProps> = {\r\n state: LockState.Shared,\r\n id: \"0x12\",\r\n };\r\n // get a new briefcaseId for some locks\r\n assert.equal(6, localHub.acquireNewBriefcaseId(\"user5\", \"alias for 5\"));\r\n\r\n localHub.acquireLock(lock1, { briefcaseId: 3, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n let lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Shared);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n\r\n assert.isUndefined(lockStat.lastCsIndex);\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 2);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 2);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(5));\r\n\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Exclusive }, { briefcaseId: 6, changeset: { id: \"cs1\" } })).to.throw(\"shared lock is held\").include({ briefcaseId: 3, briefcaseAlias: \"user2 briefcase 1\" });\r\n expect(() => localHub.releaseLocks([lock1], { briefcaseId: 9, changesetIndex: cs1.index })).to.throw(\"shared lock not held\");\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 3, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 5, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n\r\n lock1.state = LockState.Exclusive;\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Shared }, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n localHub.releaseLocks([lock1], { briefcaseId: 6, changesetIndex: cs2.index });\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n assert.equal(lockStat.lastCsIndex, cs2.index);\r\n\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"pull is required\");\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.equal(lockStat.lastCsIndex, cs2.index);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x22\" }, { briefcaseId: 5, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.isUndefined(lockStat.lastCsIndex);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x23\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 5, changeset: cs1 });\r\n\r\n let locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 3);\r\n\r\n localHub.releaseBriefcaseId(5); // releasing a briefcaseId with held locks should release them\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 0);\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n\r\n localHub.releaseAllLocks({ briefcaseId: 6, changesetIndex: 3 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 4);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x23\");\r\n assert.equal(lockStat.lastCsIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x24\");\r\n assert.equal(lockStat.lastCsIndex, undefined);\r\n assert.equal(lockStat.state, 0);\r\n\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n it(\"HubMock report progress of changesets 'downloads'\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n const briefcaseId = await HubMock.acquireNewBriefcaseId({ iModelId });\r\n\r\n const pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n const fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user1\", pathname,\r\n };\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n };\r\n cs1.index = localHub.addChangeset(cs1);\r\n cs2.index = localHub.addChangeset(cs2);\r\n\r\n // Progress reporting of single changeset \"download\"\r\n let progressReports: { downloaded: number, total: number }[] = [];\r\n let progressCallback: ProgressFunction = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return ProgressStatus.Continue;\r\n };\r\n let cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n let previousReport = { downloaded: 0, total: 0 };\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, cProps.size);\r\n }\r\n\r\n // Progress reporting of multiple changesets \"download\"\r\n progressReports = [];\r\n let cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n previousReport = { downloaded: 0, total: 0 };\r\n const totalSize = cPropsSet.reduce((sum, props) => sum + (props.size ?? 0), 0);\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, totalSize);\r\n }\r\n\r\n // Cancel single changeset \"download\"\r\n progressReports = [];\r\n progressCallback = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return downloaded > total / 2 ? ProgressStatus.Abort : ProgressStatus.Continue;\r\n };\r\n let errorThrown: boolean = false;\r\n try {\r\n cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n let lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n\r\n // Cancel multiple changesets \"download\"\r\n progressReports = [];\r\n errorThrown = false;\r\n try {\r\n cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n });\r\n\r\n it(\"use HubMock with BriefcaseManager\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const briefcase = await BriefcaseManager.downloadBriefcase({ accessToken, iTwinId, iModelId });\r\n assert.equal(briefcase.briefcaseId, 2);\r\n assert.equal(briefcase.changeset.id, \"\");\r\n assert.equal(briefcase.iModelId, iModelId);\r\n assert.equal(briefcase.iTwinId, iTwinId);\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"HubMock.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/HubMock.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAe,IAAI,EAAuB,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAsB,aAAa,EAAuB,SAAS,EAA4B,MAAM,oBAAoB,CAAC;AAEjI,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAoB,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAgB,YAAY,CAAC;IAE9C,MAAM,CAAC,GAAG,EAAE;QACV,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChH,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE1C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAE9E,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtG,uDAAuD;QACvD,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC/B,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACvG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtG,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC/B,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9F,IAAI,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;QACnF,IAAI,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAEpD,yBAAyB;QACzB,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC1I,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;SAC/C,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB;QAC1D,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvD,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;QAC/E,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAEhD,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC9I,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC;YACnG,IAAI,EAAE,QAAQ;SACf,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC;QACzE,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,CAAC;QAEvD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhC,sBAAsB;QACtB,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvG,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEtE,wCAAwC;QACxC,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY;YACxC,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACrJ,IAAI,EAAE,QAAQ;SACf,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC7E,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChE,oDAAoD;QACpD,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAC3F,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAEjE,GAAG,CAAC,EAAE,GAAG,YAAY,CAAC;QACtB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAErE,yBAAyB;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnC,aAAa;QACb,MAAM,KAAK,GAAuB;YAChC,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,EAAE,EAAE,MAAM;SACX,CAAC;QACF,uCAAuC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;QAExE,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvC,IAAI,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAE,QAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAE,QAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;QAChE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;QAC7D,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAE,QAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAE,QAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAE,QAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC5N,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE7H,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAE,QAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE9D,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAE7C,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;QAClC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACpL,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;QACpN,QAAQ,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kCAAkC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAErE,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC3G,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAE,QAAgC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kCAAkC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAErE,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAE,QAAgC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;QAChE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;QAE7D,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACrG,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAElG,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9B,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,8DAA8D;QAC9F,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAE7C,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEhC,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kCAAkC,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChH,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAEtD,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACvI,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,EAAE,QAAQ;SAC/B,CAAC;QACF,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YAC3I,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,gBAAgB,CAAC,iCAAiC,CAAC;SACpG,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAEvC,oDAAoD;QACpD,IAAI,eAAe,GAA4C,EAAE,CAAC;QAClE,IAAI,gBAAgB,GAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YAC7D,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO,cAAc,CAAC,QAAQ,CAAC;QACjC,CAAC,CAAC;QACF,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC;YAC3C,QAAQ;YACR,SAAS,EAAE;gBACT,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB;YACD,SAAS,EAAE,MAAM;YACjB,gBAAgB;SACjB,CAAC,CAAC;QACH,IAAI,cAAc,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,uDAAuD;QACvD,eAAe,GAAG,EAAE,CAAC;QACrB,IAAI,SAAS,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC;YAC/C,QAAQ;YACR,SAAS,EAAE,MAAM;YACjB,gBAAgB;SACjB,CAAC,CAAC;QACH,cAAc,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,qCAAqC;QACrC,eAAe,GAAG,EAAE,CAAC;QACrB,gBAAgB,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YACvC,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;QACjF,CAAC,CAAC;QACF,IAAI,WAAW,GAAY,KAAK,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC;gBACvC,QAAQ;gBACR,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,CAAC,KAAK;iBACjB;gBACD,SAAS,EAAE,MAAM;gBACjB,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,IAAI,UAAU,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAExD,wCAAwC;QACxC,eAAe,GAAG,EAAE,CAAC;QACrB,WAAW,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC;gBAC3C,QAAQ;gBACR,SAAS,EAAE,MAAM;gBACjB,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,UAAU,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,GAAG,eAAe,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC/F,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC7C,MAAM,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,qBAAqB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACjD,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,YAAY,GAAgB,OAAO,CAAC;QAC1C,MAAM,YAAY,GAAgB,OAAO,CAAC;QAC1C,IAAI,QAAoB,CAAC;QACzB,IAAI,eAAoC,CAAC;QACzC,IAAI,eAAoC,CAAC;QAEzC,kCAAkC;QAClC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,WAAW,GAAG;gBAClB,UAAU,EAAE,oBAAoB;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,MAAM,cAAc,EAAE;aACjC,CAAC;YAEF,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,IAAI,GAA6B,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YAClF,eAAe,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACnG,eAAe,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;QAEH,IAAI,GAAgB,CAAC;QACrB,IAAI,GAA4B,CAAC;QAEjC,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,EAAE,CAAC;YAEZ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;gBAC3B,GAAG,CAAC,KAAK,EAAE,CAAC;gBACZ,GAAG,GAAG,SAAS,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8GAA8G,EAAE,KAAK,IAAI,EAAE;YAC5H,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAExB,MAAM,OAAO,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAEvE,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,OAAO,CAAC,CAAC;YAClE,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,EAAE,CAAC;YAElB,kFAAkF;YAClF,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC;YAElH,8FAA8F;YAC9F,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC;YAEnH,wDAAwD;YACxD,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAEjE,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAEvE,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,OAAO,CAAC,CAAC;YAClE,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,EAAE,CAAC;YAElB,2GAA2G;YAC3G,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC;YAElH,0GAA0G;YAC1G,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC;YAEnH,8DAA8D;YAC9D,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAExB,MAAM,SAAS,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;YAE9D,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,SAAS,CAAC,CAAC;YACpE,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,EAAE,CAAC;YAElB,8GAA8G;YAC9G,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC;YAEpH,8GAA8G;YAC9G,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC;YAErH,kEAAkE;YAClE,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;YACjG,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAExB,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAExE,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,QAAQ,CAAC,CAAC;YACnE,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,EAAE,CAAC;YAElB,+CAA+C;YAC/C,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YAEjF,wFAAwF;YACxF,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAEjE,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAEvE,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,OAAO,CAAC,CAAC;YAClE,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,EAAE,CAAC;YAElB,2GAA2G;YAC3G,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;YAExG,2GAA2G;YAC3G,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC;YAEpH,+DAA+D;YAC/D,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;YAExB,MAAM,SAAS,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;YAE9D,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,SAAS,CAAC,CAAC;YACpE,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,CAAC,WAAW,EAAE,CAAC;YAElB,8GAA8G;YAC9G,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;YAEvG,0GAA0G;YAC1G,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC;YAEnH,8DAA8D;YAC9D,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, expect } from \"chai\";\r\nimport { join } from \"path\";\r\nimport { AccessToken, Guid, GuidString, Mutable } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps, ChangesetType, LocalBriefcaseProps, LockState, RequestNewBriefcaseProps } from \"@itwin/core-common\";\r\nimport { LockProps } from \"../../BackendHubAccess\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { LockStatusExclusive, LockStatusShared } from \"../../LocalHub\";\r\nimport { ProgressFunction, ProgressStatus } from \"../../CheckpointManager\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { ChannelControl } from \"../../ChannelControl\";\r\nimport { PhysicalElement } from \"../../Element\";\r\n\r\ndescribe(\"HubMock\", () => {\r\n const tmpDir = join(KnownTestLocations.outputDir, \"HubMockTest\");\r\n const iTwinId = Guid.createValue();\r\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const accessToken: AccessToken = \"fake token\";\r\n\r\n before(() => {\r\n HubMock.startup(\"HubMockTest\", KnownTestLocations.outputDir);\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n it(\"should be able to create HubMock\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n let checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 1);\r\n assert.equal(checkpoints[0], 0);\r\n\r\n const cp1 = join(tmpDir, \"cp-1.bim\");\r\n localHub.downloadCheckpoint({ changeset: { index: 0 }, targetFile: cp1 });\r\n const stat1 = IModelJsFs.lstatSync(cp1);\r\n const statRev0 = IModelJsFs.lstatSync(version0);\r\n assert.equal(stat1?.size, statRev0?.size);\r\n\r\n assert.equal(2, localHub.acquireNewBriefcaseId(\"user1\", \"user1 briefcase 1\"));\r\n assert.equal(3, localHub.acquireNewBriefcaseId(\"user2\", \"user2 briefcase 1\"));\r\n assert.equal(4, localHub.acquireNewBriefcaseId(\"user3\", \"user3 briefcase 1\"));\r\n\r\n let briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n // releasing a briefcaseId should mark it as unassigned\r\n localHub.releaseBriefcaseId(2);\r\n briefcases = localHub.getBriefcases(false);\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: false });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n localHub.releaseBriefcaseId(4);\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 1);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n\r\n assert.equal(5, localHub.acquireNewBriefcaseId(\"user4\"));\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 2);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 5, user: \"user4\", alias: \"user4 (5)\", assigned: true });\r\n\r\n let pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n let fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n // try pushing changesets\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user1\", pathname, size: fileSize,\r\n };\r\n cs1.index = localHub.addChangeset(cs1); // first changeset\r\n const changesets1 = localHub.queryChangesets();\r\n assert.equal(changesets1.length, 1);\r\n assert.equal(changesets1[0].id, cs1.id);\r\n assert.equal(changesets1[0].description, cs1.description);\r\n assert.equal(changesets1[0].changesType, cs1.changesType);\r\n assert.equal(changesets1[0].index, 1);\r\n assert.equal(changesets1[0].briefcaseId, 5);\r\n assert.isAtLeast(changesets1[0].size, 1);\r\n assert.equal(changesets1[0].parentId, \"\");\r\n assert.isDefined(changesets1[0].pushDate);\r\n assert.equal(cs1.id, localHub.getLatestChangeset().id);\r\n\r\n pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\");\r\n fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n size: fileSize,\r\n };\r\n cs2.index = localHub.addChangeset(cs2); // second changeset, parent = cs1\r\n const changesets2 = localHub.queryChangesets();\r\n assert.equal(changesets2.length, 2);\r\n assert.deepEqual(changesets1[0], changesets2[0]);\r\n assert.equal(changesets2[1].id, cs2.id);\r\n assert.equal(changesets2[1].parentId, cs2.parentId);\r\n assert.equal(changesets2[1].description, cs2.description);\r\n assert.equal(changesets2[1].changesType, cs2.changesType);\r\n assert.equal(changesets2[1].index, 2);\r\n assert.equal(changesets2[1].briefcaseId, 5);\r\n assert.isAtLeast(changesets2[1].size, 1);\r\n assert.isDefined(changesets2[1].pushDate);\r\n assert.equal(cs2.id, localHub.getLatestChangeset().id);\r\n\r\n localHub.uploadCheckpoint({ changesetIndex: cs2.index, localFile: version0 });\r\n checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 2);\r\n assert.equal(checkpoints[1], 2);\r\n\r\n // test named versions\r\n const version1 = \"release 1\";\r\n const version2 = \"release 2\";\r\n localHub.addNamedVersion({ versionName: version1, csIndex: cs1.index });\r\n localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index });\r\n assert.equal(localHub.findNamedVersion(version1).index, cs1.index);\r\n expect(() => localHub.findNamedVersion(\"not there\")).throws(\"not found\");\r\n expect(() => localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index })).throws(\"insert\");\r\n localHub.deleteNamedVersion(version1);\r\n expect(() => localHub.findNamedVersion(version1)).throws(\"not found\");\r\n\r\n // test for duplicate changeset id fails\r\n const cs3: ChangesetFileProps = {\r\n id: \"changeset0\", parentId: \"changeset1\",\r\n description: \"third changeset\", changesType: ChangesetType.Regular, pathname: cs1.pathname, briefcaseId: 500, userCreated: \"\", pushDate: \"\", index: 0,\r\n size: fileSize,\r\n };\r\n expect(() => localHub.addChangeset(cs3)).throws(\"no briefcase with that id\");\r\n cs3.briefcaseId = 5;\r\n expect(() => localHub.addChangeset(cs3)).throws(\"can't insert\");\r\n // now test for valid changeset id, but bad parentId\r\n const cs4 = { ...cs3, id: \"changeset4\", parentId: \"bad\", description: \"fourth changeset\" };\r\n expect(() => localHub.addChangeset(cs4)).throws(\"bad not found\");\r\n\r\n cs3.id = \"changeset3\";\r\n cs3.parentId = cs2.id;\r\n cs3.index = localHub.addChangeset(cs3);\r\n assert.equal(0, localHub.queryPreviousCheckpoint(0));\r\n assert.equal(0, localHub.queryPreviousCheckpoint(cs1.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs2.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs3.index));\r\n\r\n // downloading changesets\r\n const cSets = localHub.downloadChangesets({ range: { first: cs1.index, end: cs2.index }, targetDir: tmpDir });\r\n assert.equal(cSets.length, 2);\r\n assert.equal(cSets[0].id, cs1.id);\r\n assert.equal(cSets[0].changesType, cs1.changesType);\r\n assert.equal(cSets[0].userCreated, cs1.userCreated);\r\n assert.equal(cSets[0].parentId, cs1.parentId);\r\n assert.equal(cSets[0].description, cs1.description);\r\n\r\n assert.equal(cSets[1].id, cs2.id);\r\n assert.equal(cSets[1].changesType, cs2.changesType);\r\n assert.equal(cSets[1].userCreated, cs2.userCreated);\r\n assert.equal(cSets[1].parentId, cs2.parentId);\r\n assert.equal(cSets[1].description, cs2.description);\r\n\r\n const orig1 = IModelJsFs.readFileSync(cs1.pathname);\r\n const downloaded1 = IModelJsFs.readFileSync(cSets[0].pathname);\r\n assert.deepEqual(orig1, downloaded1);\r\n\r\n const orig2 = IModelJsFs.readFileSync(cs2.pathname);\r\n const downloaded2 = IModelJsFs.readFileSync(cSets[1].pathname);\r\n assert.deepEqual(orig2, downloaded2);\r\n assert.notDeepEqual(orig1, orig2);\r\n\r\n const latest = await BriefcaseManager.getLatestChangeset({ iModelId });\r\n expect(latest.index).to.equal(cs3.index);\r\n expect(latest.id).to.equal(cs3.id);\r\n expect(latest.parentId).to.equal(cs3.parentId);\r\n\r\n const cs1q = await BriefcaseManager.queryChangeset({ changeset: { index: cs1.index }, iModelId });\r\n expect(cs1q.description).to.equal(cs1.description);\r\n\r\n const changes = await BriefcaseManager.queryChangesets({ range: { first: cs1.index }, iModelId });\r\n expect(changes.length).to.equal(3);\r\n\r\n // test locks\r\n const lock1: Mutable<LockProps> = {\r\n state: LockState.Shared,\r\n id: \"0x12\",\r\n };\r\n // get a new briefcaseId for some locks\r\n assert.equal(6, localHub.acquireNewBriefcaseId(\"user5\", \"alias for 5\"));\r\n\r\n localHub.acquireLock(lock1, { briefcaseId: 3, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n let lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Shared);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n\r\n assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);\r\n assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 2);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 2);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(5));\r\n\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Exclusive }, { briefcaseId: 6, changeset: { id: \"cs1\" } })).to.throw(\"shared lock is held\").include({ briefcaseId: 3, briefcaseAlias: \"user2 briefcase 1\" });\r\n expect(() => localHub.releaseLocks([lock1], { briefcaseId: 9, changesetIndex: cs1.index })).to.throw(\"shared lock not held\");\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 3, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 5, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n\r\n lock1.state = LockState.Exclusive;\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Shared }, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n localHub.releaseLocks([lock1], { briefcaseId: 6, changesetIndex: cs2.index });\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);\r\n\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"pull is required\");\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x22\" }, { briefcaseId: 5, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);\r\n assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x23\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 5, changeset: cs1 });\r\n\r\n let locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 3);\r\n\r\n localHub.releaseBriefcaseId(5); // releasing a briefcaseId with held locks should release them\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 0);\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n\r\n localHub.releaseAllLocks({ briefcaseId: 6, changesetIndex: 3 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 4);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x23\");\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x24\");\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, undefined);\r\n assert.equal(lockStat.lastSharedReleaseChangesetIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n it(\"HubMock report progress of changesets 'downloads'\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n const briefcaseId = await HubMock.acquireNewBriefcaseId({ iModelId });\r\n\r\n const pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n const fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user1\", pathname,\r\n };\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n };\r\n cs1.index = localHub.addChangeset(cs1);\r\n cs2.index = localHub.addChangeset(cs2);\r\n\r\n // Progress reporting of single changeset \"download\"\r\n let progressReports: { downloaded: number, total: number }[] = [];\r\n let progressCallback: ProgressFunction = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return ProgressStatus.Continue;\r\n };\r\n let cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n let previousReport = { downloaded: 0, total: 0 };\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, cProps.size);\r\n }\r\n\r\n // Progress reporting of multiple changesets \"download\"\r\n progressReports = [];\r\n let cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n previousReport = { downloaded: 0, total: 0 };\r\n const totalSize = cPropsSet.reduce((sum, props) => sum + (props.size ?? 0), 0);\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, totalSize);\r\n }\r\n\r\n // Cancel single changeset \"download\"\r\n progressReports = [];\r\n progressCallback = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return downloaded > total / 2 ? ProgressStatus.Abort : ProgressStatus.Continue;\r\n };\r\n let errorThrown: boolean = false;\r\n try {\r\n cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n let lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n\r\n // Cancel multiple changesets \"download\"\r\n progressReports = [];\r\n errorThrown = false;\r\n try {\r\n cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n });\r\n\r\n it(\"use HubMock with BriefcaseManager\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const briefcase = await BriefcaseManager.downloadBriefcase({ accessToken, iTwinId, iModelId });\r\n assert.equal(briefcase.briefcaseId, 2);\r\n assert.equal(briefcase.changeset.id, \"\");\r\n assert.equal(briefcase.iModelId, iModelId);\r\n assert.equal(briefcase.iTwinId, iTwinId);\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n describe(\"locking behavior\", () => {\r\n const createVersion0 = async () => {\r\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\r\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\r\n assert.isFalse(sourceDb.locks.isServerBased);\r\n await ExtensiveTestScenario.prepareDb(sourceDb);\r\n await ExtensiveTestScenario.populateDb(sourceDb);\r\n sourceDb.saveChanges();\r\n sourceDb.close();\r\n return dbName;\r\n };\r\n\r\n const accessToken1: AccessToken = \"user1\";\r\n const accessToken2: AccessToken = \"user2\";\r\n let iModelId: GuidString;\r\n let briefcase1Props: LocalBriefcaseProps;\r\n let briefcase2Props: LocalBriefcaseProps;\r\n\r\n //afterEach(() => sinonRestore());\r\n before(async () => {\r\n const iModelProps = {\r\n iModelName: \"HubMock locks test\",\r\n iTwinId: HubMock.iTwinId,\r\n version0: await createVersion0(),\r\n };\r\n\r\n iModelId = await HubMock.createNewIModel(iModelProps);\r\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\r\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken1, ...args });\r\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken2, ...args });\r\n });\r\n\r\n let bc1: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n\r\n beforeEach(async () => {\r\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc1.locks.isServerBased).to.be.true;\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc1.pullChanges();\r\n });\r\n\r\n afterEach(async () => {\r\n await bc1.discardChanges();\r\n bc1.close();\r\n\r\n if (bc2 !== undefined) {\r\n await bc2.discardChanges();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"a pushed change to an element prevents acquiring an exclusive lock on the same element without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: childId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock because bc1 still holds it.\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire it yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: childId });\r\n });\r\n\r\n it(\"parent lock prevents acquiring a child lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const parentId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: parentId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the child because bc1 holds a lock on the parent.\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the child lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the child lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: childId });\r\n });\r\n\r\n it(\"model lock prevents acquiring a child lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const elementId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const modelId = bc1.elements.getElementProps(elementId).model;\r\n\r\n await bc1.locks.acquireLocks({ exclusive: modelId });\r\n const element = bc1.elements.getElement<PhysicalElement>(elementId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the sub-model because bc1 holds a lock on the model.\r\n await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the sub-model lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the sub-model lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: elementId });\r\n });\r\n\r\n it(\"a pushed change to sibling element should not prevent acquiring an exclusive lock\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const child1Id = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\r\n const child2Id = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: child1Id });\r\n const element = bc1.elements.getElement<PhysicalElement>(child1Id);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // Pushing bc1's changes will release the lock.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n\r\n // bc2 should be able to acquire an exclusive lock on a sibling element without pulling.\r\n await bc2.locks.acquireLocks({ exclusive: child2Id });\r\n });\r\n\r\n it(\"edited child prevents acquiring parent lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const parentId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: childId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the parent because bc1 holds a lock on the child.\r\n await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith(\"shared lock is held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the parent lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the parent lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: parentId });\r\n });\r\n\r\n it(\"edited sub-model prevents acquiring model lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const elementId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const modelId = bc1.elements.getElementProps(elementId).model;\r\n\r\n await bc1.locks.acquireLocks({ exclusive: elementId });\r\n const element = bc1.elements.getElement<PhysicalElement>(elementId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the model because bc1 holds a lock on the sub-model.\r\n await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith(\"shared lock is held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the model lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the model lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: modelId });\r\n });\r\n });\r\n});\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "5.8.0-dev.12",
3
+ "version": "5.8.0-dev.14",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "module": "lib/esm/core-backend.js",
@@ -27,10 +27,10 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@opentelemetry/api": "^1.0.4",
30
- "@itwin/core-bentley": "5.8.0-dev.12",
31
- "@itwin/core-geometry": "5.8.0-dev.12",
32
- "@itwin/core-common": "5.8.0-dev.12",
33
- "@itwin/ecschema-metadata": "5.8.0-dev.12"
30
+ "@itwin/core-bentley": "5.8.0-dev.14",
31
+ "@itwin/ecschema-metadata": "5.8.0-dev.14",
32
+ "@itwin/core-common": "5.8.0-dev.14",
33
+ "@itwin/core-geometry": "5.8.0-dev.14"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "@opentelemetry/api": {
@@ -77,17 +77,17 @@
77
77
  "marked": "^14.1.3",
78
78
  "sql-formatter": "^15.4.6",
79
79
  "webpack": "^5.97.1",
80
- "@itwin/build-tools": "5.8.0-dev.12",
80
+ "@itwin/core-bentley": "5.8.0-dev.14",
81
+ "@itwin/build-tools": "5.8.0-dev.14",
82
+ "@itwin/core-common": "5.8.0-dev.14",
83
+ "@itwin/core-geometry": "5.8.0-dev.14",
84
+ "@itwin/ecschema-locaters": "5.8.0-dev.14",
81
85
  "internal-tools": "3.0.0-dev.69",
82
- "@itwin/core-geometry": "5.8.0-dev.12",
83
- "@itwin/core-bentley": "5.8.0-dev.12",
84
- "@itwin/ecschema-locaters": "5.8.0-dev.12",
85
- "@itwin/core-common": "5.8.0-dev.12",
86
- "@itwin/ecschema-metadata": "5.8.0-dev.12",
87
- "@itwin/ecsql-common": "5.8.0-dev.12"
86
+ "@itwin/ecsql-common": "5.8.0-dev.14",
87
+ "@itwin/ecschema-metadata": "5.8.0-dev.14"
88
88
  },
89
89
  "dependencies": {
90
- "@bentley/imodeljs-native": "5.8.16",
90
+ "@bentley/imodeljs-native": "5.8.18",
91
91
  "@itwin/object-storage-azure": "^3.0.4",
92
92
  "@azure/storage-blob": "^12.28.0",
93
93
  "form-data": "^4.0.4",