From 7066ab9b21ff2d9b09f226b0b729953f932542fd Mon Sep 17 00:00:00 2001 From: Liran Cohen Date: Tue, 13 Aug 2024 18:13:38 -0400 Subject: [PATCH 1/4] first pass at connect flow and grants api --- .changeset/fuzzy-baboons-own.md | 5 + .changeset/silly-poets-sing.md | 8 + packages/agent/src/dwn-api.ts | 64 - packages/agent/src/identity-api.ts | 19 + packages/agent/src/types/dwn.ts | 1 + packages/agent/src/types/identity.ts | 1 + .../agent/tests/connected-permissions.spec.ts | 273 +- packages/agent/tests/did-api.spec.ts | 1 - packages/agent/tests/dwn-api.spec.ts | 4 +- .../agent/tests/dwn-permissions-util.spec.ts | 155 +- packages/agent/tests/identity-api.spec.ts | 46 + packages/api/src/dwn-api.ts | 275 +- packages/api/src/web5.ts | 224 +- packages/api/tests/dwn-api.spec.ts | 427 +- packages/api/tests/web5.spec.ts | 566 +- pnpm-lock.yaml | 12045 ++++++++++------ 16 files changed, 9391 insertions(+), 4723 deletions(-) create mode 100644 .changeset/fuzzy-baboons-own.md create mode 100644 .changeset/silly-poets-sing.md diff --git a/.changeset/fuzzy-baboons-own.md b/.changeset/fuzzy-baboons-own.md new file mode 100644 index 000000000..9f07b688a --- /dev/null +++ b/.changeset/fuzzy-baboons-own.md @@ -0,0 +1,5 @@ +--- +"@web5/api": minor +--- + +Support impersonation using delegated grants for DWN record operations using WalletConnect diff --git a/.changeset/silly-poets-sing.md b/.changeset/silly-poets-sing.md new file mode 100644 index 000000000..16cdbf118 --- /dev/null +++ b/.changeset/silly-poets-sing.md @@ -0,0 +1,8 @@ +--- +"@web5/agent": minor +"@web5/identity-agent": minor +"@web5/proxy-agent": minor +"@web5/user-agent": minor +--- + +Simplify support for Permission Grant logic within agent. diff --git a/packages/agent/src/dwn-api.ts b/packages/agent/src/dwn-api.ts index c20ffb193..747421971 100644 --- a/packages/agent/src/dwn-api.ts +++ b/packages/agent/src/dwn-api.ts @@ -39,7 +39,6 @@ import type { import { DwnInterface, dwnMessageConstructors } from './types/dwn.js'; import { blobToIsomorphicNodeReadable, getDwnServiceEndpointUrls, isRecordsWrite, webReadableToIsomorphicNodeReadable } from './utils.js'; -import { DwnPermissionsUtil } from './dwn-permissions-util.js'; export type DwnMessageWithBlob = { message: DwnMessage[T]; @@ -456,69 +455,6 @@ export class AgentDwnApi { * TODO: Create a `grants` API to handle creating permission requests, grants and revocations * */ - /** - * Performs a RecordsQuery for permission grants that match the given parameters. - */ - public async fetchGrants({ author, target, grantee, grantor }: { - /** author of the query message, defaults to grantee */ - author?: string, - /** target of the query message, defaults to author */ - target?: string, - grantor: string, - grantee: string - }): Promise { - // if no author is provided, use the grantee's DID - author ??= grantee; - // if no target is explicitly provided, use the author - target ??= author; - - const { reply: grantsReply } = await this.processRequest({ - author, - target, - messageType : DwnInterface.RecordsQuery, - messageParams : { - filter: { - author : grantor, // the author of the grant would be the grantor and the logical author of the message - recipient : grantee, // the recipient of the grant would be the grantee - ...DwnPermissionsUtil.permissionsProtocolParams('grant') - } - } - }); - - if (grantsReply.status.code !== 200) { - throw new Error(`AgentDwnApi: Failed to fetch grants: ${grantsReply.status.detail}`); - } - - return grantsReply.entries! as DataEncodedRecordsWriteMessage[]; - }; - - /** - * Check whether a grant is revoked by reading the revocation record for a given grant recordId. - */ - public async isGrantRevoked(author:string, target: string, grantRecordId: string): Promise { - const { reply: revocationReply } = await this.processRequest({ - author, - target, - messageType : DwnInterface.RecordsRead, - messageParams : { - filter: { - parentId: grantRecordId, - ...DwnPermissionsUtil.permissionsProtocolParams('revoke') - } - } - }); - - if (revocationReply.status.code === 404) { - // no revocation found, the grant is not revoked - return false; - } else if (revocationReply.status.code === 200) { - // a revocation was found, the grant is revoked - return true; - } - - throw new Error(`AgentDwnApi: Failed to check if grant is revoked: ${revocationReply.status.detail}`); - } - public async createGrant({ grantedFrom, dateExpires, grantedTo, scope, delegated }:{ dateExpires: string, grantedFrom: string, diff --git a/packages/agent/src/identity-api.ts b/packages/agent/src/identity-api.ts index 530fc1129..c64ef46ef 100644 --- a/packages/agent/src/identity-api.ts +++ b/packages/agent/src/identity-api.ts @@ -235,4 +235,23 @@ export class AgentIdentityApi { + const identities = await this.list(); + if (identities.length < 1) { + return undefined; + } + + // If a specific connected DID is provided, return the first identity that matches it. + // Otherwise, return the first connected identity. + return connectedDid ? + identities.find(identity => identity.metadata.connectedDid === connectedDid) : + identities.find(identity => identity.metadata.connectedDid !== undefined); + } } \ No newline at end of file diff --git a/packages/agent/src/types/dwn.ts b/packages/agent/src/types/dwn.ts index a2a21d408..e27743d97 100644 --- a/packages/agent/src/types/dwn.ts +++ b/packages/agent/src/types/dwn.ts @@ -256,6 +256,7 @@ export { DwnConstant, Signer as DwnSigner, DateSort as DwnDateSort, + DataEncodedRecordsWriteMessage as DwnDataEncodedRecordsWriteMessage, PublicJwk as DwnPublicKeyJwk, // TODO: Remove once DWN SDK switches to Jwk from @web5/crypto PaginationCursor as DwnPaginationCursor, MessageSubscriptionHandler as DwnMessageSubscriptionHandler, diff --git a/packages/agent/src/types/identity.ts b/packages/agent/src/types/identity.ts index dbc429983..01840f0d6 100644 --- a/packages/agent/src/types/identity.ts +++ b/packages/agent/src/types/identity.ts @@ -7,6 +7,7 @@ export interface IdentityMetadata { name: string; tenant: string; uri: string; + connectedDid?: string; } export interface PortableIdentity { diff --git a/packages/agent/tests/connected-permissions.spec.ts b/packages/agent/tests/connected-permissions.spec.ts index 75a000b12..24e104d6c 100644 --- a/packages/agent/tests/connected-permissions.spec.ts +++ b/packages/agent/tests/connected-permissions.spec.ts @@ -1,4 +1,4 @@ -import { DwnInterfaceName, DwnMethodName, Jws, Message, PermissionGrant, ProtocolDefinition, Time } from '@tbd54566975/dwn-sdk-js'; +import { DwnInterfaceName, DwnMethodName, Jws, Message, ProtocolDefinition, Time } from '@tbd54566975/dwn-sdk-js'; import type { BearerIdentity } from '../src/bearer-identity.js'; @@ -14,7 +14,6 @@ import { expect } from 'chai'; // NOTE: @noble/secp256k1 requires globalThis.crypto polyfill for node.js <=18: https://github.com/paulmillr/noble-secp256k1/blob/main/README.md#usage // Remove when we move off of node.js v18 to v20, earliest possible time would be Oct 2023: https://github.com/nodejs/release#release-schedule import { webcrypto } from 'node:crypto'; -import { GrantsUtil } from './utils/grants.js'; // @ts-expect-error - globalThis.crypto and webcrypto are of different types. if (!globalThis.crypto) globalThis.crypto = webcrypto; @@ -354,275 +353,5 @@ describe('Connect Flow Permissions', () => { expect(delegatedReadReply2.status.code).to.equal(200, 'delegated read ok'); expect(delegatedReadReply2.record?.recordId).to.equal(delegatedWriteMessage?.recordId); }); - - describe('fetchGrants', () => { - it('fetches grants for a grantee', async () => { - // scenario: alice creates grants for recipients deviceY and deviceX - // the grantee fetches their own grants respectively - - // create an identity for deviceX and deviceY - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const aliceDeviceY = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device Y' }, - didMethod : 'jwk' - }); - - // create records grants for deviceX - const deviceXGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol : 'http://example.com/protocol', - }); - - const deviceXGrantRecordIds = [ - deviceXGrants.delete.recordId, - deviceXGrants.query.recordId, - deviceXGrants.read.recordId, - deviceXGrants.subscribe.recordId, - deviceXGrants.write.recordId - ]; - - // create records and messages grants for deviceY - const deviceYRecordGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceY.did.uri, - protocol : 'http://example.com/protocol', - }); - - const deviceYMessageGrants = await GrantsUtil.createMessagesGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceY.did.uri, - protocol : 'http://example.com/protocol', - }); - - const deviceYGrantRecordIds = [ - deviceYRecordGrants.delete.recordId, - deviceYRecordGrants.query.recordId, - deviceYRecordGrants.read.recordId, - deviceYRecordGrants.subscribe.recordId, - deviceYRecordGrants.write.recordId, - deviceYMessageGrants.read.recordId, - deviceYMessageGrants.query.recordId, - deviceYMessageGrants.subscribe.recordId - ]; - - // fetch the grants for deviceX from the app agent - const fetchedDeviceXGrants = await appAgent.agent.dwn.fetchGrants({ - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - }); - - // expect to have the 5 grants created for deviceX - expect(fetchedDeviceXGrants.length).to.equal(5); - expect(fetchedDeviceXGrants.map(grant => grant.recordId)).to.have.members(deviceXGrantRecordIds); - - // fetch grants for deviceY from the app agent - const fetchedDeviceYGrants = await appAgent.agent.dwn.fetchGrants({ - grantor : alice.did.uri, - grantee : aliceDeviceY.did.uri, - }); - - // expect to have the 8 grants created for deviceY - expect(fetchedDeviceYGrants.length).to.equal(8); - expect(fetchedDeviceYGrants.map(grant => grant.recordId)).to.have.members(deviceYGrantRecordIds); - }); - - it('fetches grants for a given target', async () => { - // scenario : alice creates a grant for deviceX and stores them in deviceX's DWN - // fetches the grants for deviceX with the default target, which is the grantee (deviceX) - // attempts to fetch the grants setting the target to alice's DWN, gets no results. - // process the grant to alice's DWN and attempts the fetch again, this time the grant should be available - - // create an identity for deviceX - const aliceDeviceX = await aliceAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - // create a grant for deviceX from alice - const recordsWriteGrant = await aliceAgent.agent.dwn.createGrant({ - grantedFrom : alice.did.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } - }); - - // write to deviceX's DWN - const { reply: writeReplyDeviceX } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), - signAsOwner : true - }); - - expect(writeReplyDeviceX.status.code).to.equal(202); - - // fetch the grants for deviceX from the app agent, the target defaults to grantee - const fetchedDeviceXGrants = await aliceAgent.agent.dwn.fetchGrants({ - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - }); - - // expect to have the 1 grant created for deviceX - expect(fetchedDeviceXGrants.length).to.equal(1); - - // explicitly set the target to alice - let fetchedAliceTarget = await aliceAgent.agent.dwn.fetchGrants({ - target : alice.did.uri, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - }); - - // because the grants were not yet processed by alice's DWN, the results should be empty - expect(fetchedAliceTarget.length).to.equal(0); - - // process the grant to alice's DWN - const { reply: writeReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), - }); - expect(writeReply.status.code).to.equal(202); - - // try again to fetch the grants with alice ad the target - fetchedAliceTarget = await aliceAgent.agent.dwn.fetchGrants({ - target : alice.did.uri, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - }); - - // now the grants should be available - expect(fetchedAliceTarget.length).to.equal(1); - }); - - it('should throw if the grant query returns anything other than a 200', async () => { - // create an identity for deviceX and deviceY - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - // return empty array if grant query returns something other than a 200 - sinon.stub(appAgent.agent.dwn, 'processRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'unknown error' } } }); - try { - await appAgent.agent.dwn.fetchGrants({ - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - }); - - expect.fail('Expected fetchGrants to throw'); - } catch(error: any) { - expect(error.message).to.equal('AgentDwnApi: Failed to fetch grants: unknown error'); - } - }); - }); - - describe('isGrantRevoked', () => { - it('checks if grant is revoked', async () => { - // scenario: create a grant for deviceX, check if the grant is revoked, revoke the grant, check if the grant is revoked - - // create an identity for deviceX - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - // create records grants for deviceX - const deviceXGrant = await aliceAgent.agent.dwn.createGrant({ - grantedFrom : alice.did.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Write, - protocol : 'http://example.com/protocol' - } - }); - - const { reply: processGrantReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : deviceXGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([deviceXGrant.permissionGrantBytes]), - }); - expect(processGrantReply.status.code).to.equal(202); - - // fetch the grants for deviceX - const fetchedDeviceXGrants = await aliceAgent.agent.dwn.fetchGrants({ - author : alice.did.uri, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri - }); - - // expect to have the 5 grants created for deviceX - expect(fetchedDeviceXGrants.length).to.equal(1); - expect(fetchedDeviceXGrants.map(grant => grant.recordId)).to.have.members([ deviceXGrant.recordsWrite.message.recordId ]); - - // check if the grant is revoked - let isRevoked = await aliceAgent.agent.dwn.isGrantRevoked( - alice.did.uri, - alice.did.uri, - deviceXGrant.recordsWrite.message.recordId - ); - - expect(isRevoked).to.equal(false); - - // revoke the grant - const writeGrant = await PermissionGrant.parse(deviceXGrant.dataEncodedMessage); - const revokeGrant = await aliceAgent.agent.dwn.createRevocation({ - author : alice.did.uri, - grant : writeGrant, - }); - - const revokeReply = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : revokeGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([revokeGrant.permissionRevocationBytes]), - }); - expect(revokeReply.reply.status.code).to.equal(202); - - // check if the grant is revoked again, should be true - isRevoked = await aliceAgent.agent.dwn.isGrantRevoked( - alice.did.uri, - alice.did.uri, - deviceXGrant.recordsWrite.message.recordId - ); - expect(isRevoked).to.equal(true); - }); - - it('throws if grant revocation query returns anything other than a 200 or 404', async () => { - // return empty array if grant query returns something other than a 200 - sinon.stub(appAgent.agent.dwn, 'processRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'unknown error' } } }); - - try { - await appAgent.agent.dwn.isGrantRevoked(alice.did.uri, alice.did.uri, 'some-record-id'); - expect.fail('Expected isGrantRevoked to throw'); - } catch (error:any) { - expect(error.message).to.equal('AgentDwnApi: Failed to check if grant is revoked: unknown error'); - } - }); - }); }); }); \ No newline at end of file diff --git a/packages/agent/tests/did-api.spec.ts b/packages/agent/tests/did-api.spec.ts index 1ef1bda25..d7f5148d2 100644 --- a/packages/agent/tests/did-api.spec.ts +++ b/packages/agent/tests/did-api.spec.ts @@ -221,7 +221,6 @@ describe('AgentDidApi', () => { // delete the DID await testHarness.agent.did.delete({ didUri: did.uri, tenant: did.uri }); - console.log('deleted'); // attempt to get the DID again try { storedDid = await testHarness.agent.did.get({ didUri: did.uri, tenant: did.uri }); diff --git a/packages/agent/tests/dwn-api.spec.ts b/packages/agent/tests/dwn-api.spec.ts index af6a568a6..95a76a245 100644 --- a/packages/agent/tests/dwn-api.spec.ts +++ b/packages/agent/tests/dwn-api.spec.ts @@ -37,11 +37,13 @@ describe('AgentDwnApi', () => { }); }); - afterEach(() => { + beforeEach(() => { sinon.restore(); }); after(async () => { + sinon.restore(); + await testHarness.clearStorage(); await testHarness.closeStorage(); }); diff --git a/packages/agent/tests/dwn-permissions-util.spec.ts b/packages/agent/tests/dwn-permissions-util.spec.ts index 314ef0da2..0993052e5 100644 --- a/packages/agent/tests/dwn-permissions-util.spec.ts +++ b/packages/agent/tests/dwn-permissions-util.spec.ts @@ -106,7 +106,7 @@ describe('DwnPermissionsUtil', () => { const protocol = 'http://example.com/protocol'; - await GrantsUtil.createRecordsGrants({ + const deviceXRecordGrants = await GrantsUtil.createRecordsGrants({ grantorAgent : aliceAgent.agent, granteeAgent : appAgent.agent, grantor : alice.did.uri, @@ -114,11 +114,13 @@ describe('DwnPermissionsUtil', () => { protocol }); - const deviceXGranteeGrants = await appAgent.agent.dwn.fetchGrants({ - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri - }); - expect(deviceXGranteeGrants.length).to.equal(5); + const deviceXGranteeGrants = [ + deviceXRecordGrants.write, + deviceXRecordGrants.read, + deviceXRecordGrants.delete, + deviceXRecordGrants.query, + deviceXRecordGrants.subscribe + ]; // attempt to match a grant with a different grantee, aliceDeviceY const notFoundGrantee = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceY.did.uri, { @@ -128,7 +130,7 @@ describe('DwnPermissionsUtil', () => { expect(notFoundGrantee).to.be.undefined; - await GrantsUtil.createRecordsGrants({ + const deviceYRecordGrants = await GrantsUtil.createRecordsGrants({ grantorAgent : appAgent.agent, granteeAgent : appAgent.agent, grantor : aliceDeviceX.did.uri, @@ -136,13 +138,18 @@ describe('DwnPermissionsUtil', () => { protocol }); - const deviceXGrantorGrants = await appAgent.agent.dwn.fetchGrants({ grantor: aliceDeviceX.did.uri, grantee: aliceDeviceY.did.uri }); - expect(deviceXGrantorGrants.length).to.equal(5); + const deviceYGrantorGrants = [ + deviceYRecordGrants.write, + deviceYRecordGrants.read, + deviceYRecordGrants.delete, + deviceYRecordGrants.query, + deviceYRecordGrants.subscribe + ]; const notFoundGrantor = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceY.did.uri, { messageType: DwnInterface.RecordsWrite, protocol - }, deviceXGrantorGrants); + }, deviceYGrantorGrants); expect(notFoundGrantor).to.be.undefined; }); @@ -161,19 +168,23 @@ describe('DwnPermissionsUtil', () => { grantee : aliceDeviceX.did.uri, }); - const fetchedGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const aliceDeviceXMessageGrants = [ + messagesGrants.query, + messagesGrants.read, + messagesGrants.subscribe + ]; // control: match a grant without specifying delegated const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesQuery, - }, fetchedGrants); + }, aliceDeviceXMessageGrants); expect(queryGrant?.message.recordId).to.equal(messagesGrants.query.recordId); // attempt to match non-delegated grant with delegated set to true const notFoundDelegated = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesQuery, - }, fetchedGrants, true); + }, aliceDeviceXMessageGrants, true); expect(notFoundDelegated).to.be.undefined; @@ -187,13 +198,19 @@ describe('DwnPermissionsUtil', () => { protocol }); - const fetchedRecordsGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const deviceXRecordGrants = [ + recordsGrants.write, + recordsGrants.read, + recordsGrants.delete, + recordsGrants.query, + recordsGrants.subscribe + ]; // match a delegated grant const writeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.RecordsWrite, protocol - }, fetchedRecordsGrants, true); + }, deviceXRecordGrants, true); expect(writeGrant?.message.recordId).to.equal(recordsGrants.write.recordId); }); @@ -212,29 +229,33 @@ describe('DwnPermissionsUtil', () => { grantee : aliceDeviceX.did.uri }); - const fetchedGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const deviceXMessageGrants = [ + messageGrants.query, + messageGrants.read, + messageGrants.subscribe + ]; const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesQuery, - }, fetchedGrants); + }, deviceXMessageGrants); expect(queryGrant?.message.recordId).to.equal(messageGrants.query.recordId); const readGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesRead, - }, fetchedGrants); + }, deviceXMessageGrants); expect(readGrant?.message.recordId).to.equal(messageGrants.read.recordId); const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesSubscribe, - }, fetchedGrants); + }, deviceXMessageGrants); expect(subscribeGrant?.message.recordId).to.equal(messageGrants.subscribe.recordId); const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.RecordsQuery, - }, fetchedGrants); + }, deviceXMessageGrants); expect(invalidGrant).to.be.undefined; }); @@ -265,40 +286,47 @@ describe('DwnPermissionsUtil', () => { protocol : otherProtocol }); - const fetchedGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const deviceXMessageGrants = [ + protocolMessageGrants.query, + protocolMessageGrants.read, + protocolMessageGrants.subscribe, + otherProtocolMessageGrants.query, + otherProtocolMessageGrants.read, + otherProtocolMessageGrants.subscribe + ]; const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesQuery, protocol - }, fetchedGrants); + }, deviceXMessageGrants); expect(queryGrant?.message.recordId).to.equal(protocolMessageGrants.query.recordId); const readGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesRead, protocol - }, fetchedGrants); + }, deviceXMessageGrants); expect(readGrant?.message.recordId).to.equal(protocolMessageGrants.read.recordId); const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType: DwnInterface.MessagesSubscribe, protocol - }, fetchedGrants); + }, deviceXMessageGrants); expect(subscribeGrant?.message.recordId).to.equal(protocolMessageGrants.subscribe.recordId); const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.MessagesQuery, protocol : 'http://example.com/unknown-protocol' - }, fetchedGrants); + }, deviceXMessageGrants); expect(invalidGrant).to.be.undefined; const otherProtocolQueryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.MessagesQuery, protocol : otherProtocol - }, fetchedGrants); + }, deviceXMessageGrants); expect(otherProtocolQueryGrant?.message.recordId).to.equal(otherProtocolMessageGrants.query.recordId); }); @@ -329,47 +357,58 @@ describe('DwnPermissionsUtil', () => { protocol : protocol2, }); - const fetchedGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const deviceXRecordGrants = [ + protocol1Grants.write, + protocol1Grants.read, + protocol1Grants.delete, + protocol1Grants.query, + protocol1Grants.subscribe, + otherProtocolGrants.write, + otherProtocolGrants.read, + otherProtocolGrants.delete, + otherProtocolGrants.query, + otherProtocolGrants.subscribe + ]; const writeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsWrite, protocol : protocol1 - }, fetchedGrants); + }, deviceXRecordGrants); expect(writeGrant?.message.recordId).to.equal(protocol1Grants.write.recordId); const readGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsRead, protocol : protocol1 - }, fetchedGrants); + }, deviceXRecordGrants); expect(readGrant?.message.recordId).to.equal(protocol1Grants.read.recordId); const deleteGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsDelete, protocol : protocol1 - }, fetchedGrants); + }, deviceXRecordGrants); expect(deleteGrant?.message.recordId).to.equal(protocol1Grants.delete.recordId); const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsQuery, protocol : protocol1 - }, fetchedGrants); + }, deviceXRecordGrants); expect(queryGrant?.message.recordId).to.equal(protocol1Grants.query.recordId); const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsSubscribe, protocol : protocol1 - }, fetchedGrants); + }, deviceXRecordGrants); expect(subscribeGrant?.message.recordId).to.equal(protocol1Grants.subscribe.recordId); const queryGrantOtherProtocol = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsQuery, protocol : protocol2 - }, fetchedGrants); + }, deviceXRecordGrants); expect(queryGrantOtherProtocol?.message.recordId).to.equal(otherProtocolGrants.query.recordId); @@ -377,7 +416,7 @@ describe('DwnPermissionsUtil', () => { const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsQuery, protocol : 'http://example.com/unknown-protocol' - }, fetchedGrants); + }, deviceXRecordGrants); expect(invalidGrant).to.be.undefined; }); @@ -409,13 +448,24 @@ describe('DwnPermissionsUtil', () => { protocolPath : 'foo/bar' }); - const fetchedGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const protocolGrants = [ + fooGrants.write, + fooGrants.read, + fooGrants.delete, + fooGrants.query, + fooGrants.subscribe, + barGrants.write, + barGrants.read, + barGrants.delete, + barGrants.query, + barGrants.subscribe + ]; const writeFooGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsWrite, protocol : protocol, protocolPath : 'foo' - }, fetchedGrants); + }, protocolGrants); expect(writeFooGrant?.message.recordId).to.equal(fooGrants.write.recordId); @@ -423,7 +473,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsRead, protocol : protocol, protocolPath : 'foo' - }, fetchedGrants); + }, protocolGrants); expect(readFooGrant?.message.recordId).to.equal(fooGrants.read.recordId); @@ -431,7 +481,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsDelete, protocol : protocol, protocolPath : 'foo' - }, fetchedGrants); + }, protocolGrants); expect(deleteFooGrant?.message.recordId).to.equal(fooGrants.delete.recordId); @@ -439,7 +489,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsQuery, protocol : protocol, protocolPath : 'foo' - }, fetchedGrants); + }, protocolGrants); expect(queryGrant?.message.recordId).to.equal(fooGrants.query.recordId); @@ -447,7 +497,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsSubscribe, protocol : protocol, protocolPath : 'foo' - }, fetchedGrants); + }, protocolGrants); expect(subscribeGrant?.message.recordId).to.equal(fooGrants.subscribe.recordId); @@ -455,7 +505,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsWrite, protocol : protocol, protocolPath : 'foo/bar' - }, fetchedGrants); + }, protocolGrants); expect(writeBarGrant?.message.recordId).to.equal(barGrants.write.recordId); @@ -463,7 +513,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsWrite, protocol : protocol, protocolPath : 'bar' - }, fetchedGrants); + }, protocolGrants); expect(noMatchGrant).to.be.undefined; }); @@ -495,13 +545,24 @@ describe('DwnPermissionsUtil', () => { contextId : 'def/ghi' }); - const fetchedGrants = await appAgent.agent.dwn.fetchGrants({ grantor: alice.did.uri, grantee: aliceDeviceX.did.uri }); + const contextGrants = [ + abcGrants.write, + abcGrants.read, + abcGrants.delete, + abcGrants.query, + abcGrants.subscribe, + defGrants.write, + defGrants.read, + defGrants.delete, + defGrants.query, + defGrants.subscribe + ]; const writeFooGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsWrite, protocol : protocol, contextId : 'abc' - }, fetchedGrants); + }, contextGrants); expect(writeFooGrant?.message.recordId).to.equal(abcGrants.write.recordId); @@ -509,7 +570,7 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsWrite, protocol : protocol, contextId : 'def/ghi' - }, fetchedGrants); + }, contextGrants); expect(writeBarGrant?.message.recordId).to.equal(defGrants.write.recordId); @@ -517,14 +578,14 @@ describe('DwnPermissionsUtil', () => { messageType : DwnInterface.RecordsWrite, protocol : protocol, contextId : 'def' - }, fetchedGrants); + }, contextGrants); expect(invalidGrant).to.be.undefined; const withoutContextGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { messageType : DwnInterface.RecordsWrite, protocol : protocol - }, fetchedGrants); + }, contextGrants); expect(withoutContextGrant).to.be.undefined; }); diff --git a/packages/agent/tests/identity-api.spec.ts b/packages/agent/tests/identity-api.spec.ts index 873afbbb8..3a5f79214 100644 --- a/packages/agent/tests/identity-api.spec.ts +++ b/packages/agent/tests/identity-api.spec.ts @@ -198,6 +198,52 @@ describe('AgentIdentityApi', () => { } }); }); + + describe('connectedIdentity', () => { + it('returns a connected Identity', async () => { + // create multiple identities, some that are connected, and some that are not + // an identity is determined to be connected if it has a connectedDid set in its metadata + + // no identities exist, return undefined + const noIdentities = await testHarness.agent.identity.connectedIdentity(); + expect(noIdentities).to.be.undefined; + + // Create a non-connected Identity. + await testHarness.agent.identity.create({ + didMethod : 'jwk', + metadata : { name: 'Alice' }, + tenant : testHarness.agent.agentDid.uri + }); + + // attempt to get a connected identity when none exist + const notConnected = await testHarness.agent.identity.connectedIdentity(); + expect(notConnected).to.be.undefined; + + // Create a connected Identity. + const connectedDid1 = await testHarness.agent.identity.create({ + didMethod : 'jwk', + metadata : { name: 'Bob', connectedDid: 'did:method:abc123' }, + tenant : testHarness.agent.agentDid.uri + }); + + // Create another connected Identity. + const connectedDid2 = await testHarness.agent.identity.create({ + didMethod : 'jwk', + metadata : { name: 'Carol', connectedDid: 'did:method:def456' }, + tenant : testHarness.agent.agentDid.uri + }); + + // get the first connected identity + const connectedIdentity = await testHarness.agent.identity.connectedIdentity(); + expect(connectedIdentity).to.exist; + expect(connectedIdentity!.did.uri).to.equal(connectedDid1.did.uri); + + // get the first identity connected to a specific connectedDid + const connectedIdentity2 = await testHarness.agent.identity.connectedIdentity({ connectedDid: 'did:method:def456' }); + expect(connectedIdentity2).to.exist; + expect(connectedIdentity2!.did.uri).to.equal(connectedDid2.did.uri); + }); + }); }); } }); \ No newline at end of file diff --git a/packages/api/src/dwn-api.ts b/packages/api/src/dwn-api.ts index 25ba5c382..eb5e44991 100644 --- a/packages/api/src/dwn-api.ts +++ b/packages/api/src/dwn-api.ts @@ -1,4 +1,10 @@ -import type { +/** + * NOTE: Added reference types here to avoid a `pnpm` bug during build. + * https://github.com/TBD54566975/web5-js/pull/507 + */ +/// + +import { Web5Agent, DwnMessage, DwnResponse, @@ -6,10 +12,11 @@ import type { DwnResponseStatus, ProcessDwnRequest, DwnPaginationCursor, + DwnDataEncodedRecordsWriteMessage } from '@web5/agent'; -import { isEmptyObject } from '@web5/common'; -import { DwnInterface, getRecordAuthor } from '@web5/agent'; +import { Convert, isEmptyObject, TtlCache } from '@web5/common'; +import { DwnInterface, getRecordAuthor, DwnPermissionsUtil } from '@web5/agent'; import { Record } from './record.js'; import { dataToBlob } from './utils.js'; @@ -101,6 +108,9 @@ export type RecordsDeleteRequest = { /** Optional DID specifying the remote target DWN tenant the record will be deleted from. */ from?: string; + /** Records must be scoped to a specific protocol */ + protocol?: string; + /** The parameters for the delete operation. */ message: Omit; } @@ -116,6 +126,9 @@ export type RecordsQueryRequest = { /** Optional DID specifying the remote target DWN tenant to query from and return results. */ from?: string; + /** Records must be scoped to a specific protocol */ + protocol?: string; + /** The parameters for the query operation, detailing the criteria for selecting records. */ message: Omit; } @@ -143,6 +156,9 @@ export type RecordsReadRequest = { /** Optional DID specifying the remote target DWN tenant the record will be read from. */ from?: string; + /** Records must be scoped to a specific protocol */ + protocol?: string; + /** The parameters for the read operation, detailing the criteria for selecting the record. */ message: Omit; } @@ -215,9 +231,184 @@ export class DwnApi { /** The DID of the DWN tenant under which operations are being performed. */ private connectedDid: string; - constructor(options: { agent: Web5Agent, connectedDid: string }) { + /** (optional) The DID of the signer when signing with permissions */ + private delegateDid?: string; + + /** cache for fetching permissions */ + private cachedPermissions: TtlCache = new TtlCache({ ttl: 60 * 1000 }); + + constructor(options: { agent: Web5Agent, connectedDid: string, delegateDid?: string }) { this.agent = options.agent; this.connectedDid = options.connectedDid; + this.delegateDid = options.delegateDid; + } + + /** + * API to interact with grants. + * + * NOTE: This is an EXPERIMENTAL API that will change behavior. + * @beta + */ + get grants() { + return { + /** + * Finds the appropriate permission grants associated with a message request + */ + findConnectedPermissionGrant: async ({ messageParams }:{ + messageParams: { + messageType: T, + protocol: string, + } + }) : Promise => { + if(!this.delegateDid) { + throw new Error('AgentDwnApi: Cannot find connected grants without a signer DID'); + } + + const permissions = await this.grants.fetchConnectedGrants(); + + // get the delegate grants that match the messageParams and are associated with the connectedDid as the grantor + const delegateGrant = await DwnPermissionsUtil.matchGrantFromArray( + this.connectedDid, + this.delegateDid, + messageParams, + permissions, + true + ); + + if (!delegateGrant) { + throw new Error(`AgentDwnApi: No permissions found for ${messageParams.messageType}: ${messageParams.protocol}`); + } + + return delegateGrant.message; + }, + + /** + * Performs a RecordsQuery for permission grants that match the given parameters. + * + * (optionally) Caches the results for the given parameters to avoid redundant queries. + */ + fetchConnectedGrants: async (cached: boolean = true): Promise => { + if (!this.delegateDid) { + throw new Error('AgentDwnApi: Cannot fetch grants without a signer DID'); + } + + const cacheKey = [ this.delegateDid, this.connectedDid ].join('~'); + const cachedGrants = cached ? this.cachedPermissions.get(cacheKey) : undefined; + if (cachedGrants) { + return cachedGrants; + } + + const { reply: grantsReply } = await this.agent.processDwnRequest({ + author : this.delegateDid, + target : this.delegateDid, + messageType : DwnInterface.RecordsQuery, + messageParams : { + filter: { + author : this.connectedDid, // the author of the grant would be the grantor and the logical author of the message + recipient : this.delegateDid, // the recipient of the grant would be the grantee + ...DwnPermissionsUtil.permissionsProtocolParams('grant') + } + } + }); + + if (grantsReply.status.code !== 200) { + throw new Error(`AgentDwnApi: Failed to fetch grants: ${grantsReply.status.detail}`); + } + + const grants:DwnDataEncodedRecordsWriteMessage[] = []; + for (const entry of grantsReply.entries! as DwnDataEncodedRecordsWriteMessage[]) { + // check if the grant is revoked, we set the target to the grantor since the grantor is the author of the revocation + // the revocations should come in through sync, and are checked against the local DWN + if(await this.grants.isGrantRevoked(this.delegateDid, this.connectedDid, entry.recordId)) { + // grant is revoked do not return it in the grants list + continue; + } + grants.push(entry as DwnDataEncodedRecordsWriteMessage); + } + + if (cached) { + this.cachedPermissions.set(cacheKey, grants); + } + + return grants; + }, + + /** + * Check whether a grant is revoked by reading the revocation record for a given grant recordId. + */ + isGrantRevoked: async (author:string, target: string, grantRecordId: string): Promise => { + const { reply: revocationReply } = await this.agent.processDwnRequest({ + author, + target, + messageType : DwnInterface.RecordsRead, + messageParams : { + filter: { + parentId: grantRecordId, + ...DwnPermissionsUtil.permissionsProtocolParams('revoke') + } + } + }); + + if (revocationReply.status.code === 404) { + // no revocation found, the grant is not revoked + return false; + } else if (revocationReply.status.code === 200) { + // a revocation was found, the grant is revoked + return true; + } + + throw new Error(`AgentDwnApi: Failed to check if grant is revoked: ${revocationReply.status.detail}`); + }, + + /** + * Processes a list of delegated grants as the delegated signer so that they are available for the signer to use. + * + * If any of the grants fail, all the input grants are deleted and an error is thrown. + * Grants cache is cleared after processing. + */ + processConnectedGrantsAsOwner: async (grants: DwnDataEncodedRecordsWriteMessage[]): Promise => { + if(!this.delegateDid) { + throw new Error('AgentDwnApi: Cannot process grants without a signer DID'); + } + + for (const grant of grants) { + const data = Convert.base64Url(grant.encodedData).toArrayBuffer(); + const grantMessage = grant as DwnMessage[DwnInterface.RecordsWrite]; + delete grantMessage['encodedData']; + + const { reply } = await this.agent.processDwnRequest({ + author : this.delegateDid, + target : this.delegateDid, + signAsOwner : true, + messageType : DwnInterface.RecordsWrite, + rawMessage : grantMessage, + dataStream : new Blob([ data ]) + }); + + if (reply.status.code !== 202) { + // if any of the grants fail, delete the other grants and throw an error + for (const grant of grants) { + const { reply } = await this.agent.processDwnRequest({ + author : this.delegateDid, + target : this.delegateDid, + messageType : DwnInterface.RecordsDelete, + messageParams : { + recordId: grant.recordId + } + }); + + if (reply.status.code !== 202 && reply.status.code !== 404) { + console.error('Failed to delete grant: ', grant.recordId); + } + } + + throw new Error(`Failed to process delegated grant: ${reply.status.detail}`); + } + + this.cachedPermissions.clear(); + } + } + }; } /** @@ -345,6 +536,20 @@ export class DwnApi { target : request.from || this.connectedDid }; + if (this.delegateDid) { + // if an app is scoped down to a specific protocolPath or contextId, it must include those filters in the read request + const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + messageParams: { + messageType : DwnInterface.RecordsDelete, + protocol : request.protocol, + } + }); + + // set the required delegated grant and grantee DID for the read operation + agentRequest.messageParams.delegatedGrant = delegatedGrant; + agentRequest.granteeDid = this.delegateDid; + } + let agentResponse: DwnResponse; if (request.from) { @@ -378,6 +583,21 @@ export class DwnApi { target : request.from || this.connectedDid }; + if (this.delegateDid) { + // if an app is scoped down to a specific protocolPath or contextId, it must include those filters in the read request + const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + messageParams: { + messageType : DwnInterface.RecordsQuery, + protocol : agentRequest.messageParams.filter.protocol, + } + }); + + // set the required delegated grant and grantee DID for the read operation + agentRequest.messageParams.delegatedGrant = delegatedGrant; + agentRequest.granteeDid = this.delegateDid; + } + + let agentResponse: DwnResponse; if (request.from) { @@ -439,6 +659,20 @@ export class DwnApi { target : request.from || this.connectedDid }; + if (this.delegateDid) { + // if an app is scoped down to a specific protocolPath or contextId, it must include those filters in the read request + const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + messageParams: { + messageType : DwnInterface.RecordsRead, + protocol : request.protocol + } + }); + + // set the required delegated grant and grantee DID for the read operation + agentRequest.messageParams.delegatedGrant = delegatedGrant; + agentRequest.granteeDid = this.delegateDid; + } + let agentResponse: DwnResponse; if (request.from) { @@ -491,14 +725,33 @@ export class DwnApi { write: async (request: RecordsWriteRequest): Promise => { const { dataBlob, dataFormat } = dataToBlob(request.data, request.message?.dataFormat); - const agentResponse = await this.agent.processDwnRequest({ - author : this.connectedDid, - dataStream : dataBlob, - messageParams : { ...request.message, dataFormat }, - messageType : DwnInterface.RecordsWrite, + const dwnRequestParams: ProcessDwnRequest = { store : request.store, - target : this.connectedDid - }); + messageType : DwnInterface.RecordsWrite, + messageParams : { + ...request.message, + dataFormat + }, + author : this.connectedDid, + target : this.connectedDid, + dataStream : dataBlob + }; + + // if impersonation is enabled, fetch the delegated grant to use with the write operation + if (this.delegateDid) { + const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + messageParams: { + messageType : DwnInterface.RecordsWrite, + protocol : dwnRequestParams.messageParams.protocol, + } + }); + + // set the required delegated grant and grantee DID for the write operation + dwnRequestParams.messageParams.delegatedGrant = delegatedGrant; + dwnRequestParams.granteeDid = this.delegateDid; + }; + + const agentResponse = await this.agent.processDwnRequest(dwnRequestParams); const { message: responseMessage, reply: { status } } = agentResponse; diff --git a/packages/api/src/web5.ts b/packages/api/src/web5.ts index 9325bfdae..d8951d67a 100644 --- a/packages/api/src/web5.ts +++ b/packages/api/src/web5.ts @@ -1,16 +1,23 @@ -import { - WalletConnect, - type BearerIdentity, - type HdIdentityVault, - type WalletConnectOptions, - type Web5Agent, +/** + * NOTE: Added reference types here to avoid a `pnpm` bug during build. + * https://github.com/TBD54566975/web5-js/pull/507 + */ +/// + +import type { + BearerIdentity, + HdIdentityVault, + WalletConnectOptions, + Web5Agent, } from '@web5/agent'; + +import { PortableDid } from '@web5/dids'; import { Web5UserAgent } from '@web5/user-agent'; +import { DwnRegistrar, WalletConnect } from '@web5/agent'; + import { DidApi } from './did-api.js'; import { DwnApi } from './dwn-api.js'; -import { DwnRegistrar } from '@web5/agent'; import { VcApi } from './vc-api.js'; -import { PortableDid } from '@web5/dids'; /** Override defaults configured during the technical preview phase. */ export type TechPreviewOptions = { @@ -147,7 +154,7 @@ export type Web5ConnectResult = { * The resulting did of a successful wallet connect. Only returned on success if * {@link WalletConnectOptions} was provided. */ - delegateDid?: PortableDid + delegateDid?: string; }; /** @@ -164,6 +171,9 @@ export type Web5Params = { /** The DID of the tenant under which all DID, DWN, and VC requests are being performed. */ connectedDid: string; + + /** The DID that will be signing Web5 messages using grants from the connectedDid */ + delegateDid?: string; }; /** @@ -186,14 +196,10 @@ export class Web5 { /** Exposed instance to the VC APIs, allow users to issue, present and verify VCs */ vc: VcApi; - /** The DID of the tenant under which DID operations are being performed. */ - private connectedDid: string; - - constructor({ agent, connectedDid }: Web5Params) { + constructor({ agent, connectedDid, delegateDid }: Web5Params) { this.agent = agent; - this.connectedDid = connectedDid; this.did = new DidApi({ agent, connectedDid }); - this.dwn = new DwnApi({ agent, connectedDid }); + this.dwn = new DwnApi({ agent, connectedDid, delegateDid }); this.vc = new VcApi({ agent, connectedDid }); } @@ -201,6 +207,10 @@ export class Web5 { * Connects to a {@link Web5Agent}. Defaults to creating a local {@link Web5UserAgent} if one * isn't provided. * + * If `walletConnectOptions` are provided, a WalletConnect flow will be initiated to import a delegated DID from an external wallet. + * If there is a failure at any point during connecting and processing grants, all created DIDs and Identities as well as the provided grants + * will be cleaned up and an error thrown. This allows for subsequent Connect attempts to be made without any errors. + * * @param options - Optional overrides that can be provided when calling {@link Web5.connect}. * @returns A promise that resolves to a {@link Web5} instance and the connected DID. */ @@ -216,6 +226,7 @@ export class Web5 { registration, walletConnectOptions, }: Web5ConnectOptions = {}): Promise { + let delegateDid: string | undefined; if (agent === undefined) { // A custom Web5Agent implementation was not specified, so use default managed user agent. const userAgent = await Web5UserAgent.create({ agentVault }); @@ -239,75 +250,100 @@ export class Web5 { recoveryPhrase = await userAgent.initialize({ password, recoveryPhrase }); } await userAgent.start({ password }); - + // Attempt to retrieve the connected Identity if it exists. + const connectedIdentity: BearerIdentity = await userAgent.identity.connectedIdentity(); let identity: BearerIdentity; - - // Query the Agent's DWN tenant for identity records. - const identities = await userAgent.identity.list(); - - // If an existing identity is not found found, create a new one. - const existingIdentityCount = identities.length; - - // on init/registration - if (existingIdentityCount === 0) { - if (walletConnectOptions) { - // WIP: ingest this - const { delegateDid } = await WalletConnect.initClient(walletConnectOptions); - // WIP - // identity = await userAgent.identity.import({ - // portableIdentity: { - // portableDid : did, - // metadata : { name: 'Connection', uri: did.uri, tenant: did.uri } - // } - // }); - - // WIP. just going to early return for now. - return { web5: null, did: null, delegateDid }; + if (connectedIdentity) { + // if a connected identity is found, use it + // TODO: In the future, implement a way to re-connect an already connected identity and apply additional grants/protocols + identity = connectedIdentity; + } else if (walletConnectOptions) { + // No connected identity found and connectOptions are provided, attempt to import a delegated DID from an external wallet + try { + // TEMPORARY: Placeholder for WalletConnect integration + const { connectedDid, delegateDid, delegateGrants } = await WalletConnect.initClient(walletConnectOptions); + + // Import the delegated DID as an Identity in the User Agent. + // Setting the connectedDID in the metadata applies a relationship between the signer identity and the one it is impersonating. + identity = await userAgent.identity.import({ portableIdentity: { + portableDid : delegateDid, + metadata : { + connectedDid, + name : 'Default', + tenant : delegateDid.uri, + uri : delegateDid.uri, + } + }}); + await userAgent.identity.manage({ portableIdentity: await identity.export() }); + + // NOTE: We are using the DwnApi directly temporarily, in a future release there will be a more robust Permissions API on the agent level + // to handle specific permissions requests + // + // Process the incoming delegated grants in the UserAgent as the owner of the signing delegatedDID + // this will allow the delegated DID to fetch the grants in order to use them when selecting a grant to sign a record/message with + // If any of the grants fail to process, they are all rolled back and this will throw an error causing the identity to be cleaned up + const dwnApi = new DwnApi({ agent, connectedDid, delegateDid: delegateDid.uri }); + await dwnApi.grants.processConnectedGrantsAsOwner(delegateGrants); + } catch (error:any) { + // clean up the DID and Identity if import fails and throw + await this.cleanUpIdentity({ identity, userAgent }); + throw new Error(`Failed to connect to wallet: ${error.message}`); } + } else { + // No connected identity found and no connectOptions provided, use local Identities + // Query the Agent's DWN tenant for identity records. + const identities = await userAgent.identity.list(); + + // If an existing identity is not found found, create a new one. + const existingIdentityCount = identities.length; + if (existingIdentityCount === 0) { + // Use the specified DWN endpoints or the latest TBD hosted DWN + const serviceEndpointNodes = techPreview?.dwnEndpoints ?? didCreateOptions?.dwnEndpoints ?? ['https://dwn.tbddev.org/beta']; + + // Generate a new Identity for the end-user. + identity = await userAgent.identity.create({ + didMethod : 'dht', + metadata : { name: 'Default' }, + didOptions : { + services: [ + { + id : 'dwn', + type : 'DecentralizedWebNode', + serviceEndpoint : serviceEndpointNodes, + enc : '#enc', + sig : '#sig', + } + ], + verificationMethods: [ + { + algorithm : 'Ed25519', + id : 'sig', + purposes : ['assertionMethod', 'authentication'] + }, + { + algorithm : 'secp256k1', + id : 'enc', + purposes : ['keyAgreement'] + } + ] + } + }); - // Use the specified DWN endpoints or get default tech preview hosted nodes. - const serviceEndpointNodes = techPreview?.dwnEndpoints ?? didCreateOptions?.dwnEndpoints ?? ['https://dwn.tbddev.org/beta']; - - // Generate a new Identity for the end-user. - identity = await userAgent.identity.create({ - didMethod : 'dht', - metadata : { name: 'Default' }, - didOptions : { - services: [ - { - id : 'dwn', - type : 'DecentralizedWebNode', - serviceEndpoint : serviceEndpointNodes, - enc : '#enc', - sig : '#sig', - } - ], - verificationMethods: [ - { - algorithm : 'Ed25519', - id : 'sig', - purposes : ['assertionMethod', 'authentication'] - }, - { - algorithm : 'secp256k1', - id : 'enc', - purposes : ['keyAgreement'] - } - ] - } - }); + // The User Agent will manage the Identity, which ensures it will be available on future + // sessions. + await userAgent.identity.manage({ portableIdentity: await identity.export() }); - // Persists the Identity to be available in future sessions - await userAgent.identity.manage({ portableIdentity: await identity.export() }); - } else if (existingIdentityCount === 1) { - // An existing identity was found in the User Agent's tenant. - identity = identities[0]; - } else { - throw new Error(`connect() failed due to unexpected state: Expected 1 but found ${existingIdentityCount} stored identities.`); + } else { + // If multiple identities are found, use the first one. + // TODO: Implement selecting a connectedDid from multiple identities + identity = identities[0]; + } } - connectedDid = identity.did.uri; - + // If the stored identity has a connected DID, use it as the connected DID, otherwise use the identity's DID. + connectedDid = identity.metadata.connectedDid ?? identity.did.uri; + // If the stored identity has a connected DID, use the identity DID as the delegated DID, otherwise it is undefined. + delegateDid = identity.metadata.connectedDid ? identity.did.uri : undefined; if (registration !== undefined) { // If a registration object is passed, we attempt to register the AgentDID and the ConnectedDID with the DWN endpoints provided const serviceEndpointNodes = techPreview?.dwnEndpoints ?? didCreateOptions?.dwnEndpoints; @@ -350,7 +386,35 @@ export class Web5 { } } - const web5 = new Web5({ agent, connectedDid }); - return { web5, did: connectedDid, recoveryPhrase }; + const web5 = new Web5({ agent, connectedDid, delegateDid }); + + return { web5, did: connectedDid, delegateDid, recoveryPhrase }; + } + + /** + * Cleans up the DID, Keys and Identity. Primarily used by a failed WalletConnect import. + * Does not throw on error, but logs to console. + */ + private static async cleanUpIdentity({ identity, userAgent }:{ + identity: BearerIdentity, + userAgent: Web5UserAgent + }): Promise { + try { + // Delete the DID and the Associated Keys + await userAgent.did.delete({ + didUri : identity.did.uri, + tenant : identity.metadata.tenant, + deleteKey : true, + }); + } catch(error: any) { + console.error(`Failed to delete DID ${identity.did.uri}: ${error.message}`); + } + + try { + // Delete the Identity + await userAgent.identity.delete({ didUri: identity.did.uri }); + } catch(error: any) { + console.error(`Failed to delete Identity ${identity.metadata.name}: ${error.message}`); + } } } diff --git a/packages/api/tests/dwn-api.spec.ts b/packages/api/tests/dwn-api.spec.ts index ce7e870bf..204cc83f3 100644 --- a/packages/api/tests/dwn-api.spec.ts +++ b/packages/api/tests/dwn-api.spec.ts @@ -3,12 +3,13 @@ import type { BearerDid } from '@web5/dids'; import sinon from 'sinon'; import { expect } from 'chai'; import { Web5UserAgent } from '@web5/user-agent'; -import { DwnDateSort, PlatformAgentTestHarness } from '@web5/agent'; +import { DwnDateSort, DwnInterface, PlatformAgentTestHarness } from '@web5/agent'; import { DwnApi } from '../src/dwn-api.js'; import { testDwnUrl } from './utils/test-config.js'; import emailProtocolDefinition from './fixtures/protocol-definitions/email.json' assert { type: 'json' }; import photosProtocolDefinition from './fixtures/protocol-definitions/photos.json' assert { type: 'json' }; +import { DwnInterfaceName, DwnMethodName, PermissionGrant, Time } from '@tbd54566975/dwn-sdk-js'; let testDwnUrls: string[] = [testDwnUrl]; @@ -27,6 +28,7 @@ describe('DwnApi', () => { }); beforeEach(async () => { + sinon.restore(); await testHarness.clearStorage(); await testHarness.createAgentDid(); @@ -43,9 +45,14 @@ describe('DwnApi', () => { // Instantiate DwnApi for both test identities. dwnAlice = new DwnApi({ agent: testHarness.agent, connectedDid: aliceDid.uri }); dwnBob = new DwnApi({ agent: testHarness.agent, connectedDid: bobDid.uri }); + + // clear cached permissions between test runs + dwnAlice['cachedPermissions'].clear(); + dwnBob['cachedPermissions'].clear(); }); after(async () => { + sinon.restore(); await testHarness.clearStorage(); await testHarness.closeStorage(); }); @@ -1240,11 +1247,7 @@ describe('DwnApi', () => { expect(writeResult.record).to.exist; // Delete the record - await dwnAlice.records.delete({ - message: { - recordId: writeResult.record!.id - } - }); + await writeResult.record!.delete(); const result = await dwnAlice.records.read({ message: { @@ -1366,4 +1369,416 @@ describe('DwnApi', () => { }); }); }); + + describe('grants.fetchConnectedGrants()', () => { + it('throws if no signerDID is set', async () => { + // make sure signerDID is undefined + dwnAlice['delegateDid'] = undefined; + try { + await dwnAlice.grants.fetchConnectedGrants(); + expect.fail('Error was not thrown'); + } catch (e) { + expect(e.message).to.equal('AgentDwnApi: Cannot fetch grants without a signer DID'); + } + }); + + it('caches results', async () => { + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // set the device identity as the signerDID + dwnAlice['delegateDid'] = aliceDeviceX.did.uri; + + const recordsWriteGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } + }); + + // process the grant to aliceDeviceX's DWN + const { reply: writeReplyX } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsWriteGrant.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), + signAsOwner : true + }); + + expect(writeReplyX.status.code).to.equal(202); + + const recordsReadGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Read, protocol: 'http://example.com/protocol' } + }); + + // process the grant to aliceDeviceX's DWN + const { reply: readReplyX } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsReadGrant.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), + signAsOwner : true + }); + + expect(readReplyX.status.code).to.equal(202); + + // spy on processDwnRequest to ensure it is only called for the first fetch + const dwnRequestSpy = sinon.spy(testHarness.agent, 'processDwnRequest'); + const grants = await dwnAlice.grants.fetchConnectedGrants(); + + expect(grants).to.exist; + expect(grants.length).to.equal(2); + + // ensure the spy to be called three times, once for fetch and once for each revocation check + expect(dwnRequestSpy.callCount).to.equal(3); + + // get the grants again to ensure they are cached + const cachedGrants = await dwnAlice.grants.fetchConnectedGrants(); + + expect(cachedGrants).to.exist; + expect(cachedGrants.length).to.equal(2); + + // ensure the spy callCount was unchanged + expect(dwnRequestSpy.callCount).to.equal(3); + + // add a new grant to aliceDeviceX + const recordsWriteGrant2 = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol-two' } + }); + + // process the grant to aliceDeviceX's DWN + const { reply: writeReplyXTwo } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsWriteGrant2.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsWriteGrant2.permissionGrantBytes]), + signAsOwner : true + }); + expect(writeReplyXTwo.status.code).to.equal(202); + + // reset the spy + dwnRequestSpy.resetHistory(); + + // fetch the grants again, the cached results should be returned, and the spy should not be called + const updatedGrants = await dwnAlice.grants.fetchConnectedGrants(); + expect(updatedGrants).to.exist; + expect(updatedGrants.length).to.equal(2); // unchanged + // must not include the new grant + expect(updatedGrants.map(grant => grant.recordId)).to.not.include(recordsWriteGrant2.dataEncodedMessage.recordId); + + // ensure a dwnRequest was not made + expect(dwnRequestSpy.callCount).to.equal(0); + + // now fetch the grants with cache set to false + const updatedGrantsNoCache = await dwnAlice.grants.fetchConnectedGrants(false); + expect(updatedGrantsNoCache).to.exist; + expect(updatedGrantsNoCache.length).to.equal(3); // includes the new grant + // must include the new grant + expect(updatedGrantsNoCache.map(grant => grant.recordId)).to.include(recordsWriteGrant2.dataEncodedMessage.recordId); + + // ensure dwnRequest was called, once for the fetch and once for each revocation check + expect(dwnRequestSpy.callCount).to.equal(4); + }); + + it('fetches grants for the signer', async () => { + // scenario: alice creates grants for recipients deviceY and deviceX + // the grantee fetches their own grants respectively + + // create an identity for deviceX and deviceY + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // set the device identity as the signerDID, this normally happens when the identity is connected + dwnAlice['delegateDid'] = aliceDeviceX.did.uri; + + const recordsWriteGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } + }); + + // process the grant to aliceDeviceX's DWN + const { reply: writeReplyX } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsWriteGrant.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), + signAsOwner : true + }); + + expect(writeReplyX.status.code).to.equal(202); + + const recordsReadGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Read, protocol: 'http://example.com/protocol' } + }); + + // process the grant to aliceDeviceX's DWN + const { reply: readReplyX } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsReadGrant.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), + signAsOwner : true + }); + + expect(readReplyX.status.code).to.equal(202); + + const deviceXGrantRecordIds = [ + recordsWriteGrant.dataEncodedMessage.recordId, + recordsReadGrant.dataEncodedMessage.recordId + ]; + + // fetch the grants for deviceX from the app agent + const fetchedDeviceXGrants = await dwnAlice.grants.fetchConnectedGrants(); + + // expect to have the 5 grants created for deviceX + expect(fetchedDeviceXGrants.length).to.equal(2); + expect(fetchedDeviceXGrants.map(grant => grant.recordId)).to.have.members(deviceXGrantRecordIds); + }); + + it('should throw if the grant query returns anything other than a 200', async () => { + // setting a signerDID, otherwise fetchConnectedGrants will throw + dwnAlice['delegateDid'] = 'did:example:123'; + + // return empty array if grant query returns something other than a 200 + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'unknown error' } } }); + try { + await dwnAlice.grants.fetchConnectedGrants(); + + expect.fail('Expected fetchGrants to throw'); + } catch(error: any) { + expect(error.message).to.equal('AgentDwnApi: Failed to fetch grants: unknown error'); + } + }); + + it('should not return revoked grants', async () => { + // create an identity for deviceX and deviceY + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // set the device identity as the signerDID for alice, this normally happens during a connect flow + dwnAlice['delegateDid'] = aliceDeviceX.did.uri; + + const recordsWriteGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } + }); + + // process the grant to alice's DWN + const { reply: writeReply } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsWriteGrant.recordsWrite.message, + author : aliceDid.uri, + target : aliceDid.uri, + dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), + }); + expect(writeReply.status.code).to.equal(202); + + // process the grant to aliceDeviceX's DWN as owner + const { reply: writeReplyX } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsWriteGrant.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), + signAsOwner : true + }); + expect(writeReplyX.status.code).to.equal(202); + + const recordsReadGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Read, protocol: 'http://example.com/protocol' } + }); + + // process the grant to alice's DWN + const { reply: readReply } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsReadGrant.recordsWrite.message, + author : aliceDid.uri, + target : aliceDid.uri, + dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), + }); + expect(readReply.status.code).to.equal(202); + + // process the grant to aliceDeviceX's DWN + const { reply: readReplyX } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsReadGrant.recordsWrite.message, + author : aliceDeviceX.did.uri, + target : aliceDeviceX.did.uri, + dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), + signAsOwner : true + }); + expect(readReplyX.status.code).to.equal(202); + + // fetch the grants for deviceX from the app agent with cache set to false + const fetchedDeviceXGrants = await dwnAlice.grants.fetchConnectedGrants(false); + + // expect to have the 2 grants created for deviceX + expect(fetchedDeviceXGrants.length).to.equal(2); + + // revoke a grant + const writeGrant = await PermissionGrant.parse(recordsWriteGrant.dataEncodedMessage); + const recordsWriteGrantRevoke = await testHarness.agent.dwn.createRevocation({ + author : aliceDid.uri, + grant : writeGrant, + }); + + // process the grant to alice's DWN + const revokeReply = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : recordsWriteGrantRevoke.recordsWrite.message, + author : aliceDid.uri, + target : aliceDid.uri, + dataStream : new Blob([recordsWriteGrantRevoke.permissionRevocationBytes]), + }); + expect(revokeReply.reply.status.code).to.equal(202); + + // fetch the grants for deviceX from the app agent with cache set to false + const fetchedDeviceXGrantsRevoked = await dwnAlice.grants.fetchConnectedGrants(); + expect(fetchedDeviceXGrantsRevoked.length).to.equal(1); // only the read grant should be available + + // ensure the revoked grant is not included + expect(fetchedDeviceXGrantsRevoked.map(grant => grant.recordId)).to.not.include(recordsWriteGrant.dataEncodedMessage.recordId); + }); + }); + + describe('grants.findConnectedPermissionGrant', () => { + it('throws if no signerDID is set', async () => { + // make sure signerDID is undefined + dwnAlice['delegateDid'] = undefined; + try { + await dwnAlice.grants.findConnectedPermissionGrant({ + messageParams: { + messageType : DwnInterface.RecordsWrite, + protocol : 'http://example.com/protocol' + } + }); + expect.fail('Error was not thrown'); + } catch (e) { + expect(e.message).to.equal('AgentDwnApi: Cannot find connected grants without a signer DID'); + } + }); + }); + + describe('grants.processConnectedGrantsAsOwner', () => { + it('throws if no signerDID is set', async () => { + // make sure signerDID is undefined + dwnAlice['delegateDid'] = undefined; + try { + await dwnAlice.grants.processConnectedGrantsAsOwner([]); + expect.fail('Error was not thrown'); + } catch (e) { + expect(e.message).to.equal('AgentDwnApi: Cannot process grants without a signer DID'); + } + }); + }); + + describe('grants.isGrantRevoked', () => { + it('checks if grant is revoked', async () => { + // scenario: create a grant for deviceX, check if the grant is revoked, revoke the grant, check if the grant is revoked + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // create records grants for deviceX + const deviceXGrant = await testHarness.agent.dwn.createGrant({ + grantedFrom : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + const { reply: processGrantReply } = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : deviceXGrant.recordsWrite.message, + author : aliceDid.uri, + target : aliceDid.uri, + dataStream : new Blob([deviceXGrant.permissionGrantBytes]), + }); + expect(processGrantReply.status.code).to.equal(202); + + // check if the grant is revoked + let isRevoked = await dwnAlice.grants.isGrantRevoked( + aliceDid.uri, + aliceDid.uri, + deviceXGrant.recordsWrite.message.recordId + ); + + expect(isRevoked).to.equal(false); + + // revoke the grant + const writeGrant = await PermissionGrant.parse(deviceXGrant.dataEncodedMessage); + const revokeGrant = await testHarness.agent.dwn.createRevocation({ + author : aliceDid.uri, + grant : writeGrant, + }); + + const revokeReply = await testHarness.agent.dwn.processRequest({ + messageType : DwnInterface.RecordsWrite, + rawMessage : revokeGrant.recordsWrite.message, + author : aliceDid.uri, + target : aliceDid.uri, + dataStream : new Blob([revokeGrant.permissionRevocationBytes]), + }); + expect(revokeReply.reply.status.code).to.equal(202); + + // check if the grant is revoked again, should be true + isRevoked = await dwnAlice.grants.isGrantRevoked( + aliceDid.uri, + aliceDid.uri, + deviceXGrant.recordsWrite.message.recordId + ); + expect(isRevoked).to.equal(true); + }); + + it('throws if grant revocation query returns anything other than a 200 or 404', async () => { + // return empty array if grant query returns something other than a 200 + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'unknown error' } } }); + + try { + await dwnAlice.grants.isGrantRevoked(aliceDid.uri, aliceDid.uri, 'some-record-id'); + expect.fail('Expected isGrantRevoked to throw'); + } catch (error:any) { + expect(error.message).to.equal('AgentDwnApi: Failed to check if grant is revoked: unknown error'); + } + }); + }); }); \ No newline at end of file diff --git a/packages/api/tests/web5.spec.ts b/packages/api/tests/web5.spec.ts index 1d6fe7f0e..c7c143d86 100644 --- a/packages/api/tests/web5.spec.ts +++ b/packages/api/tests/web5.spec.ts @@ -1,20 +1,21 @@ import { expect } from 'chai'; import sinon from 'sinon'; -import { MemoryStore } from '@web5/common'; import { Web5UserAgent } from '@web5/user-agent'; import { - AgentDidApi, AgentIdentityApi, + BearerIdentity, + DwnInterface, + DwnProtocolDefinition, DwnRegistrar, - HdIdentityVault, PlatformAgentTestHarness, WalletConnect, } from '@web5/agent'; import { Web5 } from '../src/web5.js'; +import { DwnInterfaceName, DwnMethodName, Jws, Time } from '@tbd54566975/dwn-sdk-js'; import { testDwnUrl } from './utils/test-config.js'; -import { DidDht } from '@web5/dids'; +import { DidJwk } from '@web5/dids'; describe('web5 api', () => { describe('using Test Harness', () => { @@ -28,15 +29,450 @@ describe('web5 api', () => { }); beforeEach(async () => { + sinon.restore(); await testHarness.clearStorage(); await testHarness.createAgentDid(); }); after(async () => { + sinon.restore(); await testHarness.clearStorage(); await testHarness.closeStorage(); }); + describe('connect()', () => { + it('accepts an externally created DID with an external agent', async () => { + const testIdentity = await testHarness.createIdentity({ + name : 'Test', + testDwnUrls : ['https://dwn.example.com'] + }); + + // Call connect() with the custom agent. + const { web5, did } = await Web5.connect({ + agent : testHarness.agent, + connectedDid : testIdentity.did.uri + }); + + expect(did).to.exist; + expect(web5).to.exist; + expect(did).to.equal(testIdentity.did.uri); + }); + + it('uses walletConnectOptions to connect to a DID and import the grants', async () => { + // Create a new Identity. + const alice = await testHarness.createIdentity({ + name : 'Alice', + testDwnUrls : [testDwnUrl] + }); + + // alice installs a protocol definition + const protocol: DwnProtocolDefinition = { + protocol : 'https://example.com/test-protocol', + published : true, + types : { + foo : {}, + bar : {} + }, + structure: { + foo: { + bar: {} + } + } + }; + + const { reply: protocolConfigReply, message: protocolConfigureMessage } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.ProtocolsConfigure, + messageParams : { + definition: protocol, + }, + }); + expect(protocolConfigReply.status.code).to.equal(202); + // create an identity for the app to use + const app = await testHarness.agent.did.create({ + store : false, + method : 'jwk', + }); + + // create grants for the app to use + const writeGrant = await testHarness.agent.dwn.createGrant({ + delegated : true, + grantedFrom : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : protocol.protocol, + } + }); + + const readGrant = await testHarness.agent.dwn.createGrant({ + delegated : true, + grantedFrom : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Read, + protocol : protocol.protocol, + } + }); + + // write the grants to wallet + const { reply: writeGrantReply } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.RecordsWrite, + rawMessage : writeGrant.recordsWrite.message, + dataStream : new Blob([ writeGrant.permissionGrantBytes ]) + }); + expect(writeGrantReply.status.code).to.equal(202); + + const { reply: readGrantReply } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.RecordsWrite, + rawMessage : readGrant.recordsWrite.message, + dataStream : new Blob([ readGrant.permissionGrantBytes ]) + }); + expect(readGrantReply.status.code).to.equal(202); + + // stub the walletInit method of the Connect placeholder class + sinon.stub(WalletConnect, 'initClient').resolves({ + delegateGrants : [ writeGrant.dataEncodedMessage, readGrant.dataEncodedMessage ], + delegateDid : await app.export(), + connectedDid : alice.did.uri + }); + + const appTestHarness = await PlatformAgentTestHarness.setup({ + agentClass : Web5UserAgent, + agentStores : 'memory', + testDataLocation : '__TESTDATA__/web5-connect-app' + }); + await appTestHarness.clearStorage(); + await appTestHarness.createAgentDid(); + + // stub the create method of the Web5UserAgent to use the test harness agent + sinon.stub(Web5UserAgent, 'create').resolves(appTestHarness.agent as Web5UserAgent); + + // connect to the app, the options don't matter because we're stubbing the initClient method + const { web5, did, delegateDid } = await Web5.connect({ + walletConnectOptions: { + connectServerUrl : 'https://connect.example.com', + walletUri : 'https://wallet.example.com', + validatePin : async () => { return '1234'; }, + onWalletUriReady : (_walletUri: string) => {}, + permissionRequests : [] + } + }); + expect(web5).to.exist; + expect(did).to.exist; + expect(delegateDid).to.exist; + expect(did).to.equal(alice.did.uri); + expect(delegateDid).to.equal(app.uri); + + // in lieu of sync, we will process the grants and protocol definition on the local connected agent + const { reply: localProtocolReply } = await web5.agent.processDwnRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.ProtocolsConfigure, + rawMessage : protocolConfigureMessage, + }); + expect(localProtocolReply.status.code).to.equal(202); + + const { reply: grantWriteLocalReply } = await web5.agent.processDwnRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.RecordsWrite, + rawMessage : writeGrant.recordsWrite.message, + dataStream : new Blob([ writeGrant.permissionGrantBytes ]) + }); + expect(grantWriteLocalReply.status.code).to.equal(202); + + const { reply: grantReadLocalReply } = await web5.agent.processDwnRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.RecordsWrite, + rawMessage : readGrant.recordsWrite.message, + dataStream : new Blob([ readGrant.permissionGrantBytes ]) + }); + expect(grantReadLocalReply.status.code).to.equal(202); + + // use the grant to write a record + const writeResult = await web5.dwn.records.write({ + data : 'Hello, world!', + message : { + protocol : protocol.protocol, + protocolPath : 'foo', + } + }); + expect(writeResult.status.code).to.equal(202); + expect(writeResult.record).to.exist; + // test that the logical author is the connected DID and the signer is the impersonator DID + expect(writeResult.record.author).to.equal(did); + const writeSigner = Jws.getSignerDid(writeResult.record.authorization.signature.signatures[0]); + expect(writeSigner).to.equal(delegateDid); + + const readResult = await web5.dwn.records.read({ + protocol : protocol.protocol, + message : { + filter: { recordId: writeResult.record.id } + } + }); + expect(readResult.status.code).to.equal(200); + expect(readResult.record).to.exist; + // test that the logical author is the connected DID and the signer is the impersonator DID + expect(readResult.record.author).to.equal(did); + const readSigner = Jws.getSignerDid(readResult.record.authorization.signature.signatures[0]); + expect(readSigner).to.equal(delegateDid); + + // attempt to query or delete, should fail because we did not grant query permissions + try { + await web5.dwn.records.query({ + protocol : protocol.protocol, + message : { + filter: { protocol: protocol.protocol } + } + }); + + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.include('AgentDwnApi: No permissions found for RecordsQuery'); + } + + try { + await web5.dwn.records.delete({ + protocol : protocol.protocol, + message : { + recordId: writeResult.record.id + } + }); + + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.include('AgentDwnApi: No permissions found for RecordsDelete'); + } + + // grant query and delete permissions + const queryGrant = await testHarness.agent.dwn.createGrant({ + delegated : true, + grantedFrom : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Query, + protocol : protocol.protocol, + } + }); + + const deleteGrant = await testHarness.agent.dwn.createGrant({ + delegated : true, + grantedFrom : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Delete, + protocol : protocol.protocol, + } + }); + + // write the grants to app as owner + // this also clears the grants cache + await web5.dwn.grants.processConnectedGrantsAsOwner([ queryGrant.dataEncodedMessage, deleteGrant.dataEncodedMessage ]); + + // attempt to delete using the grant + const deleteResult = await web5.dwn.records.delete({ + protocol : protocol.protocol, + message : { + recordId: writeResult.record.id + } + }); + expect(deleteResult.status.code).to.equal(202); + + // attempt to query using the grant + const queryResult = await web5.dwn.records.query({ + protocol : protocol.protocol, + message : { + filter: { protocol: protocol.protocol } + } + }); + expect(queryResult.status.code).to.equal(200); + expect(queryResult.records).to.have.lengthOf(0); // record has been deleted + + // connecting a 2nd time will return the same connectedDID and delegatedDID + const { did: did2, delegateDid: delegateDid2 } = await Web5.connect(); + expect(did2).to.equal(did); + expect(delegateDid2).to.equal(delegateDid); + + // Close the app test harness storage. + await appTestHarness.clearStorage(); + await appTestHarness.closeStorage(); + }); + + it('cleans up imported Identity from walletConnectOptions flow if grants cannot be processed', async () => { + const alice = await testHarness.createIdentity({ + name : 'Alice', + testDwnUrls : [testDwnUrl] + }); + + // alice installs a protocol definition + const protocol: DwnProtocolDefinition = { + protocol : 'https://example.com/test-protocol', + published : true, + types : { + foo : {}, + bar : {} + }, + structure: { + foo: { + bar: {} + } + } + }; + + const { reply: protocolConfigReply } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.ProtocolsConfigure, + messageParams : { + definition: protocol, + }, + }); + expect(protocolConfigReply.status.code).to.equal(202); + // create an identity for the app to use + const app = await testHarness.agent.did.create({ + store : false, + method : 'jwk', + }); + + // create grants for the app to use + const writeGrant = await testHarness.agent.dwn.createGrant({ + delegated : true, + grantedFrom : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : protocol.protocol, + } + }); + + const readGrant = await testHarness.agent.dwn.createGrant({ + delegated : true, + grantedFrom : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Read, + protocol : protocol.protocol, + } + }); + + // write the grants to wallet + const { reply: writeGrantReply } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.RecordsWrite, + rawMessage : writeGrant.recordsWrite.message, + dataStream : new Blob([ writeGrant.permissionGrantBytes ]) + }); + expect(writeGrantReply.status.code).to.equal(202); + + const { reply: readGrantReply } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.RecordsWrite, + rawMessage : readGrant.recordsWrite.message, + dataStream : new Blob([ readGrant.permissionGrantBytes ]) + }); + expect(readGrantReply.status.code).to.equal(202); + + // stub the walletInit method of the Connect placeholder class + sinon.stub(WalletConnect, 'initClient').resolves({ + delegateGrants : [ writeGrant.dataEncodedMessage, readGrant.dataEncodedMessage ], + delegateDid : await app.export(), + connectedDid : alice.did.uri + }); + + const appTestHarness = await PlatformAgentTestHarness.setup({ + agentClass : Web5UserAgent, + agentStores : 'memory', + testDataLocation : '__TESTDATA__/web5-connect-app' + }); + await appTestHarness.clearStorage(); + await appTestHarness.createAgentDid(); + + + // stub processDwnRequest to return a non 202 error code + sinon.stub(appTestHarness.agent, 'processDwnRequest').resolves({ + messageCid : '', + reply : { status: { code: 400, detail: 'Bad Request' } } + }); + + // stub the create method of the Web5UserAgent to use the test harness agent + sinon.stub(Web5UserAgent, 'create').resolves(appTestHarness.agent as Web5UserAgent); + + // stub console.error so that it doesn't log in the test output and use it as a spy confirming the error messages were logged + const consoleSpy = sinon.stub(console, 'error').returns(); + + try { + // connect to the app, the options don't matter because we're stubbing the initClient method + await Web5.connect({ + walletConnectOptions: { + connectServerUrl : 'https://connect.example.com', + walletUri : 'https://wallet.example.com', + validatePin : async () => { return '1234'; }, + onWalletUriReady : (_walletUri: string) => {}, + permissionRequests : [] + } + }); + + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.equal('Failed to connect to wallet: Failed to process delegated grant: Bad Request'); + } + + // because `processDwnRequest` is stubbed to return a 400, deleting the grants will return the same + // we spy on console.error to check if the error messages are logged for the 2 failed grant deletions + expect(consoleSpy.calledTwice, 'console.error called twice').to.be.true; + + // check that the Identity was deleted + const appDid = await appTestHarness.agent.identity.list(); + expect(appDid).to.have.lengthOf(0); + + // close the app test harness storage + await appTestHarness.clearStorage(); + await appTestHarness.closeStorage(); + }); + + it('logs an error if there is a failure during cleanup of Identity information, but does not throw', async () => { + // create a DID that is not stored in the agent + const did = await DidJwk.create(); + const identity = new BearerIdentity({ + did, + metadata: { + name : 'Test', + uri : did.uri, + tenant : did.uri + } + }); + + // stub console.error to avoid logging errors into the test output, use as spy to check if the error message is logged + const consoleSpy = sinon.stub(console, 'error').returns(); + + // call identityCleanup on a did that does not exist + await Web5['cleanUpIdentity']({ userAgent: testHarness.agent as Web5UserAgent, identity }); + + expect(consoleSpy.calledTwice, 'console.error called twice').to.be.true; + }); + }); + describe('constructor', () => { it('instantiates Web5 API with provided Web5Agent and connectedDid', async () => { // Create a new Identity. @@ -165,20 +601,21 @@ describe('web5 api', () => { }); it('uses Web5UserAgent, by default', async () => { - // Create an in-memory identity vault store to speed up tests. - const agentVault = new HdIdentityVault({ - keyDerivationWorkFactor : 1, - store : new MemoryStore(), - }); - const { web5, recoveryPhrase } = await Web5.connect({ agentVault }); - const walletConnectSpy = sinon.spy(WalletConnect, 'initClient'); + // stub the create method of the Web5UserAgent to use the test harness agent + // this avoids DB locks when the agent is created twice + sinon.stub(Web5UserAgent, 'create').resolves(testHarness.agent as Web5UserAgent); + const { web5, recoveryPhrase, did } = await Web5.connect(); expect(web5).to.exist; expect(web5.agent).to.be.instanceOf(Web5UserAgent); // Verify recovery phrase is a 12-word string. expect(recoveryPhrase).to.be.a('string'); expect(recoveryPhrase.split(' ')).to.have.lengthOf(12); - expect(walletConnectSpy.called).to.be.false; + + // if called again, the same DID is returned, and the recovery phrase is not regenerated + const { recoveryPhrase: recoveryPhraseConnect2, did: didConnect2 } = await Web5.connect(); + expect(recoveryPhraseConnect2).to.be.undefined; + expect(didConnect2).to.equal(did); }); it('accepts an externally created DID', async () => { @@ -242,6 +679,28 @@ describe('web5 api', () => { expect(walletConnectSpy.called).to.be.false; }); + it('defaults to the first identity if multiple identities exist', async () => { + // scenario: For some reason more than one identity exists when attempting to re-connect to `Web5` + // the first identity in the array should be the one selected + // TODO: this has happened due to a race condition somewhere. Dig into this issue and implement a better way to select/manage DIDs when using `Web5.connect()` + + // create an identity by connecting + sinon.stub(Web5UserAgent, 'create').resolves(testHarness.agent as Web5UserAgent); + const { web5, did } = await Web5.connect({ techPreview: { dwnEndpoints: [ testDwnUrl ] }}); + expect(web5).to.exist; + expect(did).to.exist; + + // create a second identity + await testHarness.agent.identity.create({ + didMethod : 'jwk', + metadata : { name: 'Second' } + }); + + // connect again + const { did: did2 } = await Web5.connect(); + expect(did2).to.equal(did); + }); + it('defaults to `https://dwn.tbddev.org/beta` as the single DWN Service endpoint if non is provided', async () => { sinon .stub(Web5UserAgent, 'create') @@ -258,89 +717,6 @@ describe('web5 api', () => { expect(serviceEndpoints).to.deep.equal(['https://dwn.tbddev.org/beta']); }); - it('should throw if more than one identity because thats unsupported by user agent', async () => { - const walletConnectSpy = sinon.spy(WalletConnect, 'initClient'); - sinon - .stub(Web5UserAgent, 'create') - .resolves(testHarness.agent as Web5UserAgent); - const existingIdentity = await testHarness.createIdentity({ - name : 'Mr FooBarovich', - testDwnUrls : [testDwnUrl], - }); - sinon - .stub(testHarness.agent.identity, 'list') - .resolves([existingIdentity, existingIdentity]); - - let web5: any, did: any; - - try { - const results = await Web5.connect({ - walletConnectOptions: {} as any, - }); - web5 = results.web5; - did = results.did; - } catch (e) { - expect(e.message).to.include( - 'connect() failed due to unexpected state: Expected 1 but found' - ); - } - - expect(walletConnectSpy.called).to.be.false; - expect(web5).not.to.exist; - expect(did).not.to.exist; - }); - - describe('wallet connect', () => { - it('should not initiate wallet connect if has walletConnectOptions and stored identities', async () => { - const walletConnectStub = sinon - .stub(WalletConnect, 'initClient') - .resolves({ - delegateDid : { garfield: 'i hate mondays' } as any, - delegateGrants : {} as any, - connectedDid : {} as any, - }); - sinon - .stub(Web5UserAgent, 'create') - .resolves(testHarness.agent as Web5UserAgent); - const existingIdentity = await testHarness.createIdentity({ - name : 'Mr FooBarovich', - testDwnUrls : [testDwnUrl], - }); - sinon - .stub(testHarness.agent.identity, 'list') - .resolves([existingIdentity]); - - const { web5, did } = await Web5.connect({ - walletConnectOptions: {} as any, - }); - - expect(walletConnectStub.called).to.be.false; - expect(web5).to.exist; - expect(did).to.exist; - }); - - it('should initiate wallet connect if has walletConnectOptions and no stored identities', async () => { - sinon.stub(Web5UserAgent, 'create').resolves(testHarness.agent as Web5UserAgent); - - const walletConnectStub = sinon - .stub(WalletConnect, 'initClient') - .resolves({ - delegateDid : { garfield: 'i hate mondays' } as any, - delegateGrants : {} as any, - connectedDid : {} as any, - }); - - const { web5, did, delegateDid } = await Web5.connect({ - walletConnectOptions: {} as any, - }); - - expect(walletConnectStub.called).to.be.true; - expect(web5).to.be.null; - expect(did).to.be.null; - expect(delegateDid).to.deep.equal({ garfield: 'i hate mondays' }); - }); - }); - describe('registration', () => { it('should call onSuccess if registration is successful', async () => { sinon diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7998f7ac5..25e719847 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,33 +1,32 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false overrides: - express@<4.19.2: '>=4.19.2' - ws@<8.17.1: '>=8.17.1' - braces@<3.0.3: '>=3.0.3' - fast-xml-parser@<4.4.1: '>=4.4.1' - '@75lb/deep-merge@<1.1.2': '>=1.1.2' + express@<4.19.2: ">=4.19.2" + ws@<8.17.1: ">=8.17.1" + braces@<3.0.3: ">=3.0.3" + fast-xml-parser@<4.4.1: ">=4.4.1" + "@75lb/deep-merge@<1.1.2": ">=1.1.2" importers: - .: devDependencies: - '@changesets/changelog-github': + "@changesets/changelog-github": specifier: ^0.5.0 version: 0.5.0 - '@changesets/cli': + "@changesets/cli": specifier: ^2.27.5 version: 2.27.7 - '@npmcli/package-json': + "@npmcli/package-json": specifier: 5.0.0 version: 5.0.0 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.4))(eslint@9.7.0)(typescript@5.5.4) - '@web5/dwn-server': + "@web5/dwn-server": specifier: 0.4.6 version: 0.4.6 audit-ci: @@ -45,22 +44,22 @@ importers: packages/agent: dependencies: - '@noble/ciphers': + "@noble/ciphers": specifier: 0.5.3 version: 0.5.3 - '@scure/bip39': + "@scure/bip39": specifier: 1.2.2 version: 1.2.2 - '@tbd54566975/dwn-sdk-js': + "@tbd54566975/dwn-sdk-js": specifier: 0.4.5 version: 0.4.5 - '@web5/common': + "@web5/common": specifier: 1.0.0 version: 1.0.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto - '@web5/dids': + "@web5/dids": specifier: 1.1.0 version: 1.1.0 abstract-level: @@ -85,40 +84,40 @@ importers: specifier: 2.1.0 version: 2.1.0 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.6 version: 4.3.6 - '@types/dns-packet': + "@types/dns-packet": specifier: 5.6.4 version: 5.6.4 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.1 version: 10.0.1 - '@types/ms': + "@types/ms": specifier: 0.7.31 version: 0.7.31 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.3.0)(typescript@5.1.6) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -160,53 +159,53 @@ importers: packages/api: dependencies: - '@web5/agent': + "@web5/agent": specifier: workspace:* version: link:../agent - '@web5/common': + "@web5/common": specifier: 1.0.0 version: 1.0.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto - '@web5/dids': + "@web5/dids": specifier: 1.1.0 version: 1.1.0 - '@web5/user-agent': + "@web5/user-agent": specifier: workspace:* version: link:../user-agent devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@tbd54566975/dwn-sdk-js': + "@tbd54566975/dwn-sdk-js": specifier: 0.4.5 version: 0.4.5 - '@types/chai': + "@types/chai": specifier: 4.3.6 version: 4.3.6 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.1 version: 10.0.1 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.3.0)(typescript@5.1.6) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -251,7 +250,7 @@ importers: packages/common: dependencies: - '@isaacs/ttlcache': + "@isaacs/ttlcache": specifier: 1.4.1 version: 1.4.1 level: @@ -264,37 +263,37 @@ importers: specifier: 4.5.2 version: 4.5.2 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.16 version: 4.3.16 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.8 version: 7.1.8 - '@types/eslint': + "@types/eslint": specifier: 9.6.0 version: 9.6.0 - '@types/mocha': + "@types/mocha": specifier: 10.0.6 version: 10.0.6 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/readable-stream': + "@types/readable-stream": specifier: 4.0.14 version: 4.0.14 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.14.1 version: 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.7.0)(typescript@5.5.3) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 abstract-level: @@ -336,16 +335,16 @@ importers: packages/credentials: dependencies: - '@sphereon/pex': + "@sphereon/pex": specifier: 3.3.3 version: 3.3.3 - '@web5/common': + "@web5/common": specifier: 1.0.1 version: 1.0.1 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto - '@web5/dids': + "@web5/dids": specifier: 1.1.1 version: 1.1.1 jsonschema: @@ -355,43 +354,43 @@ importers: specifier: ^2.1.0 version: 2.1.0 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@sphereon/pex-models': + "@sphereon/pex-models": specifier: 2.2.4 version: 2.2.4 - '@sphereon/ssi-types': + "@sphereon/ssi-types": specifier: 0.26.0 version: 0.26.0 - '@types/chai': + "@types/chai": specifier: 4.3.16 version: 4.3.16 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.6 version: 10.0.6 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/pako': + "@types/pako": specifier: ^2.0.3 version: 2.0.3 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.10.0 version: 7.10.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.3.0)(typescript@5.4.5) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -430,50 +429,50 @@ importers: packages/crypto: dependencies: - '@noble/ciphers': + "@noble/ciphers": specifier: 0.5.3 version: 0.5.3 - '@noble/curves': + "@noble/curves": specifier: 1.3.0 version: 1.3.0 - '@noble/hashes': + "@noble/hashes": specifier: 1.4.0 version: 1.4.0 - '@web5/common': + "@web5/common": specifier: 1.0.1 version: 1.0.1 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.16 version: 4.3.16 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.8 version: 7.1.8 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.6 version: 10.0.6 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.14.1 version: 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.5.0)(typescript@5.4.5) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -518,47 +517,47 @@ importers: packages/crypto-aws-kms: dependencies: - '@aws-sdk/client-kms': + "@aws-sdk/client-kms": specifier: 3.616.0 version: 3.616.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.16 version: 4.3.16 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.8 version: 7.1.8 - '@types/eslint': + "@types/eslint": specifier: 9.6.0 version: 9.6.0 - '@types/mocha': + "@types/mocha": specifier: 10.0.7 version: 10.0.7 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.14.1 version: 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.4.5))(eslint@9.7.0)(typescript@5.4.5) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.7.0)(typescript@5.4.5) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 - '@web5/common': + "@web5/common": specifier: 1.0.1 version: 1.0.1 c8: @@ -600,16 +599,16 @@ importers: packages/dids: dependencies: - '@decentralized-identity/ion-sdk': + "@decentralized-identity/ion-sdk": specifier: 1.0.4 version: 1.0.4 - '@dnsquery/dns-packet': + "@dnsquery/dns-packet": specifier: 6.1.1 version: 6.1.1 - '@web5/common': + "@web5/common": specifier: 1.0.0 version: 1.0.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto abstract-level: @@ -628,43 +627,43 @@ importers: specifier: 2.1.3 version: 2.1.3 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/bencode': + "@types/bencode": specifier: 2.0.4 version: 2.0.4 - '@types/chai': + "@types/chai": specifier: 4.3.16 version: 4.3.16 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.8 version: 7.1.8 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.7 version: 10.0.7 - '@types/ms': + "@types/ms": specifier: 0.7.34 version: 0.7.34 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)(typescript@5.5.4) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.5.0)(typescript@5.5.4) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -709,50 +708,50 @@ importers: packages/identity-agent: dependencies: - '@web5/agent': + "@web5/agent": specifier: workspace:* version: link:../agent - '@web5/common': + "@web5/common": specifier: 1.0.0 version: 1.0.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto - '@web5/dids': + "@web5/dids": specifier: 1.1.0 version: 1.1.0 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.6 version: 4.3.6 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.5 version: 7.1.5 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.1 version: 10.0.1 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@types/sinon': + "@types/sinon": specifier: 17.0.3 version: 17.0.3 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.3.0)(typescript@5.1.6) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -797,50 +796,50 @@ importers: packages/proxy-agent: dependencies: - '@web5/agent': + "@web5/agent": specifier: workspace:* version: link:../agent - '@web5/common': + "@web5/common": specifier: 1.0.0 version: 1.0.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto - '@web5/dids': + "@web5/dids": specifier: 1.1.0 version: 1.1.0 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.6 version: 4.3.6 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.5 version: 7.1.5 - '@types/dns-packet': + "@types/dns-packet": specifier: 5.6.4 version: 5.6.4 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.1 version: 10.0.1 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.3.0)(typescript@5.1.6) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -882,50 +881,50 @@ importers: packages/user-agent: dependencies: - '@web5/agent': + "@web5/agent": specifier: workspace:* version: link:../agent - '@web5/common': + "@web5/common": specifier: 1.0.0 version: 1.0.0 - '@web5/crypto': + "@web5/crypto": specifier: workspace:* version: link:../crypto - '@web5/dids': + "@web5/dids": specifier: 1.1.0 version: 1.1.0 devDependencies: - '@playwright/test': + "@playwright/test": specifier: 1.45.3 version: 1.45.3 - '@types/chai': + "@types/chai": specifier: 4.3.6 version: 4.3.6 - '@types/chai-as-promised': + "@types/chai-as-promised": specifier: 7.1.5 version: 7.1.5 - '@types/dns-packet': + "@types/dns-packet": specifier: 5.6.4 version: 5.6.4 - '@types/eslint': + "@types/eslint": specifier: 8.56.10 version: 8.56.10 - '@types/mocha': + "@types/mocha": specifier: 10.0.1 version: 10.0.1 - '@types/node': + "@types/node": specifier: 20.14.8 version: 20.14.8 - '@typescript-eslint/eslint-plugin': + "@typescript-eslint/eslint-plugin": specifier: 7.9.0 version: 7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/parser': + "@typescript-eslint/parser": specifier: 7.14.1 version: 7.14.1(eslint@9.3.0)(typescript@5.1.6) - '@web/test-runner': + "@web/test-runner": specifier: 0.18.2 version: 0.18.2 - '@web/test-runner-playwright': + "@web/test-runner-playwright": specifier: 0.11.0 version: 0.11.0 c8: @@ -966,1631 +965,2755 @@ importers: version: 5.1.6 packages: - - '@assemblyscript/loader@0.9.4': - resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} - - '@astronautlabs/jsonpath@1.1.2': - resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-kms@3.616.0': - resolution: {integrity: sha512-40fu8xNcj03kWqeKg5pBrNdAp1Wbcn26yml1opQkg83LfmeF/y1htX/HiAlZcu4vBvQMMznFUU/vdd8qGgjZNA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/client-sso-oidc@3.616.0': - resolution: {integrity: sha512-YY1hpYS/G1uRGjQf88dL8VLHkP/IjGxKeXdhy+JnzMdCkAWl3V9j0fEALw40NZe0x79gr6R2KUOUH/IKYQfUmg==} - engines: {node: '>=16.0.0'} + "@assemblyscript/loader@0.9.4": + resolution: + { + integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==, + } + + "@astronautlabs/jsonpath@1.1.2": + resolution: + { + integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==, + } + + "@aws-crypto/sha256-browser@5.2.0": + resolution: + { + integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==, + } + + "@aws-crypto/sha256-js@5.2.0": + resolution: + { + integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==, + } + engines: { node: ">=16.0.0" } + + "@aws-crypto/supports-web-crypto@5.2.0": + resolution: + { + integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==, + } + + "@aws-crypto/util@5.2.0": + resolution: + { + integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==, + } + + "@aws-sdk/client-kms@3.616.0": + resolution: + { + integrity: sha512-40fu8xNcj03kWqeKg5pBrNdAp1Wbcn26yml1opQkg83LfmeF/y1htX/HiAlZcu4vBvQMMznFUU/vdd8qGgjZNA==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/client-sso-oidc@3.616.0": + resolution: + { + integrity: sha512-YY1hpYS/G1uRGjQf88dL8VLHkP/IjGxKeXdhy+JnzMdCkAWl3V9j0fEALw40NZe0x79gr6R2KUOUH/IKYQfUmg==, + } + engines: { node: ">=16.0.0" } peerDependencies: - '@aws-sdk/client-sts': ^3.616.0 - - '@aws-sdk/client-sso@3.616.0': - resolution: {integrity: sha512-hwW0u1f8U4dSloAe61/eupUiGd5Q13B72BuzGxvRk0cIpYX/2m0KBG8DDl7jW1b2QQ+CflTLpG2XUf2+vRJxGA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/client-sts@3.616.0': - resolution: {integrity: sha512-FP7i7hS5FpReqnysQP1ukQF1OUWy8lkomaOnbu15H415YUrfCp947SIx6+BItjmx+esKxPkEjh/fbCVzw2D6hQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/core@3.616.0': - resolution: {integrity: sha512-O/urkh2kECs/IqZIVZxyeyHZ7OR2ZWhLNK7btsVQBQvJKrEspLrk/Fp20Qfg5JDerQfBN83ZbyRXLJOOucdZpw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-env@3.609.0': - resolution: {integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-http@3.616.0': - resolution: {integrity: sha512-1rgCkr7XvEMBl7qWCo5BKu3yAxJs71dRaZ55Xnjte/0ZHH6Oc93ZrHzyYy6UH6t0nZrH+FAuw7Yko2YtDDwDeg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-ini@3.616.0': - resolution: {integrity: sha512-5gQdMr9cca3xV7FF2SxpxWGH2t6+t4o+XBGiwsHm8muEjf4nUmw7Ij863x25Tjt2viPYV0UStczSb5Sihp7bkA==} - engines: {node: '>=16.0.0'} + "@aws-sdk/client-sts": ^3.616.0 + + "@aws-sdk/client-sso@3.616.0": + resolution: + { + integrity: sha512-hwW0u1f8U4dSloAe61/eupUiGd5Q13B72BuzGxvRk0cIpYX/2m0KBG8DDl7jW1b2QQ+CflTLpG2XUf2+vRJxGA==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/client-sts@3.616.0": + resolution: + { + integrity: sha512-FP7i7hS5FpReqnysQP1ukQF1OUWy8lkomaOnbu15H415YUrfCp947SIx6+BItjmx+esKxPkEjh/fbCVzw2D6hQ==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/core@3.616.0": + resolution: + { + integrity: sha512-O/urkh2kECs/IqZIVZxyeyHZ7OR2ZWhLNK7btsVQBQvJKrEspLrk/Fp20Qfg5JDerQfBN83ZbyRXLJOOucdZpw==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/credential-provider-env@3.609.0": + resolution: + { + integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/credential-provider-http@3.616.0": + resolution: + { + integrity: sha512-1rgCkr7XvEMBl7qWCo5BKu3yAxJs71dRaZ55Xnjte/0ZHH6Oc93ZrHzyYy6UH6t0nZrH+FAuw7Yko2YtDDwDeg==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/credential-provider-ini@3.616.0": + resolution: + { + integrity: sha512-5gQdMr9cca3xV7FF2SxpxWGH2t6+t4o+XBGiwsHm8muEjf4nUmw7Ij863x25Tjt2viPYV0UStczSb5Sihp7bkA==, + } + engines: { node: ">=16.0.0" } peerDependencies: - '@aws-sdk/client-sts': ^3.616.0 - - '@aws-sdk/credential-provider-node@3.616.0': - resolution: {integrity: sha512-Se+u6DAxjDPjKE3vX1X2uxjkWgGq69BTo0uTB0vDUiWwBVgh16s9BsBhSAlKEH1CCbbJHvOg4YdTrzjwzqyClg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-process@3.614.0': - resolution: {integrity: sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-sso@3.616.0': - resolution: {integrity: sha512-3rsWs9GBi8Z8Gps5ROwqguxtw+J6OIg1vawZMLRNMqqZoBvbOToe9wEnpid8ylU+27+oG8uibJNlNuRyXApUjw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.609.0': - resolution: {integrity: sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==} - engines: {node: '>=16.0.0'} + "@aws-sdk/client-sts": ^3.616.0 + + "@aws-sdk/credential-provider-node@3.616.0": + resolution: + { + integrity: sha512-Se+u6DAxjDPjKE3vX1X2uxjkWgGq69BTo0uTB0vDUiWwBVgh16s9BsBhSAlKEH1CCbbJHvOg4YdTrzjwzqyClg==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/credential-provider-process@3.614.0": + resolution: + { + integrity: sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/credential-provider-sso@3.616.0": + resolution: + { + integrity: sha512-3rsWs9GBi8Z8Gps5ROwqguxtw+J6OIg1vawZMLRNMqqZoBvbOToe9wEnpid8ylU+27+oG8uibJNlNuRyXApUjw==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/credential-provider-web-identity@3.609.0": + resolution: + { + integrity: sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==, + } + engines: { node: ">=16.0.0" } peerDependencies: - '@aws-sdk/client-sts': ^3.609.0 - - '@aws-sdk/middleware-host-header@3.616.0': - resolution: {integrity: sha512-mhNfHuGhCDZwYCABebaOvTgOM44UCZZRq2cBpgPZLVKP0ydAv5aFHXv01goexxXHqgHoEGx0uXWxlw0s2EpFDg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-logger@3.609.0': - resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.616.0': - resolution: {integrity: sha512-LQKAcrZRrR9EGez4fdCIVjdn0Ot2HMN12ChnoMGEU6oIxnQ2aSC7iASFFCV39IYfeMh7iSCPj7Wopqw8rAouzg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.616.0': - resolution: {integrity: sha512-iMcAb4E+Z3vuEcrDsG6T2OBNiqWAquwahP9qepHqfmnmJqHr1mSHtXDYTGBNid31+621sUQmneUQ+fagpGAe4w==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.614.0': - resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/token-providers@3.614.0': - resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} - engines: {node: '>=16.0.0'} + "@aws-sdk/client-sts": ^3.609.0 + + "@aws-sdk/middleware-host-header@3.616.0": + resolution: + { + integrity: sha512-mhNfHuGhCDZwYCABebaOvTgOM44UCZZRq2cBpgPZLVKP0ydAv5aFHXv01goexxXHqgHoEGx0uXWxlw0s2EpFDg==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/middleware-logger@3.609.0": + resolution: + { + integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/middleware-recursion-detection@3.616.0": + resolution: + { + integrity: sha512-LQKAcrZRrR9EGez4fdCIVjdn0Ot2HMN12ChnoMGEU6oIxnQ2aSC7iASFFCV39IYfeMh7iSCPj7Wopqw8rAouzg==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/middleware-user-agent@3.616.0": + resolution: + { + integrity: sha512-iMcAb4E+Z3vuEcrDsG6T2OBNiqWAquwahP9qepHqfmnmJqHr1mSHtXDYTGBNid31+621sUQmneUQ+fagpGAe4w==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/region-config-resolver@3.614.0": + resolution: + { + integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/token-providers@3.614.0": + resolution: + { + integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==, + } + engines: { node: ">=16.0.0" } peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.614.0 - - '@aws-sdk/types@3.609.0': - resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.614.0': - resolution: {integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-locate-window@3.568.0': - resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-user-agent-browser@3.609.0': - resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} - - '@aws-sdk/util-user-agent-node@3.614.0': - resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} - engines: {node: '>=16.0.0'} + "@aws-sdk/client-sso-oidc": ^3.614.0 + + "@aws-sdk/types@3.609.0": + resolution: + { + integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/util-endpoints@3.614.0": + resolution: + { + integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/util-locate-window@3.568.0": + resolution: + { + integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==, + } + engines: { node: ">=16.0.0" } + + "@aws-sdk/util-user-agent-browser@3.609.0": + resolution: + { + integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==, + } + + "@aws-sdk/util-user-agent-node@3.614.0": + resolution: + { + integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==, + } + engines: { node: ">=16.0.0" } peerDependencies: - aws-crt: '>=1.0.0' + aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@changesets/apply-release-plan@7.0.4': - resolution: {integrity: sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==} - - '@changesets/assemble-release-plan@6.0.3': - resolution: {integrity: sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==} - - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - - '@changesets/changelog-github@0.5.0': - resolution: {integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==} - - '@changesets/cli@2.27.7': - resolution: {integrity: sha512-6lr8JltiiXPIjDeYg4iM2MeePP6VN/JkmqBsVA5XRiy01hGS3y629LtSDvKcycj/w/5Eur1rEwby/MjcYS+e2A==} + "@babel/code-frame@7.24.7": + resolution: + { + integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.24.7": + resolution: + { + integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.24.7": + resolution: + { + integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==, + } + engines: { node: ">=6.9.0" } + + "@babel/runtime@7.25.0": + resolution: + { + integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==, + } + engines: { node: ">=6.9.0" } + + "@bcoe/v8-coverage@0.2.3": + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } + + "@changesets/apply-release-plan@7.0.4": + resolution: + { + integrity: sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==, + } + + "@changesets/assemble-release-plan@6.0.3": + resolution: + { + integrity: sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==, + } + + "@changesets/changelog-git@0.2.0": + resolution: + { + integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==, + } + + "@changesets/changelog-github@0.5.0": + resolution: + { + integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==, + } + + "@changesets/cli@2.27.7": + resolution: + { + integrity: sha512-6lr8JltiiXPIjDeYg4iM2MeePP6VN/JkmqBsVA5XRiy01hGS3y629LtSDvKcycj/w/5Eur1rEwby/MjcYS+e2A==, + } hasBin: true - '@changesets/config@3.0.2': - resolution: {integrity: sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - - '@changesets/get-dependents-graph@2.1.1': - resolution: {integrity: sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==} - - '@changesets/get-github-info@0.6.0': - resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - - '@changesets/get-release-plan@4.0.3': - resolution: {integrity: sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - - '@changesets/should-skip-package@0.1.0': - resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==} - - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - - '@changesets/write@0.3.1': - resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} - - '@decentralized-identity/ion-sdk@1.0.4': - resolution: {integrity: sha512-pOWrlTH5ChxUKRHOgfG2ZeTioWEFJXADyErCQOJ0BqYNDKfP+CM09Vss+9ei6PNOABQlcDn0mEDFZtpO+DXl8A==} - - '@dnsquery/dns-packet@6.1.1': - resolution: {integrity: sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==} - engines: {node: '>=6'} - - '@esbuild/aix-ppc64@0.21.3': - resolution: {integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==} - engines: {node: '>=12'} + "@changesets/config@3.0.2": + resolution: + { + integrity: sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==, + } + + "@changesets/errors@0.2.0": + resolution: + { + integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==, + } + + "@changesets/get-dependents-graph@2.1.1": + resolution: + { + integrity: sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==, + } + + "@changesets/get-github-info@0.6.0": + resolution: + { + integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==, + } + + "@changesets/get-release-plan@4.0.3": + resolution: + { + integrity: sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==, + } + + "@changesets/get-version-range-type@0.4.0": + resolution: + { + integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==, + } + + "@changesets/git@3.0.0": + resolution: + { + integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==, + } + + "@changesets/logger@0.1.0": + resolution: + { + integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==, + } + + "@changesets/parse@0.4.0": + resolution: + { + integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==, + } + + "@changesets/pre@2.0.0": + resolution: + { + integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==, + } + + "@changesets/read@0.6.0": + resolution: + { + integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==, + } + + "@changesets/should-skip-package@0.1.0": + resolution: + { + integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==, + } + + "@changesets/types@4.1.0": + resolution: + { + integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==, + } + + "@changesets/types@6.0.0": + resolution: + { + integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==, + } + + "@changesets/write@0.3.1": + resolution: + { + integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==, + } + + "@decentralized-identity/ion-sdk@1.0.4": + resolution: + { + integrity: sha512-pOWrlTH5ChxUKRHOgfG2ZeTioWEFJXADyErCQOJ0BqYNDKfP+CM09Vss+9ei6PNOABQlcDn0mEDFZtpO+DXl8A==, + } + + "@dnsquery/dns-packet@6.1.1": + resolution: + { + integrity: sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==, + } + engines: { node: ">=6" } + + "@esbuild/aix-ppc64@0.21.3": + resolution: + { + integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.0': - resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} - engines: {node: '>=18'} + "@esbuild/aix-ppc64@0.23.0": + resolution: + { + integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.8': - resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} - engines: {node: '>=12'} + "@esbuild/android-arm64@0.19.8": + resolution: + { + integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.3': - resolution: {integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==} - engines: {node: '>=12'} + "@esbuild/android-arm64@0.21.3": + resolution: + { + integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==, + } + engines: { node: ">=12" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.0': - resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.23.0": + resolution: + { + integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==, + } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.8': - resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} - engines: {node: '>=12'} + "@esbuild/android-arm@0.19.8": + resolution: + { + integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==, + } + engines: { node: ">=12" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.3': - resolution: {integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==} - engines: {node: '>=12'} + "@esbuild/android-arm@0.21.3": + resolution: + { + integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==, + } + engines: { node: ">=12" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.0': - resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.23.0": + resolution: + { + integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==, + } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.8': - resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} - engines: {node: '>=12'} + "@esbuild/android-x64@0.19.8": + resolution: + { + integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==, + } + engines: { node: ">=12" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.3': - resolution: {integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==} - engines: {node: '>=12'} + "@esbuild/android-x64@0.21.3": + resolution: + { + integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==, + } + engines: { node: ">=12" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.0': - resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.23.0": + resolution: + { + integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.8': - resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} - engines: {node: '>=12'} + "@esbuild/darwin-arm64@0.19.8": + resolution: + { + integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==, + } + engines: { node: ">=12" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.3': - resolution: {integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==} - engines: {node: '>=12'} + "@esbuild/darwin-arm64@0.21.3": + resolution: + { + integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==, + } + engines: { node: ">=12" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.0': - resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.23.0": + resolution: + { + integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==, + } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.8': - resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} - engines: {node: '>=12'} + "@esbuild/darwin-x64@0.19.8": + resolution: + { + integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==, + } + engines: { node: ">=12" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.3': - resolution: {integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==} - engines: {node: '>=12'} + "@esbuild/darwin-x64@0.21.3": + resolution: + { + integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==, + } + engines: { node: ">=12" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.0': - resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.23.0": + resolution: + { + integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.8': - resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} - engines: {node: '>=12'} + "@esbuild/freebsd-arm64@0.19.8": + resolution: + { + integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==, + } + engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.3': - resolution: {integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==} - engines: {node: '>=12'} + "@esbuild/freebsd-arm64@0.21.3": + resolution: + { + integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==, + } + engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.0': - resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.23.0": + resolution: + { + integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.8': - resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} - engines: {node: '>=12'} + "@esbuild/freebsd-x64@0.19.8": + resolution: + { + integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==, + } + engines: { node: ">=12" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.3': - resolution: {integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==} - engines: {node: '>=12'} + "@esbuild/freebsd-x64@0.21.3": + resolution: + { + integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==, + } + engines: { node: ">=12" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.0': - resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.23.0": + resolution: + { + integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.8': - resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} - engines: {node: '>=12'} + "@esbuild/linux-arm64@0.19.8": + resolution: + { + integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==, + } + engines: { node: ">=12" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.3': - resolution: {integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==} - engines: {node: '>=12'} + "@esbuild/linux-arm64@0.21.3": + resolution: + { + integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==, + } + engines: { node: ">=12" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.0': - resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.23.0": + resolution: + { + integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.8': - resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} - engines: {node: '>=12'} + "@esbuild/linux-arm@0.19.8": + resolution: + { + integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==, + } + engines: { node: ">=12" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.3': - resolution: {integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==} - engines: {node: '>=12'} + "@esbuild/linux-arm@0.21.3": + resolution: + { + integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==, + } + engines: { node: ">=12" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.0': - resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.23.0": + resolution: + { + integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==, + } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.8': - resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} - engines: {node: '>=12'} + "@esbuild/linux-ia32@0.19.8": + resolution: + { + integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==, + } + engines: { node: ">=12" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.3': - resolution: {integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==} - engines: {node: '>=12'} + "@esbuild/linux-ia32@0.21.3": + resolution: + { + integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==, + } + engines: { node: ">=12" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.0': - resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.23.0": + resolution: + { + integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==, + } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.8': - resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} - engines: {node: '>=12'} + "@esbuild/linux-loong64@0.19.8": + resolution: + { + integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==, + } + engines: { node: ">=12" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.3': - resolution: {integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==} - engines: {node: '>=12'} + "@esbuild/linux-loong64@0.21.3": + resolution: + { + integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==, + } + engines: { node: ">=12" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.0': - resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.23.0": + resolution: + { + integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==, + } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.8': - resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} - engines: {node: '>=12'} + "@esbuild/linux-mips64el@0.19.8": + resolution: + { + integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==, + } + engines: { node: ">=12" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.3': - resolution: {integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==} - engines: {node: '>=12'} + "@esbuild/linux-mips64el@0.21.3": + resolution: + { + integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==, + } + engines: { node: ">=12" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.0': - resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.23.0": + resolution: + { + integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==, + } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.8': - resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} - engines: {node: '>=12'} + "@esbuild/linux-ppc64@0.19.8": + resolution: + { + integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.3': - resolution: {integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==} - engines: {node: '>=12'} + "@esbuild/linux-ppc64@0.21.3": + resolution: + { + integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.0': - resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.23.0": + resolution: + { + integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.8': - resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} - engines: {node: '>=12'} + "@esbuild/linux-riscv64@0.19.8": + resolution: + { + integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==, + } + engines: { node: ">=12" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.3': - resolution: {integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==} - engines: {node: '>=12'} + "@esbuild/linux-riscv64@0.21.3": + resolution: + { + integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==, + } + engines: { node: ">=12" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.0': - resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.23.0": + resolution: + { + integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==, + } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.8': - resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} - engines: {node: '>=12'} + "@esbuild/linux-s390x@0.19.8": + resolution: + { + integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==, + } + engines: { node: ">=12" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.3': - resolution: {integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==} - engines: {node: '>=12'} + "@esbuild/linux-s390x@0.21.3": + resolution: + { + integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==, + } + engines: { node: ">=12" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.0': - resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.23.0": + resolution: + { + integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==, + } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.8': - resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} - engines: {node: '>=12'} + "@esbuild/linux-x64@0.19.8": + resolution: + { + integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==, + } + engines: { node: ">=12" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.3': - resolution: {integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==} - engines: {node: '>=12'} + "@esbuild/linux-x64@0.21.3": + resolution: + { + integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==, + } + engines: { node: ">=12" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.0': - resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.23.0": + resolution: + { + integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.8': - resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} - engines: {node: '>=12'} + "@esbuild/netbsd-x64@0.19.8": + resolution: + { + integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==, + } + engines: { node: ">=12" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.3': - resolution: {integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==} - engines: {node: '>=12'} + "@esbuild/netbsd-x64@0.21.3": + resolution: + { + integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==, + } + engines: { node: ">=12" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.0': - resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.23.0": + resolution: + { + integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==, + } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.0': - resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.23.0": + resolution: + { + integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.8': - resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} - engines: {node: '>=12'} + "@esbuild/openbsd-x64@0.19.8": + resolution: + { + integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==, + } + engines: { node: ">=12" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.3': - resolution: {integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==} - engines: {node: '>=12'} + "@esbuild/openbsd-x64@0.21.3": + resolution: + { + integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==, + } + engines: { node: ">=12" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.0': - resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.23.0": + resolution: + { + integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==, + } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.8': - resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} - engines: {node: '>=12'} + "@esbuild/sunos-x64@0.19.8": + resolution: + { + integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==, + } + engines: { node: ">=12" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.3': - resolution: {integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==} - engines: {node: '>=12'} + "@esbuild/sunos-x64@0.21.3": + resolution: + { + integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==, + } + engines: { node: ">=12" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.0': - resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.23.0": + resolution: + { + integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==, + } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.8': - resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} - engines: {node: '>=12'} + "@esbuild/win32-arm64@0.19.8": + resolution: + { + integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==, + } + engines: { node: ">=12" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.3': - resolution: {integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==} - engines: {node: '>=12'} + "@esbuild/win32-arm64@0.21.3": + resolution: + { + integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==, + } + engines: { node: ">=12" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.0': - resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.23.0": + resolution: + { + integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==, + } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.8': - resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} - engines: {node: '>=12'} + "@esbuild/win32-ia32@0.19.8": + resolution: + { + integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==, + } + engines: { node: ">=12" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.3': - resolution: {integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==} - engines: {node: '>=12'} + "@esbuild/win32-ia32@0.21.3": + resolution: + { + integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==, + } + engines: { node: ">=12" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.0': - resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.23.0": + resolution: + { + integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==, + } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.8': - resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} - engines: {node: '>=12'} + "@esbuild/win32-x64@0.19.8": + resolution: + { + integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==, + } + engines: { node: ">=12" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.3': - resolution: {integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==} - engines: {node: '>=12'} + "@esbuild/win32-x64@0.21.3": + resolution: + { + integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==, + } + engines: { node: ">=12" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.0': - resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.23.0": + resolution: + { + integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==, + } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@eslint-community/eslint-utils@4.4.0": + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.16.0': - resolution: {integrity: sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-array@0.17.1': - resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.3.0': - resolution: {integrity: sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.5.0': - resolution: {integrity: sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.7.0': - resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@hapi/bourne@3.0.0': - resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} + "@eslint-community/regexpp@4.11.0": + resolution: + { + integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/config-array@0.16.0": + resolution: + { + integrity: sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/config-array@0.17.1": + resolution: + { + integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/eslintrc@3.1.0": + resolution: + { + integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.3.0": + resolution: + { + integrity: sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.5.0": + resolution: + { + integrity: sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.7.0": + resolution: + { + integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/object-schema@2.1.4": + resolution: + { + integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@hapi/bourne@3.0.0": + resolution: + { + integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==, + } + + "@humanwhocodes/config-array@0.13.0": + resolution: + { + integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==, + } + engines: { node: ">=10.10.0" } deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + "@humanwhocodes/object-schema@2.0.3": + resolution: + { + integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==, + } deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} - engines: {node: '>=18.18'} - - '@ipld/dag-cbor@9.0.3': - resolution: {integrity: sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - - '@ipld/dag-cbor@9.0.5': - resolution: {integrity: sha512-TyqgtxEojc98rvxg4NGM+73JzQeM4+tK2VQes/in2mdyhO+1wbGuBijh1tvi9BErQ/dEblxs9v4vEQSX8mFCIw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - - '@ipld/dag-pb@4.1.2': - resolution: {integrity: sha512-BSztO4l3C+ya9HjCaQot26Y4AVsqIKtnn6+23ubc1usucnf6yoTBme18oCCdM6gKBMxuPqju5ye3lh9WEJsdeQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/ttlcache@1.4.1': - resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@js-temporal/polyfill@0.4.4': - resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} - engines: {node: '>=12'} - - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - - '@multiformats/murmur3@2.1.8': - resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} - - '@noble/ciphers@0.3.0': - resolution: {integrity: sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==} - - '@noble/ciphers@0.4.1': - resolution: {integrity: sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==} - - '@noble/ciphers@0.5.3': - resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} - - '@noble/curves@1.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/ed25519@2.0.0': - resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} - - '@noble/ed25519@2.1.0': - resolution: {integrity: sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==} - - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/secp256k1@2.0.0': - resolution: {integrity: sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==} - - '@noble/secp256k1@2.1.0': - resolution: {integrity: sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/git@5.0.8': - resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/package-json@5.0.0': - resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/promise-spawn@7.0.2': - resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@playwright/test@1.45.3': - resolution: {integrity: sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==} - engines: {node: '>=18'} + "@humanwhocodes/retry@0.3.0": + resolution: + { + integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==, + } + engines: { node: ">=18.18" } + + "@ipld/dag-cbor@9.0.3": + resolution: + { + integrity: sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } + + "@ipld/dag-cbor@9.0.5": + resolution: + { + integrity: sha512-TyqgtxEojc98rvxg4NGM+73JzQeM4+tK2VQes/in2mdyhO+1wbGuBijh1tvi9BErQ/dEblxs9v4vEQSX8mFCIw==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } + + "@ipld/dag-pb@4.1.2": + resolution: + { + integrity: sha512-BSztO4l3C+ya9HjCaQot26Y4AVsqIKtnn6+23ubc1usucnf6yoTBme18oCCdM6gKBMxuPqju5ye3lh9WEJsdeQ==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@isaacs/ttlcache@1.4.1": + resolution: + { + integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==, + } + engines: { node: ">=12" } + + "@istanbuljs/schema@0.1.3": + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: ">=8" } + + "@jridgewell/gen-mapping@0.3.5": + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.2.1": + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/source-map@0.3.6": + resolution: + { + integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + } + + "@jridgewell/sourcemap-codec@1.5.0": + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + + "@js-temporal/polyfill@0.4.4": + resolution: + { + integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==, + } + engines: { node: ">=12" } + + "@leichtgewicht/ip-codec@2.0.5": + resolution: + { + integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, + } + + "@manypkg/find-root@1.1.0": + resolution: + { + integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, + } + + "@manypkg/get-packages@1.1.3": + resolution: + { + integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==, + } + + "@multiformats/murmur3@2.1.8": + resolution: + { + integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } + + "@noble/ciphers@0.3.0": + resolution: + { + integrity: sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==, + } + + "@noble/ciphers@0.4.1": + resolution: + { + integrity: sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==, + } + + "@noble/ciphers@0.5.3": + resolution: + { + integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==, + } + + "@noble/curves@1.3.0": + resolution: + { + integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==, + } + + "@noble/curves@1.4.2": + resolution: + { + integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==, + } + + "@noble/ed25519@2.0.0": + resolution: + { + integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==, + } + + "@noble/ed25519@2.1.0": + resolution: + { + integrity: sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==, + } + + "@noble/hashes@1.3.3": + resolution: + { + integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==, + } + engines: { node: ">= 16" } + + "@noble/hashes@1.4.0": + resolution: + { + integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==, + } + engines: { node: ">= 16" } + + "@noble/secp256k1@2.0.0": + resolution: + { + integrity: sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==, + } + + "@noble/secp256k1@2.1.0": + resolution: + { + integrity: sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw==, + } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@npmcli/git@5.0.8": + resolution: + { + integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + + "@npmcli/package-json@5.0.0": + resolution: + { + integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + + "@npmcli/promise-spawn@7.0.2": + resolution: + { + integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@playwright/test@1.45.3": + resolution: + { + integrity: sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==, + } + engines: { node: ">=18" } hasBin: true - '@puppeteer/browsers@2.3.0': - resolution: {integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==} - engines: {node: '>=18'} + "@puppeteer/browsers@2.3.0": + resolution: + { + integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==, + } + engines: { node: ">=18" } hasBin: true - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} + "@rollup/plugin-node-resolve@15.2.3": + resolution: + { + integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} + "@rollup/pluginutils@5.1.0": + resolution: + { + integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==, + } + engines: { node: ">=14.0.0" } peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.20.0': - resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + "@rollup/rollup-android-arm-eabi@4.20.0": + resolution: + { + integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==, + } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.20.0': - resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + "@rollup/rollup-android-arm64@4.20.0": + resolution: + { + integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==, + } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.20.0': - resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + "@rollup/rollup-darwin-arm64@4.20.0": + resolution: + { + integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==, + } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.20.0': - resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + "@rollup/rollup-darwin-x64@4.20.0": + resolution: + { + integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==, + } cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': - resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + "@rollup/rollup-linux-arm-gnueabihf@4.20.0": + resolution: + { + integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==, + } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.20.0': - resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + "@rollup/rollup-linux-arm-musleabihf@4.20.0": + resolution: + { + integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==, + } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.20.0': - resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + "@rollup/rollup-linux-arm64-gnu@4.20.0": + resolution: + { + integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==, + } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.20.0': - resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + "@rollup/rollup-linux-arm64-musl@4.20.0": + resolution: + { + integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==, + } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': - resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + "@rollup/rollup-linux-powerpc64le-gnu@4.20.0": + resolution: + { + integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==, + } cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.20.0': - resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + "@rollup/rollup-linux-riscv64-gnu@4.20.0": + resolution: + { + integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==, + } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.20.0': - resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + "@rollup/rollup-linux-s390x-gnu@4.20.0": + resolution: + { + integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==, + } cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.20.0': - resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + "@rollup/rollup-linux-x64-gnu@4.20.0": + resolution: + { + integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==, + } cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.20.0': - resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + "@rollup/rollup-linux-x64-musl@4.20.0": + resolution: + { + integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==, + } cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.20.0': - resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + "@rollup/rollup-win32-arm64-msvc@4.20.0": + resolution: + { + integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==, + } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.20.0': - resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + "@rollup/rollup-win32-ia32-msvc@4.20.0": + resolution: + { + integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==, + } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.20.0': - resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + "@rollup/rollup-win32-x64-msvc@4.20.0": + resolution: + { + integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==, + } cpu: [x64] os: [win32] - '@scure/base@1.1.7': - resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} - - '@scure/bip39@1.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - - '@sd-jwt/decode@0.6.1': - resolution: {integrity: sha512-QgTIoYd5zyKKLgXB4xEYJTrvumVwtsj5Dog0v0L9UH9ZvHekDaeexS247X7A4iSdzTvmZzUpGskgABOa4D8NmQ==} - engines: {node: '>=16'} - - '@sd-jwt/present@0.6.1': - resolution: {integrity: sha512-QRD3TUDLj4PqQNZ70bBxh8FLLrOE9mY8V9qiZrJSsaDOLFs2p1CtZG+v9ig62fxFYJZMf4bWKwYjz+qqGAtxCg==} - engines: {node: '>=16'} - - '@sd-jwt/types@0.6.1': - resolution: {integrity: sha512-LKpABZJGT77jNhOLvAHIkNNmGqXzyfwBT+6r+DN9zNzMx1CzuNR0qXk1GMUbast9iCfPkGbnEpUv/jHTBvlIvg==} - engines: {node: '>=16'} - - '@sd-jwt/utils@0.6.1': - resolution: {integrity: sha512-1NHZ//+GecGQJb+gSdDicnrHG0DvACUk9jTnXA5yLZhlRjgkjyfJLNsCZesYeCyVp/SiyvIC9B+JwoY4kI0TwQ==} - engines: {node: '>=16'} - - '@sinonjs/commons@2.0.0': - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@11.2.2': - resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} - - '@sinonjs/samsam@8.0.0': - resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} - - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - - '@smithy/abort-controller@3.1.1': - resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} - engines: {node: '>=16.0.0'} - - '@smithy/config-resolver@3.0.5': - resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} - engines: {node: '>=16.0.0'} - - '@smithy/core@2.3.2': - resolution: {integrity: sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==} - engines: {node: '>=16.0.0'} - - '@smithy/credential-provider-imds@3.2.0': - resolution: {integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==} - engines: {node: '>=16.0.0'} - - '@smithy/fetch-http-handler@3.2.4': - resolution: {integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==} - - '@smithy/hash-node@3.0.3': - resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} - engines: {node: '>=16.0.0'} - - '@smithy/invalid-dependency@3.0.3': - resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/is-array-buffer@3.0.0': - resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-content-length@3.0.5': - resolution: {integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-endpoint@3.1.0': - resolution: {integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-retry@3.0.14': - resolution: {integrity: sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-serde@3.0.3': - resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} - engines: {node: '>=16.0.0'} - - '@smithy/middleware-stack@3.0.3': - resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} - engines: {node: '>=16.0.0'} - - '@smithy/node-config-provider@3.1.4': - resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} - engines: {node: '>=16.0.0'} - - '@smithy/node-http-handler@3.1.4': - resolution: {integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==} - engines: {node: '>=16.0.0'} - - '@smithy/property-provider@3.1.3': - resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} - engines: {node: '>=16.0.0'} - - '@smithy/protocol-http@4.1.0': - resolution: {integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==} - engines: {node: '>=16.0.0'} - - '@smithy/querystring-builder@3.0.3': - resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} - engines: {node: '>=16.0.0'} - - '@smithy/querystring-parser@3.0.3': - resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} - engines: {node: '>=16.0.0'} - - '@smithy/service-error-classification@3.0.3': - resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} - engines: {node: '>=16.0.0'} - - '@smithy/shared-ini-file-loader@3.1.4': - resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} - engines: {node: '>=16.0.0'} - - '@smithy/signature-v4@4.1.0': - resolution: {integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==} - engines: {node: '>=16.0.0'} - - '@smithy/smithy-client@3.1.12': - resolution: {integrity: sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==} - engines: {node: '>=16.0.0'} - - '@smithy/types@3.3.0': - resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} - engines: {node: '>=16.0.0'} - - '@smithy/url-parser@3.0.3': - resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} - - '@smithy/util-base64@3.0.0': - resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} - engines: {node: '>=16.0.0'} - - '@smithy/util-body-length-browser@3.0.0': - resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} - - '@smithy/util-body-length-node@3.0.0': - resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} - engines: {node: '>=16.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-buffer-from@3.0.0': - resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} - engines: {node: '>=16.0.0'} - - '@smithy/util-config-provider@3.0.0': - resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} - engines: {node: '>=16.0.0'} - - '@smithy/util-defaults-mode-browser@3.0.14': - resolution: {integrity: sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==} - engines: {node: '>= 10.0.0'} - - '@smithy/util-defaults-mode-node@3.0.14': - resolution: {integrity: sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==} - engines: {node: '>= 10.0.0'} - - '@smithy/util-endpoints@2.0.5': - resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} - engines: {node: '>=16.0.0'} - - '@smithy/util-hex-encoding@3.0.0': - resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} - engines: {node: '>=16.0.0'} - - '@smithy/util-middleware@3.0.3': - resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} - engines: {node: '>=16.0.0'} - - '@smithy/util-retry@3.0.3': - resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} - engines: {node: '>=16.0.0'} - - '@smithy/util-stream@3.1.3': - resolution: {integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==} - engines: {node: '>=16.0.0'} - - '@smithy/util-uri-escape@3.0.0': - resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} - engines: {node: '>=16.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@3.0.0': - resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} - engines: {node: '>=16.0.0'} - - '@sphereon/pex-models@2.2.4': - resolution: {integrity: sha512-pGlp+wplneE1+Lk3U48/2htYKTbONMeG5/x7vhO6AnPUOsnOXeJdftPrBYWVSzz/JH5GJptAc6+pAyYE1zMu4Q==} - - '@sphereon/pex@3.3.3': - resolution: {integrity: sha512-CXwdEcMTUh2z/5AriBn3OuShEG06l2tgiIr7qDJthnkez8DQ3sZo2vr4NEQWKKAL+DeAWAI4FryQGO4KuK7yfg==} - engines: {node: '>=18'} - - '@sphereon/ssi-types@0.22.0': - resolution: {integrity: sha512-YPJAZlKmzNALXK8ohP3ETxj1oVzL4+M9ljj3fD5xrbacvYax1JPCVKc8BWSubGcQckKHPbgbpcS7LYEeghyT9Q==} - - '@sphereon/ssi-types@0.26.0': - resolution: {integrity: sha512-r4JQIN7rnPunEv0HvCFC1ZCc9qlWcegYvhJbMJqSvyFE6VhmT5NNdH9jNV9QetgMa0yo5r3k+TnHNv3nH58Dmg==} - - '@tbd54566975/dwn-sdk-js@0.4.5': - resolution: {integrity: sha512-UGcq9PX32oQ3sB9LfQms82Ce5secNJXUUe+W163Am2vOAAjJ8AyFG9CaIrXO8HMyEO1yZ7l3bBv57tYM9Zf70A==} - engines: {node: '>= 18'} - - '@tbd54566975/dwn-sql-store@0.6.5': - resolution: {integrity: sha512-ZPdz7Ck7NMNCIOuZv+oxfxrw5lZJI/SukcLVd7PMseWZvT28D/gRcHgt0MfizeE9jLv9+ONI+0k8uc/O2NILyw==} - engines: {node: '>=18'} - - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - '@types/accepts@1.3.7': - resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - - '@types/babel__code-frame@7.0.6': - resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} - - '@types/bencode@2.0.4': - resolution: {integrity: sha512-sirDu3HUSG7jZMlhTDvCzSFiPR4lkUYBQA75CoMi6DEf2alFZWJWtHgfjBbb9PachPZhPMB1IlH09deyMNBipQ==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/chai-as-promised@7.1.5': - resolution: {integrity: sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==} - - '@types/chai-as-promised@7.1.8': - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/chai@4.3.6': - resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} - - '@types/co-body@6.1.3': - resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} - - '@types/command-line-args@5.2.3': - resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/content-disposition@0.5.8': - resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} - - '@types/convert-source-map@2.0.3': - resolution: {integrity: sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==} - - '@types/cookies@0.9.0': - resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} - - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} - - '@types/dns-packet@5.6.4': - resolution: {integrity: sha512-R0ORTvCCeujG+upKfV4JlvozKLdQWlpsducXGd1L6ezBChwpjSj9K84F+KoMDsZQ9RhOLTR1hnNrwJHWagY24g==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - - '@types/eslint@9.6.0': - resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/express-serve-static-core@4.19.5': - resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/http-assert@1.5.5': - resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/keygrip@1.0.6': - resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - - '@types/koa-compose@3.2.8': - resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} - - '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/mocha@10.0.1': - resolution: {integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==} - - '@types/mocha@10.0.6': - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} - - '@types/mocha@10.0.7': - resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} - - '@types/ms@0.7.31': - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.14.8': - resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} - - '@types/pako@2.0.3': - resolution: {integrity: sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==} - - '@types/parse5@6.0.3': - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/readable-stream@4.0.14': - resolution: {integrity: sha512-xZn/AuUbCMShGsqH/ehZtGDwQtbx00M9rZ2ENLe4tOjFZ/JFeWMhEZkk2fEe1jAUqqEAURIkFJ7Az/go8mM1/w==} - - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - - '@types/sinon@17.0.3': - resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} - - '@types/sinonjs__fake-timers@8.1.5': - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@7.10.0': - resolution: {integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==} - engines: {node: ^18.18.0 || >=20.0.0} + "@scure/base@1.1.7": + resolution: + { + integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==, + } + + "@scure/bip39@1.2.2": + resolution: + { + integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==, + } + + "@sd-jwt/decode@0.6.1": + resolution: + { + integrity: sha512-QgTIoYd5zyKKLgXB4xEYJTrvumVwtsj5Dog0v0L9UH9ZvHekDaeexS247X7A4iSdzTvmZzUpGskgABOa4D8NmQ==, + } + engines: { node: ">=16" } + + "@sd-jwt/present@0.6.1": + resolution: + { + integrity: sha512-QRD3TUDLj4PqQNZ70bBxh8FLLrOE9mY8V9qiZrJSsaDOLFs2p1CtZG+v9ig62fxFYJZMf4bWKwYjz+qqGAtxCg==, + } + engines: { node: ">=16" } + + "@sd-jwt/types@0.6.1": + resolution: + { + integrity: sha512-LKpABZJGT77jNhOLvAHIkNNmGqXzyfwBT+6r+DN9zNzMx1CzuNR0qXk1GMUbast9iCfPkGbnEpUv/jHTBvlIvg==, + } + engines: { node: ">=16" } + + "@sd-jwt/utils@0.6.1": + resolution: + { + integrity: sha512-1NHZ//+GecGQJb+gSdDicnrHG0DvACUk9jTnXA5yLZhlRjgkjyfJLNsCZesYeCyVp/SiyvIC9B+JwoY4kI0TwQ==, + } + engines: { node: ">=16" } + + "@sinonjs/commons@2.0.0": + resolution: + { + integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==, + } + + "@sinonjs/commons@3.0.1": + resolution: + { + integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==, + } + + "@sinonjs/fake-timers@11.2.2": + resolution: + { + integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==, + } + + "@sinonjs/samsam@8.0.0": + resolution: + { + integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==, + } + + "@sinonjs/text-encoding@0.7.2": + resolution: + { + integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==, + } + + "@smithy/abort-controller@3.1.1": + resolution: + { + integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/config-resolver@3.0.5": + resolution: + { + integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/core@2.3.2": + resolution: + { + integrity: sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==, + } + engines: { node: ">=16.0.0" } + + "@smithy/credential-provider-imds@3.2.0": + resolution: + { + integrity: sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/fetch-http-handler@3.2.4": + resolution: + { + integrity: sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==, + } + + "@smithy/hash-node@3.0.3": + resolution: + { + integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==, + } + engines: { node: ">=16.0.0" } + + "@smithy/invalid-dependency@3.0.3": + resolution: + { + integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==, + } + + "@smithy/is-array-buffer@2.2.0": + resolution: + { + integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==, + } + engines: { node: ">=14.0.0" } + + "@smithy/is-array-buffer@3.0.0": + resolution: + { + integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/middleware-content-length@3.0.5": + resolution: + { + integrity: sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==, + } + engines: { node: ">=16.0.0" } + + "@smithy/middleware-endpoint@3.1.0": + resolution: + { + integrity: sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==, + } + engines: { node: ">=16.0.0" } + + "@smithy/middleware-retry@3.0.14": + resolution: + { + integrity: sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/middleware-serde@3.0.3": + resolution: + { + integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/middleware-stack@3.0.3": + resolution: + { + integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/node-config-provider@3.1.4": + resolution: + { + integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/node-http-handler@3.1.4": + resolution: + { + integrity: sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==, + } + engines: { node: ">=16.0.0" } + + "@smithy/property-provider@3.1.3": + resolution: + { + integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==, + } + engines: { node: ">=16.0.0" } + + "@smithy/protocol-http@4.1.0": + resolution: + { + integrity: sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/querystring-builder@3.0.3": + resolution: + { + integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==, + } + engines: { node: ">=16.0.0" } + + "@smithy/querystring-parser@3.0.3": + resolution: + { + integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/service-error-classification@3.0.3": + resolution: + { + integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/shared-ini-file-loader@3.1.4": + resolution: + { + integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/signature-v4@4.1.0": + resolution: + { + integrity: sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==, + } + engines: { node: ">=16.0.0" } + + "@smithy/smithy-client@3.1.12": + resolution: + { + integrity: sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/types@3.3.0": + resolution: + { + integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/url-parser@3.0.3": + resolution: + { + integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==, + } + + "@smithy/util-base64@3.0.0": + resolution: + { + integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-body-length-browser@3.0.0": + resolution: + { + integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==, + } + + "@smithy/util-body-length-node@3.0.0": + resolution: + { + integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-buffer-from@2.2.0": + resolution: + { + integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==, + } + engines: { node: ">=14.0.0" } + + "@smithy/util-buffer-from@3.0.0": + resolution: + { + integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-config-provider@3.0.0": + resolution: + { + integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-defaults-mode-browser@3.0.14": + resolution: + { + integrity: sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==, + } + engines: { node: ">= 10.0.0" } + + "@smithy/util-defaults-mode-node@3.0.14": + resolution: + { + integrity: sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==, + } + engines: { node: ">= 10.0.0" } + + "@smithy/util-endpoints@2.0.5": + resolution: + { + integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-hex-encoding@3.0.0": + resolution: + { + integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-middleware@3.0.3": + resolution: + { + integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-retry@3.0.3": + resolution: + { + integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-stream@3.1.3": + resolution: + { + integrity: sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-uri-escape@3.0.0": + resolution: + { + integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==, + } + engines: { node: ">=16.0.0" } + + "@smithy/util-utf8@2.3.0": + resolution: + { + integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==, + } + engines: { node: ">=14.0.0" } + + "@smithy/util-utf8@3.0.0": + resolution: + { + integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==, + } + engines: { node: ">=16.0.0" } + + "@sphereon/pex-models@2.2.4": + resolution: + { + integrity: sha512-pGlp+wplneE1+Lk3U48/2htYKTbONMeG5/x7vhO6AnPUOsnOXeJdftPrBYWVSzz/JH5GJptAc6+pAyYE1zMu4Q==, + } + + "@sphereon/pex@3.3.3": + resolution: + { + integrity: sha512-CXwdEcMTUh2z/5AriBn3OuShEG06l2tgiIr7qDJthnkez8DQ3sZo2vr4NEQWKKAL+DeAWAI4FryQGO4KuK7yfg==, + } + engines: { node: ">=18" } + + "@sphereon/ssi-types@0.22.0": + resolution: + { + integrity: sha512-YPJAZlKmzNALXK8ohP3ETxj1oVzL4+M9ljj3fD5xrbacvYax1JPCVKc8BWSubGcQckKHPbgbpcS7LYEeghyT9Q==, + } + + "@sphereon/ssi-types@0.26.0": + resolution: + { + integrity: sha512-r4JQIN7rnPunEv0HvCFC1ZCc9qlWcegYvhJbMJqSvyFE6VhmT5NNdH9jNV9QetgMa0yo5r3k+TnHNv3nH58Dmg==, + } + + "@tbd54566975/dwn-sdk-js@0.4.5": + resolution: + { + integrity: sha512-UGcq9PX32oQ3sB9LfQms82Ce5secNJXUUe+W163Am2vOAAjJ8AyFG9CaIrXO8HMyEO1yZ7l3bBv57tYM9Zf70A==, + } + engines: { node: ">= 18" } + + "@tbd54566975/dwn-sql-store@0.6.5": + resolution: + { + integrity: sha512-ZPdz7Ck7NMNCIOuZv+oxfxrw5lZJI/SukcLVd7PMseWZvT28D/gRcHgt0MfizeE9jLv9+ONI+0k8uc/O2NILyw==, + } + engines: { node: ">=18" } + + "@tootallnate/quickjs-emscripten@0.23.0": + resolution: + { + integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==, + } + + "@types/accepts@1.3.7": + resolution: + { + integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==, + } + + "@types/babel__code-frame@7.0.6": + resolution: + { + integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==, + } + + "@types/bencode@2.0.4": + resolution: + { + integrity: sha512-sirDu3HUSG7jZMlhTDvCzSFiPR4lkUYBQA75CoMi6DEf2alFZWJWtHgfjBbb9PachPZhPMB1IlH09deyMNBipQ==, + } + + "@types/body-parser@1.19.5": + resolution: + { + integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, + } + + "@types/chai-as-promised@7.1.5": + resolution: + { + integrity: sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==, + } + + "@types/chai-as-promised@7.1.8": + resolution: + { + integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==, + } + + "@types/chai@4.3.16": + resolution: + { + integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==, + } + + "@types/chai@4.3.6": + resolution: + { + integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==, + } + + "@types/co-body@6.1.3": + resolution: + { + integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==, + } + + "@types/command-line-args@5.2.3": + resolution: + { + integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==, + } + + "@types/connect@3.4.38": + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } + + "@types/content-disposition@0.5.8": + resolution: + { + integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==, + } + + "@types/convert-source-map@2.0.3": + resolution: + { + integrity: sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==, + } + + "@types/cookies@0.9.0": + resolution: + { + integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==, + } + + "@types/debounce@1.2.4": + resolution: + { + integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==, + } + + "@types/dns-packet@5.6.4": + resolution: + { + integrity: sha512-R0ORTvCCeujG+upKfV4JlvozKLdQWlpsducXGd1L6ezBChwpjSj9K84F+KoMDsZQ9RhOLTR1hnNrwJHWagY24g==, + } + + "@types/eslint-scope@3.7.7": + resolution: + { + integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, + } + + "@types/eslint@8.56.10": + resolution: + { + integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==, + } + + "@types/eslint@9.6.0": + resolution: + { + integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==, + } + + "@types/estree@1.0.5": + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + } + + "@types/express-serve-static-core@4.19.5": + resolution: + { + integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==, + } + + "@types/express@4.17.21": + resolution: + { + integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, + } + + "@types/http-assert@1.5.5": + resolution: + { + integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==, + } + + "@types/http-errors@2.0.4": + resolution: + { + integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, + } + + "@types/istanbul-lib-coverage@2.0.6": + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } + + "@types/istanbul-lib-report@3.0.3": + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } + + "@types/istanbul-reports@3.0.4": + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/keygrip@1.0.6": + resolution: + { + integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==, + } + + "@types/koa-compose@3.2.8": + resolution: + { + integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==, + } + + "@types/koa@2.15.0": + resolution: + { + integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==, + } + + "@types/mime@1.3.5": + resolution: + { + integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + } + + "@types/mocha@10.0.1": + resolution: + { + integrity: sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==, + } + + "@types/mocha@10.0.6": + resolution: + { + integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==, + } + + "@types/mocha@10.0.7": + resolution: + { + integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==, + } + + "@types/ms@0.7.31": + resolution: + { + integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==, + } + + "@types/ms@0.7.34": + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + + "@types/node@12.20.55": + resolution: + { + integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, + } + + "@types/node@20.14.8": + resolution: + { + integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==, + } + + "@types/pako@2.0.3": + resolution: + { + integrity: sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==, + } + + "@types/parse5@6.0.3": + resolution: + { + integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==, + } + + "@types/qs@6.9.15": + resolution: + { + integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==, + } + + "@types/range-parser@1.2.7": + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } + + "@types/readable-stream@4.0.14": + resolution: + { + integrity: sha512-xZn/AuUbCMShGsqH/ehZtGDwQtbx00M9rZ2ENLe4tOjFZ/JFeWMhEZkk2fEe1jAUqqEAURIkFJ7Az/go8mM1/w==, + } + + "@types/resolve@1.20.2": + resolution: + { + integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==, + } + + "@types/semver@7.5.8": + resolution: + { + integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, + } + + "@types/send@0.17.4": + resolution: + { + integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, + } + + "@types/serve-static@1.15.7": + resolution: + { + integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, + } + + "@types/sinon@17.0.3": + resolution: + { + integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==, + } + + "@types/sinonjs__fake-timers@8.1.5": + resolution: + { + integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==, + } + + "@types/ws@7.4.7": + resolution: + { + integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==, + } + + "@types/yauzl@2.10.3": + resolution: + { + integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, + } + + "@typescript-eslint/eslint-plugin@7.10.0": + resolution: + { + integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: - '@typescript-eslint/parser': ^7.0.0 + "@typescript-eslint/parser": ^7.0.0 eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/eslint-plugin@7.14.1': - resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/eslint-plugin@7.14.1": + resolution: + { + integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: - '@typescript-eslint/parser': ^7.0.0 + "@typescript-eslint/parser": ^7.0.0 eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/eslint-plugin@7.9.0': - resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/eslint-plugin@7.9.0": + resolution: + { + integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: - '@typescript-eslint/parser': ^7.0.0 + "@typescript-eslint/parser": ^7.0.0 eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.14.1': - resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/parser@7.14.1": + resolution: + { + integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.10.0': - resolution: {integrity: sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/scope-manager@7.14.1': - resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/scope-manager@7.9.0': - resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.10.0': - resolution: {integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/scope-manager@7.10.0": + resolution: + { + integrity: sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/scope-manager@7.14.1": + resolution: + { + integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/scope-manager@7.9.0": + resolution: + { + integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/type-utils@7.10.0": + resolution: + { + integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/type-utils@7.14.1': - resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/type-utils@7.14.1": + resolution: + { + integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/type-utils@7.9.0': - resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/type-utils@7.9.0": + resolution: + { + integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.10.0': - resolution: {integrity: sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/types@7.14.1': - resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/types@7.9.0': - resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.10.0': - resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/types@7.10.0": + resolution: + { + integrity: sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/types@7.14.1": + resolution: + { + integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/types@7.9.0": + resolution: + { + integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/typescript-estree@7.10.0": + resolution: + { + integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/typescript-estree@7.14.1': - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/typescript-estree@7.14.1": + resolution: + { + integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/typescript-estree@7.9.0': - resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/typescript-estree@7.9.0": + resolution: + { + integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.10.0': - resolution: {integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/utils@7.10.0": + resolution: + { + integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@7.14.1': - resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/utils@7.14.1": + resolution: + { + integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@7.9.0': - resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/utils@7.9.0": + resolution: + { + integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.10.0': - resolution: {integrity: sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/visitor-keys@7.14.1': - resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/visitor-keys@7.9.0': - resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@web/browser-logs@0.4.0': - resolution: {integrity: sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==} - engines: {node: '>=18.0.0'} - - '@web/config-loader@0.3.1': - resolution: {integrity: sha512-IYjHXUgSGGNpO3YJQ9foLcazbJlAWDdJGRe9be7aOhon0Nd6Na5JIOJAej7jsMu76fKHr4b4w2LfIdNQ4fJ8pA==} - engines: {node: '>=18.0.0'} - - '@web/dev-server-core@0.7.2': - resolution: {integrity: sha512-Q/0jpF13Ipk+qGGQ+Yx/FW1TQBYazpkfgYHHo96HBE7qv4V4KKHqHglZcSUxti/zd4bToxX1cFTz8dmbTlb8JA==} - engines: {node: '>=18.0.0'} - - '@web/dev-server-rollup@0.6.4': - resolution: {integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==} - engines: {node: '>=18.0.0'} - - '@web/dev-server@0.4.6': - resolution: {integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==} - engines: {node: '>=18.0.0'} + "@typescript-eslint/visitor-keys@7.10.0": + resolution: + { + integrity: sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/visitor-keys@7.14.1": + resolution: + { + integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/visitor-keys@7.9.0": + resolution: + { + integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==, + } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@web/browser-logs@0.4.0": + resolution: + { + integrity: sha512-/EBiDAUCJ2DzZhaFxTPRIznEPeafdLbXShIL6aTu7x73x7ZoxSDv7DGuTsh2rWNMUa4+AKli4UORrpyv6QBOiA==, + } + engines: { node: ">=18.0.0" } + + "@web/config-loader@0.3.1": + resolution: + { + integrity: sha512-IYjHXUgSGGNpO3YJQ9foLcazbJlAWDdJGRe9be7aOhon0Nd6Na5JIOJAej7jsMu76fKHr4b4w2LfIdNQ4fJ8pA==, + } + engines: { node: ">=18.0.0" } + + "@web/dev-server-core@0.7.2": + resolution: + { + integrity: sha512-Q/0jpF13Ipk+qGGQ+Yx/FW1TQBYazpkfgYHHo96HBE7qv4V4KKHqHglZcSUxti/zd4bToxX1cFTz8dmbTlb8JA==, + } + engines: { node: ">=18.0.0" } + + "@web/dev-server-rollup@0.6.4": + resolution: + { + integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==, + } + engines: { node: ">=18.0.0" } + + "@web/dev-server@0.4.6": + resolution: + { + integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==, + } + engines: { node: ">=18.0.0" } hasBin: true - '@web/parse5-utils@2.1.0': - resolution: {integrity: sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-chrome@0.16.0': - resolution: {integrity: sha512-Edc6Y49aVB6k18S5IOj9OCX3rEf8F3jptIu0p95+imqxmcutFEh1GNmlAk2bQGnXS0U6uVY7Xbf61fiaXUQqhg==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-commands@0.9.0': - resolution: {integrity: sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-core@0.13.3': - resolution: {integrity: sha512-ilDqF/v2sj0sD69FNSIDT7uw4M1yTVedLBt32/lXy3MMi6suCM7m/ZlhsBy8PXhf879WMvzBOl/vhJBpEMB9vA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-coverage-v8@0.8.0': - resolution: {integrity: sha512-PskiucYpjUtgNfR2zF2AWqWwjXL7H3WW/SnCAYmzUrtob7X9o/+BjdyZ4wKbOxWWSbJO4lEdGIDLu+8X2Xw+lA==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-mocha@0.9.0': - resolution: {integrity: sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==} - engines: {node: '>=18.0.0'} - - '@web/test-runner-playwright@0.11.0': - resolution: {integrity: sha512-s+f43DSAcssKYVOD9SuzueUcctJdHzq1by45gAnSCKa9FQcaTbuYe8CzmxA21g+NcL5+ayo4z+MA9PO4H+PssQ==} - engines: {node: '>=18.0.0'} - - '@web/test-runner@0.18.2': - resolution: {integrity: sha512-jA+957ic31aG/f1mr1b+HYzf/uTu4QsvFhyVgTKi2s5YQYGBbtfzx9PnYi47MVC9K9OHRbW8cq2Urds9qwSU3w==} - engines: {node: '>=18.0.0'} + "@web/parse5-utils@2.1.0": + resolution: + { + integrity: sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner-chrome@0.16.0": + resolution: + { + integrity: sha512-Edc6Y49aVB6k18S5IOj9OCX3rEf8F3jptIu0p95+imqxmcutFEh1GNmlAk2bQGnXS0U6uVY7Xbf61fiaXUQqhg==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner-commands@0.9.0": + resolution: + { + integrity: sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner-core@0.13.3": + resolution: + { + integrity: sha512-ilDqF/v2sj0sD69FNSIDT7uw4M1yTVedLBt32/lXy3MMi6suCM7m/ZlhsBy8PXhf879WMvzBOl/vhJBpEMB9vA==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner-coverage-v8@0.8.0": + resolution: + { + integrity: sha512-PskiucYpjUtgNfR2zF2AWqWwjXL7H3WW/SnCAYmzUrtob7X9o/+BjdyZ4wKbOxWWSbJO4lEdGIDLu+8X2Xw+lA==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner-mocha@0.9.0": + resolution: + { + integrity: sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner-playwright@0.11.0": + resolution: + { + integrity: sha512-s+f43DSAcssKYVOD9SuzueUcctJdHzq1by45gAnSCKa9FQcaTbuYe8CzmxA21g+NcL5+ayo4z+MA9PO4H+PssQ==, + } + engines: { node: ">=18.0.0" } + + "@web/test-runner@0.18.2": + resolution: + { + integrity: sha512-jA+957ic31aG/f1mr1b+HYzf/uTu4QsvFhyVgTKi2s5YQYGBbtfzx9PnYi47MVC9K9OHRbW8cq2Urds9qwSU3w==, + } + engines: { node: ">=18.0.0" } hasBin: true - '@web5/common@1.0.0': - resolution: {integrity: sha512-3JHF6X5o0h+3oAVQeBC4XpMoZeEYZYdEmQdgpOfKv/rnSru2yHQSAM+0wbIvEFcSCmelBT3u7rUAcpJjelLB0w==} - engines: {node: '>=18.0.0'} - - '@web5/common@1.0.1': - resolution: {integrity: sha512-dxczXqzWt6HCwuNyOVBeakg6GgOpP74tVEVxBeKkb+D3XcSP96mYaDtky5ZnjY4iBYb16SaCgwje+sgevOL51A==} - engines: {node: '>=18.0.0'} - - '@web5/crypto@1.0.0': - resolution: {integrity: sha512-z1CsgycTqiXEsS6pPlJDDLGAeGsgzfdBeWvyxLXTgh08Q8ACULmEGRXjSsgWHFn6DO6MpWFn55h/hF4wZZRxvA==} - engines: {node: '>=18.0.0'} - - '@web5/crypto@1.0.3': - resolution: {integrity: sha512-gZJKo0scX+L53E2K/5cgEiFYxejzHP2RSg64ncF6TitOnCNxUyWjofovgufb+u3ZpGC4iuliD7V0o1C+V73Law==} - engines: {node: '>=18.0.0'} - - '@web5/dids@1.1.0': - resolution: {integrity: sha512-d9pKf/DW+ziUiV5g3McC71utyAhQyT1tYGPbQSYWt2ji6FHGNC6tffHMfLXXK/W+vbwV3eNTn06JqTXRaYhxBA==} - engines: {node: '>=18.0.0'} - - '@web5/dids@1.1.1': - resolution: {integrity: sha512-LKc6Okl2iz78QGJCsd8QKQq3LdtmfQ9cfiRKu1BU4ITWteWsg4JD089hKmslNDd2KKnEf9LE72TqEYWxr/e8JA==} - engines: {node: '>=18.0.0'} - - '@web5/dids@1.1.3': - resolution: {integrity: sha512-M9EfsEYcOtYuEvUQjow4vpxXbD0Sz5H8EuDXMtwuvP4UdYL0ATl+60F8+8HDmwPFeUy6M2wxuoixrLDwSRFwZA==} - engines: {node: '>=18.0.0'} - - '@web5/dwn-server@0.4.6': - resolution: {integrity: sha512-92uNTJDBHGprneQtuD0A4XbcWirWHY+MrQVKd4fyrjwMh7cUMF3uE4l3QnBwn8kquzRrU+3sekcgzNjHvmTfHw==} + "@web5/common@1.0.0": + resolution: + { + integrity: sha512-3JHF6X5o0h+3oAVQeBC4XpMoZeEYZYdEmQdgpOfKv/rnSru2yHQSAM+0wbIvEFcSCmelBT3u7rUAcpJjelLB0w==, + } + engines: { node: ">=18.0.0" } + + "@web5/common@1.0.1": + resolution: + { + integrity: sha512-dxczXqzWt6HCwuNyOVBeakg6GgOpP74tVEVxBeKkb+D3XcSP96mYaDtky5ZnjY4iBYb16SaCgwje+sgevOL51A==, + } + engines: { node: ">=18.0.0" } + + "@web5/crypto@1.0.0": + resolution: + { + integrity: sha512-z1CsgycTqiXEsS6pPlJDDLGAeGsgzfdBeWvyxLXTgh08Q8ACULmEGRXjSsgWHFn6DO6MpWFn55h/hF4wZZRxvA==, + } + engines: { node: ">=18.0.0" } + + "@web5/crypto@1.0.3": + resolution: + { + integrity: sha512-gZJKo0scX+L53E2K/5cgEiFYxejzHP2RSg64ncF6TitOnCNxUyWjofovgufb+u3ZpGC4iuliD7V0o1C+V73Law==, + } + engines: { node: ">=18.0.0" } + + "@web5/dids@1.1.0": + resolution: + { + integrity: sha512-d9pKf/DW+ziUiV5g3McC71utyAhQyT1tYGPbQSYWt2ji6FHGNC6tffHMfLXXK/W+vbwV3eNTn06JqTXRaYhxBA==, + } + engines: { node: ">=18.0.0" } + + "@web5/dids@1.1.1": + resolution: + { + integrity: sha512-LKc6Okl2iz78QGJCsd8QKQq3LdtmfQ9cfiRKu1BU4ITWteWsg4JD089hKmslNDd2KKnEf9LE72TqEYWxr/e8JA==, + } + engines: { node: ">=18.0.0" } + + "@web5/dids@1.1.3": + resolution: + { + integrity: sha512-M9EfsEYcOtYuEvUQjow4vpxXbD0Sz5H8EuDXMtwuvP4UdYL0ATl+60F8+8HDmwPFeUy6M2wxuoixrLDwSRFwZA==, + } + engines: { node: ">=18.0.0" } + + "@web5/dwn-server@0.4.6": + resolution: + { + integrity: sha512-92uNTJDBHGprneQtuD0A4XbcWirWHY+MrQVKd4fyrjwMh7cUMF3uE4l3QnBwn8kquzRrU+3sekcgzNjHvmTfHw==, + } hasBin: true - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + "@webassemblyjs/ast@1.12.1": + resolution: + { + integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==, + } + + "@webassemblyjs/floating-point-hex-parser@1.11.6": + resolution: + { + integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, + } + + "@webassemblyjs/helper-api-error@1.11.6": + resolution: + { + integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, + } + + "@webassemblyjs/helper-buffer@1.12.1": + resolution: + { + integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==, + } + + "@webassemblyjs/helper-numbers@1.11.6": + resolution: + { + integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, + } + + "@webassemblyjs/helper-wasm-bytecode@1.11.6": + resolution: + { + integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, + } + + "@webassemblyjs/helper-wasm-section@1.12.1": + resolution: + { + integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==, + } + + "@webassemblyjs/ieee754@1.11.6": + resolution: + { + integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, + } + + "@webassemblyjs/leb128@1.11.6": + resolution: + { + integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, + } + + "@webassemblyjs/utf8@1.11.6": + resolution: + { + integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, + } + + "@webassemblyjs/wasm-edit@1.12.1": + resolution: + { + integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==, + } + + "@webassemblyjs/wasm-gen@1.12.1": + resolution: + { + integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==, + } + + "@webassemblyjs/wasm-opt@1.12.1": + resolution: + { + integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==, + } + + "@webassemblyjs/wasm-parser@1.12.1": + resolution: + { + integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==, + } + + "@webassemblyjs/wast-printer@1.12.1": + resolution: + { + integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==, + } + + "@xtuc/ieee754@1.2.0": + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } + + "@xtuc/long@4.2.2": + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: ">=6.5" } abstract-level@1.0.3: - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==, + } + engines: { node: ">=12" } abstract-level@1.0.4: - resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==, + } + engines: { node: ">=12" } accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: ">= 0.6" } acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + resolution: + { + integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==, + } peerDependencies: acorn: ^8 acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==, + } + engines: { node: ">=0.4.0" } hasBin: true agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==, + } + engines: { node: ">= 14" } ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + resolution: + { + integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -2598,279 +3721,516 @@ packages: optional: true ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } peerDependencies: ajv: ^6.9.1 ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + resolution: + { + integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, + } ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, + } + engines: { node: ">=6" } ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: ">=6" } ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: ">=8" } ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==, + } + engines: { node: ">=14.16" } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==, + } + engines: { node: ">=6" } array-back@6.2.2: - resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} - engines: {node: '>=12.17'} + resolution: + { + integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==, + } + engines: { node: ">=12.17" } array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, + } + engines: { node: ">= 0.4" } array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, + } + engines: { node: ">= 0.4" } asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + resolution: + { + integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==, + } assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + resolution: + { + integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==, + } assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + resolution: + { + integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, + } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: ">=12" } ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==, + } + engines: { node: ">=4" } astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: ">=8" } async-mutex@0.4.0: - resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} + resolution: + { + integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==, + } async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + resolution: + { + integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==, + } audit-ci@7.1.0: - resolution: {integrity: sha512-PjjEejlST57S/aDbeWLic0glJ8CNl/ekY3kfGFPMrPkmuaYaDKcMH0F9x9yS9Vp6URhuefSCubl/G0Y2r6oP0g==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-PjjEejlST57S/aDbeWLic0glJ8CNl/ekY3kfGFPMrPkmuaYaDKcMH0F9x9yS9Vp6URhuefSCubl/G0Y2r6oP0g==, + } + engines: { node: ">=16" } hasBin: true available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } aws-ssl-profiles@1.1.1: - resolution: {integrity: sha512-+H+kuK34PfMaI9PNU/NSjBKL5hh/KDM9J72kwYeYEm0A8B1AC4fuCy3qsjnA7lxklgyXsB68yn8Z2xoZEjgwCQ==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-+H+kuK34PfMaI9PNU/NSjBKL5hh/KDM9J72kwYeYEm0A8B1AC4fuCy3qsjnA7lxklgyXsB68yn8Z2xoZEjgwCQ==, + } + engines: { node: ">= 6.0.0" } b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + resolution: + { + integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==, + } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + resolution: + { + integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==, + } bare-fs@2.3.1: - resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + resolution: + { + integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==, + } bare-os@2.4.0: - resolution: {integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==} + resolution: + { + integrity: sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==, + } bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + resolution: + { + integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==, + } bare-stream@2.1.3: - resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} + resolution: + { + integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==, + } base64-arraybuffer@1.0.2: - resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==, + } + engines: { node: ">= 0.6.0" } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==, + } + engines: { node: ">=10.0.0" } bencode@4.0.0: - resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==} - engines: {node: '>=12.20.0'} + resolution: + { + integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==, + } + engines: { node: ">=12.20.0" } better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==, + } + engines: { node: ">=4" } better-sqlite3@8.7.0: - resolution: {integrity: sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==} + resolution: + { + integrity: sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==, + } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } bintrees@1.0.2: - resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + resolution: + { + integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==, + } bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + resolution: + { + integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==, + } blockstore-core@4.2.0: - resolution: {integrity: sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + resolution: + { + integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==, + } bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + resolution: + { + integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, + } body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + resolution: + { + integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, + } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + resolution: + { + integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, + } browser-level@1.0.1: - resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} + resolution: + { + integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==, + } browser-resolve@2.0.0: - resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + resolution: + { + integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==, + } browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + resolution: + { + integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, + } browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + resolution: + { + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, + } browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + resolution: + { + integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, + } browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + resolution: + { + integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, + } browserify-rsa@4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + resolution: + { + integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==, + } browserify-sign@4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} + resolution: + { + integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==, + } + engines: { node: ">= 0.12" } browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + resolution: + { + integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==, + } browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: + { + integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, + } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + resolution: + { + integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, + } buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, + } + engines: { node: ">=6" } builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + resolution: + { + integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==, + } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } c8@10.1.2: - resolution: {integrity: sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==, + } + engines: { node: ">=18" } hasBin: true peerDependencies: monocart-coverage-reports: ^2 @@ -2879,1737 +4239,3120 @@ packages: optional: true c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} + resolution: + { + integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==, + } + engines: { node: ">=14.14.0" } hasBin: true cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==, + } + engines: { node: ">= 6.0.0" } call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: ">= 0.4" } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: ">=10" } caniuse-lite@1.0.30001647: - resolution: {integrity: sha512-n83xdNiyeNcHpzWY+1aFbqCK7LuLfBricc4+alSQL2Xb6OR3XpnQAmlDG+pQcdTfiHRuLcQ96VOfrPSGiNJYSg==} + resolution: + { + integrity: sha512-n83xdNiyeNcHpzWY+1aFbqCK7LuLfBricc4+alSQL2Xb6OR3XpnQAmlDG+pQcdTfiHRuLcQ96VOfrPSGiNJYSg==, + } canonicalize@2.0.0: - resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + resolution: + { + integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==, + } catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==, + } + engines: { node: ">=6" } cborg@2.0.5: - resolution: {integrity: sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==} + resolution: + { + integrity: sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==, + } hasBin: true cborg@4.2.3: - resolution: {integrity: sha512-XBFbEJ6WMfn9L7woc2t+EzOxF8vGqddoopKBbrhIvZBt2WIUgSlT8xLmM6Aq1xv8eWt4yOSjwxWjYeuHU3CpJA==} + resolution: + { + integrity: sha512-XBFbEJ6WMfn9L7woc2t+EzOxF8vGqddoopKBbrhIvZBt2WIUgSlT8xLmM6Aq1xv8eWt4yOSjwxWjYeuHU3CpJA==, + } hasBin: true chai-as-promised@7.1.1: - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + resolution: + { + integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==, + } peerDependencies: - chai: '>= 2.1.2 < 5' + chai: ">= 2.1.2 < 5" chai-as-promised@7.1.2: - resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} + resolution: + { + integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==, + } peerDependencies: - chai: '>= 2.1.2 < 6' + chai: ">= 2.1.2 < 6" chai-as-promised@8.0.0: - resolution: {integrity: sha512-sMsGXTrS3FunP/wbqh/KxM8Kj/aLPXQGkNtvE5wPfSToq8wkkvBpTZo1LIiEVmC4BwkKpag+l5h/20lBMk6nUg==} + resolution: + { + integrity: sha512-sMsGXTrS3FunP/wbqh/KxM8Kj/aLPXQGkNtvE5wPfSToq8wkkvBpTZo1LIiEVmC4BwkKpag+l5h/20lBMk6nUg==, + } peerDependencies: - chai: '>= 2.1.2 < 6' + chai: ">= 2.1.2 < 6" chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==, + } + engines: { node: ">=4" } chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==, + } + engines: { node: ">=12" } chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==, + } + engines: { node: ">=12" } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + resolution: + { + integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, + } check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + resolution: + { + integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, + } check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: ">= 16" } chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } chrome-launcher@0.15.2: - resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} - engines: {node: '>=12.13.0'} + resolution: + { + integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==, + } + engines: { node: ">=12.13.0" } hasBin: true chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, + } + engines: { node: ">=6.0" } chromium-bidi@0.6.3: - resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} + resolution: + { + integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==, + } peerDependencies: - devtools-protocol: '*' + devtools-protocol: "*" ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: ">=8" } cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + resolution: + { + integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, + } classic-level@1.4.1: - resolution: {integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==, + } + engines: { node: ">=12" } cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: ">=8" } cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } clone@2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, + } + engines: { node: ">=0.8" } co-body@6.2.0: - resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==, + } + engines: { node: ">=8.0.0" } co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} + resolution: + { + integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==, + } + engines: { node: ">=0.1.90" } command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==, + } + engines: { node: ">=4.0.0" } command-line-usage@7.0.3: - resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} - engines: {node: '>=12.20.0'} + resolution: + { + integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==, + } + engines: { node: ">=12.20.0" } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + resolution: + { + integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==, + } constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + resolution: + { + integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==, + } content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: ">= 0.6" } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==, + } + engines: { node: ">= 0.8" } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, + } + engines: { node: ">= 0.10" } create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + resolution: + { + integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, + } create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + resolution: + { + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, + } create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + resolution: + { + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, + } create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + resolution: + { + integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==, + } cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + resolution: + { + integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==, + } cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + resolution: + { + integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, + } crypto-browserify@3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + resolution: + { + integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==, + } data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==, + } + engines: { node: ">= 14" } data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, + } + engines: { node: ">= 0.4" } data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, + } + engines: { node: ">= 0.4" } data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, + } + engines: { node: ">= 0.4" } dataloader@1.4.0: - resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + resolution: + { + integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==, + } debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + resolution: + { + integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==, + } debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, + } + engines: { node: ">=10" } decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==, + } + engines: { node: ">=6" } deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: ">=6" } deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + resolution: + { + integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==, + } deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, + } + engines: { node: ">= 10" } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: ">=8" } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==, + } + engines: { node: ">= 14" } delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + resolution: + { + integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==, + } denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, + } + engines: { node: ">= 0.6" } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } dependency-graph@0.11.0: - resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==, + } + engines: { node: ">= 0.6.0" } des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + resolution: + { + integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==, + } destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, + } + engines: { node: ">=8" } detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, + } + engines: { node: ">=8" } devtools-protocol@0.0.1312386: - resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} + resolution: + { + integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==, + } diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, + } + engines: { node: ">=0.3.1" } diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, + } + engines: { node: ">=0.3.1" } diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + resolution: + { + integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, + } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } domain-browser@4.23.0: - resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==, + } + engines: { node: ">=10" } dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==, + } + engines: { node: ">=10" } duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + resolution: + { + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, + } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } eciesjs@0.4.5: - resolution: {integrity: sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==, + } + engines: { node: ">=16.0.0" } ed25519-keygen@0.4.11: - resolution: {integrity: sha512-UKxebk/eoW/0yy6BcyCkgAvN2/VzwVXiMVHgKNYBMX6T0fJRAE3WWvH2inyuBvMIJaOqlkc3utylUvL8yW6SOg==} - deprecated: 'Switch to micro-key-producer: the package has been merged into it' + resolution: + { + integrity: sha512-UKxebk/eoW/0yy6BcyCkgAvN2/VzwVXiMVHgKNYBMX6T0fJRAE3WWvH2inyuBvMIJaOqlkc3utylUvL8yW6SOg==, + } + deprecated: "Switch to micro-key-producer: the package has been merged into it" ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + resolution: + { + integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==, + } elliptic@6.5.6: - resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} + resolution: + { + integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==, + } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==, + } + engines: { node: ">=10.13.0" } enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, + } + engines: { node: ">=8.6" } err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + resolution: + { + integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, + } err-code@3.0.1: - resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + resolution: + { + integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==, + } errorstacks@2.4.1: - resolution: {integrity: sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==} + resolution: + { + integrity: sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==, + } es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==, + } + engines: { node: ">= 0.4" } es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + resolution: + { + integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==, + } es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: ">= 0.4" } es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, + } + engines: { node: ">= 0.4" } es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } esbuild@0.19.8: - resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==, + } + engines: { node: ">=12" } hasBin: true esbuild@0.21.3: - resolution: {integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==, + } + engines: { node: ">=12" } hasBin: true esbuild@0.23.0: - resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==, + } + engines: { node: ">=18" } hasBin: true escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + } + engines: { node: ">=6" } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, + } + engines: { node: ">=4.0" } hasBin: true escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, + } + engines: { node: ">=6.0" } hasBin: true eslint-plugin-mocha@10.4.3: - resolution: {integrity: sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==, + } + engines: { node: ">=14.0.0" } peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: ">=8.0.0" } eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + resolution: + { + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, + } + engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } peerDependencies: - eslint: '>=5' + eslint: ">=5" eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, + } + engines: { node: ">=10" } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint@9.3.0: - resolution: {integrity: sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true eslint@9.5.0: - resolution: {integrity: sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true eslint@9.7.0: - resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: ">=0.10" } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } event-stream@4.0.1: - resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} + resolution: + { + integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==, + } event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: ">=6" } eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: ">=0.8.x" } evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + resolution: + { + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, + } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==, + } + engines: { node: ">= 0.10.0" } extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + resolution: + { + integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==, + } external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: ">=4" } extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} + resolution: + { + integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, + } + engines: { node: ">= 10.17.0" } hasBin: true fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + resolution: + { + integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, + } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + resolution: + { + integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==, + } fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + resolution: + { + integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==, + } hasBin: true fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + resolution: + { + integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, + } fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: ">=16.0.0" } file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, + } + engines: { node: ">= 0.8" } find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==, + } + engines: { node: ">=4.0.0" } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + resolution: + { + integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, + } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: ">=16" } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } hasBin: true flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: + { + integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, + } for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==, + } + engines: { node: ">=14" } formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + resolution: + { + integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==, + } fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, + } + engines: { node: ">=14.14" } fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, + } + engines: { node: ">=6 <7 || >=8" } fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: ">=6 <7 || >=8" } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: ">= 0.4" } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } gar@1.0.4: - resolution: {integrity: sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==} + resolution: + { + integrity: sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==, + } deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + resolution: + { + integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, + } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-folder-size@2.0.1: - resolution: {integrity: sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==} + resolution: + { + integrity: sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==, + } hasBin: true get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + resolution: + { + integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, + } get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: ">= 0.4" } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: ">=8" } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, + } + engines: { node: ">= 0.4" } get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==, + } + engines: { node: ">= 14" } github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } hasBin: true glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + resolution: + { + integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, + } deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } deprecated: Glob versions prior to v9 are no longer supported glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, + } + engines: { node: ">=16 || 14 >=14.17" } globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: ">=8" } globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: ">=18" } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: ">= 0.4" } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } hamt-sharding@3.0.6: - resolution: {integrity: sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==} + resolution: + { + integrity: sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==, + } has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + } + engines: { node: ">= 0.4" } has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } hash-base@3.0.4: - resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==, + } + engines: { node: ">=4" } hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, + } + engines: { node: ">=4" } hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + resolution: + { + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, + } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + } hasBin: true hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + resolution: + { + integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, + } hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==, + } + engines: { node: ^16.14.0 || >=18.0.0 } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==, + } + engines: { node: ">= 0.8" } http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==, + } + engines: { node: ">= 0.6" } http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==, + } + engines: { node: ">= 0.6" } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, + } + engines: { node: ">= 14" } https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + resolution: + { + integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==, + } https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==, + } + engines: { node: ">= 14" } human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + resolution: + { + integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==, + } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, + } + engines: { node: ">= 4" } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } inflation@2.1.0: - resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==, + } + engines: { node: ">= 0.8.0" } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + resolution: + { + integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, + } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } interface-blockstore@5.2.3: - resolution: {integrity: sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } interface-store@5.1.2: - resolution: {integrity: sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } internal-ip@6.2.0: - resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==, + } + engines: { node: ">=10" } internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, + } + engines: { node: ">= 0.4" } ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==, + } + engines: { node: ">= 12" } ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==, + } + engines: { node: ">=8" } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } ipfs-unixfs-exporter@13.1.5: - resolution: {integrity: sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } ipfs-unixfs-importer@15.1.5: - resolution: {integrity: sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } ipfs-unixfs@11.1.4: - resolution: {integrity: sha512-RE4nyx5qgG2w7JOLj0Y0D7SfAR1ZkEdramNaBx0OSD4DlQ2Y2NORgc4FHfej3Pgy31v+QISDVP1pQJhdv3bUUg==} + resolution: + { + integrity: sha512-RE4nyx5qgG2w7JOLj0Y0D7SfAR1ZkEdramNaBx0OSD4DlQ2Y2NORgc4FHfej3Pgy31v+QISDVP1pQJhdv3bUUg==, + } is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + } + engines: { node: ">= 0.4" } is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, + } + engines: { node: ">= 0.4" } is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + resolution: + { + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, + } is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: ">=4" } is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==, + } + engines: { node: ">=6" } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==, + } + engines: { node: ">= 0.4" } is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, + } + engines: { node: ">= 0.4" } is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } hasBin: true is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, + } + engines: { node: ">= 0.4" } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } is-ip@3.1.0: - resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==, + } + engines: { node: ">=8" } is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + resolution: + { + integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, + } is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==, + } + engines: { node: ">= 0.4" } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: ">= 0.4" } is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, + } + engines: { node: ">=8" } is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + resolution: + { + integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, + } is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, + } + engines: { node: ">= 0.4" } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==, + } + engines: { node: ">=4" } is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, + } + engines: { node: ">= 0.4" } is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: ">=10" } is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: ">=0.10.0" } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } isbinaryfile@5.0.2: - resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} - engines: {node: '>= 18.0.0'} + resolution: + { + integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==, + } + engines: { node: ">= 18.0.0" } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, + } + engines: { node: ">=16" } isomorphic-timers-promises@1.0.1: - resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==, + } + engines: { node: ">=10" } isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + resolution: + { + integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==, + } peerDependencies: - ws: '>=8.17.1' + ws: ">=8.17.1" istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: ">=8" } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: ">=10" } istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, + } + engines: { node: ">=8" } it-all@3.0.6: - resolution: {integrity: sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q==} + resolution: + { + integrity: sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q==, + } it-batch@3.0.6: - resolution: {integrity: sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg==} + resolution: + { + integrity: sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg==, + } it-filter@3.1.1: - resolution: {integrity: sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==} + resolution: + { + integrity: sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==, + } it-first@3.0.6: - resolution: {integrity: sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==} + resolution: + { + integrity: sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==, + } it-last@3.0.6: - resolution: {integrity: sha512-M4/get95O85u2vWvWQinF8SJUc/RPC5bWTveBTYXvlP2q5TF9Y+QhT3nz+CRCyS2YEc66VJkyl/da6WrJ0wKhw==} + resolution: + { + integrity: sha512-M4/get95O85u2vWvWQinF8SJUc/RPC5bWTveBTYXvlP2q5TF9Y+QhT3nz+CRCyS2YEc66VJkyl/da6WrJ0wKhw==, + } it-map@3.1.1: - resolution: {integrity: sha512-9bCSwKD1yN1wCOgJ9UOl+46NQtdatosPWzxxUk2NdTLwRPXLh+L7iwCC9QKsbgM60RQxT/nH8bKMqm3H/o8IHQ==} + resolution: + { + integrity: sha512-9bCSwKD1yN1wCOgJ9UOl+46NQtdatosPWzxxUk2NdTLwRPXLh+L7iwCC9QKsbgM60RQxT/nH8bKMqm3H/o8IHQ==, + } it-merge@3.0.5: - resolution: {integrity: sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==} + resolution: + { + integrity: sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==, + } it-parallel-batch@3.0.6: - resolution: {integrity: sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q==} + resolution: + { + integrity: sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q==, + } it-parallel@3.0.8: - resolution: {integrity: sha512-URLhs6eG4Hdr4OdvgBBPDzOjBeSSmI+Kqex2rv/aAyYClME26RYHirLVhZsZP5M+ZP6M34iRlXk8Wlqtezuqpg==} + resolution: + { + integrity: sha512-URLhs6eG4Hdr4OdvgBBPDzOjBeSSmI+Kqex2rv/aAyYClME26RYHirLVhZsZP5M+ZP6M34iRlXk8Wlqtezuqpg==, + } it-peekable@3.0.5: - resolution: {integrity: sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==} + resolution: + { + integrity: sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==, + } it-pipe@3.0.1: - resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } it-pushable@3.2.3: - resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} + resolution: + { + integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==, + } it-stream-types@2.0.1: - resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, + } + engines: { node: ">= 10.13.0" } jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + resolution: + { + integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==, + } js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + resolution: + { + integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true jsbi@4.3.0: - resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + resolution: + { + integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==, + } jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + resolution: + { + integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==, + } json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { "0": node >= 0.2.0 } jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + resolution: + { + integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==, + } jsonstream-next@3.0.0: - resolution: {integrity: sha512-aAi6oPhdt7BKyQn1SrIIGZBt0ukKuOUE1qV6kJ3GgioSOYzsRc8z9Hfr1BVmacA/jLe9nARfmgMGgn68BqIAgg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-aAi6oPhdt7BKyQn1SrIIGZBt0ukKuOUE1qV6kJ3GgioSOYzsRc8z9Hfr1BVmacA/jLe9nARfmgMGgn68BqIAgg==, + } + engines: { node: ">=10" } hasBin: true just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + resolution: + { + integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==, + } jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + resolution: + { + integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==, + } keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==, + } + engines: { node: ">= 0.6" } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + resolution: + { + integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==, + } koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==, + } + engines: { node: ">= 10" } koa-etag@4.0.0: - resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} + resolution: + { + integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==, + } koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==, + } + engines: { node: ">= 8" } koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} + resolution: + { + integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==, + } + engines: { node: ">= 7.6.0" } koa@2.15.3: - resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + resolution: + { + integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==, + } + engines: { node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4 } kysely@0.26.3: - resolution: {integrity: sha512-yWSgGi9bY13b/W06DD2OCDDHQmq1kwTGYlQ4wpZkMOJqMGCstVCFIvxCCVG4KfY1/3G0MhDAcZsip/Lw8/vJWw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-yWSgGi9bY13b/W06DD2OCDDHQmq1kwTGYlQ4wpZkMOJqMGCstVCFIvxCCVG4KfY1/3G0MhDAcZsip/Lw8/vJWw==, + } + engines: { node: ">=14.0.0" } layerr@2.1.0: - resolution: {integrity: sha512-xDD9suWxfBYeXgqffRVH/Wqh+mqZrQcqPRn0I0ijl7iJQ7vu8gMGPt1Qop59pEW/jaIDNUN7+PX1Qk40+vuflg==} + resolution: + { + integrity: sha512-xDD9suWxfBYeXgqffRVH/Wqh+mqZrQcqPRn0I0ijl7iJQ7vu8gMGPt1Qop59pEW/jaIDNUN7+PX1Qk40+vuflg==, + } level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==, + } + engines: { node: ">=12" } level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==, + } + engines: { node: ">=12" } level@8.0.0: - resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==, + } + engines: { node: ">=12" } level@8.0.1: - resolution: {integrity: sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==, + } + engines: { node: ">=12" } levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, + } + engines: { node: ">= 0.8.0" } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + resolution: + { + integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==, + } load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, + } + engines: { node: ">=6" } loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + resolution: + { + integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, + } + engines: { node: ">=6.11.5" } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + resolution: + { + integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==, + } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: ">=10" } log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==, + } + engines: { node: ">=10" } loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + resolution: + { + integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==, + } loglevel@1.9.1: - resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==, + } + engines: { node: ">= 0.6.0" } long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + resolution: + { + integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, + } loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + resolution: + { + integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, + } loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + resolution: + { + integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==, + } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + resolution: + { + integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, + } lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: ">=12" } lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} + resolution: + { + integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, + } + engines: { node: ">=16.14" } lru-cache@9.1.2: - resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} - engines: {node: 14 || >=16.14} + resolution: + { + integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==, + } + engines: { node: 14 || >=16.14 } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: ">=10" } map-stream@0.0.7: - resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} + resolution: + { + integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==, + } marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + resolution: + { + integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==, + } md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + resolution: + { + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, + } md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + resolution: + { + integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, + } media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + resolution: + { + integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, + } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: ">= 0.6" } micro-packed@0.5.3: - resolution: {integrity: sha512-zWRoH+qUb/ZMp9gVZhexvRGCENDM5HEQF4sflqpdilUHWK2/zKR7/MT8GBctnTwbhNJwy1iuk5q6+TYP7/twYA==} + resolution: + { + integrity: sha512-zWRoH+qUb/ZMp9gVZhexvRGCENDM5HEQF4sflqpdilUHWK2/zKR7/MT8GBctnTwbhNJwy1iuk5q6+TYP7/twYA==, + } micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==, + } + engines: { node: ">=8.6" } miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + resolution: + { + integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, + } hasBin: true mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } hasBin: true mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + { + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, + } minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + resolution: + { + integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, + } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, + } + engines: { node: ">=10" } minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, + } + engines: { node: ">=16 || 14 >=14.17" } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: ">=16 || 14 >=14.17" } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, + } + engines: { node: ">=8" } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: ">=16 || 14 >=14.17" } mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + resolution: + { + integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==, + } mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } hasBin: true mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: ">=10" } hasBin: true mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==, + } + engines: { node: ">=10" } hasBin: true mocha-junit-reporter@2.2.1: - resolution: {integrity: sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==} + resolution: + { + integrity: sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==, + } peerDependencies: - mocha: '>=2.2.5' + mocha: ">=2.2.5" mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==, + } + engines: { node: ">= 14.0.0" } hasBin: true mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==, + } + engines: { node: ">= 14.0.0" } hasBin: true mocha@10.7.0: - resolution: {integrity: sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==} - engines: {node: '>= 14.0.0'} + resolution: + { + integrity: sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==, + } + engines: { node: ">= 14.0.0" } hasBin: true module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==, + } + engines: { node: ">=10" } mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: ">=4" } ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } multiformats@11.0.2: - resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } multiformats@12.0.1: - resolution: {integrity: sha512-s01wijBJoDUqESWSzePY0lvTw7J3PVO9x2Cc6ASI5AMZM2Gnhh7BC17+nlFhHKU7dDzaCaRfb+NiqNzOsgPUoQ==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-s01wijBJoDUqESWSzePY0lvTw7J3PVO9x2Cc6ASI5AMZM2Gnhh7BC17+nlFhHKU7dDzaCaRfb+NiqNzOsgPUoQ==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } multiformats@12.1.3: - resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} - engines: {node: '>=16.0.0', npm: '>=7.0.0'} + resolution: + { + integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==, + } + engines: { node: ">=16.0.0", npm: ">=7.0.0" } multiformats@13.1.0: - resolution: {integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==} + resolution: + { + integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==, + } multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + resolution: + { + integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==, + } murmurhash3js-revisited@3.0.0: - resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==, + } + engines: { node: ">=8.0.0" } mysql2@3.11.0: - resolution: {integrity: sha512-J9phbsXGvTOcRVPR95YedzVSxJecpW5A5+cQ57rhHIFXteTP10HCs+VBjS7DHIKfEaI1zQ5tlVrquCd64A6YvA==} - engines: {node: '>= 8.0'} + resolution: + { + integrity: sha512-J9phbsXGvTOcRVPR95YedzVSxJecpW5A5+cQ57rhHIFXteTP10HCs+VBjS7DHIKfEaI1zQ5tlVrquCd64A6YvA==, + } + engines: { node: ">= 8.0" } named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, + } + engines: { node: ">=12.0.0" } nanocolors@0.2.13: - resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} + resolution: + { + integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==, + } nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + resolution: + { + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + } napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + resolution: + { + integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==, + } natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: ">= 0.6" } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, + } + engines: { node: ">= 0.4.0" } nise@6.0.0: - resolution: {integrity: sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==} + resolution: + { + integrity: sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==, + } node-abi@3.65.0: - resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==, + } + engines: { node: ">=10" } node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + resolution: + { + integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, + } node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -4617,895 +7360,1597 @@ packages: optional: true node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + resolution: + { + integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==, + } hasBin: true node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + resolution: + { + integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==, + } node-stdlib-browser@1.2.0: - resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==, + } + engines: { node: ">=10" } normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==, + } + engines: { node: ^16.14.0 || >=18.0.0 } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } npkill@0.11.3: - resolution: {integrity: sha512-3lqJcuXw3mJoIpIrcSWmBx477wEKAv9WOVnMgDf4zWKOZNfnPETi1Wwn8CsjSLVNgulFgDy2ScmTh8io3EGxIw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-3lqJcuXw3mJoIpIrcSWmBx477wEKAv9WOVnMgDf4zWKOZNfnPETi1Wwn8CsjSLVNgulFgDy2ScmTh8io3EGxIw==, + } + engines: { node: ">=14.0.0" } hasBin: true npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } npm-package-arg@11.0.3: - resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==, + } + engines: { node: ^16.14.0 || >=18.0.0 } npm-pick-manifest@9.1.0: - resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { + integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==, + } + engines: { node: ^16.14.0 || >=18.0.0 } npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==, + } + engines: { node: ">= 0.4" } object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==, + } + engines: { node: ">= 0.4" } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: ">= 0.4" } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, + } + engines: { node: ">= 0.8" } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + resolution: + { + integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==, + } open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: ">=12" } optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, + } + engines: { node: ">= 0.8.0" } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: ">= 0.8.0" } os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + resolution: + { + integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==, + } os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: ">=0.10.0" } outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + resolution: + { + integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==, + } p-defer@4.0.1: - resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==, + } + engines: { node: ">=12" } p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==, + } + engines: { node: ">=8" } p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, + } + engines: { node: ">=8" } p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + } + engines: { node: ">=4" } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, + } + engines: { node: ">=6" } p-queue@7.4.1: - resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==, + } + engines: { node: ">=12" } p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, + } + engines: { node: ">=8" } p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==, + } + engines: { node: ">=12" } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==, + } + engines: { node: ">= 14" } pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==, + } + engines: { node: ">= 14" } package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + resolution: + { + integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==, + } pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + resolution: + { + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, + } pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + resolution: + { + integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } parse-asn1@5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==, + } + engines: { node: ">= 0.10" } parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + resolution: + { + integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, + } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: ">=16 || 14 >=14.18" } path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + resolution: + { + integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, + } path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + resolution: + { + integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==, + } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: ">=8" } pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + resolution: + { + integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, + } pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + resolution: + { + integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, + } + engines: { node: ">= 14.16" } pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + resolution: + { + integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==, + } pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, + } + engines: { node: ">=0.12" } pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: + { + integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, + } pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + resolution: + { + integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==, + } pg-connection-string@2.6.4: - resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + resolution: + { + integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==, + } pg-cursor@2.11.0: - resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} + resolution: + { + integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==, + } peerDependencies: pg: ^8 pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==, + } + engines: { node: ">=4.0.0" } pg-pool@3.6.2: - resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + resolution: + { + integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==, + } peerDependencies: - pg: '>=8.0' + pg: ">=8.0" pg-protocol@1.6.1: - resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + resolution: + { + integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==, + } pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==, + } + engines: { node: ">=4" } pg@8.12.0: - resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==, + } + engines: { node: ">= 8.0.0" } peerDependencies: - pg-native: '>=3.0.1' + pg-native: ">=3.0.1" peerDependenciesMeta: pg-native: optional: true pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + resolution: + { + integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==, + } picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + resolution: + { + integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: ">=6" } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: ">=8" } pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==, + } + engines: { node: ">=10" } playwright-core@1.45.3: - resolution: {integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==, + } + engines: { node: ">=18" } hasBin: true playwright@1.45.3: - resolution: {integrity: sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==, + } + engines: { node: ">=18" } hasBin: true portfinder@1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} + resolution: + { + integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==, + } + engines: { node: ">= 0.12.0" } possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: ">= 0.4" } postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==, + } + engines: { node: ">=4" } postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==, + } + engines: { node: ">=0.10.0" } postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==, + } + engines: { node: ">=0.10.0" } postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==, + } + engines: { node: ">=0.10.0" } prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==, + } + engines: { node: ">=10" } hasBin: true preferred-pm@3.1.4: - resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==, + } + engines: { node: ">=10" } prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, + } + engines: { node: ">= 0.8.0" } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: ">=10.13.0" } hasBin: true proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: ">= 0.6.0" } progress-events@1.0.1: - resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==} + resolution: + { + integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==, + } progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, + } + engines: { node: ">=0.4.0" } prom-client@14.2.0: - resolution: {integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==, + } + engines: { node: ">=10" } promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + resolution: + { + integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, + } peerDependencies: - bluebird: '*' + bluebird: "*" peerDependenciesMeta: bluebird: optional: true promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, + } + engines: { node: ">=10" } protons-runtime@5.4.0: - resolution: {integrity: sha512-XfA++W/WlQOSyjUyuF5lgYBfXZUEMP01Oh1C2dSwZAlF2e/ZrMRPfWonXj6BGM+o8Xciv7w0tsRMKYwYEuQvaw==} + resolution: + { + integrity: sha512-XfA++W/WlQOSyjUyuF5lgYBfXZUEMP01Oh1C2dSwZAlF2e/ZrMRPfWonXj6BGM+o8Xciv7w0tsRMKYwYEuQvaw==, + } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==, + } + engines: { node: ">= 14" } proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + resolution: + { + integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, + } public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + resolution: + { + integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, + } pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + resolution: + { + integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } puppeteer-core@22.15.0: - resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==, + } + engines: { node: ">=18" } qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + } + engines: { node: ">=0.6" } qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, + } + engines: { node: ">=0.6" } querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} + resolution: + { + integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==, + } + engines: { node: ">=0.4.x" } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + resolution: + { + integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, + } rabin-wasm@0.1.5: - resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} + resolution: + { + integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==, + } hasBin: true rambda@7.5.0: - resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + resolution: + { + integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==, + } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + resolution: + { + integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: ">= 0.8" } rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } hasBin: true read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==, + } + engines: { node: ">=6" } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==, + } + engines: { node: ">=8" } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } readline-transform@1.0.0: - resolution: {integrity: sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg==, + } + engines: { node: ">=6" } regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==, + } + engines: { node: ">= 0.4" } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==, + } + engines: { node: ">= 0.8" } resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } hasBin: true response-time@2.3.2: - resolution: {integrity: sha512-MUIDaDQf+CVqflfTdQ5yam+aYCkXj1PY8fjlPDQ6ppxJlmgZb864pHtA750mayywNg8tx4rS7qH9JXd/OF+3gw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-MUIDaDQf+CVqflfTdQ5yam+aYCkXj1PY8fjlPDQ6ppxJlmgZb864pHtA750mayywNg8tx4rS7qH9JXd/OF+3gw==, + } + engines: { node: ">= 0.8.0" } restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: ">=8" } retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, + } + engines: { node: ">= 4" } reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } rimraf@4.4.0: - resolution: {integrity: sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==, + } + engines: { node: ">=14" } hasBin: true rimraf@5.0.7: - resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} - engines: {node: '>=14.18'} + resolution: + { + integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==, + } + engines: { node: ">=14.18" } hasBin: true ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + resolution: + { + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, + } rollup@4.20.0: - resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true run-parallel-limit@1.1.0: - resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} + resolution: + { + integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==, + } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, + } + engines: { node: ">=0.4" } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, + } + engines: { node: ">= 0.4" } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + } + engines: { node: ">= 10.13.0" } semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, + } + engines: { node: ">=10" } hasBin: true send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, + } + engines: { node: ">= 0.8.0" } seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + resolution: + { + integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, + } serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + resolution: + { + integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, + } serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + resolution: + { + integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, + } serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, + } + engines: { node: ">= 0.8.0" } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + resolution: + { + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, + } setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + resolution: + { + integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, + } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } hasBin: true shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: ">=0.10.0" } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: ">=0.10.0" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: ">= 0.4" } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } sinon@18.0.0: - resolution: {integrity: sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==} + resolution: + { + integrity: sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==, + } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: ">=10" } smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + resolution: + { + integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, + } + engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==, + } + engines: { node: ">= 14" } socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + resolution: + { + integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==, + } + engines: { node: ">= 10.0.0", npm: ">= 3.0.0" } source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + } + engines: { node: ">=0.10.0" } source-map-loader@4.0.2: - resolution: {integrity: sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==} - engines: {node: '>= 14.15.0'} + resolution: + { + integrity: sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==, + } + engines: { node: ">= 14.15.0" } peerDependencies: webpack: ^5.72.1 source-map-loader@5.0.0: - resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==, + } + engines: { node: ">= 18.12.0" } peerDependencies: webpack: ^5.72.1 source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } sparse-array@1.3.2: - resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + resolution: + { + integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==, + } spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + resolution: + { + integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==, + } spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + resolution: + { + integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==, + } split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: ">= 10.x" } split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + resolution: + { + integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==, + } sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, + } + engines: { node: ">= 0.6" } static-eval@2.0.2: - resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + resolution: + { + integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==, + } statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, + } + engines: { node: ">= 0.6" } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + resolution: + { + integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, + } stream-combiner@0.2.2: - resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} + resolution: + { + integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==, + } stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + resolution: + { + integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==, + } streamx@2.18.0: - resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + resolution: + { + integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==, + } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==, + } + engines: { node: ">= 0.4" } string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, + } + engines: { node: ">= 0.4" } string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + resolution: + { + integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, + } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: ">=10" } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } table-layout@4.1.1: - resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} - engines: {node: '>=12.17'} + resolution: + { + integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==, + } + engines: { node: ">=12.17" } tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: ">=6" } tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + resolution: + { + integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==, + } tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + resolution: + { + integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==, + } tdigest@0.1.2: - resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + resolution: + { + integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==, + } term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, + } + engines: { node: ">=8" } terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==, + } + engines: { node: ">= 10.13.0" } peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' + "@swc/core": "*" + esbuild: "*" + uglify-js: "*" webpack: ^5.1.0 peerDependenciesMeta: - '@swc/core': + "@swc/core": optional: true esbuild: optional: true @@ -5513,348 +8958,615 @@ packages: optional: true terser@5.31.3: - resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==, + } + engines: { node: ">=10" } hasBin: true test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: ">=8" } test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, + } + engines: { node: ">=18" } text-decoder@1.1.1: - resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + resolution: + { + integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==, + } text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + resolution: + { + integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, + } through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==, + } + engines: { node: ">=0.6.0" } tiny-each-async@2.0.3: - resolution: {integrity: sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==} + resolution: + { + integrity: sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==, + } tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: ">=0.6.0" } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==, + } + engines: { node: ">=18" } ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==, + } + engines: { node: ">=16" } peerDependencies: - typescript: '>=4.2.0' + typescript: ">=4.2.0" tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + resolution: + { + integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==, + } tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} + resolution: + { + integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==, + } + engines: { node: ">=0.6.x" } tty-browserify@0.0.1: - resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + resolution: + { + integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==, + } tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, + } + engines: { node: ">= 0.8.0" } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: ">=4" } type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==, + } + engines: { node: ">=4" } type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: ">=10" } type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, + } + engines: { node: ">= 0.4" } typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, + } + engines: { node: ">= 0.4" } typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==, + } + engines: { node: ">= 0.4" } typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==, + } + engines: { node: ">= 0.4" } typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==, + } + engines: { node: ">=14.17" } hasBin: true typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==, + } + engines: { node: ">=14.17" } hasBin: true typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==, + } + engines: { node: ">=14.17" } hasBin: true typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==, + } + engines: { node: ">=14.17" } hasBin: true typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==, + } + engines: { node: ">=8" } typical@7.1.1: - resolution: {integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==} - engines: {node: '>=12.17'} + resolution: + { + integrity: sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==, + } + engines: { node: ">=12.17" } uint8-util@2.2.5: - resolution: {integrity: sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw==} + resolution: + { + integrity: sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw==, + } uint8-varint@2.0.4: - resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} + resolution: + { + integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==, + } uint8arraylist@2.4.8: - resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + resolution: + { + integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==, + } uint8arrays@3.1.1: - resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + resolution: + { + integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==, + } uint8arrays@4.0.10: - resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} + resolution: + { + integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==, + } uint8arrays@5.1.0: - resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} + resolution: + { + integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==, + } ulidx@2.1.0: - resolution: {integrity: sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==, + } + engines: { node: ">=16" } unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + resolution: + { + integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==, + } undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: ">= 4.0.0" } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + resolution: + { + integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==, + } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==, + } + engines: { node: ">= 0.4" } urlpattern-polyfill@10.0.0: - resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + resolution: + { + integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==, + } utf8-codec@1.0.0: - resolution: {integrity: sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==} + resolution: + { + integrity: sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==, + } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + resolution: + { + integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, + } utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: ">= 0.4.0" } uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } hasBin: true uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + resolution: + { + integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==, + } hasBin: true uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } hasBin: true v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} + resolution: + { + integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==, + } + engines: { node: ">=10.12.0" } validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } varint@6.0.0: - resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + resolution: + { + integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==, + } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + resolution: + { + integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, + } watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==, + } + engines: { node: ">=10.13.0" } web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, + } + engines: { node: ">= 8" } webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, + } + engines: { node: ">=12" } webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, + } + engines: { node: ">=10.13.0" } webpack@5.93.0: - resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==, + } + engines: { node: ">=10.13.0" } hasBin: true peerDependencies: - webpack-cli: '*' + webpack-cli: "*" peerDependenciesMeta: webpack-cli: optional: true whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==, + } + engines: { node: ">=18" } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } which-pm@2.2.0: - resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} - engines: {node: '>=8.15'} + resolution: + { + integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==, + } + engines: { node: ">=8.15" } which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, + } + engines: { node: ">= 0.4" } which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } hasBin: true which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } hasBin: true which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, + } + engines: { node: ^16.13.0 || >=18.0.0 } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } wordwrapjs@5.1.0: - resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} - engines: {node: '>=12.17'} + resolution: + { + integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==, + } + engines: { node: ">=12.17" } workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + resolution: + { + integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, + } workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + resolution: + { + integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==, + } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: ">=8" } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, + } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true @@ -5862,470 +9574,511 @@ packages: optional: true xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + resolution: + { + integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==, + } xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + resolution: + { + integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, + } yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==, + } + engines: { node: ">=10" } yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: ">=10" } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, + } + engines: { node: ">=10" } yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: ">=10" } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + resolution: + { + integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, + } ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==, + } + engines: { node: ">= 4.0.0" } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + resolution: + { + integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==, + } snapshots: + "@assemblyscript/loader@0.9.4": {} - '@assemblyscript/loader@0.9.4': {} - - '@astronautlabs/jsonpath@1.1.2': + "@astronautlabs/jsonpath@1.1.2": dependencies: static-eval: 2.0.2 - '@aws-crypto/sha256-browser@5.2.0': + "@aws-crypto/sha256-browser@5.2.0": dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-locate-window': 3.568.0 - '@smithy/util-utf8': 2.3.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-crypto/supports-web-crypto": 5.2.0 + "@aws-crypto/util": 5.2.0 + "@aws-sdk/types": 3.609.0 + "@aws-sdk/util-locate-window": 3.568.0 + "@smithy/util-utf8": 2.3.0 tslib: 2.6.3 - '@aws-crypto/sha256-js@5.2.0': + "@aws-crypto/sha256-js@5.2.0": dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.609.0 + "@aws-crypto/util": 5.2.0 + "@aws-sdk/types": 3.609.0 tslib: 2.6.3 - '@aws-crypto/supports-web-crypto@5.2.0': + "@aws-crypto/supports-web-crypto@5.2.0": dependencies: tslib: 2.6.3 - '@aws-crypto/util@5.2.0': + "@aws-crypto/util@5.2.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/util-utf8': 2.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/util-utf8": 2.3.0 tslib: 2.6.3 - '@aws-sdk/client-kms@3.616.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.616.0(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/client-sts': 3.616.0 - '@aws-sdk/core': 3.616.0 - '@aws-sdk/credential-provider-node': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/middleware-host-header': 3.616.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.616.0 - '@aws-sdk/middleware-user-agent': 3.616.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.614.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.3.2 - '@smithy/fetch-http-handler': 3.2.4 - '@smithy/hash-node': 3.0.3 - '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.5 - '@smithy/middleware-endpoint': 3.1.0 - '@smithy/middleware-retry': 3.0.14 - '@smithy/middleware-serde': 3.0.3 - '@smithy/middleware-stack': 3.0.3 - '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.4 - '@smithy/protocol-http': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/url-parser': 3.0.3 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.14 - '@smithy/util-defaults-mode-node': 3.0.14 - '@smithy/util-endpoints': 2.0.5 - '@smithy/util-middleware': 3.0.3 - '@smithy/util-retry': 3.0.3 - '@smithy/util-utf8': 3.0.0 + "@aws-sdk/client-kms@3.616.0": + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/client-sso-oidc": 3.616.0(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/client-sts": 3.616.0 + "@aws-sdk/core": 3.616.0 + "@aws-sdk/credential-provider-node": 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/middleware-host-header": 3.616.0 + "@aws-sdk/middleware-logger": 3.609.0 + "@aws-sdk/middleware-recursion-detection": 3.616.0 + "@aws-sdk/middleware-user-agent": 3.616.0 + "@aws-sdk/region-config-resolver": 3.614.0 + "@aws-sdk/types": 3.609.0 + "@aws-sdk/util-endpoints": 3.614.0 + "@aws-sdk/util-user-agent-browser": 3.609.0 + "@aws-sdk/util-user-agent-node": 3.614.0 + "@smithy/config-resolver": 3.0.5 + "@smithy/core": 2.3.2 + "@smithy/fetch-http-handler": 3.2.4 + "@smithy/hash-node": 3.0.3 + "@smithy/invalid-dependency": 3.0.3 + "@smithy/middleware-content-length": 3.0.5 + "@smithy/middleware-endpoint": 3.1.0 + "@smithy/middleware-retry": 3.0.14 + "@smithy/middleware-serde": 3.0.3 + "@smithy/middleware-stack": 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/node-http-handler": 3.1.4 + "@smithy/protocol-http": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/url-parser": 3.0.3 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.14 + "@smithy/util-defaults-mode-node": 3.0.14 + "@smithy/util-endpoints": 2.0.5 + "@smithy/util-middleware": 3.0.3 + "@smithy/util-retry": 3.0.3 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.616.0 - '@aws-sdk/core': 3.616.0 - '@aws-sdk/credential-provider-node': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/middleware-host-header': 3.616.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.616.0 - '@aws-sdk/middleware-user-agent': 3.616.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.614.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.3.2 - '@smithy/fetch-http-handler': 3.2.4 - '@smithy/hash-node': 3.0.3 - '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.5 - '@smithy/middleware-endpoint': 3.1.0 - '@smithy/middleware-retry': 3.0.14 - '@smithy/middleware-serde': 3.0.3 - '@smithy/middleware-stack': 3.0.3 - '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.4 - '@smithy/protocol-http': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/url-parser': 3.0.3 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.14 - '@smithy/util-defaults-mode-node': 3.0.14 - '@smithy/util-endpoints': 2.0.5 - '@smithy/util-middleware': 3.0.3 - '@smithy/util-retry': 3.0.3 - '@smithy/util-utf8': 3.0.0 + "@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)": + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/client-sts": 3.616.0 + "@aws-sdk/core": 3.616.0 + "@aws-sdk/credential-provider-node": 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/middleware-host-header": 3.616.0 + "@aws-sdk/middleware-logger": 3.609.0 + "@aws-sdk/middleware-recursion-detection": 3.616.0 + "@aws-sdk/middleware-user-agent": 3.616.0 + "@aws-sdk/region-config-resolver": 3.614.0 + "@aws-sdk/types": 3.609.0 + "@aws-sdk/util-endpoints": 3.614.0 + "@aws-sdk/util-user-agent-browser": 3.609.0 + "@aws-sdk/util-user-agent-node": 3.614.0 + "@smithy/config-resolver": 3.0.5 + "@smithy/core": 2.3.2 + "@smithy/fetch-http-handler": 3.2.4 + "@smithy/hash-node": 3.0.3 + "@smithy/invalid-dependency": 3.0.3 + "@smithy/middleware-content-length": 3.0.5 + "@smithy/middleware-endpoint": 3.1.0 + "@smithy/middleware-retry": 3.0.14 + "@smithy/middleware-serde": 3.0.3 + "@smithy/middleware-stack": 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/node-http-handler": 3.1.4 + "@smithy/protocol-http": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/url-parser": 3.0.3 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.14 + "@smithy/util-defaults-mode-node": 3.0.14 + "@smithy/util-endpoints": 2.0.5 + "@smithy/util-middleware": 3.0.3 + "@smithy/util-retry": 3.0.3 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.616.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.616.0 - '@aws-sdk/middleware-host-header': 3.616.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.616.0 - '@aws-sdk/middleware-user-agent': 3.616.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.614.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.3.2 - '@smithy/fetch-http-handler': 3.2.4 - '@smithy/hash-node': 3.0.3 - '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.5 - '@smithy/middleware-endpoint': 3.1.0 - '@smithy/middleware-retry': 3.0.14 - '@smithy/middleware-serde': 3.0.3 - '@smithy/middleware-stack': 3.0.3 - '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.4 - '@smithy/protocol-http': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/url-parser': 3.0.3 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.14 - '@smithy/util-defaults-mode-node': 3.0.14 - '@smithy/util-endpoints': 2.0.5 - '@smithy/util-middleware': 3.0.3 - '@smithy/util-retry': 3.0.3 - '@smithy/util-utf8': 3.0.0 + "@aws-sdk/client-sso@3.616.0": + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.616.0 + "@aws-sdk/middleware-host-header": 3.616.0 + "@aws-sdk/middleware-logger": 3.609.0 + "@aws-sdk/middleware-recursion-detection": 3.616.0 + "@aws-sdk/middleware-user-agent": 3.616.0 + "@aws-sdk/region-config-resolver": 3.614.0 + "@aws-sdk/types": 3.609.0 + "@aws-sdk/util-endpoints": 3.614.0 + "@aws-sdk/util-user-agent-browser": 3.609.0 + "@aws-sdk/util-user-agent-node": 3.614.0 + "@smithy/config-resolver": 3.0.5 + "@smithy/core": 2.3.2 + "@smithy/fetch-http-handler": 3.2.4 + "@smithy/hash-node": 3.0.3 + "@smithy/invalid-dependency": 3.0.3 + "@smithy/middleware-content-length": 3.0.5 + "@smithy/middleware-endpoint": 3.1.0 + "@smithy/middleware-retry": 3.0.14 + "@smithy/middleware-serde": 3.0.3 + "@smithy/middleware-stack": 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/node-http-handler": 3.1.4 + "@smithy/protocol-http": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/url-parser": 3.0.3 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.14 + "@smithy/util-defaults-mode-node": 3.0.14 + "@smithy/util-endpoints": 2.0.5 + "@smithy/util-middleware": 3.0.3 + "@smithy/util-retry": 3.0.3 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.616.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.616.0(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/core': 3.616.0 - '@aws-sdk/credential-provider-node': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/middleware-host-header': 3.616.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.616.0 - '@aws-sdk/middleware-user-agent': 3.616.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.614.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.3.2 - '@smithy/fetch-http-handler': 3.2.4 - '@smithy/hash-node': 3.0.3 - '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.5 - '@smithy/middleware-endpoint': 3.1.0 - '@smithy/middleware-retry': 3.0.14 - '@smithy/middleware-serde': 3.0.3 - '@smithy/middleware-stack': 3.0.3 - '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.4 - '@smithy/protocol-http': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/url-parser': 3.0.3 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.14 - '@smithy/util-defaults-mode-node': 3.0.14 - '@smithy/util-endpoints': 2.0.5 - '@smithy/util-middleware': 3.0.3 - '@smithy/util-retry': 3.0.3 - '@smithy/util-utf8': 3.0.0 + "@aws-sdk/client-sts@3.616.0": + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/client-sso-oidc": 3.616.0(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/core": 3.616.0 + "@aws-sdk/credential-provider-node": 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/middleware-host-header": 3.616.0 + "@aws-sdk/middleware-logger": 3.609.0 + "@aws-sdk/middleware-recursion-detection": 3.616.0 + "@aws-sdk/middleware-user-agent": 3.616.0 + "@aws-sdk/region-config-resolver": 3.614.0 + "@aws-sdk/types": 3.609.0 + "@aws-sdk/util-endpoints": 3.614.0 + "@aws-sdk/util-user-agent-browser": 3.609.0 + "@aws-sdk/util-user-agent-node": 3.614.0 + "@smithy/config-resolver": 3.0.5 + "@smithy/core": 2.3.2 + "@smithy/fetch-http-handler": 3.2.4 + "@smithy/hash-node": 3.0.3 + "@smithy/invalid-dependency": 3.0.3 + "@smithy/middleware-content-length": 3.0.5 + "@smithy/middleware-endpoint": 3.1.0 + "@smithy/middleware-retry": 3.0.14 + "@smithy/middleware-serde": 3.0.3 + "@smithy/middleware-stack": 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/node-http-handler": 3.1.4 + "@smithy/protocol-http": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/url-parser": 3.0.3 + "@smithy/util-base64": 3.0.0 + "@smithy/util-body-length-browser": 3.0.0 + "@smithy/util-body-length-node": 3.0.0 + "@smithy/util-defaults-mode-browser": 3.0.14 + "@smithy/util-defaults-mode-node": 3.0.14 + "@smithy/util-endpoints": 2.0.5 + "@smithy/util-middleware": 3.0.3 + "@smithy/util-retry": 3.0.3 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.616.0': + "@aws-sdk/core@3.616.0": dependencies: - '@smithy/core': 2.3.2 - '@smithy/protocol-http': 4.1.0 - '@smithy/signature-v4': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 + "@smithy/core": 2.3.2 + "@smithy/protocol-http": 4.1.0 + "@smithy/signature-v4": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 fast-xml-parser: 4.4.1 tslib: 2.6.3 - '@aws-sdk/credential-provider-env@3.609.0': + "@aws-sdk/credential-provider-env@3.609.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/property-provider": 3.1.3 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/credential-provider-http@3.616.0': + "@aws-sdk/credential-provider-http@3.616.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/fetch-http-handler': 3.2.4 - '@smithy/node-http-handler': 3.1.4 - '@smithy/property-provider': 3.1.3 - '@smithy/protocol-http': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/util-stream': 3.1.3 + "@aws-sdk/types": 3.609.0 + "@smithy/fetch-http-handler": 3.2.4 + "@smithy/node-http-handler": 3.1.4 + "@smithy/property-provider": 3.1.3 + "@smithy/protocol-http": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/util-stream": 3.1.3 tslib: 2.6.3 - '@aws-sdk/credential-provider-ini@3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0)': - dependencies: - '@aws-sdk/client-sts': 3.616.0 - '@aws-sdk/credential-provider-env': 3.609.0 - '@aws-sdk/credential-provider-http': 3.616.0 - '@aws-sdk/credential-provider-process': 3.614.0 - '@aws-sdk/credential-provider-sso': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)) - '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/types': 3.609.0 - '@smithy/credential-provider-imds': 3.2.0 - '@smithy/property-provider': 3.1.3 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + "@aws-sdk/credential-provider-ini@3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0)": + dependencies: + "@aws-sdk/client-sts": 3.616.0 + "@aws-sdk/credential-provider-env": 3.609.0 + "@aws-sdk/credential-provider-http": 3.616.0 + "@aws-sdk/credential-provider-process": 3.614.0 + "@aws-sdk/credential-provider-sso": 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)) + "@aws-sdk/credential-provider-web-identity": 3.609.0(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/types": 3.609.0 + "@smithy/credential-provider-imds": 3.2.0 + "@smithy/property-provider": 3.1.3 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' + - "@aws-sdk/client-sso-oidc" - aws-crt - '@aws-sdk/credential-provider-node@3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.609.0 - '@aws-sdk/credential-provider-http': 3.616.0 - '@aws-sdk/credential-provider-ini': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/credential-provider-process': 3.614.0 - '@aws-sdk/credential-provider-sso': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)) - '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/types': 3.609.0 - '@smithy/credential-provider-imds': 3.2.0 - '@smithy/property-provider': 3.1.3 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + "@aws-sdk/credential-provider-node@3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0)": + dependencies: + "@aws-sdk/credential-provider-env": 3.609.0 + "@aws-sdk/credential-provider-http": 3.616.0 + "@aws-sdk/credential-provider-ini": 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/credential-provider-process": 3.614.0 + "@aws-sdk/credential-provider-sso": 3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)) + "@aws-sdk/credential-provider-web-identity": 3.609.0(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/types": 3.609.0 + "@smithy/credential-provider-imds": 3.2.0 + "@smithy/property-provider": 3.1.3 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' + - "@aws-sdk/client-sso-oidc" + - "@aws-sdk/client-sts" - aws-crt - '@aws-sdk/credential-provider-process@3.614.0': + "@aws-sdk/credential-provider-process@3.614.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.3 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/property-provider": 3.1.3 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/credential-provider-sso@3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))': + "@aws-sdk/credential-provider-sso@3.616.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))": dependencies: - '@aws-sdk/client-sso': 3.616.0 - '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)) - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.3 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + "@aws-sdk/client-sso": 3.616.0 + "@aws-sdk/token-providers": 3.614.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0)) + "@aws-sdk/types": 3.609.0 + "@smithy/property-provider": 3.1.3 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' + - "@aws-sdk/client-sso-oidc" - aws-crt - '@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.616.0)': + "@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.616.0)": dependencies: - '@aws-sdk/client-sts': 3.616.0 - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + "@aws-sdk/client-sts": 3.616.0 + "@aws-sdk/types": 3.609.0 + "@smithy/property-provider": 3.1.3 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/middleware-host-header@3.616.0': + "@aws-sdk/middleware-host-header@3.616.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.1.0 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/protocol-http": 4.1.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/middleware-logger@3.609.0': + "@aws-sdk/middleware-logger@3.609.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/middleware-recursion-detection@3.616.0': + "@aws-sdk/middleware-recursion-detection@3.616.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.1.0 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/protocol-http": 4.1.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/middleware-user-agent@3.616.0': + "@aws-sdk/middleware-user-agent@3.616.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.614.0 - '@smithy/protocol-http': 4.1.0 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@aws-sdk/util-endpoints": 3.614.0 + "@smithy/protocol-http": 4.1.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/region-config-resolver@3.614.0': + "@aws-sdk/region-config-resolver@3.614.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.3 + "@aws-sdk/types": 3.609.0 + "@smithy/node-config-provider": 3.1.4 + "@smithy/types": 3.3.0 + "@smithy/util-config-provider": 3.0.0 + "@smithy/util-middleware": 3.0.3 tslib: 2.6.3 - '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))': + "@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0))": dependencies: - '@aws-sdk/client-sso-oidc': 3.616.0(@aws-sdk/client-sts@3.616.0) - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.3 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + "@aws-sdk/client-sso-oidc": 3.616.0(@aws-sdk/client-sts@3.616.0) + "@aws-sdk/types": 3.609.0 + "@smithy/property-provider": 3.1.3 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/types@3.609.0': + "@aws-sdk/types@3.609.0": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@aws-sdk/util-endpoints@3.614.0': + "@aws-sdk/util-endpoints@3.614.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 - '@smithy/util-endpoints': 2.0.5 + "@aws-sdk/types": 3.609.0 + "@smithy/types": 3.3.0 + "@smithy/util-endpoints": 2.0.5 tslib: 2.6.3 - '@aws-sdk/util-locate-window@3.568.0': + "@aws-sdk/util-locate-window@3.568.0": dependencies: tslib: 2.6.3 - '@aws-sdk/util-user-agent-browser@3.609.0': + "@aws-sdk/util-user-agent-browser@3.609.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/types": 3.3.0 bowser: 2.11.0 tslib: 2.6.3 - '@aws-sdk/util-user-agent-node@3.614.0': + "@aws-sdk/util-user-agent-node@3.614.0": dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 + "@aws-sdk/types": 3.609.0 + "@smithy/node-config-provider": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@babel/code-frame@7.24.7': + "@babel/code-frame@7.24.7": dependencies: - '@babel/highlight': 7.24.7 + "@babel/highlight": 7.24.7 picocolors: 1.0.1 - '@babel/helper-validator-identifier@7.24.7': {} + "@babel/helper-validator-identifier@7.24.7": {} - '@babel/highlight@7.24.7': + "@babel/highlight@7.24.7": dependencies: - '@babel/helper-validator-identifier': 7.24.7 + "@babel/helper-validator-identifier": 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/runtime@7.25.0': + "@babel/runtime@7.25.0": dependencies: regenerator-runtime: 0.14.1 - '@bcoe/v8-coverage@0.2.3': {} + "@bcoe/v8-coverage@0.2.3": {} - '@changesets/apply-release-plan@7.0.4': + "@changesets/apply-release-plan@7.0.4": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/config': 3.0.2 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/should-skip-package': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.25.0 + "@changesets/config": 3.0.2 + "@changesets/get-version-range-type": 0.4.0 + "@changesets/git": 3.0.0 + "@changesets/should-skip-package": 0.1.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 lodash.startcase: 4.4.0 @@ -6334,47 +10087,47 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.3 - '@changesets/assemble-release-plan@6.0.3': + "@changesets/assemble-release-plan@6.0.3": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.1 - '@changesets/should-skip-package': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.25.0 + "@changesets/errors": 0.2.0 + "@changesets/get-dependents-graph": 2.1.1 + "@changesets/should-skip-package": 0.1.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 semver: 7.6.3 - '@changesets/changelog-git@0.2.0': + "@changesets/changelog-git@0.2.0": dependencies: - '@changesets/types': 6.0.0 + "@changesets/types": 6.0.0 - '@changesets/changelog-github@0.5.0': + "@changesets/changelog-github@0.5.0": dependencies: - '@changesets/get-github-info': 0.6.0 - '@changesets/types': 6.0.0 + "@changesets/get-github-info": 0.6.0 + "@changesets/types": 6.0.0 dotenv: 8.6.0 transitivePeerDependencies: - encoding - '@changesets/cli@2.27.7': - dependencies: - '@babel/runtime': 7.25.0 - '@changesets/apply-release-plan': 7.0.4 - '@changesets/assemble-release-plan': 6.0.3 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.2 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.1 - '@changesets/get-release-plan': 4.0.3 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/should-skip-package': 0.1.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.1 - '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 + "@changesets/cli@2.27.7": + dependencies: + "@babel/runtime": 7.25.0 + "@changesets/apply-release-plan": 7.0.4 + "@changesets/assemble-release-plan": 6.0.3 + "@changesets/changelog-git": 0.2.0 + "@changesets/config": 3.0.2 + "@changesets/errors": 0.2.0 + "@changesets/get-dependents-graph": 2.1.1 + "@changesets/get-release-plan": 4.0.3 + "@changesets/git": 3.0.0 + "@changesets/logger": 0.1.0 + "@changesets/pre": 2.0.0 + "@changesets/read": 0.6.0 + "@changesets/should-skip-package": 0.1.0 + "@changesets/types": 6.0.0 + "@changesets/write": 0.3.1 + "@manypkg/get-packages": 1.1.3 + "@types/semver": 7.5.8 ansi-colors: 4.1.3 chalk: 2.4.2 ci-info: 3.9.0 @@ -6391,357 +10144,357 @@ snapshots: spawndamnit: 2.0.0 term-size: 2.2.1 - '@changesets/config@3.0.2': + "@changesets/config@3.0.2": dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.1 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@changesets/errors": 0.2.0 + "@changesets/get-dependents-graph": 2.1.1 + "@changesets/logger": 0.1.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.7 - '@changesets/errors@0.2.0': + "@changesets/errors@0.2.0": dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.1': + "@changesets/get-dependents-graph@2.1.1": dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 semver: 7.6.3 - '@changesets/get-github-info@0.6.0': + "@changesets/get-github-info@0.6.0": dependencies: dataloader: 1.4.0 node-fetch: 2.7.0 transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.3': + "@changesets/get-release-plan@4.0.3": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/assemble-release-plan': 6.0.3 - '@changesets/config': 3.0.2 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.25.0 + "@changesets/assemble-release-plan": 6.0.3 + "@changesets/config": 3.0.2 + "@changesets/pre": 2.0.0 + "@changesets/read": 0.6.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 - '@changesets/get-version-range-type@0.4.0': {} + "@changesets/get-version-range-type@0.4.0": {} - '@changesets/git@3.0.0': + "@changesets/git@3.0.0": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.25.0 + "@changesets/errors": 0.2.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.7 spawndamnit: 2.0.0 - '@changesets/logger@0.1.0': + "@changesets/logger@0.1.0": dependencies: chalk: 2.4.2 - '@changesets/parse@0.4.0': + "@changesets/parse@0.4.0": dependencies: - '@changesets/types': 6.0.0 + "@changesets/types": 6.0.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.0': + "@changesets/pre@2.0.0": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.25.0 + "@changesets/errors": 0.2.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.0': + "@changesets/read@0.6.0": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + "@babel/runtime": 7.25.0 + "@changesets/git": 3.0.0 + "@changesets/logger": 0.1.0 + "@changesets/parse": 0.4.0 + "@changesets/types": 6.0.0 chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - '@changesets/should-skip-package@0.1.0': + "@changesets/should-skip-package@0.1.0": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 + "@babel/runtime": 7.25.0 + "@changesets/types": 6.0.0 + "@manypkg/get-packages": 1.1.3 - '@changesets/types@4.1.0': {} + "@changesets/types@4.1.0": {} - '@changesets/types@6.0.0': {} + "@changesets/types@6.0.0": {} - '@changesets/write@0.3.1': + "@changesets/write@0.3.1": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/types': 6.0.0 + "@babel/runtime": 7.25.0 + "@changesets/types": 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 - '@decentralized-identity/ion-sdk@1.0.4': + "@decentralized-identity/ion-sdk@1.0.4": dependencies: - '@noble/ed25519': 2.1.0 - '@noble/secp256k1': 2.1.0 + "@noble/ed25519": 2.1.0 + "@noble/secp256k1": 2.1.0 canonicalize: 2.0.0 multiformats: 12.1.3 uri-js: 4.4.1 - '@dnsquery/dns-packet@6.1.1': + "@dnsquery/dns-packet@6.1.1": dependencies: - '@leichtgewicht/ip-codec': 2.0.5 + "@leichtgewicht/ip-codec": 2.0.5 utf8-codec: 1.0.0 - '@esbuild/aix-ppc64@0.21.3': + "@esbuild/aix-ppc64@0.21.3": optional: true - '@esbuild/aix-ppc64@0.23.0': + "@esbuild/aix-ppc64@0.23.0": optional: true - '@esbuild/android-arm64@0.19.8': + "@esbuild/android-arm64@0.19.8": optional: true - '@esbuild/android-arm64@0.21.3': + "@esbuild/android-arm64@0.21.3": optional: true - '@esbuild/android-arm64@0.23.0': + "@esbuild/android-arm64@0.23.0": optional: true - '@esbuild/android-arm@0.19.8': + "@esbuild/android-arm@0.19.8": optional: true - '@esbuild/android-arm@0.21.3': + "@esbuild/android-arm@0.21.3": optional: true - '@esbuild/android-arm@0.23.0': + "@esbuild/android-arm@0.23.0": optional: true - '@esbuild/android-x64@0.19.8': + "@esbuild/android-x64@0.19.8": optional: true - '@esbuild/android-x64@0.21.3': + "@esbuild/android-x64@0.21.3": optional: true - '@esbuild/android-x64@0.23.0': + "@esbuild/android-x64@0.23.0": optional: true - '@esbuild/darwin-arm64@0.19.8': + "@esbuild/darwin-arm64@0.19.8": optional: true - '@esbuild/darwin-arm64@0.21.3': + "@esbuild/darwin-arm64@0.21.3": optional: true - '@esbuild/darwin-arm64@0.23.0': + "@esbuild/darwin-arm64@0.23.0": optional: true - '@esbuild/darwin-x64@0.19.8': + "@esbuild/darwin-x64@0.19.8": optional: true - '@esbuild/darwin-x64@0.21.3': + "@esbuild/darwin-x64@0.21.3": optional: true - '@esbuild/darwin-x64@0.23.0': + "@esbuild/darwin-x64@0.23.0": optional: true - '@esbuild/freebsd-arm64@0.19.8': + "@esbuild/freebsd-arm64@0.19.8": optional: true - '@esbuild/freebsd-arm64@0.21.3': + "@esbuild/freebsd-arm64@0.21.3": optional: true - '@esbuild/freebsd-arm64@0.23.0': + "@esbuild/freebsd-arm64@0.23.0": optional: true - '@esbuild/freebsd-x64@0.19.8': + "@esbuild/freebsd-x64@0.19.8": optional: true - '@esbuild/freebsd-x64@0.21.3': + "@esbuild/freebsd-x64@0.21.3": optional: true - '@esbuild/freebsd-x64@0.23.0': + "@esbuild/freebsd-x64@0.23.0": optional: true - '@esbuild/linux-arm64@0.19.8': + "@esbuild/linux-arm64@0.19.8": optional: true - '@esbuild/linux-arm64@0.21.3': + "@esbuild/linux-arm64@0.21.3": optional: true - '@esbuild/linux-arm64@0.23.0': + "@esbuild/linux-arm64@0.23.0": optional: true - '@esbuild/linux-arm@0.19.8': + "@esbuild/linux-arm@0.19.8": optional: true - '@esbuild/linux-arm@0.21.3': + "@esbuild/linux-arm@0.21.3": optional: true - '@esbuild/linux-arm@0.23.0': + "@esbuild/linux-arm@0.23.0": optional: true - '@esbuild/linux-ia32@0.19.8': + "@esbuild/linux-ia32@0.19.8": optional: true - '@esbuild/linux-ia32@0.21.3': + "@esbuild/linux-ia32@0.21.3": optional: true - '@esbuild/linux-ia32@0.23.0': + "@esbuild/linux-ia32@0.23.0": optional: true - '@esbuild/linux-loong64@0.19.8': + "@esbuild/linux-loong64@0.19.8": optional: true - '@esbuild/linux-loong64@0.21.3': + "@esbuild/linux-loong64@0.21.3": optional: true - '@esbuild/linux-loong64@0.23.0': + "@esbuild/linux-loong64@0.23.0": optional: true - '@esbuild/linux-mips64el@0.19.8': + "@esbuild/linux-mips64el@0.19.8": optional: true - '@esbuild/linux-mips64el@0.21.3': + "@esbuild/linux-mips64el@0.21.3": optional: true - '@esbuild/linux-mips64el@0.23.0': + "@esbuild/linux-mips64el@0.23.0": optional: true - '@esbuild/linux-ppc64@0.19.8': + "@esbuild/linux-ppc64@0.19.8": optional: true - '@esbuild/linux-ppc64@0.21.3': + "@esbuild/linux-ppc64@0.21.3": optional: true - '@esbuild/linux-ppc64@0.23.0': + "@esbuild/linux-ppc64@0.23.0": optional: true - '@esbuild/linux-riscv64@0.19.8': + "@esbuild/linux-riscv64@0.19.8": optional: true - '@esbuild/linux-riscv64@0.21.3': + "@esbuild/linux-riscv64@0.21.3": optional: true - '@esbuild/linux-riscv64@0.23.0': + "@esbuild/linux-riscv64@0.23.0": optional: true - '@esbuild/linux-s390x@0.19.8': + "@esbuild/linux-s390x@0.19.8": optional: true - '@esbuild/linux-s390x@0.21.3': + "@esbuild/linux-s390x@0.21.3": optional: true - '@esbuild/linux-s390x@0.23.0': + "@esbuild/linux-s390x@0.23.0": optional: true - '@esbuild/linux-x64@0.19.8': + "@esbuild/linux-x64@0.19.8": optional: true - '@esbuild/linux-x64@0.21.3': + "@esbuild/linux-x64@0.21.3": optional: true - '@esbuild/linux-x64@0.23.0': + "@esbuild/linux-x64@0.23.0": optional: true - '@esbuild/netbsd-x64@0.19.8': + "@esbuild/netbsd-x64@0.19.8": optional: true - '@esbuild/netbsd-x64@0.21.3': + "@esbuild/netbsd-x64@0.21.3": optional: true - '@esbuild/netbsd-x64@0.23.0': + "@esbuild/netbsd-x64@0.23.0": optional: true - '@esbuild/openbsd-arm64@0.23.0': + "@esbuild/openbsd-arm64@0.23.0": optional: true - '@esbuild/openbsd-x64@0.19.8': + "@esbuild/openbsd-x64@0.19.8": optional: true - '@esbuild/openbsd-x64@0.21.3': + "@esbuild/openbsd-x64@0.21.3": optional: true - '@esbuild/openbsd-x64@0.23.0': + "@esbuild/openbsd-x64@0.23.0": optional: true - '@esbuild/sunos-x64@0.19.8': + "@esbuild/sunos-x64@0.19.8": optional: true - '@esbuild/sunos-x64@0.21.3': + "@esbuild/sunos-x64@0.21.3": optional: true - '@esbuild/sunos-x64@0.23.0': + "@esbuild/sunos-x64@0.23.0": optional: true - '@esbuild/win32-arm64@0.19.8': + "@esbuild/win32-arm64@0.19.8": optional: true - '@esbuild/win32-arm64@0.21.3': + "@esbuild/win32-arm64@0.21.3": optional: true - '@esbuild/win32-arm64@0.23.0': + "@esbuild/win32-arm64@0.23.0": optional: true - '@esbuild/win32-ia32@0.19.8': + "@esbuild/win32-ia32@0.19.8": optional: true - '@esbuild/win32-ia32@0.21.3': + "@esbuild/win32-ia32@0.21.3": optional: true - '@esbuild/win32-ia32@0.23.0': + "@esbuild/win32-ia32@0.23.0": optional: true - '@esbuild/win32-x64@0.19.8': + "@esbuild/win32-x64@0.19.8": optional: true - '@esbuild/win32-x64@0.21.3': + "@esbuild/win32-x64@0.21.3": optional: true - '@esbuild/win32-x64@0.23.0': + "@esbuild/win32-x64@0.23.0": optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.3.0)': + "@eslint-community/eslint-utils@4.4.0(eslint@9.3.0)": dependencies: eslint: 9.3.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.0(eslint@9.5.0)': + "@eslint-community/eslint-utils@4.4.0(eslint@9.5.0)": dependencies: eslint: 9.5.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)': + "@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)": dependencies: eslint: 9.7.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + "@eslint-community/regexpp@4.11.0": {} - '@eslint/config-array@0.16.0': + "@eslint/config-array@0.16.0": dependencies: - '@eslint/object-schema': 2.1.4 + "@eslint/object-schema": 2.1.4 debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-array@0.17.1': + "@eslint/config-array@0.17.1": dependencies: - '@eslint/object-schema': 2.1.4 + "@eslint/object-schema": 2.1.4 debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.1.0': + "@eslint/eslintrc@3.1.0": dependencies: ajv: 6.12.6 debug: 4.3.6(supports-color@8.1.1) @@ -6755,45 +10508,45 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.3.0': {} + "@eslint/js@9.3.0": {} - '@eslint/js@9.5.0': {} + "@eslint/js@9.5.0": {} - '@eslint/js@9.7.0': {} + "@eslint/js@9.7.0": {} - '@eslint/object-schema@2.1.4': {} + "@eslint/object-schema@2.1.4": {} - '@hapi/bourne@3.0.0': {} + "@hapi/bourne@3.0.0": {} - '@humanwhocodes/config-array@0.13.0': + "@humanwhocodes/config-array@0.13.0": dependencies: - '@humanwhocodes/object-schema': 2.0.3 + "@humanwhocodes/object-schema": 2.0.3 debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@humanwhocodes/module-importer@1.0.1': {} + "@humanwhocodes/module-importer@1.0.1": {} - '@humanwhocodes/object-schema@2.0.3': {} + "@humanwhocodes/object-schema@2.0.3": {} - '@humanwhocodes/retry@0.3.0': {} + "@humanwhocodes/retry@0.3.0": {} - '@ipld/dag-cbor@9.0.3': + "@ipld/dag-cbor@9.0.3": dependencies: cborg: 2.0.5 multiformats: 12.1.3 - '@ipld/dag-cbor@9.0.5': + "@ipld/dag-cbor@9.0.5": dependencies: cborg: 4.2.3 multiformats: 12.1.3 - '@ipld/dag-pb@4.1.2': + "@ipld/dag-pb@4.1.2": dependencies: multiformats: 13.1.0 - '@isaacs/cliui@8.0.2': + "@isaacs/cliui@8.0.2": dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 @@ -6802,101 +10555,101 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/ttlcache@1.4.1': {} + "@isaacs/ttlcache@1.4.1": {} - '@istanbuljs/schema@0.1.3': {} + "@istanbuljs/schema@0.1.3": {} - '@jridgewell/gen-mapping@0.3.5': + "@jridgewell/gen-mapping@0.3.5": dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/trace-mapping": 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/set-array@1.2.1': {} + "@jridgewell/set-array@1.2.1": {} - '@jridgewell/source-map@0.3.6': + "@jridgewell/source-map@0.3.6": dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 - '@jridgewell/sourcemap-codec@1.5.0': {} + "@jridgewell/sourcemap-codec@1.5.0": {} - '@jridgewell/trace-mapping@0.3.25': + "@jridgewell/trace-mapping@0.3.25": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.0 - '@js-temporal/polyfill@0.4.4': + "@js-temporal/polyfill@0.4.4": dependencies: jsbi: 4.3.0 tslib: 2.6.3 - '@leichtgewicht/ip-codec@2.0.5': {} + "@leichtgewicht/ip-codec@2.0.5": {} - '@manypkg/find-root@1.1.0': + "@manypkg/find-root@1.1.0": dependencies: - '@babel/runtime': 7.25.0 - '@types/node': 12.20.55 + "@babel/runtime": 7.25.0 + "@types/node": 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - '@manypkg/get-packages@1.1.3': + "@manypkg/get-packages@1.1.3": dependencies: - '@babel/runtime': 7.25.0 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 + "@babel/runtime": 7.25.0 + "@changesets/types": 4.1.0 + "@manypkg/find-root": 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@multiformats/murmur3@2.1.8': + "@multiformats/murmur3@2.1.8": dependencies: multiformats: 13.1.0 murmurhash3js-revisited: 3.0.0 - '@noble/ciphers@0.3.0': {} + "@noble/ciphers@0.3.0": {} - '@noble/ciphers@0.4.1': {} + "@noble/ciphers@0.4.1": {} - '@noble/ciphers@0.5.3': {} + "@noble/ciphers@0.5.3": {} - '@noble/curves@1.3.0': + "@noble/curves@1.3.0": dependencies: - '@noble/hashes': 1.3.3 + "@noble/hashes": 1.3.3 - '@noble/curves@1.4.2': + "@noble/curves@1.4.2": dependencies: - '@noble/hashes': 1.4.0 + "@noble/hashes": 1.4.0 - '@noble/ed25519@2.0.0': {} + "@noble/ed25519@2.0.0": {} - '@noble/ed25519@2.1.0': {} + "@noble/ed25519@2.1.0": {} - '@noble/hashes@1.3.3': {} + "@noble/hashes@1.3.3": {} - '@noble/hashes@1.4.0': {} + "@noble/hashes@1.4.0": {} - '@noble/secp256k1@2.0.0': {} + "@noble/secp256k1@2.0.0": {} - '@noble/secp256k1@2.1.0': {} + "@noble/secp256k1@2.1.0": {} - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.17.1 - '@npmcli/git@5.0.8': + "@npmcli/git@5.0.8": dependencies: - '@npmcli/promise-spawn': 7.0.2 + "@npmcli/promise-spawn": 7.0.2 ini: 4.1.3 lru-cache: 10.4.3 npm-pick-manifest: 9.1.0 @@ -6908,9 +10661,9 @@ snapshots: transitivePeerDependencies: - bluebird - '@npmcli/package-json@5.0.0': + "@npmcli/package-json@5.0.0": dependencies: - '@npmcli/git': 5.0.8 + "@npmcli/git": 5.0.8 glob: 10.4.5 hosted-git-info: 7.0.2 json-parse-even-better-errors: 3.0.2 @@ -6920,18 +10673,18 @@ snapshots: transitivePeerDependencies: - bluebird - '@npmcli/promise-spawn@7.0.2': + "@npmcli/promise-spawn@7.0.2": dependencies: which: 4.0.0 - '@pkgjs/parseargs@0.11.0': + "@pkgjs/parseargs@0.11.0": optional: true - '@playwright/test@1.45.3': + "@playwright/test@1.45.3": dependencies: playwright: 1.45.3 - '@puppeteer/browsers@2.3.0': + "@puppeteer/browsers@2.3.0": dependencies: debug: 4.3.6(supports-color@8.1.1) extract-zip: 2.0.1 @@ -6944,10 +10697,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@15.2.3(rollup@4.20.0)': + "@rollup/plugin-node-resolve@15.2.3(rollup@4.20.0)": dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.20.0) - '@types/resolve': 1.20.2 + "@rollup/pluginutils": 5.1.0(rollup@4.20.0) + "@types/resolve": 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 @@ -6955,382 +10708,382 @@ snapshots: optionalDependencies: rollup: 4.20.0 - '@rollup/pluginutils@5.1.0(rollup@4.20.0)': + "@rollup/pluginutils@5.1.0(rollup@4.20.0)": dependencies: - '@types/estree': 1.0.5 + "@types/estree": 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: rollup: 4.20.0 - '@rollup/rollup-android-arm-eabi@4.20.0': + "@rollup/rollup-android-arm-eabi@4.20.0": optional: true - '@rollup/rollup-android-arm64@4.20.0': + "@rollup/rollup-android-arm64@4.20.0": optional: true - '@rollup/rollup-darwin-arm64@4.20.0': + "@rollup/rollup-darwin-arm64@4.20.0": optional: true - '@rollup/rollup-darwin-x64@4.20.0': + "@rollup/rollup-darwin-x64@4.20.0": optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + "@rollup/rollup-linux-arm-gnueabihf@4.20.0": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.20.0': + "@rollup/rollup-linux-arm-musleabihf@4.20.0": optional: true - '@rollup/rollup-linux-arm64-gnu@4.20.0': + "@rollup/rollup-linux-arm64-gnu@4.20.0": optional: true - '@rollup/rollup-linux-arm64-musl@4.20.0': + "@rollup/rollup-linux-arm64-musl@4.20.0": optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + "@rollup/rollup-linux-powerpc64le-gnu@4.20.0": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.20.0': + "@rollup/rollup-linux-riscv64-gnu@4.20.0": optional: true - '@rollup/rollup-linux-s390x-gnu@4.20.0': + "@rollup/rollup-linux-s390x-gnu@4.20.0": optional: true - '@rollup/rollup-linux-x64-gnu@4.20.0': + "@rollup/rollup-linux-x64-gnu@4.20.0": optional: true - '@rollup/rollup-linux-x64-musl@4.20.0': + "@rollup/rollup-linux-x64-musl@4.20.0": optional: true - '@rollup/rollup-win32-arm64-msvc@4.20.0': + "@rollup/rollup-win32-arm64-msvc@4.20.0": optional: true - '@rollup/rollup-win32-ia32-msvc@4.20.0': + "@rollup/rollup-win32-ia32-msvc@4.20.0": optional: true - '@rollup/rollup-win32-x64-msvc@4.20.0': + "@rollup/rollup-win32-x64-msvc@4.20.0": optional: true - '@scure/base@1.1.7': {} + "@scure/base@1.1.7": {} - '@scure/bip39@1.2.2': + "@scure/bip39@1.2.2": dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.7 + "@noble/hashes": 1.3.3 + "@scure/base": 1.1.7 - '@sd-jwt/decode@0.6.1': + "@sd-jwt/decode@0.6.1": dependencies: - '@sd-jwt/types': 0.6.1 - '@sd-jwt/utils': 0.6.1 + "@sd-jwt/types": 0.6.1 + "@sd-jwt/utils": 0.6.1 - '@sd-jwt/present@0.6.1': + "@sd-jwt/present@0.6.1": dependencies: - '@sd-jwt/decode': 0.6.1 - '@sd-jwt/types': 0.6.1 - '@sd-jwt/utils': 0.6.1 + "@sd-jwt/decode": 0.6.1 + "@sd-jwt/types": 0.6.1 + "@sd-jwt/utils": 0.6.1 - '@sd-jwt/types@0.6.1': {} + "@sd-jwt/types@0.6.1": {} - '@sd-jwt/utils@0.6.1': + "@sd-jwt/utils@0.6.1": dependencies: - '@sd-jwt/types': 0.6.1 + "@sd-jwt/types": 0.6.1 js-base64: 3.7.7 - '@sinonjs/commons@2.0.0': + "@sinonjs/commons@2.0.0": dependencies: type-detect: 4.0.8 - '@sinonjs/commons@3.0.1': + "@sinonjs/commons@3.0.1": dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@11.2.2': + "@sinonjs/fake-timers@11.2.2": dependencies: - '@sinonjs/commons': 3.0.1 + "@sinonjs/commons": 3.0.1 - '@sinonjs/samsam@8.0.0': + "@sinonjs/samsam@8.0.0": dependencies: - '@sinonjs/commons': 2.0.0 + "@sinonjs/commons": 2.0.0 lodash.get: 4.4.2 type-detect: 4.1.0 - '@sinonjs/text-encoding@0.7.2': {} + "@sinonjs/text-encoding@0.7.2": {} - '@smithy/abort-controller@3.1.1': + "@smithy/abort-controller@3.1.1": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/config-resolver@3.0.5': + "@smithy/config-resolver@3.0.5": dependencies: - '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/types": 3.3.0 + "@smithy/util-config-provider": 3.0.0 + "@smithy/util-middleware": 3.0.3 tslib: 2.6.3 - '@smithy/core@2.3.2': + "@smithy/core@2.3.2": dependencies: - '@smithy/middleware-endpoint': 3.1.0 - '@smithy/middleware-retry': 3.0.14 - '@smithy/middleware-serde': 3.0.3 - '@smithy/protocol-http': 4.1.0 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/util-middleware': 3.0.3 + "@smithy/middleware-endpoint": 3.1.0 + "@smithy/middleware-retry": 3.0.14 + "@smithy/middleware-serde": 3.0.3 + "@smithy/protocol-http": 4.1.0 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/util-middleware": 3.0.3 tslib: 2.6.3 - '@smithy/credential-provider-imds@3.2.0': + "@smithy/credential-provider-imds@3.2.0": dependencies: - '@smithy/node-config-provider': 3.1.4 - '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 - '@smithy/url-parser': 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/property-provider": 3.1.3 + "@smithy/types": 3.3.0 + "@smithy/url-parser": 3.0.3 tslib: 2.6.3 - '@smithy/fetch-http-handler@3.2.4': + "@smithy/fetch-http-handler@3.2.4": dependencies: - '@smithy/protocol-http': 4.1.0 - '@smithy/querystring-builder': 3.0.3 - '@smithy/types': 3.3.0 - '@smithy/util-base64': 3.0.0 + "@smithy/protocol-http": 4.1.0 + "@smithy/querystring-builder": 3.0.3 + "@smithy/types": 3.3.0 + "@smithy/util-base64": 3.0.0 tslib: 2.6.3 - '@smithy/hash-node@3.0.3': + "@smithy/hash-node@3.0.3": dependencies: - '@smithy/types': 3.3.0 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 + "@smithy/types": 3.3.0 + "@smithy/util-buffer-from": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 - '@smithy/invalid-dependency@3.0.3': + "@smithy/invalid-dependency@3.0.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/is-array-buffer@2.2.0': + "@smithy/is-array-buffer@2.2.0": dependencies: tslib: 2.6.3 - '@smithy/is-array-buffer@3.0.0': + "@smithy/is-array-buffer@3.0.0": dependencies: tslib: 2.6.3 - '@smithy/middleware-content-length@3.0.5': + "@smithy/middleware-content-length@3.0.5": dependencies: - '@smithy/protocol-http': 4.1.0 - '@smithy/types': 3.3.0 + "@smithy/protocol-http": 4.1.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/middleware-endpoint@3.1.0': + "@smithy/middleware-endpoint@3.1.0": dependencies: - '@smithy/middleware-serde': 3.0.3 - '@smithy/node-config-provider': 3.1.4 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 - '@smithy/url-parser': 3.0.3 - '@smithy/util-middleware': 3.0.3 + "@smithy/middleware-serde": 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 + "@smithy/url-parser": 3.0.3 + "@smithy/util-middleware": 3.0.3 tslib: 2.6.3 - '@smithy/middleware-retry@3.0.14': + "@smithy/middleware-retry@3.0.14": dependencies: - '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.1.0 - '@smithy/service-error-classification': 3.0.3 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 - '@smithy/util-middleware': 3.0.3 - '@smithy/util-retry': 3.0.3 + "@smithy/node-config-provider": 3.1.4 + "@smithy/protocol-http": 4.1.0 + "@smithy/service-error-classification": 3.0.3 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 + "@smithy/util-middleware": 3.0.3 + "@smithy/util-retry": 3.0.3 tslib: 2.6.3 uuid: 9.0.1 - '@smithy/middleware-serde@3.0.3': + "@smithy/middleware-serde@3.0.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/middleware-stack@3.0.3': + "@smithy/middleware-stack@3.0.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/node-config-provider@3.1.4': + "@smithy/node-config-provider@3.1.4": dependencies: - '@smithy/property-provider': 3.1.3 - '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + "@smithy/property-provider": 3.1.3 + "@smithy/shared-ini-file-loader": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/node-http-handler@3.1.4': + "@smithy/node-http-handler@3.1.4": dependencies: - '@smithy/abort-controller': 3.1.1 - '@smithy/protocol-http': 4.1.0 - '@smithy/querystring-builder': 3.0.3 - '@smithy/types': 3.3.0 + "@smithy/abort-controller": 3.1.1 + "@smithy/protocol-http": 4.1.0 + "@smithy/querystring-builder": 3.0.3 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/property-provider@3.1.3': + "@smithy/property-provider@3.1.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/protocol-http@4.1.0': + "@smithy/protocol-http@4.1.0": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/querystring-builder@3.0.3': + "@smithy/querystring-builder@3.0.3": dependencies: - '@smithy/types': 3.3.0 - '@smithy/util-uri-escape': 3.0.0 + "@smithy/types": 3.3.0 + "@smithy/util-uri-escape": 3.0.0 tslib: 2.6.3 - '@smithy/querystring-parser@3.0.3': + "@smithy/querystring-parser@3.0.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/service-error-classification@3.0.3': + "@smithy/service-error-classification@3.0.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 - '@smithy/shared-ini-file-loader@3.1.4': + "@smithy/shared-ini-file-loader@3.1.4": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/signature-v4@4.1.0': + "@smithy/signature-v4@4.1.0": dependencies: - '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.1.0 - '@smithy/types': 3.3.0 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.3 - '@smithy/util-uri-escape': 3.0.0 - '@smithy/util-utf8': 3.0.0 + "@smithy/is-array-buffer": 3.0.0 + "@smithy/protocol-http": 4.1.0 + "@smithy/types": 3.3.0 + "@smithy/util-hex-encoding": 3.0.0 + "@smithy/util-middleware": 3.0.3 + "@smithy/util-uri-escape": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 - '@smithy/smithy-client@3.1.12': + "@smithy/smithy-client@3.1.12": dependencies: - '@smithy/middleware-endpoint': 3.1.0 - '@smithy/middleware-stack': 3.0.3 - '@smithy/protocol-http': 4.1.0 - '@smithy/types': 3.3.0 - '@smithy/util-stream': 3.1.3 + "@smithy/middleware-endpoint": 3.1.0 + "@smithy/middleware-stack": 3.0.3 + "@smithy/protocol-http": 4.1.0 + "@smithy/types": 3.3.0 + "@smithy/util-stream": 3.1.3 tslib: 2.6.3 - '@smithy/types@3.3.0': + "@smithy/types@3.3.0": dependencies: tslib: 2.6.3 - '@smithy/url-parser@3.0.3': + "@smithy/url-parser@3.0.3": dependencies: - '@smithy/querystring-parser': 3.0.3 - '@smithy/types': 3.3.0 + "@smithy/querystring-parser": 3.0.3 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/util-base64@3.0.0': + "@smithy/util-base64@3.0.0": dependencies: - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 + "@smithy/util-buffer-from": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 - '@smithy/util-body-length-browser@3.0.0': + "@smithy/util-body-length-browser@3.0.0": dependencies: tslib: 2.6.3 - '@smithy/util-body-length-node@3.0.0': + "@smithy/util-body-length-node@3.0.0": dependencies: tslib: 2.6.3 - '@smithy/util-buffer-from@2.2.0': + "@smithy/util-buffer-from@2.2.0": dependencies: - '@smithy/is-array-buffer': 2.2.0 + "@smithy/is-array-buffer": 2.2.0 tslib: 2.6.3 - '@smithy/util-buffer-from@3.0.0': + "@smithy/util-buffer-from@3.0.0": dependencies: - '@smithy/is-array-buffer': 3.0.0 + "@smithy/is-array-buffer": 3.0.0 tslib: 2.6.3 - '@smithy/util-config-provider@3.0.0': + "@smithy/util-config-provider@3.0.0": dependencies: tslib: 2.6.3 - '@smithy/util-defaults-mode-browser@3.0.14': + "@smithy/util-defaults-mode-browser@3.0.14": dependencies: - '@smithy/property-provider': 3.1.3 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 + "@smithy/property-provider": 3.1.3 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 bowser: 2.11.0 tslib: 2.6.3 - '@smithy/util-defaults-mode-node@3.0.14': + "@smithy/util-defaults-mode-node@3.0.14": dependencies: - '@smithy/config-resolver': 3.0.5 - '@smithy/credential-provider-imds': 3.2.0 - '@smithy/node-config-provider': 3.1.4 - '@smithy/property-provider': 3.1.3 - '@smithy/smithy-client': 3.1.12 - '@smithy/types': 3.3.0 + "@smithy/config-resolver": 3.0.5 + "@smithy/credential-provider-imds": 3.2.0 + "@smithy/node-config-provider": 3.1.4 + "@smithy/property-provider": 3.1.3 + "@smithy/smithy-client": 3.1.12 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/util-endpoints@2.0.5': + "@smithy/util-endpoints@2.0.5": dependencies: - '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 + "@smithy/node-config-provider": 3.1.4 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/util-hex-encoding@3.0.0': + "@smithy/util-hex-encoding@3.0.0": dependencies: tslib: 2.6.3 - '@smithy/util-middleware@3.0.3': + "@smithy/util-middleware@3.0.3": dependencies: - '@smithy/types': 3.3.0 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/util-retry@3.0.3': + "@smithy/util-retry@3.0.3": dependencies: - '@smithy/service-error-classification': 3.0.3 - '@smithy/types': 3.3.0 + "@smithy/service-error-classification": 3.0.3 + "@smithy/types": 3.3.0 tslib: 2.6.3 - '@smithy/util-stream@3.1.3': + "@smithy/util-stream@3.1.3": dependencies: - '@smithy/fetch-http-handler': 3.2.4 - '@smithy/node-http-handler': 3.1.4 - '@smithy/types': 3.3.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-utf8': 3.0.0 + "@smithy/fetch-http-handler": 3.2.4 + "@smithy/node-http-handler": 3.1.4 + "@smithy/types": 3.3.0 + "@smithy/util-base64": 3.0.0 + "@smithy/util-buffer-from": 3.0.0 + "@smithy/util-hex-encoding": 3.0.0 + "@smithy/util-utf8": 3.0.0 tslib: 2.6.3 - '@smithy/util-uri-escape@3.0.0': + "@smithy/util-uri-escape@3.0.0": dependencies: tslib: 2.6.3 - '@smithy/util-utf8@2.3.0': + "@smithy/util-utf8@2.3.0": dependencies: - '@smithy/util-buffer-from': 2.2.0 + "@smithy/util-buffer-from": 2.2.0 tslib: 2.6.3 - '@smithy/util-utf8@3.0.0': + "@smithy/util-utf8@3.0.0": dependencies: - '@smithy/util-buffer-from': 3.0.0 + "@smithy/util-buffer-from": 3.0.0 tslib: 2.6.3 - '@sphereon/pex-models@2.2.4': {} + "@sphereon/pex-models@2.2.4": {} - '@sphereon/pex@3.3.3': + "@sphereon/pex@3.3.3": dependencies: - '@astronautlabs/jsonpath': 1.1.2 - '@sd-jwt/decode': 0.6.1 - '@sd-jwt/present': 0.6.1 - '@sd-jwt/types': 0.6.1 - '@sphereon/pex-models': 2.2.4 - '@sphereon/ssi-types': 0.22.0 + "@astronautlabs/jsonpath": 1.1.2 + "@sd-jwt/decode": 0.6.1 + "@sd-jwt/present": 0.6.1 + "@sd-jwt/types": 0.6.1 + "@sphereon/pex-models": 2.2.4 + "@sphereon/ssi-types": 0.22.0 ajv: 8.17.1 ajv-formats: 2.1.1(ajv@8.17.1) jwt-decode: 3.1.2 @@ -7338,29 +11091,29 @@ snapshots: string.prototype.matchall: 4.0.11 uint8arrays: 3.1.1 - '@sphereon/ssi-types@0.22.0': + "@sphereon/ssi-types@0.22.0": dependencies: - '@sd-jwt/decode': 0.6.1 + "@sd-jwt/decode": 0.6.1 jwt-decode: 3.1.2 - '@sphereon/ssi-types@0.26.0': + "@sphereon/ssi-types@0.26.0": dependencies: - '@sd-jwt/decode': 0.6.1 + "@sd-jwt/decode": 0.6.1 debug: 4.3.6(supports-color@8.1.1) events: 3.3.0 jwt-decode: 3.1.2 transitivePeerDependencies: - supports-color - '@tbd54566975/dwn-sdk-js@0.4.5': + "@tbd54566975/dwn-sdk-js@0.4.5": dependencies: - '@ipld/dag-cbor': 9.0.3 - '@js-temporal/polyfill': 0.4.4 - '@noble/ciphers': 0.5.3 - '@noble/curves': 1.4.2 - '@noble/ed25519': 2.0.0 - '@noble/secp256k1': 2.0.0 - '@web5/dids': 1.1.3 + "@ipld/dag-cbor": 9.0.3 + "@js-temporal/polyfill": 0.4.4 + "@noble/ciphers": 0.5.3 + "@noble/curves": 1.4.2 + "@noble/ed25519": 2.0.0 + "@noble/secp256k1": 2.0.0 + "@web5/dids": 1.1.3 abstract-level: 1.0.3 ajv: 8.12.0 blockstore-core: 4.2.0 @@ -7385,10 +11138,10 @@ snapshots: - encoding - supports-color - '@tbd54566975/dwn-sql-store@0.6.5': + "@tbd54566975/dwn-sql-store@0.6.5": dependencies: - '@ipld/dag-cbor': 9.0.5 - '@tbd54566975/dwn-sdk-js': 0.4.5 + "@ipld/dag-cbor": 9.0.5 + "@tbd54566975/dwn-sdk-js": 0.4.5 kysely: 0.26.3 multiformats: 12.0.1 readable-stream: 4.4.2 @@ -7396,196 +11149,196 @@ snapshots: - encoding - supports-color - '@tootallnate/quickjs-emscripten@0.23.0': {} + "@tootallnate/quickjs-emscripten@0.23.0": {} - '@types/accepts@1.3.7': + "@types/accepts@1.3.7": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 - '@types/babel__code-frame@7.0.6': {} + "@types/babel__code-frame@7.0.6": {} - '@types/bencode@2.0.4': + "@types/bencode@2.0.4": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 - '@types/body-parser@1.19.5': + "@types/body-parser@1.19.5": dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.14.8 + "@types/connect": 3.4.38 + "@types/node": 20.14.8 - '@types/chai-as-promised@7.1.5': + "@types/chai-as-promised@7.1.5": dependencies: - '@types/chai': 4.3.16 + "@types/chai": 4.3.16 - '@types/chai-as-promised@7.1.8': + "@types/chai-as-promised@7.1.8": dependencies: - '@types/chai': 4.3.16 + "@types/chai": 4.3.16 - '@types/chai@4.3.16': {} + "@types/chai@4.3.16": {} - '@types/chai@4.3.6': {} + "@types/chai@4.3.6": {} - '@types/co-body@6.1.3': + "@types/co-body@6.1.3": dependencies: - '@types/node': 20.14.8 - '@types/qs': 6.9.15 + "@types/node": 20.14.8 + "@types/qs": 6.9.15 - '@types/command-line-args@5.2.3': {} + "@types/command-line-args@5.2.3": {} - '@types/connect@3.4.38': + "@types/connect@3.4.38": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 - '@types/content-disposition@0.5.8': {} + "@types/content-disposition@0.5.8": {} - '@types/convert-source-map@2.0.3': {} + "@types/convert-source-map@2.0.3": {} - '@types/cookies@0.9.0': + "@types/cookies@0.9.0": dependencies: - '@types/connect': 3.4.38 - '@types/express': 4.17.21 - '@types/keygrip': 1.0.6 - '@types/node': 20.14.8 + "@types/connect": 3.4.38 + "@types/express": 4.17.21 + "@types/keygrip": 1.0.6 + "@types/node": 20.14.8 - '@types/debounce@1.2.4': {} + "@types/debounce@1.2.4": {} - '@types/dns-packet@5.6.4': + "@types/dns-packet@5.6.4": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 - '@types/eslint-scope@3.7.7': + "@types/eslint-scope@3.7.7": dependencies: - '@types/eslint': 9.6.0 - '@types/estree': 1.0.5 + "@types/eslint": 9.6.0 + "@types/estree": 1.0.5 - '@types/eslint@8.56.10': + "@types/eslint@8.56.10": dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 + "@types/estree": 1.0.5 + "@types/json-schema": 7.0.15 - '@types/eslint@9.6.0': + "@types/eslint@9.6.0": dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 + "@types/estree": 1.0.5 + "@types/json-schema": 7.0.15 - '@types/estree@1.0.5': {} + "@types/estree@1.0.5": {} - '@types/express-serve-static-core@4.19.5': + "@types/express-serve-static-core@4.19.5": dependencies: - '@types/node': 20.14.8 - '@types/qs': 6.9.15 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + "@types/node": 20.14.8 + "@types/qs": 6.9.15 + "@types/range-parser": 1.2.7 + "@types/send": 0.17.4 - '@types/express@4.17.21': + "@types/express@4.17.21": dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.5 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 + "@types/body-parser": 1.19.5 + "@types/express-serve-static-core": 4.19.5 + "@types/qs": 6.9.15 + "@types/serve-static": 1.15.7 - '@types/http-assert@1.5.5': {} + "@types/http-assert@1.5.5": {} - '@types/http-errors@2.0.4': {} + "@types/http-errors@2.0.4": {} - '@types/istanbul-lib-coverage@2.0.6': {} + "@types/istanbul-lib-coverage@2.0.6": {} - '@types/istanbul-lib-report@3.0.3': + "@types/istanbul-lib-report@3.0.3": dependencies: - '@types/istanbul-lib-coverage': 2.0.6 + "@types/istanbul-lib-coverage": 2.0.6 - '@types/istanbul-reports@3.0.4': + "@types/istanbul-reports@3.0.4": dependencies: - '@types/istanbul-lib-report': 3.0.3 + "@types/istanbul-lib-report": 3.0.3 - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/keygrip@1.0.6': {} + "@types/keygrip@1.0.6": {} - '@types/koa-compose@3.2.8': + "@types/koa-compose@3.2.8": dependencies: - '@types/koa': 2.15.0 + "@types/koa": 2.15.0 - '@types/koa@2.15.0': + "@types/koa@2.15.0": dependencies: - '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.8 - '@types/cookies': 0.9.0 - '@types/http-assert': 1.5.5 - '@types/http-errors': 2.0.4 - '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.8 - '@types/node': 20.14.8 + "@types/accepts": 1.3.7 + "@types/content-disposition": 0.5.8 + "@types/cookies": 0.9.0 + "@types/http-assert": 1.5.5 + "@types/http-errors": 2.0.4 + "@types/keygrip": 1.0.6 + "@types/koa-compose": 3.2.8 + "@types/node": 20.14.8 - '@types/mime@1.3.5': {} + "@types/mime@1.3.5": {} - '@types/mocha@10.0.1': {} + "@types/mocha@10.0.1": {} - '@types/mocha@10.0.6': {} + "@types/mocha@10.0.6": {} - '@types/mocha@10.0.7': {} + "@types/mocha@10.0.7": {} - '@types/ms@0.7.31': {} + "@types/ms@0.7.31": {} - '@types/ms@0.7.34': {} + "@types/ms@0.7.34": {} - '@types/node@12.20.55': {} + "@types/node@12.20.55": {} - '@types/node@20.14.8': + "@types/node@20.14.8": dependencies: undici-types: 5.26.5 - '@types/pako@2.0.3': {} + "@types/pako@2.0.3": {} - '@types/parse5@6.0.3': {} + "@types/parse5@6.0.3": {} - '@types/qs@6.9.15': {} + "@types/qs@6.9.15": {} - '@types/range-parser@1.2.7': {} + "@types/range-parser@1.2.7": {} - '@types/readable-stream@4.0.14': + "@types/readable-stream@4.0.14": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 safe-buffer: 5.1.2 - '@types/resolve@1.20.2': {} + "@types/resolve@1.20.2": {} - '@types/semver@7.5.8': {} + "@types/semver@7.5.8": {} - '@types/send@0.17.4': + "@types/send@0.17.4": dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.14.8 + "@types/mime": 1.3.5 + "@types/node": 20.14.8 - '@types/serve-static@1.15.7': + "@types/serve-static@1.15.7": dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 20.14.8 - '@types/send': 0.17.4 + "@types/http-errors": 2.0.4 + "@types/node": 20.14.8 + "@types/send": 0.17.4 - '@types/sinon@17.0.3': + "@types/sinon@17.0.3": dependencies: - '@types/sinonjs__fake-timers': 8.1.5 + "@types/sinonjs__fake-timers": 8.1.5 - '@types/sinonjs__fake-timers@8.1.5': {} + "@types/sinonjs__fake-timers@8.1.5": {} - '@types/ws@7.4.7': + "@types/ws@7.4.7": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 - '@types/yauzl@2.10.3': + "@types/yauzl@2.10.3": dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 optional: true - '@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0)(typescript@5.4.5)': + "@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.4.5))(eslint@9.3.0)(typescript@5.4.5)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/type-utils': 7.10.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.10.0(eslint@9.3.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.10.0 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.3.0)(typescript@5.4.5) + "@typescript-eslint/scope-manager": 7.10.0 + "@typescript-eslint/type-utils": 7.10.0(eslint@9.3.0)(typescript@5.4.5) + "@typescript-eslint/utils": 7.10.0(eslint@9.3.0)(typescript@5.4.5) + "@typescript-eslint/visitor-keys": 7.10.0 eslint: 9.3.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7596,14 +11349,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5)': + "@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.4.5))(eslint@9.5.0)(typescript@5.4.5)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.14.1 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.5.0)(typescript@5.4.5) + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/type-utils": 7.14.1(eslint@9.5.0)(typescript@5.4.5) + "@typescript-eslint/utils": 7.14.1(eslint@9.5.0)(typescript@5.4.5) + "@typescript-eslint/visitor-keys": 7.14.1 eslint: 9.5.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7614,14 +11367,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.4.5))(eslint@9.7.0)(typescript@5.4.5)': + "@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.4.5))(eslint@9.7.0)(typescript@5.4.5)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.7.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@9.7.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.14.1 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.7.0)(typescript@5.4.5) + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/type-utils": 7.14.1(eslint@9.7.0)(typescript@5.4.5) + "@typescript-eslint/utils": 7.14.1(eslint@9.7.0)(typescript@5.4.5) + "@typescript-eslint/visitor-keys": 7.14.1 eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7632,14 +11385,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)': + "@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.14.1 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.7.0)(typescript@5.5.3) + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/type-utils": 7.14.1(eslint@9.7.0)(typescript@5.5.3) + "@typescript-eslint/utils": 7.14.1(eslint@9.7.0)(typescript@5.5.3) + "@typescript-eslint/visitor-keys": 7.14.1 eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7650,14 +11403,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6)': + "@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6))(eslint@9.3.0)(typescript@5.1.6)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 7.9.0 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.3.0)(typescript@5.1.6) + "@typescript-eslint/scope-manager": 7.9.0 + "@typescript-eslint/type-utils": 7.9.0(eslint@9.3.0)(typescript@5.1.6) + "@typescript-eslint/utils": 7.9.0(eslint@9.3.0)(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 7.9.0 eslint: 9.3.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7668,14 +11421,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)(typescript@5.5.4)': + "@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)(typescript@5.5.4)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@9.5.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.9.0(eslint@9.5.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.9.0 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.5.0)(typescript@5.5.4) + "@typescript-eslint/scope-manager": 7.9.0 + "@typescript-eslint/type-utils": 7.9.0(eslint@9.5.0)(typescript@5.5.4) + "@typescript-eslint/utils": 7.9.0(eslint@9.5.0)(typescript@5.5.4) + "@typescript-eslint/visitor-keys": 7.9.0 eslint: 9.5.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7686,14 +11439,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.4))(eslint@9.7.0)(typescript@5.5.4)': + "@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.4))(eslint@9.7.0)(typescript@5.5.4)": dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.7.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@9.7.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.9.0(eslint@9.7.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.9.0 + "@eslint-community/regexpp": 4.11.0 + "@typescript-eslint/parser": 7.14.1(eslint@9.7.0)(typescript@5.5.4) + "@typescript-eslint/scope-manager": 7.9.0 + "@typescript-eslint/type-utils": 7.9.0(eslint@9.7.0)(typescript@5.5.4) + "@typescript-eslint/utils": 7.9.0(eslint@9.7.0)(typescript@5.5.4) + "@typescript-eslint/visitor-keys": 7.9.0 eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -7704,12 +11457,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6)': + "@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.1.6)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.3.0 optionalDependencies: @@ -7717,12 +11470,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.4.5)': + "@typescript-eslint/parser@7.14.1(eslint@9.3.0)(typescript@5.4.5)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.3.0 optionalDependencies: @@ -7730,12 +11483,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.4.5)': + "@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.4.5)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.5.0 optionalDependencies: @@ -7743,12 +11496,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.4)': + "@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.4)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.5.4) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.5.0 optionalDependencies: @@ -7756,12 +11509,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.4.5)': + "@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.4.5)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.7.0 optionalDependencies: @@ -7769,12 +11522,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.3)': + "@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.3)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.5.3) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.7.0 optionalDependencies: @@ -7782,12 +11535,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.4)': + "@typescript-eslint/parser@7.14.1(eslint@9.7.0)(typescript@5.5.4)": dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.5.4) + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) eslint: 9.7.0 optionalDependencies: @@ -7795,25 +11548,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.10.0': + "@typescript-eslint/scope-manager@7.10.0": dependencies: - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/visitor-keys': 7.10.0 + "@typescript-eslint/types": 7.10.0 + "@typescript-eslint/visitor-keys": 7.10.0 - '@typescript-eslint/scope-manager@7.14.1': + "@typescript-eslint/scope-manager@7.14.1": dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/visitor-keys": 7.14.1 - '@typescript-eslint/scope-manager@7.9.0': + "@typescript-eslint/scope-manager@7.9.0": dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + "@typescript-eslint/types": 7.9.0 + "@typescript-eslint/visitor-keys": 7.9.0 - '@typescript-eslint/type-utils@7.10.0(eslint@9.3.0)(typescript@5.4.5)': + "@typescript-eslint/type-utils@7.10.0(eslint@9.3.0)(typescript@5.4.5)": dependencies: - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.10.0(eslint@9.3.0)(typescript@5.4.5) + "@typescript-eslint/typescript-estree": 7.10.0(typescript@5.4.5) + "@typescript-eslint/utils": 7.10.0(eslint@9.3.0)(typescript@5.4.5) debug: 4.3.6(supports-color@8.1.1) eslint: 9.3.0 ts-api-utils: 1.3.0(typescript@5.4.5) @@ -7822,10 +11575,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.14.1(eslint@9.5.0)(typescript@5.4.5)': + "@typescript-eslint/type-utils@7.14.1(eslint@9.5.0)(typescript@5.4.5)": dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) - '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.4.5) + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) + "@typescript-eslint/utils": 7.14.1(eslint@9.5.0)(typescript@5.4.5) debug: 4.3.6(supports-color@8.1.1) eslint: 9.5.0 ts-api-utils: 1.3.0(typescript@5.4.5) @@ -7834,10 +11587,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.14.1(eslint@9.7.0)(typescript@5.4.5)': + "@typescript-eslint/type-utils@7.14.1(eslint@9.7.0)(typescript@5.4.5)": dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) - '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.4.5) + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) + "@typescript-eslint/utils": 7.14.1(eslint@9.7.0)(typescript@5.4.5) debug: 4.3.6(supports-color@8.1.1) eslint: 9.7.0 ts-api-utils: 1.3.0(typescript@5.4.5) @@ -7846,10 +11599,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.14.1(eslint@9.7.0)(typescript@5.5.3)': + "@typescript-eslint/type-utils@7.14.1(eslint@9.7.0)(typescript@5.5.3)": dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.3) - '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.5.3) + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.5.3) + "@typescript-eslint/utils": 7.14.1(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.6(supports-color@8.1.1) eslint: 9.7.0 ts-api-utils: 1.3.0(typescript@5.5.3) @@ -7858,10 +11611,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.9.0(eslint@9.3.0)(typescript@5.1.6)': + "@typescript-eslint/type-utils@7.9.0(eslint@9.3.0)(typescript@5.1.6)": dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.1.6) - '@typescript-eslint/utils': 7.9.0(eslint@9.3.0)(typescript@5.1.6) + "@typescript-eslint/typescript-estree": 7.9.0(typescript@5.1.6) + "@typescript-eslint/utils": 7.9.0(eslint@9.3.0)(typescript@5.1.6) debug: 4.3.6(supports-color@8.1.1) eslint: 9.3.0 ts-api-utils: 1.3.0(typescript@5.1.6) @@ -7870,10 +11623,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.9.0(eslint@9.5.0)(typescript@5.5.4)': + "@typescript-eslint/type-utils@7.9.0(eslint@9.5.0)(typescript@5.5.4)": dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.9.0(eslint@9.5.0)(typescript@5.5.4) + "@typescript-eslint/typescript-estree": 7.9.0(typescript@5.5.4) + "@typescript-eslint/utils": 7.9.0(eslint@9.5.0)(typescript@5.5.4) debug: 4.3.6(supports-color@8.1.1) eslint: 9.5.0 ts-api-utils: 1.3.0(typescript@5.5.4) @@ -7882,10 +11635,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.9.0(eslint@9.7.0)(typescript@5.5.4)': + "@typescript-eslint/type-utils@7.9.0(eslint@9.7.0)(typescript@5.5.4)": dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.9.0(eslint@9.7.0)(typescript@5.5.4) + "@typescript-eslint/typescript-estree": 7.9.0(typescript@5.5.4) + "@typescript-eslint/utils": 7.9.0(eslint@9.7.0)(typescript@5.5.4) debug: 4.3.6(supports-color@8.1.1) eslint: 9.7.0 ts-api-utils: 1.3.0(typescript@5.5.4) @@ -7894,16 +11647,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.10.0': {} + "@typescript-eslint/types@7.10.0": {} - '@typescript-eslint/types@7.14.1': {} + "@typescript-eslint/types@7.14.1": {} - '@typescript-eslint/types@7.9.0': {} + "@typescript-eslint/types@7.9.0": {} - '@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5)': + "@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5)": dependencies: - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/visitor-keys': 7.10.0 + "@typescript-eslint/types": 7.10.0 + "@typescript-eslint/visitor-keys": 7.10.0 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -7915,10 +11668,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.1.6)': + "@typescript-eslint/typescript-estree@7.14.1(typescript@5.1.6)": dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -7930,10 +11683,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.4.5)': + "@typescript-eslint/typescript-estree@7.14.1(typescript@5.4.5)": dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -7945,10 +11698,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.3)': + "@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.3)": dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -7960,10 +11713,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.4)': + "@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.4)": dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/visitor-keys": 7.14.1 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -7975,10 +11728,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.9.0(typescript@5.1.6)': + "@typescript-eslint/typescript-estree@7.9.0(typescript@5.1.6)": dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + "@typescript-eslint/types": 7.9.0 + "@typescript-eslint/visitor-keys": 7.9.0 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -7990,10 +11743,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.9.0(typescript@5.5.4)': + "@typescript-eslint/typescript-estree@7.9.0(typescript@5.5.4)": dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + "@typescript-eslint/types": 7.9.0 + "@typescript-eslint/visitor-keys": 7.9.0 debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -8005,109 +11758,109 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.10.0(eslint@9.3.0)(typescript@5.4.5)': + "@typescript-eslint/utils@7.10.0(eslint@9.3.0)(typescript@5.4.5)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.3.0) + "@typescript-eslint/scope-manager": 7.10.0 + "@typescript-eslint/types": 7.10.0 + "@typescript-eslint/typescript-estree": 7.10.0(typescript@5.4.5) eslint: 9.3.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.14.1(eslint@9.5.0)(typescript@5.4.5)': + "@typescript-eslint/utils@7.14.1(eslint@9.5.0)(typescript@5.4.5)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.5.0) + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) eslint: 9.5.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.14.1(eslint@9.7.0)(typescript@5.4.5)': + "@typescript-eslint/utils@7.14.1(eslint@9.7.0)(typescript@5.4.5)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.4.5) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.7.0) + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.4.5) eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.14.1(eslint@9.7.0)(typescript@5.5.3)': + "@typescript-eslint/utils@7.14.1(eslint@9.7.0)(typescript@5.5.3)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.3) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.7.0) + "@typescript-eslint/scope-manager": 7.14.1 + "@typescript-eslint/types": 7.14.1 + "@typescript-eslint/typescript-estree": 7.14.1(typescript@5.5.3) eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.9.0(eslint@9.3.0)(typescript@5.1.6)': + "@typescript-eslint/utils@7.9.0(eslint@9.3.0)(typescript@5.1.6)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.1.6) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.3.0) + "@typescript-eslint/scope-manager": 7.9.0 + "@typescript-eslint/types": 7.9.0 + "@typescript-eslint/typescript-estree": 7.9.0(typescript@5.1.6) eslint: 9.3.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.9.0(eslint@9.5.0)(typescript@5.5.4)': + "@typescript-eslint/utils@7.9.0(eslint@9.5.0)(typescript@5.5.4)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.5.4) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.5.0) + "@typescript-eslint/scope-manager": 7.9.0 + "@typescript-eslint/types": 7.9.0 + "@typescript-eslint/typescript-estree": 7.9.0(typescript@5.5.4) eslint: 9.5.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.9.0(eslint@9.7.0)(typescript@5.5.4)': + "@typescript-eslint/utils@7.9.0(eslint@9.7.0)(typescript@5.5.4)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.5.4) + "@eslint-community/eslint-utils": 4.4.0(eslint@9.7.0) + "@typescript-eslint/scope-manager": 7.9.0 + "@typescript-eslint/types": 7.9.0 + "@typescript-eslint/typescript-estree": 7.9.0(typescript@5.5.4) eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.10.0': + "@typescript-eslint/visitor-keys@7.10.0": dependencies: - '@typescript-eslint/types': 7.10.0 + "@typescript-eslint/types": 7.10.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.14.1': + "@typescript-eslint/visitor-keys@7.14.1": dependencies: - '@typescript-eslint/types': 7.14.1 + "@typescript-eslint/types": 7.14.1 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.9.0': + "@typescript-eslint/visitor-keys@7.9.0": dependencies: - '@typescript-eslint/types': 7.9.0 + "@typescript-eslint/types": 7.9.0 eslint-visitor-keys: 3.4.3 - '@web/browser-logs@0.4.0': + "@web/browser-logs@0.4.0": dependencies: errorstacks: 2.4.1 - '@web/config-loader@0.3.1': {} + "@web/config-loader@0.3.1": {} - '@web/dev-server-core@0.7.2': + "@web/dev-server-core@0.7.2": dependencies: - '@types/koa': 2.15.0 - '@types/ws': 7.4.7 - '@web/parse5-utils': 2.1.0 + "@types/koa": 2.15.0 + "@types/ws": 7.4.7 + "@web/parse5-utils": 2.1.0 chokidar: 3.6.0 clone: 2.1.2 es-module-lexer: 1.5.4 @@ -8128,10 +11881,10 @@ snapshots: - supports-color - utf-8-validate - '@web/dev-server-rollup@0.6.4': + "@web/dev-server-rollup@0.6.4": dependencies: - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.20.0) - '@web/dev-server-core': 0.7.2 + "@rollup/plugin-node-resolve": 15.2.3(rollup@4.20.0) + "@web/dev-server-core": 0.7.2 nanocolors: 0.2.13 parse5: 6.0.1 rollup: 4.20.0 @@ -8141,13 +11894,13 @@ snapshots: - supports-color - utf-8-validate - '@web/dev-server@0.4.6': + "@web/dev-server@0.4.6": dependencies: - '@babel/code-frame': 7.24.7 - '@types/command-line-args': 5.2.3 - '@web/config-loader': 0.3.1 - '@web/dev-server-core': 0.7.2 - '@web/dev-server-rollup': 0.6.4 + "@babel/code-frame": 7.24.7 + "@types/command-line-args": 5.2.3 + "@web/config-loader": 0.3.1 + "@web/dev-server-core": 0.7.2 + "@web/dev-server-rollup": 0.6.4 camelcase: 6.3.0 command-line-args: 5.2.1 command-line-usage: 7.0.3 @@ -8162,15 +11915,15 @@ snapshots: - supports-color - utf-8-validate - '@web/parse5-utils@2.1.0': + "@web/parse5-utils@2.1.0": dependencies: - '@types/parse5': 6.0.3 + "@types/parse5": 6.0.3 parse5: 6.0.1 - '@web/test-runner-chrome@0.16.0': + "@web/test-runner-chrome@0.16.0": dependencies: - '@web/test-runner-core': 0.13.3 - '@web/test-runner-coverage-v8': 0.8.0 + "@web/test-runner-core": 0.13.3 + "@web/test-runner-coverage-v8": 0.8.0 async-mutex: 0.4.0 chrome-launcher: 0.15.2 puppeteer-core: 22.15.0 @@ -8179,26 +11932,26 @@ snapshots: - supports-color - utf-8-validate - '@web/test-runner-commands@0.9.0': + "@web/test-runner-commands@0.9.0": dependencies: - '@web/test-runner-core': 0.13.3 + "@web/test-runner-core": 0.13.3 mkdirp: 1.0.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/test-runner-core@0.13.3': - dependencies: - '@babel/code-frame': 7.24.7 - '@types/babel__code-frame': 7.0.6 - '@types/co-body': 6.1.3 - '@types/convert-source-map': 2.0.3 - '@types/debounce': 1.2.4 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@web/browser-logs': 0.4.0 - '@web/dev-server-core': 0.7.2 + "@web/test-runner-core@0.13.3": + dependencies: + "@babel/code-frame": 7.24.7 + "@types/babel__code-frame": 7.0.6 + "@types/co-body": 6.1.3 + "@types/convert-source-map": 2.0.3 + "@types/debounce": 1.2.4 + "@types/istanbul-lib-coverage": 2.0.6 + "@types/istanbul-reports": 3.0.4 + "@web/browser-logs": 0.4.0 + "@web/dev-server-core": 0.7.2 chokidar: 3.6.0 cli-cursor: 3.1.0 co-body: 6.2.0 @@ -8221,9 +11974,9 @@ snapshots: - supports-color - utf-8-validate - '@web/test-runner-coverage-v8@0.8.0': + "@web/test-runner-coverage-v8@0.8.0": dependencies: - '@web/test-runner-core': 0.13.3 + "@web/test-runner-core": 0.13.3 istanbul-lib-coverage: 3.2.2 lru-cache: 8.0.5 picomatch: 2.3.1 @@ -8233,33 +11986,33 @@ snapshots: - supports-color - utf-8-validate - '@web/test-runner-mocha@0.9.0': + "@web/test-runner-mocha@0.9.0": dependencies: - '@web/test-runner-core': 0.13.3 + "@web/test-runner-core": 0.13.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/test-runner-playwright@0.11.0': + "@web/test-runner-playwright@0.11.0": dependencies: - '@web/test-runner-core': 0.13.3 - '@web/test-runner-coverage-v8': 0.8.0 + "@web/test-runner-core": 0.13.3 + "@web/test-runner-coverage-v8": 0.8.0 playwright: 1.45.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@web/test-runner@0.18.2': + "@web/test-runner@0.18.2": dependencies: - '@web/browser-logs': 0.4.0 - '@web/config-loader': 0.3.1 - '@web/dev-server': 0.4.6 - '@web/test-runner-chrome': 0.16.0 - '@web/test-runner-commands': 0.9.0 - '@web/test-runner-core': 0.13.3 - '@web/test-runner-mocha': 0.9.0 + "@web/browser-logs": 0.4.0 + "@web/config-loader": 0.3.1 + "@web/dev-server": 0.4.6 + "@web/test-runner-chrome": 0.16.0 + "@web/test-runner-commands": 0.9.0 + "@web/test-runner-core": 0.13.3 + "@web/test-runner-mocha": 0.9.0 camelcase: 6.3.0 command-line-args: 5.2.1 command-line-usage: 7.0.3 @@ -8274,74 +12027,74 @@ snapshots: - supports-color - utf-8-validate - '@web5/common@1.0.0': + "@web5/common@1.0.0": dependencies: - '@isaacs/ttlcache': 1.4.1 + "@isaacs/ttlcache": 1.4.1 level: 8.0.0 multiformats: 11.0.2 readable-stream: 4.4.2 - '@web5/common@1.0.1': + "@web5/common@1.0.1": dependencies: - '@isaacs/ttlcache': 1.4.1 + "@isaacs/ttlcache": 1.4.1 level: 8.0.1 multiformats: 13.1.0 readable-stream: 4.4.2 - '@web5/crypto@1.0.0': + "@web5/crypto@1.0.0": dependencies: - '@noble/ciphers': 0.4.1 - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@web5/common': 1.0.0 + "@noble/ciphers": 0.4.1 + "@noble/curves": 1.3.0 + "@noble/hashes": 1.3.3 + "@web5/common": 1.0.0 - '@web5/crypto@1.0.3': + "@web5/crypto@1.0.3": dependencies: - '@noble/ciphers': 0.5.3 - '@noble/curves': 1.3.0 - '@noble/hashes': 1.4.0 - '@web5/common': 1.0.1 + "@noble/ciphers": 0.5.3 + "@noble/curves": 1.3.0 + "@noble/hashes": 1.4.0 + "@web5/common": 1.0.1 - '@web5/dids@1.1.0': + "@web5/dids@1.1.0": dependencies: - '@decentralized-identity/ion-sdk': 1.0.4 - '@dnsquery/dns-packet': 6.1.1 - '@web5/common': 1.0.0 - '@web5/crypto': 1.0.0 + "@decentralized-identity/ion-sdk": 1.0.4 + "@dnsquery/dns-packet": 6.1.1 + "@web5/common": 1.0.0 + "@web5/crypto": 1.0.0 abstract-level: 1.0.4 bencode: 4.0.0 buffer: 6.0.3 level: 8.0.1 ms: 2.1.3 - '@web5/dids@1.1.1': + "@web5/dids@1.1.1": dependencies: - '@decentralized-identity/ion-sdk': 1.0.4 - '@dnsquery/dns-packet': 6.1.1 - '@web5/common': 1.0.0 - '@web5/crypto': 1.0.0 + "@decentralized-identity/ion-sdk": 1.0.4 + "@dnsquery/dns-packet": 6.1.1 + "@web5/common": 1.0.0 + "@web5/crypto": 1.0.0 abstract-level: 1.0.4 bencode: 4.0.0 buffer: 6.0.3 level: 8.0.1 ms: 2.1.3 - '@web5/dids@1.1.3': + "@web5/dids@1.1.3": dependencies: - '@decentralized-identity/ion-sdk': 1.0.4 - '@dnsquery/dns-packet': 6.1.1 - '@web5/common': 1.0.0 - '@web5/crypto': 1.0.3 + "@decentralized-identity/ion-sdk": 1.0.4 + "@dnsquery/dns-packet": 6.1.1 + "@web5/common": 1.0.0 + "@web5/crypto": 1.0.3 abstract-level: 1.0.4 bencode: 4.0.0 buffer: 6.0.3 level: 8.0.1 ms: 2.1.3 - '@web5/dwn-server@0.4.6': + "@web5/dwn-server@0.4.6": dependencies: - '@tbd54566975/dwn-sdk-js': 0.4.5 - '@tbd54566975/dwn-sql-store': 0.6.5 + "@tbd54566975/dwn-sdk-js": 0.4.5 + "@tbd54566975/dwn-sql-store": 0.6.5 better-sqlite3: 8.7.0 body-parser: 1.20.2 bytes: 3.1.2 @@ -8367,85 +12120,85 @@ snapshots: - supports-color - utf-8-validate - '@webassemblyjs/ast@1.12.1': + "@webassemblyjs/ast@1.12.1": dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + "@webassemblyjs/floating-point-hex-parser@1.11.6": {} - '@webassemblyjs/helper-api-error@1.11.6': {} + "@webassemblyjs/helper-api-error@1.11.6": {} - '@webassemblyjs/helper-buffer@1.12.1': {} + "@webassemblyjs/helper-buffer@1.12.1": {} - '@webassemblyjs/helper-numbers@1.11.6': + "@webassemblyjs/helper-numbers@1.11.6": dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@xtuc/long": 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + "@webassemblyjs/helper-wasm-bytecode@1.11.6": {} - '@webassemblyjs/helper-wasm-section@1.12.1': + "@webassemblyjs/helper-wasm-section@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.12.1 - '@webassemblyjs/ieee754@1.11.6': + "@webassemblyjs/ieee754@1.11.6": dependencies: - '@xtuc/ieee754': 1.2.0 + "@xtuc/ieee754": 1.2.0 - '@webassemblyjs/leb128@1.11.6': + "@webassemblyjs/leb128@1.11.6": dependencies: - '@xtuc/long': 4.2.2 + "@xtuc/long": 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} + "@webassemblyjs/utf8@1.11.6": {} - '@webassemblyjs/wasm-edit@1.12.1': + "@webassemblyjs/wasm-edit@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-opt": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 + "@webassemblyjs/wast-printer": 1.12.1 - '@webassemblyjs/wasm-gen@1.12.1': + "@webassemblyjs/wasm-gen@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 - '@webassemblyjs/wasm-opt@1.12.1': + "@webassemblyjs/wasm-opt@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 - '@webassemblyjs/wasm-parser@1.12.1': + "@webassemblyjs/wasm-parser@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 - '@webassemblyjs/wast-printer@1.12.1': + "@webassemblyjs/wast-printer@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@xtuc/long': 4.2.2 + "@webassemblyjs/ast": 1.12.1 + "@xtuc/long": 4.2.2 - '@xtuc/ieee754@1.2.0': {} + "@xtuc/ieee754@1.2.0": {} - '@xtuc/long@4.2.2': {} + "@xtuc/long@4.2.2": {} abort-controller@3.0.0: dependencies: @@ -8829,8 +12582,8 @@ snapshots: c8@10.1.2: dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 + "@bcoe/v8-coverage": 0.2.3 + "@istanbuljs/schema": 0.1.3 find-up: 5.0.0 foreground-child: 3.2.1 istanbul-lib-coverage: 3.2.2 @@ -8843,8 +12596,8 @@ snapshots: c8@9.1.0: dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 + "@bcoe/v8-coverage": 0.2.3 + "@istanbuljs/schema": 0.1.3 find-up: 5.0.0 foreground-child: 3.2.1 istanbul-lib-coverage: 3.2.2 @@ -8968,7 +12721,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -9019,7 +12772,7 @@ snapshots: co-body@6.2.0: dependencies: - '@hapi/bourne': 3.0.0 + "@hapi/bourne": 3.0.0 inflation: 2.1.0 qs: 6.13.0 raw-body: 2.5.2 @@ -9282,15 +13035,15 @@ snapshots: eciesjs@0.4.5: dependencies: - '@noble/ciphers': 0.3.0 - '@noble/curves': 1.3.0 - '@noble/hashes': 1.4.0 + "@noble/ciphers": 0.3.0 + "@noble/curves": 1.3.0 + "@noble/hashes": 1.4.0 ed25519-keygen@0.4.11: dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.7 + "@noble/curves": 1.3.0 + "@noble/hashes": 1.3.3 + "@scure/base": 1.1.7 micro-packed: 0.5.3 ee-first@1.1.1: {} @@ -9408,81 +13161,81 @@ snapshots: esbuild@0.19.8: optionalDependencies: - '@esbuild/android-arm': 0.19.8 - '@esbuild/android-arm64': 0.19.8 - '@esbuild/android-x64': 0.19.8 - '@esbuild/darwin-arm64': 0.19.8 - '@esbuild/darwin-x64': 0.19.8 - '@esbuild/freebsd-arm64': 0.19.8 - '@esbuild/freebsd-x64': 0.19.8 - '@esbuild/linux-arm': 0.19.8 - '@esbuild/linux-arm64': 0.19.8 - '@esbuild/linux-ia32': 0.19.8 - '@esbuild/linux-loong64': 0.19.8 - '@esbuild/linux-mips64el': 0.19.8 - '@esbuild/linux-ppc64': 0.19.8 - '@esbuild/linux-riscv64': 0.19.8 - '@esbuild/linux-s390x': 0.19.8 - '@esbuild/linux-x64': 0.19.8 - '@esbuild/netbsd-x64': 0.19.8 - '@esbuild/openbsd-x64': 0.19.8 - '@esbuild/sunos-x64': 0.19.8 - '@esbuild/win32-arm64': 0.19.8 - '@esbuild/win32-ia32': 0.19.8 - '@esbuild/win32-x64': 0.19.8 + "@esbuild/android-arm": 0.19.8 + "@esbuild/android-arm64": 0.19.8 + "@esbuild/android-x64": 0.19.8 + "@esbuild/darwin-arm64": 0.19.8 + "@esbuild/darwin-x64": 0.19.8 + "@esbuild/freebsd-arm64": 0.19.8 + "@esbuild/freebsd-x64": 0.19.8 + "@esbuild/linux-arm": 0.19.8 + "@esbuild/linux-arm64": 0.19.8 + "@esbuild/linux-ia32": 0.19.8 + "@esbuild/linux-loong64": 0.19.8 + "@esbuild/linux-mips64el": 0.19.8 + "@esbuild/linux-ppc64": 0.19.8 + "@esbuild/linux-riscv64": 0.19.8 + "@esbuild/linux-s390x": 0.19.8 + "@esbuild/linux-x64": 0.19.8 + "@esbuild/netbsd-x64": 0.19.8 + "@esbuild/openbsd-x64": 0.19.8 + "@esbuild/sunos-x64": 0.19.8 + "@esbuild/win32-arm64": 0.19.8 + "@esbuild/win32-ia32": 0.19.8 + "@esbuild/win32-x64": 0.19.8 esbuild@0.21.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.3 - '@esbuild/android-arm': 0.21.3 - '@esbuild/android-arm64': 0.21.3 - '@esbuild/android-x64': 0.21.3 - '@esbuild/darwin-arm64': 0.21.3 - '@esbuild/darwin-x64': 0.21.3 - '@esbuild/freebsd-arm64': 0.21.3 - '@esbuild/freebsd-x64': 0.21.3 - '@esbuild/linux-arm': 0.21.3 - '@esbuild/linux-arm64': 0.21.3 - '@esbuild/linux-ia32': 0.21.3 - '@esbuild/linux-loong64': 0.21.3 - '@esbuild/linux-mips64el': 0.21.3 - '@esbuild/linux-ppc64': 0.21.3 - '@esbuild/linux-riscv64': 0.21.3 - '@esbuild/linux-s390x': 0.21.3 - '@esbuild/linux-x64': 0.21.3 - '@esbuild/netbsd-x64': 0.21.3 - '@esbuild/openbsd-x64': 0.21.3 - '@esbuild/sunos-x64': 0.21.3 - '@esbuild/win32-arm64': 0.21.3 - '@esbuild/win32-ia32': 0.21.3 - '@esbuild/win32-x64': 0.21.3 + "@esbuild/aix-ppc64": 0.21.3 + "@esbuild/android-arm": 0.21.3 + "@esbuild/android-arm64": 0.21.3 + "@esbuild/android-x64": 0.21.3 + "@esbuild/darwin-arm64": 0.21.3 + "@esbuild/darwin-x64": 0.21.3 + "@esbuild/freebsd-arm64": 0.21.3 + "@esbuild/freebsd-x64": 0.21.3 + "@esbuild/linux-arm": 0.21.3 + "@esbuild/linux-arm64": 0.21.3 + "@esbuild/linux-ia32": 0.21.3 + "@esbuild/linux-loong64": 0.21.3 + "@esbuild/linux-mips64el": 0.21.3 + "@esbuild/linux-ppc64": 0.21.3 + "@esbuild/linux-riscv64": 0.21.3 + "@esbuild/linux-s390x": 0.21.3 + "@esbuild/linux-x64": 0.21.3 + "@esbuild/netbsd-x64": 0.21.3 + "@esbuild/openbsd-x64": 0.21.3 + "@esbuild/sunos-x64": 0.21.3 + "@esbuild/win32-arm64": 0.21.3 + "@esbuild/win32-ia32": 0.21.3 + "@esbuild/win32-x64": 0.21.3 esbuild@0.23.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.0 - '@esbuild/android-arm': 0.23.0 - '@esbuild/android-arm64': 0.23.0 - '@esbuild/android-x64': 0.23.0 - '@esbuild/darwin-arm64': 0.23.0 - '@esbuild/darwin-x64': 0.23.0 - '@esbuild/freebsd-arm64': 0.23.0 - '@esbuild/freebsd-x64': 0.23.0 - '@esbuild/linux-arm': 0.23.0 - '@esbuild/linux-arm64': 0.23.0 - '@esbuild/linux-ia32': 0.23.0 - '@esbuild/linux-loong64': 0.23.0 - '@esbuild/linux-mips64el': 0.23.0 - '@esbuild/linux-ppc64': 0.23.0 - '@esbuild/linux-riscv64': 0.23.0 - '@esbuild/linux-s390x': 0.23.0 - '@esbuild/linux-x64': 0.23.0 - '@esbuild/netbsd-x64': 0.23.0 - '@esbuild/openbsd-arm64': 0.23.0 - '@esbuild/openbsd-x64': 0.23.0 - '@esbuild/sunos-x64': 0.23.0 - '@esbuild/win32-arm64': 0.23.0 - '@esbuild/win32-ia32': 0.23.0 - '@esbuild/win32-x64': 0.23.0 + "@esbuild/aix-ppc64": 0.23.0 + "@esbuild/android-arm": 0.23.0 + "@esbuild/android-arm64": 0.23.0 + "@esbuild/android-x64": 0.23.0 + "@esbuild/darwin-arm64": 0.23.0 + "@esbuild/darwin-x64": 0.23.0 + "@esbuild/freebsd-arm64": 0.23.0 + "@esbuild/freebsd-x64": 0.23.0 + "@esbuild/linux-arm": 0.23.0 + "@esbuild/linux-arm64": 0.23.0 + "@esbuild/linux-ia32": 0.23.0 + "@esbuild/linux-loong64": 0.23.0 + "@esbuild/linux-mips64el": 0.23.0 + "@esbuild/linux-ppc64": 0.23.0 + "@esbuild/linux-riscv64": 0.23.0 + "@esbuild/linux-s390x": 0.23.0 + "@esbuild/linux-x64": 0.23.0 + "@esbuild/netbsd-x64": 0.23.0 + "@esbuild/openbsd-arm64": 0.23.0 + "@esbuild/openbsd-x64": 0.23.0 + "@esbuild/sunos-x64": 0.23.0 + "@esbuild/win32-arm64": 0.23.0 + "@esbuild/win32-ia32": 0.23.0 + "@esbuild/win32-x64": 0.23.0 escalade@3.1.2: {} @@ -9563,14 +13316,14 @@ snapshots: eslint@9.3.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.3.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.3.0 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + "@eslint-community/eslint-utils": 4.4.0(eslint@9.3.0) + "@eslint-community/regexpp": 4.11.0 + "@eslint/eslintrc": 3.1.0 + "@eslint/js": 9.3.0 + "@humanwhocodes/config-array": 0.13.0 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.3.0 + "@nodelib/fs.walk": 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -9602,14 +13355,14 @@ snapshots: eslint@9.5.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.16.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.5.0 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + "@eslint-community/eslint-utils": 4.4.0(eslint@9.5.0) + "@eslint-community/regexpp": 4.11.0 + "@eslint/config-array": 0.16.0 + "@eslint/eslintrc": 3.1.0 + "@eslint/js": 9.5.0 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.3.0 + "@nodelib/fs.walk": 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -9641,14 +13394,14 @@ snapshots: eslint@9.7.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.1 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.7.0 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + "@eslint-community/eslint-utils": 4.4.0(eslint@9.7.0) + "@eslint-community/regexpp": 4.11.0 + "@eslint/config-array": 0.17.1 + "@eslint/eslintrc": 3.1.0 + "@eslint/js": 9.7.0 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.3.0 + "@nodelib/fs.walk": 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -9789,7 +13542,7 @@ snapshots: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.3 + "@types/yauzl": 2.10.3 transitivePeerDependencies: - supports-color @@ -9799,8 +13552,8 @@ snapshots: fast-glob@3.3.2: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.7 @@ -10232,9 +13985,9 @@ snapshots: ipfs-unixfs-exporter@13.1.5: dependencies: - '@ipld/dag-cbor': 9.0.5 - '@ipld/dag-pb': 4.1.2 - '@multiformats/murmur3': 2.1.8 + "@ipld/dag-cbor": 9.0.5 + "@ipld/dag-pb": 4.1.2 + "@multiformats/murmur3": 2.1.8 err-code: 3.0.1 hamt-sharding: 3.0.6 interface-blockstore: 5.2.3 @@ -10252,8 +14005,8 @@ snapshots: ipfs-unixfs-importer@15.1.5: dependencies: - '@ipld/dag-pb': 4.1.2 - '@multiformats/murmur3': 2.1.8 + "@ipld/dag-pb": 4.1.2 + "@multiformats/murmur3": 2.1.8 err-code: 3.0.1 hamt-sharding: 3.0.6 interface-blockstore: 5.2.3 @@ -10474,13 +14227,13 @@ snapshots: jackspeak@3.4.3: dependencies: - '@isaacs/cliui': 8.0.2 + "@isaacs/cliui": 8.0.2 optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + "@pkgjs/parseargs": 0.11.0 jest-worker@27.5.1: dependencies: - '@types/node': 20.14.8 + "@types/node": 20.14.8 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -10737,7 +14490,7 @@ snapshots: micro-packed@0.5.3: dependencies: - '@scure/base': 1.1.7 + "@scure/base": 1.1.7 micromatch@4.0.7: dependencies: @@ -10964,9 +14717,9 @@ snapshots: nise@6.0.0: dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/text-encoding': 0.7.2 + "@sinonjs/commons": 3.0.1 + "@sinonjs/fake-timers": 11.2.2 + "@sinonjs/text-encoding": 0.7.2 just-extend: 6.2.0 path-to-regexp: 6.2.2 @@ -11173,7 +14926,7 @@ snapshots: pac-proxy-agent@7.0.2: dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 + "@tootallnate/quickjs-emscripten": 0.23.0 agent-base: 7.1.1 debug: 4.3.6(supports-color@8.1.1) get-uri: 6.0.3 @@ -11431,10 +15184,10 @@ snapshots: puppeteer-core@22.15.0: dependencies: - '@puppeteer/browsers': 2.3.0 - chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) - debug: 4.3.6(supports-color@8.1.1) - devtools-protocol: 0.0.1312386 + "@puppeteer/browsers": 2.2.3 + chromium-bidi: 0.5.19(devtools-protocol@0.0.1286932) + debug: 4.3.4(supports-color@8.1.1) + devtools-protocol: 0.0.1286932 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -11457,7 +15210,7 @@ snapshots: rabin-wasm@0.1.5: dependencies: - '@assemblyscript/loader': 0.9.4 + "@assemblyscript/loader": 0.9.4 bl: 5.1.0 debug: 4.3.6(supports-color@8.1.1) minimist: 1.2.8 @@ -11600,24 +15353,24 @@ snapshots: rollup@4.20.0: dependencies: - '@types/estree': 1.0.5 + "@types/estree": 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.20.0 - '@rollup/rollup-android-arm64': 4.20.0 - '@rollup/rollup-darwin-arm64': 4.20.0 - '@rollup/rollup-darwin-x64': 4.20.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 - '@rollup/rollup-linux-arm-musleabihf': 4.20.0 - '@rollup/rollup-linux-arm64-gnu': 4.20.0 - '@rollup/rollup-linux-arm64-musl': 4.20.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 - '@rollup/rollup-linux-riscv64-gnu': 4.20.0 - '@rollup/rollup-linux-s390x-gnu': 4.20.0 - '@rollup/rollup-linux-x64-gnu': 4.20.0 - '@rollup/rollup-linux-x64-musl': 4.20.0 - '@rollup/rollup-win32-arm64-msvc': 4.20.0 - '@rollup/rollup-win32-ia32-msvc': 4.20.0 - '@rollup/rollup-win32-x64-msvc': 4.20.0 + "@rollup/rollup-android-arm-eabi": 4.20.0 + "@rollup/rollup-android-arm64": 4.20.0 + "@rollup/rollup-darwin-arm64": 4.20.0 + "@rollup/rollup-darwin-x64": 4.20.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.20.0 + "@rollup/rollup-linux-arm-musleabihf": 4.20.0 + "@rollup/rollup-linux-arm64-gnu": 4.20.0 + "@rollup/rollup-linux-arm64-musl": 4.20.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.20.0 + "@rollup/rollup-linux-riscv64-gnu": 4.20.0 + "@rollup/rollup-linux-s390x-gnu": 4.20.0 + "@rollup/rollup-linux-x64-gnu": 4.20.0 + "@rollup/rollup-linux-x64-musl": 4.20.0 + "@rollup/rollup-win32-arm64-msvc": 4.20.0 + "@rollup/rollup-win32-ia32-msvc": 4.20.0 + "@rollup/rollup-win32-x64-msvc": 4.20.0 fsevents: 2.3.3 run-parallel-limit@1.1.0: @@ -11653,7 +15406,7 @@ snapshots: schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) @@ -11756,9 +15509,9 @@ snapshots: sinon@18.0.0: dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/samsam': 8.0.0 + "@sinonjs/commons": 3.0.1 + "@sinonjs/fake-timers": 11.2.2 + "@sinonjs/samsam": 8.0.0 diff: 5.2.0 nise: 6.0.0 supports-color: 7.2.0 @@ -12011,7 +15764,7 @@ snapshots: terser-webpack-plugin@5.3.10(esbuild@0.19.8)(webpack@5.93.0(esbuild@0.19.8)): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 @@ -12022,7 +15775,7 @@ snapshots: terser-webpack-plugin@5.3.10(esbuild@0.23.0)(webpack@5.93.0(esbuild@0.23.0)): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 @@ -12033,7 +15786,7 @@ snapshots: terser-webpack-plugin@5.3.10(webpack@5.93.0): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 @@ -12042,20 +15795,20 @@ snapshots: terser@5.31.3: dependencies: - '@jridgewell/source-map': 0.3.6 + "@jridgewell/source-map": 0.3.6 acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 test-exclude@6.0.0: dependencies: - '@istanbuljs/schema': 0.1.3 + "@istanbuljs/schema": 0.1.3 glob: 7.2.3 minimatch: 3.1.2 test-exclude@7.0.1: dependencies: - '@istanbuljs/schema': 0.1.3 + "@istanbuljs/schema": 0.1.3 glob: 10.4.5 minimatch: 9.0.5 @@ -12272,8 +16025,8 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 + "@jridgewell/trace-mapping": 0.3.25 + "@types/istanbul-lib-coverage": 2.0.6 convert-source-map: 2.0.0 validate-npm-package-license@3.0.4: @@ -12304,11 +16057,11 @@ snapshots: webpack@5.93.0: dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + "@types/eslint-scope": 3.7.7 + "@types/estree": 1.0.5 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/wasm-edit": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) browserslist: 4.23.3 @@ -12329,17 +16082,17 @@ snapshots: watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - - '@swc/core' + - "@swc/core" - esbuild - uglify-js webpack@5.93.0(esbuild@0.19.8): dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + "@types/eslint-scope": 3.7.7 + "@types/estree": 1.0.5 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/wasm-edit": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) browserslist: 4.23.3 @@ -12360,17 +16113,17 @@ snapshots: watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - - '@swc/core' + - "@swc/core" - esbuild - uglify-js webpack@5.93.0(esbuild@0.23.0): dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + "@types/eslint-scope": 3.7.7 + "@types/estree": 1.0.5 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/wasm-edit": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) browserslist: 4.23.3 @@ -12391,7 +16144,7 @@ snapshots: watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - - '@swc/core' + - "@swc/core" - esbuild - uglify-js From d3a2de94061fbb08bc0892c26e0a7675be3a5763 Mon Sep 17 00:00:00 2001 From: Liran Cohen Date: Tue, 13 Aug 2024 23:03:15 -0400 Subject: [PATCH 2/4] PermissionsApi for Agent, `permissions` API for `Web5` (#833) This refactors a lot of what's in https://github.com/TBD54566975/web5-js/pull/824 with regards to creating/fetching grants. Satisfies: https://github.com/TBD54566975/web5-js/issues/827 #### `PermissionsApi` Introduces a `PermissionsApi` interface and an `AgentPermissionsApi` concrete implementation. The interface implements the following methods `fetchGrants`, `fetchRequests`, `isGrantRevoked`, `createGrant`, `createRequest`, `createRevocation` as convenience methods for dealing with the built-in permission protocol records. The `AgentPermissionsApi` implements an additional static method `matchGrantFromArray` which was moved from a `PermissionsUtil` class, which is used to find the appropriate grant to use when authoring a message. #### `dwn.connected` A Private API usedin a connected state to find and cache the correct grants to use for the request. #### `dwn.permissions` A Permissions API which implements `request`, `grant`, `queryRequests`, and `queryGrants` that a user can utilize The `Web5` permissions api introduces 3 helper classes to represent permissions: #### `PermissionRequest` Class to represent a permission request record. It implements convenience methods similar to the `Record` class where you can `store()`, `import()` or `send()` the underlying request record. Additionally a `grant()` method will create a `PermissionGrant` object. #### `PermissionGrant` Class to represent a grant record. It implements convenience methods similar to the `Record` class where you can `store()`, `import()` or `send()` the underlying grant record. Additionally a `revoke()` method will create a `GrantRevocation` object, and `isRevoked()` will check if the underlying grant has been revoked. #### `GrantRevocation` Class to represent a permission grant revocation record. It implements convenience methods similar to the `Record` class where you can `store()` or `send()` the underlying revocation record. --- .changeset/gold-lamps-obey.md | 5 + .changeset/polite-days-wash.md | 8 + packages/agent/src/dwn-api.ts | 44 - packages/agent/src/dwn-permissions-util.ts | 116 -- packages/agent/src/index.ts | 3 +- packages/agent/src/permissions-api.ts | 371 +++++ packages/agent/src/test-harness.ts | 16 +- packages/agent/src/types/agent.ts | 6 + packages/agent/src/types/dwn.ts | 6 + packages/agent/src/types/permissions.ts | 96 ++ .../agent/tests/connected-permissions.spec.ts | 357 ----- packages/agent/tests/dwn-api.spec.ts | 17 +- .../agent/tests/dwn-permissions-util.spec.ts | 593 -------- packages/agent/tests/permissions-api.spec.ts | 1223 +++++++++++++++++ packages/agent/tests/utils/grants.ts | 277 ---- packages/agent/tests/utils/test-agent.ts | 5 + packages/api/src/dwn-api.ts | 295 ++-- packages/api/src/grant-revocation.ts | 124 ++ packages/api/src/index.ts | 3 + packages/api/src/permission-grant.ts | 327 +++++ packages/api/src/permission-request.ts | 214 +++ packages/api/src/web5.ts | 13 +- packages/api/tests/dwn-api.spec.ts | 983 +++++++++---- packages/api/tests/permission-grant.spec.ts | 460 +++++++ packages/api/tests/permission-request.spec.ts | 260 ++++ packages/api/tests/web5.spec.ts | 465 ++++++- packages/identity-agent/src/identity-agent.ts | 13 +- .../tests/identity-agent.spec.ts | 2 +- packages/proxy-agent/src/proxy-agent.ts | 13 +- .../proxy-agent/tests/proxy-agent.spec.ts | 2 +- packages/user-agent/src/user-agent.ts | 13 +- packages/user-agent/tests/user-agent.spec.ts | 2 +- 32 files changed, 4423 insertions(+), 1909 deletions(-) create mode 100644 .changeset/gold-lamps-obey.md create mode 100644 .changeset/polite-days-wash.md delete mode 100644 packages/agent/src/dwn-permissions-util.ts create mode 100644 packages/agent/src/permissions-api.ts create mode 100644 packages/agent/src/types/permissions.ts delete mode 100644 packages/agent/tests/connected-permissions.spec.ts delete mode 100644 packages/agent/tests/dwn-permissions-util.spec.ts create mode 100644 packages/agent/tests/permissions-api.spec.ts delete mode 100644 packages/agent/tests/utils/grants.ts create mode 100644 packages/api/src/grant-revocation.ts create mode 100644 packages/api/src/permission-grant.ts create mode 100644 packages/api/src/permission-request.ts create mode 100644 packages/api/tests/permission-grant.spec.ts create mode 100644 packages/api/tests/permission-request.spec.ts diff --git a/.changeset/gold-lamps-obey.md b/.changeset/gold-lamps-obey.md new file mode 100644 index 000000000..d4beab164 --- /dev/null +++ b/.changeset/gold-lamps-obey.md @@ -0,0 +1,5 @@ +--- +"@web5/api": patch +--- + +Introduce a `grants` API for `Web5.dwn` diff --git a/.changeset/polite-days-wash.md b/.changeset/polite-days-wash.md new file mode 100644 index 000000000..0ea7caf24 --- /dev/null +++ b/.changeset/polite-days-wash.md @@ -0,0 +1,8 @@ +--- +"@web5/identity-agent": patch +"@web5/proxy-agent": patch +"@web5/user-agent": patch +"@web5/agent": patch +--- + +Introduce a `PermissionsApi` for Web5Agents diff --git a/packages/agent/src/dwn-api.ts b/packages/agent/src/dwn-api.ts index 747421971..fb0614373 100644 --- a/packages/agent/src/dwn-api.ts +++ b/packages/agent/src/dwn-api.ts @@ -2,7 +2,6 @@ import type { Readable } from '@web5/common'; import { Cid, - DataEncodedRecordsWriteMessage, DataStoreLevel, Dwn, DwnConfig, @@ -11,10 +10,6 @@ import { GenericMessage, Message, MessageStoreLevel, - PermissionGrant, - PermissionScope, - PermissionsProtocol, - RecordsWrite, ResumableTaskStoreLevel } from '@tbd54566975/dwn-sdk-js'; @@ -449,43 +444,4 @@ export class AgentDwnApi { return dwnMessageWithBlob; } - - /** - * NOTE EVERYTHING BELOW THIS LINE IS TEMPORARY - * TODO: Create a `grants` API to handle creating permission requests, grants and revocations - * */ - - public async createGrant({ grantedFrom, dateExpires, grantedTo, scope, delegated }:{ - dateExpires: string, - grantedFrom: string, - grantedTo: string, - scope: PermissionScope, - delegated?: boolean - }): Promise<{ - recordsWrite: RecordsWrite, - dataEncodedMessage: DataEncodedRecordsWriteMessage, - permissionGrantBytes: Uint8Array - }> { - return await PermissionsProtocol.createGrant({ - signer: await this.getSigner(grantedFrom), - grantedTo, - dateExpires, - scope, - delegated - }); - } - - public async createRevocation({ grant, author }:{ - author: string, - grant: PermissionGrant - }): Promise<{ - recordsWrite: RecordsWrite, - dataEncodedMessage: DataEncodedRecordsWriteMessage, - permissionRevocationBytes: Uint8Array - }> { - return await PermissionsProtocol.createRevocation({ - signer: await this.getSigner(author), - grant, - }); - } } \ No newline at end of file diff --git a/packages/agent/src/dwn-permissions-util.ts b/packages/agent/src/dwn-permissions-util.ts deleted file mode 100644 index cf97c1cf5..000000000 --- a/packages/agent/src/dwn-permissions-util.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { DataEncodedRecordsWriteMessage, MessagesPermissionScope, PermissionGrant, PermissionScope, PermissionsProtocol, ProtocolPermissionScope, RecordsPermissionScope } from '@tbd54566975/dwn-sdk-js'; -import { DwnInterface } from './types/dwn.js'; -import { isRecordsType } from './dwn-api.js'; - -export class DwnPermissionsUtil { - - static permissionsProtocolParams(type: 'grant' | 'revoke' | 'request'): { protocol: string, protocolPath: string } { - const protocolPath = type === 'grant' ? PermissionsProtocol.grantPath : - type === 'revoke' ? PermissionsProtocol.revocationPath : PermissionsProtocol.requestPath; - return { - protocol: PermissionsProtocol.uri, - protocolPath, - }; - } - - /** - * Matches the appropriate grant from an array of grants based on the provided parameters. - * - * @param delegated if true, only delegated grants are turned, if false all grants are returned including delegated ones. - */ - static async matchGrantFromArray( - grantor: string, - grantee: string, - messageParams: { - messageType: T, - protocol?: string, - protocolPath?: string, - contextId?: string, - }, - grants: DataEncodedRecordsWriteMessage[], - delegated: boolean = false - ): Promise<{ message: DataEncodedRecordsWriteMessage, grant: PermissionGrant } | undefined> { - for (const grant of grants) { - const grantData = await PermissionGrant.parse(grant); - // only delegated grants are returned - if (delegated === true && grantData.delegated !== true) { - continue; - } - const { messageType, protocol, protocolPath, contextId } = messageParams; - - if (this.matchScopeFromGrant(grantor, grantee, messageType, grantData, protocol, protocolPath, contextId)) { - return { message: grant, grant: grantData }; - } - } - } - - private static matchScopeFromGrant( - grantor: string, - grantee: string, - messageType: T, - grant: PermissionGrant, - protocol?: string, - protocolPath?: string, - contextId?: string - ): boolean { - // Check if the grant matches the provided parameters - if (grant.grantee !== grantee || grant.grantor !== grantor) { - return false; - } - - const scope = grant.scope; - const scopeMessageType = scope.interface + scope.method; - if (scopeMessageType === messageType) { - if (isRecordsType(messageType)) { - const recordScope = scope as RecordsPermissionScope; - if (!this.matchesProtocol(recordScope, protocol)) { - return false; - } - - // If the grant scope is not restricted to a specific context or protocol path, it is unrestricted and can be used - if (this.isUnrestrictedProtocolScope(recordScope)) { - return true; - } - - // protocolPath and contextId are mutually exclusive - // If the permission is scoped to a protocolPath and the permissionParams matches that path, this grant can be used - if (recordScope.protocolPath !== undefined && recordScope.protocolPath === protocolPath) { - return true; - } - - // If the permission is scoped to a contextId and the permissionParams starts with that contextId, this grant can be used - if (recordScope.contextId !== undefined && contextId?.startsWith(recordScope.contextId)) { - return true; - } - } else { - const messagesScope = scope as MessagesPermissionScope | ProtocolPermissionScope; - if (this.protocolScopeUnrestricted(messagesScope)) { - return true; - } - - if (!this.matchesProtocol(messagesScope, protocol)) { - return false; - } - - return this.isUnrestrictedProtocolScope(messagesScope); - } - } - - return false; - } - - private static matchesProtocol(scope: PermissionScope & { protocol?: string }, protocol?: string): boolean { - return scope.protocol !== undefined && scope.protocol === protocol; - } - - /** - * Checks if the scope is restricted to a specific protocol - */ - private static protocolScopeUnrestricted(scope: PermissionScope & { protocol?: string }): boolean { - return scope.protocol === undefined; - } - - private static isUnrestrictedProtocolScope(scope: PermissionScope & { contextId?: string, protocolPath?: string }): boolean { - return scope.contextId === undefined && scope.protocolPath === undefined; - } -} \ No newline at end of file diff --git a/packages/agent/src/index.ts b/packages/agent/src/index.ts index 4af5f24de..b3f1b3f02 100644 --- a/packages/agent/src/index.ts +++ b/packages/agent/src/index.ts @@ -3,6 +3,7 @@ export * from './types/dwn.js'; export type * from './types/identity.js'; export type * from './types/identity-vault.js'; export type * from './types/key-manager.js'; +export type * from './types/permissions.js'; export type * from './types/sync.js'; export type * from './types/vc.js'; @@ -10,11 +11,11 @@ export * from './bearer-identity.js'; export * from './crypto-api.js'; export * from './did-api.js'; export * from './dwn-api.js'; -export * from './dwn-permissions-util.js'; export * from './dwn-registrar.js'; export * from './hd-identity-vault.js'; export * from './identity-api.js'; export * from './local-key-manager.js'; +export * from './permissions-api.js'; export * from './rpc-client.js'; export * from './store-data.js'; export * from './store-did.js'; diff --git a/packages/agent/src/permissions-api.ts b/packages/agent/src/permissions-api.ts new file mode 100644 index 000000000..1d2d85cc8 --- /dev/null +++ b/packages/agent/src/permissions-api.ts @@ -0,0 +1,371 @@ +import { PermissionGrant, PermissionGrantData, PermissionRequestData, PermissionRevocationData, PermissionsProtocol } from '@tbd54566975/dwn-sdk-js'; +import { Web5Agent } from './types/agent.js'; +import { DwnDataEncodedRecordsWriteMessage, DwnInterface, DwnMessageParams, DwnMessagesPermissionScope, DwnPermissionGrant, DwnPermissionRequest, DwnPermissionScope, DwnProtocolPermissionScope, DwnRecordsPermissionScope, ProcessDwnRequest } from './types/dwn.js'; +import { Convert } from '@web5/common'; +import { CreateGrantParams, CreateRequestParams, CreateRevocationParams, FetchPermissionRequestParams, FetchPermissionsParams, IsGrantRevokedParams, PermissionGrantEntry, PermissionRequestEntry, PermissionRevocationEntry, PermissionsApi } from './types/permissions.js'; +import { isRecordsType } from './dwn-api.js'; + +export class AgentPermissionsApi implements PermissionsApi { + + private _agent?: Web5Agent; + + get agent(): Web5Agent { + if (!this._agent) { + throw new Error('AgentPermissionsApi: Agent is not set'); + } + return this._agent; + } + + set agent(agent:Web5Agent) { + this._agent = agent; + } + + constructor({ agent }: { agent?: Web5Agent } = {}) { + this._agent = agent; + } + + async fetchGrants({ + author, + target, + grantee, + grantor, + protocol, + remote = false + }: FetchPermissionsParams): Promise { + + // filter by a protocol using tags if provided + const tags = protocol ? { protocol } : undefined; + + const params: ProcessDwnRequest = { + author : author, + target : target, + messageType : DwnInterface.RecordsQuery, + messageParams : { + filter: { + author : grantor, // the author of the grant would be the grantor + recipient : grantee, // the recipient of the grant would be the grantee + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.grantPath, + tags + } + } + }; + + const { reply } = remote ? await this.agent.sendDwnRequest(params) : await this.agent.processDwnRequest(params); + if (reply.status.code !== 200) { + throw new Error(`PermissionsApi: Failed to fetch grants: ${reply.status.detail}`); + } + + const grants:PermissionGrantEntry[] = []; + for (const entry of reply.entries! as DwnDataEncodedRecordsWriteMessage[]) { + // TODO: Check for revocation status based on a request parameter and filter out revoked grants + const grant = await DwnPermissionGrant.parse(entry); + grants.push({ grant, message: entry }); + } + + return grants; + } + + async fetchRequests({ + author, + target, + protocol, + remote = false + }:FetchPermissionRequestParams):Promise { + // filter by a protocol using tags if provided + const tags = protocol ? { protocol } : undefined; + + const params: ProcessDwnRequest = { + author : author, + target : target, + messageType : DwnInterface.RecordsQuery, + messageParams : { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.requestPath, + tags + } + } + }; + + const { reply } = remote ? await this.agent.sendDwnRequest(params) : await this.agent.processDwnRequest(params); + if (reply.status.code !== 200) { + throw new Error(`PermissionsApi: Failed to fetch requests: ${reply.status.detail}`); + } + + const requests: PermissionRequestEntry[] = []; + for (const entry of reply.entries! as DwnDataEncodedRecordsWriteMessage[]) { + const request = await DwnPermissionRequest.parse(entry); + requests.push({ request, message: entry }); + } + + return requests; + } + + async isGrantRevoked({ + author, + target, + grantRecordId, + remote = false + }: IsGrantRevokedParams): Promise { + const params: ProcessDwnRequest = { + author, + target, + messageType : DwnInterface.RecordsRead, + messageParams : { + filter: { + parentId : grantRecordId, + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.revocationPath, + } + } + }; + + const { reply: revocationReply } = remote ? await this.agent.sendDwnRequest(params) : await this.agent.processDwnRequest(params); + if (revocationReply.status.code === 404) { + // no revocation found, the grant is not revoked + return false; + } else if (revocationReply.status.code === 200) { + // a revocation was found, the grant is revoked + return true; + } + + throw new Error(`PermissionsApi: Failed to check if grant is revoked: ${revocationReply.status.detail}`); + } + + async createGrant(params: CreateGrantParams): Promise { + const { author, store = false, delegated = false, ...createGrantParams } = params; + + let tags = undefined; + if (PermissionsProtocol.hasProtocolScope(createGrantParams.scope)) { + tags = { protocol: createGrantParams.scope.protocol }; + } + + const permissionGrantData: PermissionGrantData = { + dateExpires : createGrantParams.dateExpires, + requestId : createGrantParams.requestId, + description : createGrantParams.description, + delegated, + scope : createGrantParams.scope + }; + + const permissionsGrantBytes = Convert.object(permissionGrantData).toUint8Array(); + + const messageParams: DwnMessageParams[DwnInterface.RecordsWrite] = { + recipient : createGrantParams.grantedTo, + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.grantPath, + dataFormat : 'application/json', + tags + }; + + const { reply, message } = await this.agent.processDwnRequest({ + store, + author, + target : author, + messageType : DwnInterface.RecordsWrite, + messageParams, + dataStream : new Blob([ permissionsGrantBytes ]) + }); + + if (reply.status.code !== 202) { + throw new Error(`PermissionsApi: Failed to create grant: ${reply.status.detail}`); + } + + const dataEncodedMessage: DwnDataEncodedRecordsWriteMessage = { + ...message!, + encodedData: Convert.uint8Array(permissionsGrantBytes).toBase64Url() + }; + + const grant = await DwnPermissionGrant.parse(dataEncodedMessage); + + return { grant, message: dataEncodedMessage }; + } + + async createRequest(params: CreateRequestParams): Promise { + const { author, store = false, delegated = false, ...createGrantParams } = params; + + let tags = undefined; + if (PermissionsProtocol.hasProtocolScope(createGrantParams.scope)) { + tags = { protocol: createGrantParams.scope.protocol }; + } + + const permissionRequestData: PermissionRequestData = { + description : createGrantParams.description, + delegated, + scope : createGrantParams.scope + }; + + const permissionRequestBytes = Convert.object(permissionRequestData).toUint8Array(); + + const messageParams: DwnMessageParams[DwnInterface.RecordsWrite] = { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.requestPath, + dataFormat : 'application/json', + tags + }; + + const { reply, message } = await this.agent.processDwnRequest({ + store, + author, + target : author, + messageType : DwnInterface.RecordsWrite, + messageParams, + dataStream : new Blob([ permissionRequestBytes ]) + }); + + if (reply.status.code !== 202) { + throw new Error(`PermissionsApi: Failed to create request: ${reply.status.detail}`); + } + + const dataEncodedMessage: DwnDataEncodedRecordsWriteMessage = { + ...message!, + encodedData: Convert.uint8Array(permissionRequestBytes).toBase64Url() + }; + + const request = await DwnPermissionRequest.parse(dataEncodedMessage); + + return { request, message: dataEncodedMessage }; + } + + async createRevocation(params: CreateRevocationParams): Promise { + const { author, store = false, grant, description } = params; + + const revokeData: PermissionRevocationData = { description }; + + const permissionRevocationBytes = Convert.object(revokeData).toUint8Array(); + + let tags = undefined; + if (PermissionsProtocol.hasProtocolScope(grant.scope)) { + tags = { protocol: grant.scope.protocol }; + } + + const messageParams: DwnMessageParams[DwnInterface.RecordsWrite] = { + parentContextId : grant.id, + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.revocationPath, + dataFormat : 'application/json', + tags + }; + + const { reply, message } = await this.agent.processDwnRequest({ + store, + author, + target : author, + messageType : DwnInterface.RecordsWrite, + messageParams, + dataStream : new Blob([ permissionRevocationBytes ]) + }); + + if (reply.status.code !== 202) { + throw new Error(`PermissionsApi: Failed to create revocation: ${reply.status.detail}`); + } + + const dataEncodedMessage: DwnDataEncodedRecordsWriteMessage = { + ...message!, + encodedData: Convert.uint8Array(permissionRevocationBytes).toBase64Url() + }; + + return { message: dataEncodedMessage }; + } + + /** + * Matches the appropriate grant from an array of grants based on the provided parameters. + * + * @param delegated if true, only delegated grants are turned, if false all grants are returned including delegated ones. + */ + static async matchGrantFromArray( + grantor: string, + grantee: string, + messageParams: { + messageType: T, + protocol?: string, + protocolPath?: string, + contextId?: string, + }, + grants: PermissionGrantEntry[], + delegated: boolean = false + ): Promise { + for (const entry of grants) { + const { grant, message } = entry; + if (delegated === true && grant.delegated !== true) { + continue; + } + const { messageType, protocol, protocolPath, contextId } = messageParams; + + if (this.matchScopeFromGrant(grantor, grantee, messageType, grant, protocol, protocolPath, contextId)) { + return { grant, message }; + } + } + } + + private static matchScopeFromGrant( + grantor: string, + grantee: string, + messageType: T, + grant: PermissionGrant, + protocol?: string, + protocolPath?: string, + contextId?: string + ): boolean { + // Check if the grant matches the provided parameters + if (grant.grantee !== grantee || grant.grantor !== grantor) { + return false; + } + + const scope = grant.scope; + const scopeMessageType = scope.interface + scope.method; + if (scopeMessageType === messageType) { + if (isRecordsType(messageType)) { + const recordScope = scope as DwnRecordsPermissionScope; + if (!this.matchesProtocol(recordScope, protocol)) { + return false; + } + + // If the grant scope is not restricted to a specific context or protocol path, it is unrestricted and can be used + if (this.isUnrestrictedProtocolScope(recordScope)) { + return true; + } + + // protocolPath and contextId are mutually exclusive + // If the permission is scoped to a protocolPath and the permissionParams matches that path, this grant can be used + if (recordScope.protocolPath !== undefined && recordScope.protocolPath === protocolPath) { + return true; + } + + // If the permission is scoped to a contextId and the permissionParams starts with that contextId, this grant can be used + if (recordScope.contextId !== undefined && contextId?.startsWith(recordScope.contextId)) { + return true; + } + } else { + const messagesScope = scope as DwnMessagesPermissionScope | DwnProtocolPermissionScope; + if (this.protocolScopeUnrestricted(messagesScope)) { + return true; + } + + if (!this.matchesProtocol(messagesScope, protocol)) { + return false; + } + + return this.isUnrestrictedProtocolScope(messagesScope); + } + } + + return false; + } + + private static matchesProtocol(scope: DwnPermissionScope & { protocol?: string }, protocol?: string): boolean { + return scope.protocol !== undefined && scope.protocol === protocol; + } + + /** + * Checks if the scope is restricted to a specific protocol + */ + private static protocolScopeUnrestricted(scope: DwnPermissionScope & { protocol?: string }): boolean { + return scope.protocol === undefined; + } + + private static isUnrestrictedProtocolScope(scope: DwnPermissionScope & { contextId?: string, protocolPath?: string }): boolean { + return scope.contextId === undefined && scope.protocolPath === undefined; + } +} \ No newline at end of file diff --git a/packages/agent/src/test-harness.ts b/packages/agent/src/test-harness.ts index 40e02881f..e17dc8df0 100644 --- a/packages/agent/src/test-harness.ts +++ b/packages/agent/src/test-harness.ts @@ -22,6 +22,7 @@ import { DwnDidStore, InMemoryDidStore } from './store-did.js'; import { DwnKeyStore, InMemoryKeyStore } from './store-key.js'; import { DwnIdentityStore, InMemoryIdentityStore } from './store-identity.js'; import { DidResolverCacheMemory } from './prototyping/dids/resolver-cache-memory.js'; +import { AgentPermissionsApi } from './permissions-api.js'; type PlatformAgentTestHarnessParams = { agent: Web5PlatformAgent @@ -104,10 +105,11 @@ export class PlatformAgentTestHarness { // Easiest way to start with fresh in-memory stores is to re-instantiate Agent components. if (this.agentStores === 'memory') { - const { didApi, identityApi, keyManager } = PlatformAgentTestHarness.useMemoryStores({ agent: this.agent }); + const { didApi, identityApi, permissionsApi, keyManager } = PlatformAgentTestHarness.useMemoryStores({ agent: this.agent }); this.agent.did = didApi; this.agent.identity = identityApi; this.agent.keyManager = keyManager; + this.agent.permissions = permissionsApi; } } @@ -203,7 +205,8 @@ export class PlatformAgentTestHarness { identityApi, keyManager, didResolverCache, - vaultStore + vaultStore, + permissionsApi } = (agentStores === 'memory') ? PlatformAgentTestHarness.useMemoryStores() : PlatformAgentTestHarness.useDiskStores({ testDataLocation, stores: dwnStores }); @@ -247,6 +250,7 @@ export class PlatformAgentTestHarness { dwnApi, identityApi, keyManager, + permissionsApi, rpcClient, syncApi, }); @@ -298,7 +302,9 @@ export class PlatformAgentTestHarness { const keyManager = new LocalKeyManager({ agent, keyStore: keyStore }); - return { agentVault, didApi, didResolverCache, identityApi, keyManager, vaultStore }; + const permissionsApi = new AgentPermissionsApi({ agent }); + + return { agentVault, didApi, didResolverCache, identityApi, keyManager, permissionsApi, vaultStore }; } private static useMemoryStores({ agent }: { agent?: Web5PlatformAgent } = {}) { @@ -319,6 +325,8 @@ export class PlatformAgentTestHarness { const identityApi = new AgentIdentityApi({ agent, store: new InMemoryIdentityStore() }); - return { agentVault, didApi, didResolverCache, identityApi, keyManager, vaultStore }; + const permissionsApi = new AgentPermissionsApi({ agent }); + + return { agentVault, didApi, didResolverCache, identityApi, keyManager, permissionsApi, vaultStore }; } } \ No newline at end of file diff --git a/packages/agent/src/types/agent.ts b/packages/agent/src/types/agent.ts index 1d99c1f2b..c5106a3f8 100644 --- a/packages/agent/src/types/agent.ts +++ b/packages/agent/src/types/agent.ts @@ -7,6 +7,7 @@ import type { AgentCryptoApi } from '../crypto-api.js'; import type { AgentKeyManager } from './key-manager.js'; import type { IdentityVault } from './identity-vault.js'; import type { AgentIdentityApi } from '../identity-api.js'; +import type { AgentPermissionsApi } from '../permissions-api.js'; import type { ProcessVcRequest, SendVcRequest, VcResponse } from './vc.js'; import type { AgentDidApi, DidInterface, DidRequest, DidResponse } from '../did-api.js'; import type { DwnInterface, DwnResponse, ProcessDwnRequest, SendDwnRequest } from './dwn.js'; @@ -151,6 +152,11 @@ export interface Web5PlatformAgent Promise; + + /** + * Fetch all requests for a given author and target, optionally filtered by a specific protocol. + */ + fetchRequests: (params: FetchPermissionRequestParams) => Promise; + + /** + * Check whether a grant is revoked by reading the revocation record for a given grant recordId. + */ + isGrantRevoked: (request: IsGrantRevokedParams) => Promise; + + /** + * Create a new permission grant, optionally storing it in the DWN. + */ + createGrant:(params: CreateGrantParams) => Promise; + + /** + * Create a new permission request, optionally storing it in the DWN. + */ + createRequest(params: CreateRequestParams): Promise; + + /** + * Create a new permission revocation, optionally storing it in the DWN. + */ + createRevocation(params: CreateRevocationParams): Promise; +} diff --git a/packages/agent/tests/connected-permissions.spec.ts b/packages/agent/tests/connected-permissions.spec.ts deleted file mode 100644 index 24e104d6c..000000000 --- a/packages/agent/tests/connected-permissions.spec.ts +++ /dev/null @@ -1,357 +0,0 @@ -import { DwnInterfaceName, DwnMethodName, Jws, Message, ProtocolDefinition, Time } from '@tbd54566975/dwn-sdk-js'; - -import type { BearerIdentity } from '../src/bearer-identity.js'; - -import { TestAgent } from './utils/test-agent.js'; -import { DwnInterface, ProcessDwnRequest } from '../src/types/dwn.js'; -import { testDwnUrl } from './utils/test-config.js'; -import { PlatformAgentTestHarness } from '../src/test-harness.js'; - -import sinon from 'sinon'; - -import { expect } from 'chai'; - -// NOTE: @noble/secp256k1 requires globalThis.crypto polyfill for node.js <=18: https://github.com/paulmillr/noble-secp256k1/blob/main/README.md#usage -// Remove when we move off of node.js v18 to v20, earliest possible time would be Oct 2023: https://github.com/nodejs/release#release-schedule -import { webcrypto } from 'node:crypto'; -// @ts-expect-error - globalThis.crypto and webcrypto are of different types. -if (!globalThis.crypto) globalThis.crypto = webcrypto; - -let testDwnUrls: string[] = [testDwnUrl]; - -describe('Connect Flow Permissions', () => { - let aliceAgent: PlatformAgentTestHarness; - let appAgent: PlatformAgentTestHarness; - - before(async () => { - aliceAgent = await PlatformAgentTestHarness.setup({ - agentClass : TestAgent, - agentStores : 'dwn' - }); - - appAgent = await PlatformAgentTestHarness.setup({ - agentClass : TestAgent, - agentStores : 'dwn', - testDataLocation : '__TESTDATA__/app' // Use a different data location for the app - }); - }); - - after(async () => { - await aliceAgent.clearStorage(); - await aliceAgent.closeStorage(); - - await appAgent.clearStorage(); - await appAgent.closeStorage(); - }); - - describe('with Web5 Platform Agent', () => { - let alice: BearerIdentity; - - before(async () => { - await aliceAgent.clearStorage(); - await aliceAgent.createAgentDid(); - - await appAgent.clearStorage(); - await appAgent.createAgentDid(); - }); - - beforeEach(async () => { - sinon.restore(); - - await aliceAgent.syncStore.clear(); - await aliceAgent.dwnDataStore.clear(); - await aliceAgent.dwnEventLog.clear(); - await aliceAgent.dwnMessageStore.clear(); - await aliceAgent.dwnResumableTaskStore.clear(); - aliceAgent.dwnStores.clear(); - - await appAgent.syncStore.clear(); - await appAgent.dwnDataStore.clear(); - await appAgent.dwnEventLog.clear(); - await appAgent.dwnMessageStore.clear(); - await appAgent.dwnResumableTaskStore.clear(); - appAgent.dwnStores.clear(); - - // create and manage alice identity for the tests to use - alice = await aliceAgent.createIdentity({ name: 'Alice', testDwnUrls }); - await aliceAgent.agent.identity.manage({ portableIdentity: await alice.export() }); - }); - - after(async () => { - await aliceAgent.clearStorage(); - await appAgent.clearStorage(); - }); - - it('creates and signs a message with a permission grant', async () => { - // scenario: - // an app creates an identity and manages it within it's own agent - // alice creates a permission grant for the app identity to allow MessageQuery on her DWN - // the app processes the permission grant - // the app then attempts to MessagesQuery using the permission grant on both the local app's DWN and alice's remote DWN - - // create a new identity for the app - const appX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Device X' }, - didMethod : 'jwk' - }); - - await appAgent.agent.identity.manage({ portableIdentity: await appX.export() }); - - // alice creates a permission grant - const messagesQueryGrant = await aliceAgent.agent.dwn.createGrant({ - grantedFrom : alice.did.uri, - grantedTo : appX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Query } - }); - - // alice stores and processes the permission grant on her DWN - const { reply: aliceGrantReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : messagesQueryGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([messagesQueryGrant.permissionGrantBytes]), - }); - expect(aliceGrantReply.status.code).to.equal(202); - - // The App processes the permission grant given by Alice, so it can be accessible when using it - const { reply: appAgentGrantReply } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : messagesQueryGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([messagesQueryGrant.permissionGrantBytes]), - }); - expect(appAgentGrantReply.status.code).to.equal(202); - - const writeGrantToGrantee: ProcessDwnRequest = { - messageType : DwnInterface.RecordsWrite, - rawMessage : messagesQueryGrant.recordsWrite.message, - author : appX.did.uri, - target : appX.did.uri, - dataStream : new Blob([messagesQueryGrant.permissionGrantBytes]), - signAsOwner : true - }; - - const { reply: importGrantReply } = await appAgent.agent.dwn.processRequest(writeGrantToGrantee); - expect(importGrantReply.status.code).to.equal(202); - - // Attempt to process the MessagesQuery locally using the permission grant. - const { message: queryMessage, reply } = await appAgent.agent.dwn.processRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.MessagesQuery, - messageParams : { - filters : [], - permissionGrantId : messagesQueryGrant.recordsWrite.message.recordId - }, - granteeDid: appX.did.uri, - }); - const messageSignature = queryMessage!.authorization.signature.signatures[0]; - const signatureDid = Jws.getSignerDid(messageSignature); - - expect(signatureDid).to.equal(appX.did.uri); - expect(reply.status.code).to.equal(200); - expect(reply.entries?.length).to.equal(1); // the permission grant should exist - expect(reply.entries![0]).to.equal(await Message.getCid(messagesQueryGrant.recordsWrite.message)); - - // process the message on alice's agent - const { reply: aliceReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.MessagesQuery, - rawMessage : queryMessage, - author : alice.did.uri, - target : alice.did.uri, - }); - expect(aliceReply.status.code).to.equal(200); - - // should have more than 1 message - // the other messages are related to DID and Identity information stored on the DWN - expect(aliceReply.entries?.length).to.be.gt(1); - expect(aliceReply.entries).to.include(await Message.getCid(messagesQueryGrant.recordsWrite.message)); - }); - - it('creates and signs a delegated grant message', async () => { - // Scenario: - // alice wants to grant permission to an app to write records to her DWN on her behalf - // alice creates an identity for the app - // alice installs the protocol that app will use to write to her DWN - // alice creates a delegated permission grant for RecordsWrite scoped to the protocol of the app - // alice processes the permission grant - // the app is able to write to alice's DWN using the delegated permission grant - // the app attempts to read the record it wrote to alice's DWN, but without a permission grant for RecordsRead, it should fail - // alice issues a delegated permission grant for RecordsRead and the app uses it to read the record - - // alice installs a protocol for deviceX to use to write to her DWN - const protocol: ProtocolDefinition = { - protocol : 'http://example.com/protocol', - published : true, - types : { - foo: {} - }, - structure: { - foo: {} - } - }; - const { reply, message: protocolConfigureMessage } = await aliceAgent.agent.dwn.processRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.ProtocolsConfigure, - messageParams : { - definition: protocol, - } - }); - expect(reply.status.code).to.equal(202); - - // create a new identity for the app - const appX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'App Identity X' }, - didMethod : 'jwk' - }); - - await appAgent.agent.identity.manage({ portableIdentity: await appX.export() }); - - // alice creates a delegated permission grant - const recordsWriteGrant = await aliceAgent.agent.dwn.createGrant({ - grantedFrom : alice.did.uri, - grantedTo : appX.did.uri, - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Write, - protocol : protocol.protocol - } - }); - - // alice stores and processes the permission grant on her DWN - const { reply: aliceGrantReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([ recordsWriteGrant.permissionGrantBytes ]), - }); - expect(aliceGrantReply.status.code).to.equal(202); - - // alice hands off the grant to the appX agent - // if sync is initiated, the appX will also have the protocol message installed - // but for this test we will process it manually - const { reply: appXProtocolReply } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.ProtocolsConfigure, - rawMessage : protocolConfigureMessage, - author : alice.did.uri, - target : alice.did.uri, - }); - expect(appXProtocolReply.status.code).to.equal(202); - - - // The App processes the permission grant given by Alice, so it can be accessible when using it - const { reply: appAgentGrantReply } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : appX.did.uri, - target : appX.did.uri, - dataStream : new Blob([ recordsWriteGrant.permissionGrantBytes ]), - signAsOwner : true - }); - expect(appAgentGrantReply.status.code).to.equal(202); - - // write a record to the app's DWN as alice - const data = new Blob([ 'Hello, Alice!' ]); - const { message: delegatedWriteMessage, reply: delegatedWriteReply } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - messageParams : { - protocol : protocol.protocol, - protocolPath : 'foo', - dataFormat : 'application/json', - delegatedGrant : recordsWriteGrant.dataEncodedMessage - }, - author : alice.did.uri, - target : alice.did.uri, - dataStream : data, - granteeDid : appX.did.uri, - }); - expect(delegatedWriteReply.status.code).to.equal(202, 'delegated write'); - - // write the record to alice's DWN - const { reply: aliceReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : delegatedWriteMessage, - author : alice.did.uri, - target : alice.did.uri, - dataStream : data, - }); - expect(aliceReply.status.code).to.equal(202, 'delegated write to alice'); - - //Record Read will not work because the permission grant is for RecordsWrite - const { reply: delegatedReadReply } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsRead, - messageParams : { - filter: { - protocol : protocol.protocol, - protocolPath : 'foo' - }, - delegatedGrant: recordsWriteGrant.dataEncodedMessage, - }, - author : alice.did.uri, - target : alice.did.uri, - granteeDid : appX.did.uri, - }); - expect(delegatedReadReply.status.code).to.equal(401, 'delegated read'); - - // alice issues a delegated read permission grant - const recordReadGrant = await aliceAgent.agent.dwn.createGrant({ - grantedFrom : alice.did.uri, - grantedTo : appX.did.uri, - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Read, - protocol : protocol.protocol - } - }); - - // alice stores and processes the permission grant on her DWN - const { reply: aliceGrantReadReply } = await aliceAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordReadGrant.recordsWrite.message, - author : alice.did.uri, - target : alice.did.uri, - dataStream : new Blob([ recordReadGrant.permissionGrantBytes]), - }); - expect(aliceGrantReadReply.status.code).to.equal(202); - - // alice hands off the grant to the appX agent - const { reply: appAgentGrantReadReply } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordReadGrant.recordsWrite.message, - author : appX.did.uri, - target : appX.did.uri, - dataStream : new Blob([ recordReadGrant.permissionGrantBytes ]), - signAsOwner : true - }); - expect(appAgentGrantReadReply.status.code).to.equal(202); - - // appX now attempts to read the messages using the delegated read permission grant - const { reply: delegatedReadReply2 } = await appAgent.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsRead, - messageParams : { - filter: { - protocol : protocol.protocol, - protocolPath : 'foo' - }, - delegatedGrant: recordReadGrant.dataEncodedMessage, - }, - author : alice.did.uri, - target : alice.did.uri, - granteeDid : appX.did.uri, - }); - expect(delegatedReadReply2.status.code).to.equal(200, 'delegated read ok'); - expect(delegatedReadReply2.record?.recordId).to.equal(delegatedWriteMessage?.recordId); - }); - }); -}); \ No newline at end of file diff --git a/packages/agent/tests/dwn-api.spec.ts b/packages/agent/tests/dwn-api.spec.ts index 95a76a245..9ab4aca3f 100644 --- a/packages/agent/tests/dwn-api.spec.ts +++ b/packages/agent/tests/dwn-api.spec.ts @@ -759,25 +759,14 @@ describe('AgentDwnApi', () => { }); // create teh grant - const recordsWriteDelegateGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : alice.did.uri, + const recordsWriteDelegateGrant = await testHarness.agent.permissions.createGrant({ + author : alice.did.uri, grantedTo : aliceDeviceX.did.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), delegated : true, scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: protocolDefinition.protocol } }); - // process the grant on alice's DWN - let { reply: { status: grantStatus } } = await testHarness.agent.dwn.processRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteDelegateGrant.recordsWrite.message, - dataStream : new Blob([ recordsWriteDelegateGrant.permissionGrantBytes ]), - }); - expect(grantStatus.code).to.equal(202, 'grant write'); - - // bob authors a public record to his dwn const dataStream = new Blob([ Convert.string('Hello, world!').toUint8Array() ]); @@ -846,7 +835,7 @@ describe('AgentDwnApi', () => { granteeDid : aliceDeviceX.did.uri, messageParams : { dataFormat : 'text/plain', // TODO: not necessary - delegatedGrant : recordsWriteDelegateGrant.dataEncodedMessage, + delegatedGrant : recordsWriteDelegateGrant.message, }, dataStream, }); diff --git a/packages/agent/tests/dwn-permissions-util.spec.ts b/packages/agent/tests/dwn-permissions-util.spec.ts deleted file mode 100644 index 0993052e5..000000000 --- a/packages/agent/tests/dwn-permissions-util.spec.ts +++ /dev/null @@ -1,593 +0,0 @@ - -import type { BearerIdentity } from '../src/bearer-identity.js'; - -import { TestAgent } from './utils/test-agent.js'; -import { DwnInterface } from '../src/types/dwn.js'; -import { testDwnUrl } from './utils/test-config.js'; -import { PlatformAgentTestHarness } from '../src/test-harness.js'; - -import sinon from 'sinon'; - -import { expect } from 'chai'; - -// NOTE: @noble/secp256k1 requires globalThis.crypto polyfill for node.js <=18: https://github.com/paulmillr/noble-secp256k1/blob/main/README.md#usage -// Remove when we move off of node.js v18 to v20, earliest possible time would be Oct 2023: https://github.com/nodejs/release#release-schedule -import { webcrypto } from 'node:crypto'; -import { GrantsUtil } from './utils/grants.js'; -import { DwnPermissionsUtil } from '../src/dwn-permissions-util.js'; -import { PermissionsProtocol } from '@tbd54566975/dwn-sdk-js'; -// @ts-expect-error - globalThis.crypto and webcrypto are of different types. -if (!globalThis.crypto) globalThis.crypto = webcrypto; - -let testDwnUrls: string[] = [testDwnUrl]; - -describe('DwnPermissionsUtil', () => { - describe('permissionsProtocolParams', () => { - it('returns correct params to use in a records message', async () => { - const grantsParams = DwnPermissionsUtil.permissionsProtocolParams('grant'); - expect(grantsParams.protocol).to.equal(PermissionsProtocol.uri); - expect(grantsParams.protocolPath).to.equal(PermissionsProtocol.grantPath); - - const revokeParams = DwnPermissionsUtil.permissionsProtocolParams('revoke'); - expect(revokeParams.protocol).to.equal(PermissionsProtocol.uri); - expect(revokeParams.protocolPath).to.equal(PermissionsProtocol.revocationPath); - - const requestParams = DwnPermissionsUtil.permissionsProtocolParams('request'); - expect(requestParams.protocol).to.equal(PermissionsProtocol.uri); - expect(requestParams.protocolPath).to.equal(PermissionsProtocol.requestPath); - }); - }); - - describe('matchGrantFromArray', () => { - let aliceAgent: PlatformAgentTestHarness; - let appAgent: PlatformAgentTestHarness; - let alice: BearerIdentity; - - before(async () => { - aliceAgent = await PlatformAgentTestHarness.setup({ - agentClass : TestAgent, - agentStores : 'dwn' - }); - - appAgent = await PlatformAgentTestHarness.setup({ - agentClass : TestAgent, - agentStores : 'dwn', - testDataLocation : '__TESTDATA__/app' // Use a different data location for the app - }); - - await aliceAgent.createAgentDid(); - await appAgent.createAgentDid(); - }); - - after(async () => { - sinon.restore(); - - await aliceAgent.clearStorage(); - await aliceAgent.closeStorage(); - - await appAgent.clearStorage(); - await appAgent.closeStorage(); - }); - - beforeEach(async () => { - sinon.restore(); - - await aliceAgent.syncStore.clear(); - await aliceAgent.dwnDataStore.clear(); - await aliceAgent.dwnEventLog.clear(); - await aliceAgent.dwnMessageStore.clear(); - await aliceAgent.dwnResumableTaskStore.clear(); - aliceAgent.dwnStores.clear(); - - await appAgent.syncStore.clear(); - await appAgent.dwnDataStore.clear(); - await appAgent.dwnEventLog.clear(); - await appAgent.dwnMessageStore.clear(); - await appAgent.dwnResumableTaskStore.clear(); - appAgent.dwnStores.clear(); - - // create and manage alice identity for the tests to use - alice = await aliceAgent.createIdentity({ name: 'Alice', testDwnUrls }); - await aliceAgent.agent.identity.manage({ portableIdentity: await alice.export() }); - }); - - it('does not match a grant with a different grantee or grantor', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const aliceDeviceY = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device Y' }, - didMethod : 'jwk' - }); - - const protocol = 'http://example.com/protocol'; - - const deviceXRecordGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol - }); - - const deviceXGranteeGrants = [ - deviceXRecordGrants.write, - deviceXRecordGrants.read, - deviceXRecordGrants.delete, - deviceXRecordGrants.query, - deviceXRecordGrants.subscribe - ]; - - // attempt to match a grant with a different grantee, aliceDeviceY - const notFoundGrantee = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceY.did.uri, { - messageType: DwnInterface.RecordsWrite, - protocol - }, deviceXGranteeGrants); - - expect(notFoundGrantee).to.be.undefined; - - const deviceYRecordGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : appAgent.agent, - granteeAgent : appAgent.agent, - grantor : aliceDeviceX.did.uri, - grantee : aliceDeviceY.did.uri, - protocol - }); - - const deviceYGrantorGrants = [ - deviceYRecordGrants.write, - deviceYRecordGrants.read, - deviceYRecordGrants.delete, - deviceYRecordGrants.query, - deviceYRecordGrants.subscribe - ]; - - const notFoundGrantor = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceY.did.uri, { - messageType: DwnInterface.RecordsWrite, - protocol - }, deviceYGrantorGrants); - - expect(notFoundGrantor).to.be.undefined; - }); - - it('matches delegated grants if specified', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const messagesGrants = await GrantsUtil.createMessagesGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - }); - - const aliceDeviceXMessageGrants = [ - messagesGrants.query, - messagesGrants.read, - messagesGrants.subscribe - ]; - - // control: match a grant without specifying delegated - const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesQuery, - }, aliceDeviceXMessageGrants); - - expect(queryGrant?.message.recordId).to.equal(messagesGrants.query.recordId); - - // attempt to match non-delegated grant with delegated set to true - const notFoundDelegated = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesQuery, - }, aliceDeviceXMessageGrants, true); - - expect(notFoundDelegated).to.be.undefined; - - // create delegated record grants - const protocol = 'http://example.com/protocol'; - const recordsGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol - }); - - const deviceXRecordGrants = [ - recordsGrants.write, - recordsGrants.read, - recordsGrants.delete, - recordsGrants.query, - recordsGrants.subscribe - ]; - - // match a delegated grant - const writeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.RecordsWrite, - protocol - }, deviceXRecordGrants, true); - - expect(writeGrant?.message.recordId).to.equal(recordsGrants.write.recordId); - }); - - it('Messages', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const messageGrants = await GrantsUtil.createMessagesGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri - }); - - const deviceXMessageGrants = [ - messageGrants.query, - messageGrants.read, - messageGrants.subscribe - ]; - - const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesQuery, - }, deviceXMessageGrants); - - expect(queryGrant?.message.recordId).to.equal(messageGrants.query.recordId); - - const readGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesRead, - }, deviceXMessageGrants); - - expect(readGrant?.message.recordId).to.equal(messageGrants.read.recordId); - - const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesSubscribe, - }, deviceXMessageGrants); - - expect(subscribeGrant?.message.recordId).to.equal(messageGrants.subscribe.recordId); - - const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.RecordsQuery, - }, deviceXMessageGrants); - - expect(invalidGrant).to.be.undefined; - }); - - it('Messages with protocol', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const protocol = 'http://example.com/protocol'; - const otherProtocol = 'http://example.com/other-protocol'; - - const protocolMessageGrants = await GrantsUtil.createMessagesGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol - }); - - const otherProtocolMessageGrants = await GrantsUtil.createMessagesGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol : otherProtocol - }); - - const deviceXMessageGrants = [ - protocolMessageGrants.query, - protocolMessageGrants.read, - protocolMessageGrants.subscribe, - otherProtocolMessageGrants.query, - otherProtocolMessageGrants.read, - otherProtocolMessageGrants.subscribe - ]; - - const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesQuery, - protocol - }, deviceXMessageGrants); - - expect(queryGrant?.message.recordId).to.equal(protocolMessageGrants.query.recordId); - - const readGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesRead, - protocol - }, deviceXMessageGrants); - - expect(readGrant?.message.recordId).to.equal(protocolMessageGrants.read.recordId); - - const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType: DwnInterface.MessagesSubscribe, - protocol - }, deviceXMessageGrants); - - expect(subscribeGrant?.message.recordId).to.equal(protocolMessageGrants.subscribe.recordId); - - const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.MessagesQuery, - protocol : 'http://example.com/unknown-protocol' - }, deviceXMessageGrants); - - expect(invalidGrant).to.be.undefined; - - const otherProtocolQueryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.MessagesQuery, - protocol : otherProtocol - }, deviceXMessageGrants); - - expect(otherProtocolQueryGrant?.message.recordId).to.equal(otherProtocolMessageGrants.query.recordId); - }); - - it('Records', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const protocol1 = 'http://example.com/protocol'; - const protocol2 = 'http://example.com/other-protocol'; - - const protocol1Grants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol : protocol1, - }); - - const otherProtocolGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol : protocol2, - }); - - const deviceXRecordGrants = [ - protocol1Grants.write, - protocol1Grants.read, - protocol1Grants.delete, - protocol1Grants.query, - protocol1Grants.subscribe, - otherProtocolGrants.write, - otherProtocolGrants.read, - otherProtocolGrants.delete, - otherProtocolGrants.query, - otherProtocolGrants.subscribe - ]; - - const writeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol1 - }, deviceXRecordGrants); - - expect(writeGrant?.message.recordId).to.equal(protocol1Grants.write.recordId); - - const readGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsRead, - protocol : protocol1 - }, deviceXRecordGrants); - - expect(readGrant?.message.recordId).to.equal(protocol1Grants.read.recordId); - - const deleteGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsDelete, - protocol : protocol1 - }, deviceXRecordGrants); - - expect(deleteGrant?.message.recordId).to.equal(protocol1Grants.delete.recordId); - - const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsQuery, - protocol : protocol1 - }, deviceXRecordGrants); - - expect(queryGrant?.message.recordId).to.equal(protocol1Grants.query.recordId); - - const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsSubscribe, - protocol : protocol1 - }, deviceXRecordGrants); - - expect(subscribeGrant?.message.recordId).to.equal(protocol1Grants.subscribe.recordId); - - const queryGrantOtherProtocol = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsQuery, - protocol : protocol2 - }, deviceXRecordGrants); - - expect(queryGrantOtherProtocol?.message.recordId).to.equal(otherProtocolGrants.query.recordId); - - // unknown protocol - const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsQuery, - protocol : 'http://example.com/unknown-protocol' - }, deviceXRecordGrants); - - expect(invalidGrant).to.be.undefined; - }); - - it('Records with protocolPath', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const protocol = 'http://example.com/protocol'; - - const fooGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol, - protocolPath : 'foo' - }); - - const barGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol, - protocolPath : 'foo/bar' - }); - - const protocolGrants = [ - fooGrants.write, - fooGrants.read, - fooGrants.delete, - fooGrants.query, - fooGrants.subscribe, - barGrants.write, - barGrants.read, - barGrants.delete, - barGrants.query, - barGrants.subscribe - ]; - - const writeFooGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol, - protocolPath : 'foo' - }, protocolGrants); - - expect(writeFooGrant?.message.recordId).to.equal(fooGrants.write.recordId); - - const readFooGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsRead, - protocol : protocol, - protocolPath : 'foo' - }, protocolGrants); - - expect(readFooGrant?.message.recordId).to.equal(fooGrants.read.recordId); - - const deleteFooGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsDelete, - protocol : protocol, - protocolPath : 'foo' - }, protocolGrants); - - expect(deleteFooGrant?.message.recordId).to.equal(fooGrants.delete.recordId); - - const queryGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsQuery, - protocol : protocol, - protocolPath : 'foo' - }, protocolGrants); - - expect(queryGrant?.message.recordId).to.equal(fooGrants.query.recordId); - - const subscribeGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsSubscribe, - protocol : protocol, - protocolPath : 'foo' - }, protocolGrants); - - expect(subscribeGrant?.message.recordId).to.equal(fooGrants.subscribe.recordId); - - const writeBarGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol, - protocolPath : 'foo/bar' - }, protocolGrants); - - expect(writeBarGrant?.message.recordId).to.equal(barGrants.write.recordId); - - const noMatchGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol, - protocolPath : 'bar' - }, protocolGrants); - - expect(noMatchGrant).to.be.undefined; - }); - - it('Records with contextId', async () => { - const aliceDeviceX = await appAgent.agent.identity.create({ - store : true, - metadata : { name: 'Alice Device X' }, - didMethod : 'jwk' - }); - - const protocol = 'http://example.com/protocol'; - - const abcGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol, - contextId : 'abc' - }); - - const defGrants = await GrantsUtil.createRecordsGrants({ - grantorAgent : aliceAgent.agent, - granteeAgent : appAgent.agent, - grantor : alice.did.uri, - grantee : aliceDeviceX.did.uri, - protocol, - contextId : 'def/ghi' - }); - - const contextGrants = [ - abcGrants.write, - abcGrants.read, - abcGrants.delete, - abcGrants.query, - abcGrants.subscribe, - defGrants.write, - defGrants.read, - defGrants.delete, - defGrants.query, - defGrants.subscribe - ]; - - const writeFooGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol, - contextId : 'abc' - }, contextGrants); - - expect(writeFooGrant?.message.recordId).to.equal(abcGrants.write.recordId); - - const writeBarGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol, - contextId : 'def/ghi' - }, contextGrants); - - expect(writeBarGrant?.message.recordId).to.equal(defGrants.write.recordId); - - const invalidGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol, - contextId : 'def' - }, contextGrants); - - expect(invalidGrant).to.be.undefined; - - const withoutContextGrant = await DwnPermissionsUtil.matchGrantFromArray(alice.did.uri, aliceDeviceX.did.uri, { - messageType : DwnInterface.RecordsWrite, - protocol : protocol - }, contextGrants); - - expect(withoutContextGrant).to.be.undefined; - }); - }); -}); \ No newline at end of file diff --git a/packages/agent/tests/permissions-api.spec.ts b/packages/agent/tests/permissions-api.spec.ts new file mode 100644 index 000000000..0514fb720 --- /dev/null +++ b/packages/agent/tests/permissions-api.spec.ts @@ -0,0 +1,1223 @@ +import sinon from 'sinon'; +import { expect } from 'chai'; +import { AgentPermissionsApi } from '../src/permissions-api.js'; +import { PlatformAgentTestHarness } from '../src/test-harness.js'; +import { TestAgent } from './utils/test-agent.js'; +import { BearerDid } from '@web5/dids'; + +import { testDwnUrl } from './utils/test-config.js'; +import { DwnInterfaceName, DwnMethodName, Time } from '@tbd54566975/dwn-sdk-js'; +import { DwnInterface, DwnPermissionGrant, DwnPermissionScope, Web5PlatformAgent } from '../src/index.js'; + +let testDwnUrls: string[] = [testDwnUrl]; + +describe('AgentPermissionsApi', () => { + let testHarness: PlatformAgentTestHarness; + let aliceDid: BearerDid; + + before(async () => { + testHarness = await PlatformAgentTestHarness.setup({ + agentClass : TestAgent, + agentStores : 'dwn' + }); + }); + + after(async () => { + sinon.restore(); + await testHarness.clearStorage(); + await testHarness.closeStorage(); + }); + + beforeEach(async () => { + sinon.restore(); + await testHarness.clearStorage(); + await testHarness.createAgentDid(); + + // Create an "alice" Identity to author the DWN messages. + const alice = await testHarness.createIdentity({ name: 'Alice', testDwnUrls }); + await testHarness.agent.identity.manage({ portableIdentity: await alice.export() }); + aliceDid = alice.did; + }); + + describe('get agent', () => { + it(`returns the 'agent' instance property`, async () => { + // we are only mocking + const permissionsApi = new AgentPermissionsApi({ agent: testHarness.agent }); + const agent = permissionsApi.agent; + expect(agent).to.exist; + expect(agent.agentDid).to.equal(testHarness.agent.agentDid); + }); + + it(`throws an error if the 'agent' instance property is undefined`, () => { + const permissionsApi = new AgentPermissionsApi(); + expect(() => + permissionsApi.agent + ).to.throw(Error, 'AgentPermissionsApi: Agent is not set'); + }); + }); + + describe('fetchGrants', () => { + it('from remote', async () => { + // spy on the processDwnRequest method + const processDwnRequestSpy = sinon.spy(testHarness.agent, 'processDwnRequest'); + // mock the sendDwnRequest method to return a 200 response + const sendDwnRequestStub = sinon.stub(testHarness.agent, 'sendDwnRequest').resolves({ messageCid: '', reply: { entries: [], status: { code: 200, detail: 'OK'} }}); + + // fetch permission grants + await testHarness.agent.permissions.fetchGrants({ + author : aliceDid.uri, + target : aliceDid.uri, + remote : true + }); + + // expect the processDwnRequest method to not have been called + expect(processDwnRequestSpy.called).to.be.false; + + // expect the sendDwnRequest method to have been called + expect(sendDwnRequestStub.called).to.be.true; + }); + + it('filter by protocol', async () => { + // create a grant for permission-1 + const protocol1Grant = await testHarness.agent.permissions.createGrant({ + author : aliceDid.uri, + grantedTo : aliceDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-1' + } + }); + + // create a grant for permission-2 + const protocol2Grant = await testHarness.agent.permissions.createGrant({ + author : aliceDid.uri, + grantedTo : aliceDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-2' + } + }); + + // fetch permission grants + const protocol1Grants = await testHarness.agent.permissions.fetchGrants({ + author : aliceDid.uri, + target : aliceDid.uri, + protocol : 'http://example.com/protocol-1' + }); + expect(protocol1Grants.length).to.equal(1); + expect(protocol1Grants[0].grant.id).to.equal(protocol1Grant.grant.id); + + const protocol2Grants = await testHarness.agent.permissions.fetchGrants({ + author : aliceDid.uri, + target : aliceDid.uri, + protocol : 'http://example.com/protocol-2' + }); + expect(protocol2Grants.length).to.equal(1); + expect(protocol2Grants[0].grant.id).to.equal(protocol2Grant.grant.id); + }); + + it('throws if the query returns anything other than 200', async () => { + // stub the processDwnRequest method to return a 400 error + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'Bad Request'} }}); + + // fetch permission requests + try { + await testHarness.agent.permissions.fetchGrants({ + author : aliceDid.uri, + target : aliceDid.uri, + }); + } catch(error: any) { + expect(error.message).to.equal('PermissionsApi: Failed to fetch grants: Bad Request'); + } + }); + }); + + describe('fetchRequests', () => { + it('from remote', async () => { + // spy on the processDwnRequest method + const processDwnRequestSpy = sinon.spy(testHarness.agent, 'processDwnRequest'); + // mock the sendDwnRequest method to return a 200 response + const sendDwnRequestStub = sinon.stub(testHarness.agent, 'sendDwnRequest').resolves({ messageCid: '', reply: { entries: [], status: { code: 200, detail: 'OK'} }}); + + // fetch permission grants + await testHarness.agent.permissions.fetchRequests({ + author : aliceDid.uri, + target : aliceDid.uri, + remote : true + }); + + // expect the processDwnRequest method to not have been called + expect(processDwnRequestSpy.called).to.be.false; + + // expect the sendDwnRequest method to have been called + expect(sendDwnRequestStub.called).to.be.true; + }); + + it('filter by protocol', async () => { + // create a request for permission-1 + const protocol1Request = await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-1' + } + }); + + // create a request for permission-2 + const protocol2Request = await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-2' + } + }); + + // fetch permission grants + const protocol1Requests = await testHarness.agent.permissions.fetchRequests({ + author : aliceDid.uri, + target : aliceDid.uri, + protocol : 'http://example.com/protocol-1' + }); + expect(protocol1Requests.length).to.equal(1); + expect(protocol1Requests[0].request.id).to.equal(protocol1Request.request.id); + + const protocol2Requests = await testHarness.agent.permissions.fetchRequests({ + author : aliceDid.uri, + target : aliceDid.uri, + protocol : 'http://example.com/protocol-2' + }); + expect(protocol2Requests.length).to.equal(1); + expect(protocol2Requests[0].request.id).to.equal(protocol2Request.request.id); + }); + + it('throws if the query returns anything other than 200', async () => { + // stub the processDwnRequest method to return a 400 error + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'Bad Request'} }}); + + // fetch permission requests + try { + await testHarness.agent.permissions.fetchRequests({ + author : aliceDid.uri, + target : aliceDid.uri, + }); + } catch(error: any) { + expect(error.message).to.equal('PermissionsApi: Failed to fetch requests: Bad Request'); + } + }); + }); + + describe('isGrantRevoked', () => { + it('from remote', async () => { + // spy on the processDwnRequest method + const processDwnRequestSpy = sinon.spy(testHarness.agent, 'processDwnRequest'); + // mock the sendDwnRequest method to return a 200 response + const sendDwnRequestStub = sinon.stub(testHarness.agent, 'sendDwnRequest').resolves({ messageCid: '', reply: { status: { code: 200, detail: 'OK'} }}); + + // fetch permission grants + await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : 'grant-record-id', + remote : true + }); + + // expect the processDwnRequest method to not have been called + expect(processDwnRequestSpy.called).to.be.false; + + // expect the sendDwnRequest method to have been called + expect(sendDwnRequestStub.called).to.be.true; + }); + + it('throws if the request was bad', async () => { + // stub the processDwnRequest method to return a 400 error + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'Bad Request'} }}); + + // create a permission request + try { + await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : 'grant-record-id' + }); + } catch(error: any) { + expect(error.message).to.equal('PermissionsApi: Failed to check if grant is revoked: Bad Request'); + } + }); + + it('returns revocation status', async () => { + // scenario: create a grant for deviceX, revoke the grant, confirm the grant is revoked + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // create a grant for deviceX + const deviceXGrant = await testHarness.agent.permissions.createGrant({ + store : true, + author : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // check if the grant is revoked + let isRevoked = await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : deviceXGrant.grant.id + }); + expect(isRevoked).to.equal(false); + + // create a revocation for the grant + await testHarness.agent.permissions.createRevocation({ + author : aliceDid.uri, + store : true, + grant : deviceXGrant.grant, + }); + + // check if the grant is revoked again, should be true + isRevoked = await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : deviceXGrant.grant.id + }); + expect(isRevoked).to.equal(true); + }); + }); + + describe('createGrant', () => { + it('throws if the grant was not created', async () => { + // stub the processDwnRequest method to return a 400 error + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'Bad Request'} }}); + + // create a permission request + try { + await testHarness.agent.permissions.createGrant({ + author : aliceDid.uri, + grantedTo : 'did:example:deviceX', + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + scope : {} as DwnPermissionScope, + }); + } catch(error: any) { + expect(error.message).to.equal('PermissionsApi: Failed to create grant: Bad Request'); + } + }); + + it('creates and stores a grant', async () => { + // scenario: create a grant for deviceX, confirm the grant exists + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : false, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + + // create a grant for deviceX + const deviceXGrant = await testHarness.agent.permissions.createGrant({ + store : true, + author : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + const grants = await testHarness.agent.permissions.fetchGrants({ + author : aliceDid.uri, + target : aliceDid.uri, + }); + + // expect to have the 1 grant created for deviceX + expect(grants.length).to.equal(1); + expect(grants[0].message.recordId).to.equal(deviceXGrant.message.recordId); + }); + + it('creates a grant without storing it', async () => { + // scenario: create a grant for deviceX, confirm the grant does not exist + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : false, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // create a grant for deviceX store is set to false by default + const deviceXGrant = await testHarness.agent.permissions.createGrant({ + author : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + const grantDataObject = { ...deviceXGrant.grant }; + const parsedGrant = await DwnPermissionGrant.parse(deviceXGrant.message); + + expect(grantDataObject).to.deep.equal(parsedGrant); + }); + }); + + describe('createRevocation', () => { + it('throws if the revocation was not created', async () => { + // stub the processDwnRequest method to return a 400 error + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'Bad Request'} }}); + + // create a permission request + try { + await testHarness.agent.permissions.createRevocation({ + author : aliceDid.uri, + store : true, + grant : { + scope: {} + } as DwnPermissionGrant, + }); + } catch(error: any) { + expect(error.message).to.equal('PermissionsApi: Failed to create revocation: Bad Request'); + } + + }); + + it('creates and stores a grant revocation', async () => { + // scenario: create a grant for deviceX, revoke the grant, confirm the grant is revoked + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // create a grant for deviceX + const deviceXGrant = await testHarness.agent.permissions.createGrant({ + store : true, + author : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // parse the grant + const writeGrant = await DwnPermissionGrant.parse(deviceXGrant.message); + + // check if the grant is revoked + let isRevoked = await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : deviceXGrant.grant.id + }); + expect(isRevoked).to.equal(false); + + // create a revocation for the grant + await testHarness.agent.permissions.createRevocation({ + author : aliceDid.uri, + store : true, + grant : writeGrant, + }); + + // check if the grant is revoked again, should be true + isRevoked = await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : deviceXGrant.grant.id + }); + expect(isRevoked).to.equal(true); + }); + + it('creates a grant revocation without storing it', async () => { + // scenario: create a grant for deviceX, revoke the grant, confirm the grant is revoked + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + // create a grant for deviceX + const deviceXGrant = await testHarness.agent.permissions.createGrant({ + store : true, + author : aliceDid.uri, + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // parse the grant + const writeGrant = await DwnPermissionGrant.parse(deviceXGrant.message); + + // check if the grant is revoked + let isRevoked = await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : deviceXGrant.grant.id + }); + expect(isRevoked).to.equal(false); + + // create a revocation for the grant without storing it + await testHarness.agent.permissions.createRevocation({ + author : aliceDid.uri, + grant : writeGrant, + }); + + // check if the grant is revoked again, should be true + isRevoked = await testHarness.agent.permissions.isGrantRevoked({ + author : aliceDid.uri, + target : aliceDid.uri, + grantRecordId : deviceXGrant.grant.id + }); + expect(isRevoked).to.equal(false); + }); + }); + + describe('createRequest', () => { + it('throws if the request was not created', async () => { + // stub the processDwnRequest method to return a 400 error + sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'Bad Request'} }}); + + // create a permission request + try { + await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + } catch(error: any) { + expect(error.message).to.equal('PermissionsApi: Failed to create request: Bad Request'); + } + + }); + + it('creates a permission request and stores it', async () => { + // scenario: create a permission request confirm the request exists + + // create a permission request + const deviceXRequest = await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // query for the request + const fetchedRequests = await testHarness.agent.permissions.fetchRequests({ + author : aliceDid.uri, + target : aliceDid.uri, + }); + + // expect to have the 1 request created + expect(fetchedRequests.length).to.equal(1); + expect(fetchedRequests[0].request.id).to.equal(deviceXRequest.message.recordId); + }); + + it('creates a permission request without storing it', async () => { + // scenario: create a permission request confirm the request does not exist + + // create a permission request store is set to false by default + await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // query for the request + const fetchedRequests = await testHarness.agent.permissions.fetchRequests({ + author : aliceDid.uri, + target : aliceDid.uri, + }); + + // expect to have no requests + expect(fetchedRequests.length).to.equal(0); + }); + }); + + describe('matchGrantFromArray', () => { + + const createRecordGrants = async ({ grantee, grantor, grantorAgent, protocol, protocolPath, contextId }:{ + grantorAgent: Web5PlatformAgent; + granteeAgent: Web5PlatformAgent; + grantor: string; + grantee: string; + protocol: string; + protocolPath?: string; + contextId?: string; + }) => { + const recordsWriteGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + delegated : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol, + protocolPath, + contextId + } + }); + + const recordsReadGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + delegated : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Read, + protocol, + protocolPath, + contextId + } + }); + + const recordsDeleteGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + delegated : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Delete, + protocol, + protocolPath, + contextId + } + }); + + const recordsQueryGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + delegated : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Query, + protocol, + protocolPath, + contextId + } + }); + + const recordsSubscribeGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + delegated : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Subscribe, + protocol, + protocolPath, + contextId + } + }); + + return { + write : recordsWriteGrant, + read : recordsReadGrant, + delete : recordsDeleteGrant, + query : recordsQueryGrant, + subscribe : recordsSubscribeGrant + }; + }; + + const createMessageGrants = async ({ grantee, grantor, grantorAgent, protocol }:{ + grantorAgent: Web5PlatformAgent; + granteeAgent: Web5PlatformAgent; + grantor: string; + grantee: string; + protocol?: string; + }) => { + + const messagesReadGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Read, + protocol + } + }); + + const messagesQueryGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Query, + protocol + } + }); + + const messagesSubscribeGrant = await grantorAgent.permissions.createGrant({ + author : grantor, + grantedTo : grantee, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + store : true, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Subscribe, + protocol + } + }); + + return { + read : messagesReadGrant, + query : messagesQueryGrant, + subscribe : messagesSubscribeGrant + }; + }; + + it('does not match a grant with a different grantee or grantor', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const aliceDeviceY = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device Y' }, + didMethod : 'jwk' + }); + + const protocol = 'http://example.com/protocol'; + + + const deviceXRecordGrantsFromAlice = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol + }); + + const deviceXRecordGrantsFromAliceArray = [ + deviceXRecordGrantsFromAlice.write, + deviceXRecordGrantsFromAlice.read, + deviceXRecordGrantsFromAlice.delete, + deviceXRecordGrantsFromAlice.query, + deviceXRecordGrantsFromAlice.subscribe + ]; + + // attempt to match a grant with a different grantee, aliceDeviceY + const notFoundGrantee = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceY.did.uri, { + messageType: DwnInterface.RecordsWrite, + protocol + }, deviceXRecordGrantsFromAliceArray); + + expect(notFoundGrantee).to.be.undefined; + + const deviceYRecordGrantsFromDeviceX = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDeviceX.did.uri, + grantee : aliceDeviceY.did.uri, + protocol + }); + + const deviceYRecordGrantsFromDeviceXArray = [ + deviceYRecordGrantsFromDeviceX.write, + deviceYRecordGrantsFromDeviceX.read, + deviceYRecordGrantsFromDeviceX.delete, + deviceYRecordGrantsFromDeviceX.query, + deviceYRecordGrantsFromDeviceX.subscribe + ]; + + const notFoundGrantor = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceY.did.uri, { + messageType: DwnInterface.RecordsWrite, + protocol + }, deviceYRecordGrantsFromDeviceXArray); + + expect(notFoundGrantor).to.be.undefined; + }); + + it('matches delegated grants if specified', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const messagesGrants = await createMessageGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + }); + + const aliceDeviceXMessageGrants = [ + messagesGrants.query, + messagesGrants.read, + messagesGrants.subscribe + ]; + + // control: match a grant without specifying delegated + const queryGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesQuery, + }, aliceDeviceXMessageGrants); + + expect(queryGrant?.message.recordId).to.equal(messagesGrants.query.message.recordId); + + // attempt to match non-delegated grant with delegated set to true + const notFoundDelegated = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesQuery, + }, aliceDeviceXMessageGrants, true); + + expect(notFoundDelegated).to.be.undefined; + + // create delegated record grants + const protocol = 'http://example.com/protocol'; + const recordsGrants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol + }); + + const deviceXRecordGrants = [ + recordsGrants.write, + recordsGrants.read, + recordsGrants.delete, + recordsGrants.query, + recordsGrants.subscribe + ]; + + // match a delegated grant + const writeGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.RecordsWrite, + protocol + }, deviceXRecordGrants, true); + + expect(writeGrant?.message.recordId).to.equal(recordsGrants.write.message.recordId); + }); + + it('Messages', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const messageGrants = await createMessageGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri + }); + + const deviceXMessageGrants = [ + messageGrants.query, + messageGrants.read, + messageGrants.subscribe + ]; + + const queryGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesQuery, + }, deviceXMessageGrants); + + expect(queryGrant?.message.recordId).to.equal(messageGrants.query.message.recordId); + + const readGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesRead, + }, deviceXMessageGrants); + + expect(readGrant?.message.recordId).to.equal(messageGrants.read.message.recordId); + + const subscribeGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesSubscribe, + }, deviceXMessageGrants); + + expect(subscribeGrant?.message.recordId).to.equal(messageGrants.subscribe.message.recordId); + + const invalidGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.RecordsQuery, + }, deviceXMessageGrants); + + expect(invalidGrant).to.be.undefined; + }); + + it('Messages with protocol', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const protocol = 'http://example.com/protocol'; + const otherProtocol = 'http://example.com/other-protocol'; + + const protocolMessageGrants = await createMessageGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol + }); + + const otherProtocolMessageGrants = await createMessageGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol : otherProtocol + }); + + const deviceXMessageGrants = [ + protocolMessageGrants.query, + protocolMessageGrants.read, + protocolMessageGrants.subscribe, + otherProtocolMessageGrants.query, + otherProtocolMessageGrants.read, + otherProtocolMessageGrants.subscribe + ]; + + const queryGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesQuery, + protocol + }, deviceXMessageGrants); + + expect(queryGrant?.message.recordId).to.equal(protocolMessageGrants.query.message.recordId); + + const readGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesRead, + protocol + }, deviceXMessageGrants); + + expect(readGrant?.message.recordId).to.equal(protocolMessageGrants.read.message.recordId); + + const subscribeGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType: DwnInterface.MessagesSubscribe, + protocol + }, deviceXMessageGrants); + + expect(subscribeGrant?.message.recordId).to.equal(protocolMessageGrants.subscribe.message.recordId); + + const invalidGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.MessagesQuery, + protocol : 'http://example.com/unknown-protocol' + }, deviceXMessageGrants); + + expect(invalidGrant).to.be.undefined; + + const otherProtocolQueryGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.MessagesQuery, + protocol : otherProtocol + }, deviceXMessageGrants); + + expect(otherProtocolQueryGrant?.message.recordId).to.equal(otherProtocolMessageGrants.query.message.recordId); + }); + + it('Records', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const protocol1 = 'http://example.com/protocol'; + const protocol2 = 'http://example.com/other-protocol'; + + const protocol1Grants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol : protocol1, + }); + + const otherProtocolGrants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol : protocol2, + }); + + const deviceXRecordGrants = [ + protocol1Grants.write, + protocol1Grants.read, + protocol1Grants.delete, + protocol1Grants.query, + protocol1Grants.subscribe, + otherProtocolGrants.write, + otherProtocolGrants.read, + otherProtocolGrants.delete, + otherProtocolGrants.query, + otherProtocolGrants.subscribe + ]; + + const writeGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol1 + }, deviceXRecordGrants); + + expect(writeGrant?.message.recordId).to.equal(protocol1Grants.write.message.recordId); + + const readGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsRead, + protocol : protocol1 + }, deviceXRecordGrants); + + expect(readGrant?.message.recordId).to.equal(protocol1Grants.read.message.recordId); + + const deleteGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsDelete, + protocol : protocol1 + }, deviceXRecordGrants); + + expect(deleteGrant?.message.recordId).to.equal(protocol1Grants.delete.message.recordId); + + const queryGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsQuery, + protocol : protocol1 + }, deviceXRecordGrants); + + expect(queryGrant?.message.recordId).to.equal(protocol1Grants.query.message.recordId); + + const subscribeGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsSubscribe, + protocol : protocol1 + }, deviceXRecordGrants); + + expect(subscribeGrant?.message.recordId).to.equal(protocol1Grants.subscribe.message.recordId); + + const queryGrantOtherProtocol = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsQuery, + protocol : protocol2 + }, deviceXRecordGrants); + + expect(queryGrantOtherProtocol?.message.recordId).to.equal(otherProtocolGrants.query.message.recordId); + + // unknown protocol + const invalidGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsQuery, + protocol : 'http://example.com/unknown-protocol' + }, deviceXRecordGrants); + + expect(invalidGrant).to.be.undefined; + }); + + it('Records with protocolPath', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const protocol = 'http://example.com/protocol'; + + const fooGrants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol, + protocolPath : 'foo' + }); + + const barGrants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol, + protocolPath : 'foo/bar' + }); + + const protocolGrants = [ + fooGrants.write, + fooGrants.read, + fooGrants.delete, + fooGrants.query, + fooGrants.subscribe, + barGrants.write, + barGrants.read, + barGrants.delete, + barGrants.query, + barGrants.subscribe + ]; + + const writeFooGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol, + protocolPath : 'foo' + }, protocolGrants); + + expect(writeFooGrant?.message.recordId).to.equal(fooGrants.write.message.recordId); + + const readFooGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsRead, + protocol : protocol, + protocolPath : 'foo' + }, protocolGrants); + + expect(readFooGrant?.message.recordId).to.equal(fooGrants.read.message.recordId); + + const deleteFooGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsDelete, + protocol : protocol, + protocolPath : 'foo' + }, protocolGrants); + + expect(deleteFooGrant?.message.recordId).to.equal(fooGrants.delete.message.recordId); + + const queryGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsQuery, + protocol : protocol, + protocolPath : 'foo' + }, protocolGrants); + + expect(queryGrant?.message.recordId).to.equal(fooGrants.query.message.recordId); + + const subscribeGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsSubscribe, + protocol : protocol, + protocolPath : 'foo' + }, protocolGrants); + + expect(subscribeGrant?.message.recordId).to.equal(fooGrants.subscribe.message.recordId); + + const writeBarGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol, + protocolPath : 'foo/bar' + }, protocolGrants); + + expect(writeBarGrant?.message.recordId).to.equal(barGrants.write.message.recordId); + + const noMatchGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol, + protocolPath : 'bar' + }, protocolGrants); + + expect(noMatchGrant).to.be.undefined; + }); + + it('Records with contextId', async () => { + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); + + const protocol = 'http://example.com/protocol'; + + const abcGrants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol, + contextId : 'abc' + }); + + const defGrants = await createRecordGrants({ + grantorAgent : testHarness.agent as Web5PlatformAgent, + granteeAgent : testHarness.agent as Web5PlatformAgent, + grantor : aliceDid.uri, + grantee : aliceDeviceX.did.uri, + protocol, + contextId : 'def/ghi' + }); + + const contextGrants = [ + abcGrants.write, + abcGrants.read, + abcGrants.delete, + abcGrants.query, + abcGrants.subscribe, + defGrants.write, + defGrants.read, + defGrants.delete, + defGrants.query, + defGrants.subscribe + ]; + + const writeFooGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol, + contextId : 'abc' + }, contextGrants); + + expect(writeFooGrant?.message.recordId).to.equal(abcGrants.write.message.recordId); + + const writeBarGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol, + contextId : 'def/ghi' + }, contextGrants); + + expect(writeBarGrant?.message.recordId).to.equal(defGrants.write.message.recordId); + + const invalidGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol, + contextId : 'def' + }, contextGrants); + + expect(invalidGrant).to.be.undefined; + + const withoutContextGrant = await AgentPermissionsApi.matchGrantFromArray(aliceDid.uri, aliceDeviceX.did.uri, { + messageType : DwnInterface.RecordsWrite, + protocol : protocol + }, contextGrants); + + expect(withoutContextGrant).to.be.undefined; + }); + }); +}); \ No newline at end of file diff --git a/packages/agent/tests/utils/grants.ts b/packages/agent/tests/utils/grants.ts deleted file mode 100644 index 41ecea0a8..000000000 --- a/packages/agent/tests/utils/grants.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { DataEncodedRecordsWriteMessage, DwnInterfaceName, DwnMethodName, Time } from '@tbd54566975/dwn-sdk-js'; -import { DwnInterface, Web5PlatformAgent } from '../../src/index.js'; - -export type MessagesGrants = { - query: DataEncodedRecordsWriteMessage; - read: DataEncodedRecordsWriteMessage; - subscribe: DataEncodedRecordsWriteMessage; -} - -export type RecordsGrants = { - write: DataEncodedRecordsWriteMessage; - delete: DataEncodedRecordsWriteMessage; - read: DataEncodedRecordsWriteMessage; - query: DataEncodedRecordsWriteMessage; - subscribe: DataEncodedRecordsWriteMessage; -} - -export class GrantsUtil { - - /** - * Creates a full set of `Records` interface delegated grants from `grantor` to `grantee`. - * The grants are processed and stored by the `granteeAgent` so that they are available when the grantee attempts to use them. - */ - static async createRecordsGrants({ grantorAgent, grantor, granteeAgent, grantee, protocol, contextId, protocolPath }: { - grantorAgent: Web5PlatformAgent, - grantor: string; - granteeAgent: Web5PlatformAgent, - grantee: string; - protocol: string; - contextId?: string; - protocolPath?: string - }): Promise { - - // RecordsWrite grant - const recordsWriteGrant = await grantorAgent.dwn.createGrant({ - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Write, - protocolPath, - contextId, - protocol, - } - }); - - // write the grant to the grantee's DWN - const recordsWriteGrantReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - dataStream : new Blob([ recordsWriteGrant.permissionGrantBytes ]), - signAsOwner : true - }); - - if (recordsWriteGrantReply.reply.status.code !== 202) { - throw new Error(`Failed to write RecordsWrite grant: ${recordsWriteGrantReply.reply.status.detail}`); - } - - // RecordsDelete grant - const recordsDeleteGrant = await grantorAgent.dwn.createGrant({ - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Delete, - protocolPath, - contextId, - protocol, - } - }); - - const recordsDeleteGrantReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsDeleteGrant.recordsWrite.message, - dataStream : new Blob([ recordsDeleteGrant.permissionGrantBytes ]), - signAsOwner : true - }); - - if (recordsDeleteGrantReply.reply.status.code !== 202) { - throw new Error(`Failed to write RecordsDelete grant: ${recordsDeleteGrantReply.reply.status.detail}`); - } - - // RecordsRead grant - const recordsReadGrant = await grantorAgent.dwn.createGrant({ - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Read, - protocolPath, - contextId, - protocol, - } - }); - - const recordsReadGrantReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsReadGrant.recordsWrite.message, - dataStream : new Blob([ recordsReadGrant.permissionGrantBytes ]), - signAsOwner : true - }); - - if (recordsReadGrantReply.reply.status.code !== 202) { - throw new Error(`Failed to write RecordsRead grant: ${recordsReadGrantReply.reply.status.detail}`); - } - - // RecordsQuery grant - const recordsQueryGrant = await grantorAgent.dwn.createGrant({ - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Query, - protocol, - protocolPath, - contextId, - } - }); - - const recordsQueryGrantReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsQueryGrant.recordsWrite.message, - dataStream : new Blob([ recordsQueryGrant.permissionGrantBytes ]), - signAsOwner : true - }); - - if (recordsQueryGrantReply.reply.status.code !== 202) { - throw new Error(`Failed to write RecordsQuery grant: ${recordsQueryGrantReply.reply.status.detail}`); - } - - // RecordsSubscribe grant - const recordsSubscribeGrant = await grantorAgent.dwn.createGrant({ - delegated : true, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Records, - method : DwnMethodName.Subscribe, - protocolPath, - contextId, - protocol, - } - }); - - const recordsSubscribeGrantReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsSubscribeGrant.recordsWrite.message, - dataStream : new Blob([ recordsSubscribeGrant.permissionGrantBytes ]), - signAsOwner : true - }); - - if (recordsSubscribeGrantReply.reply.status.code !== 202) { - throw new Error(`Failed to write RecordsSubscribe grant: ${recordsSubscribeGrantReply.reply.status.detail}`); - } - - return { - write : recordsWriteGrant.dataEncodedMessage, - delete : recordsDeleteGrant.dataEncodedMessage, - read : recordsReadGrant.dataEncodedMessage, - query : recordsQueryGrant.dataEncodedMessage, - subscribe : recordsSubscribeGrant.dataEncodedMessage, - }; - }; - - /** - * Creates a full set of `Messages` interface permission grants from `grantor` to `grantee`. - */ - static async createMessagesGrants ({ grantorAgent, grantor, granteeAgent, grantee, protocol }: { - grantorAgent: Web5PlatformAgent, - grantor: string; - granteeAgent: Web5PlatformAgent, - grantee: string; - protocol?: string; - }): Promise { - // MessagesQuery grant - const messagesQueryGrant = await grantorAgent.dwn.createGrant({ - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Messages, - method : DwnMethodName.Query, - protocol, - } - }); - - const messagesQueryReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : messagesQueryGrant.recordsWrite.message, - dataStream : new Blob([ messagesQueryGrant.permissionGrantBytes ]), - signAsOwner : true, - }); - - if (messagesQueryReply.reply.status.code !== 202) { - throw new Error(`Failed to write MessagesQuery grant: ${messagesQueryReply.reply.status.detail}`); - } - - // MessagesRead - const messagesReadGrant = await grantorAgent.dwn.createGrant({ - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Messages, - method : DwnMethodName.Read, - protocol, - } - }); - - const messagesReadReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : messagesReadGrant.recordsWrite.message, - dataStream : new Blob([ messagesReadGrant.permissionGrantBytes ]), - signAsOwner : true, - }); - - if (messagesReadReply.reply.status.code !== 202) { - throw new Error(`Failed to write MessagesRead grant: ${messagesReadReply.reply.status.detail}`); - } - - // MessagesSubscribe - const messagesSubscribeGrant = await grantorAgent.dwn.createGrant({ - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - grantedFrom : grantor, - grantedTo : grantee, - scope : { - interface : DwnInterfaceName.Messages, - method : DwnMethodName.Subscribe, - protocol, - } - }); - - const messagesSubscribeReply = await granteeAgent.dwn.processRequest({ - author : grantee, - target : grantee, - messageType : DwnInterface.RecordsWrite, - rawMessage : messagesSubscribeGrant.recordsWrite.message, - dataStream : new Blob([ messagesSubscribeGrant.permissionGrantBytes ]), - signAsOwner : true, - }); - - if (messagesSubscribeReply.reply.status.code !== 202) { - throw new Error(`Failed to write MessagesSubscribe grant: ${messagesSubscribeReply.reply.status.detail}`); - } - - - return { - query : messagesQueryGrant.dataEncodedMessage, - read : messagesReadGrant.dataEncodedMessage, - subscribe : messagesSubscribeGrant.dataEncodedMessage, - }; - }; - -} \ No newline at end of file diff --git a/packages/agent/tests/utils/test-agent.ts b/packages/agent/tests/utils/test-agent.ts index 32bf0d61c..234917ec4 100644 --- a/packages/agent/tests/utils/test-agent.ts +++ b/packages/agent/tests/utils/test-agent.ts @@ -18,6 +18,7 @@ import type { AgentIdentityApi } from '../../src/identity-api.js'; import type { AgentDidApi, DidInterface } from '../../src/did-api.js'; import type { AgentKeyManager } from '../../src/types/key-manager.js'; import type { IdentityVault } from '../../src/types/identity-vault.js'; +import { AgentPermissionsApi } from '../../src/permissions-api.js'; type TestAgentParams = { agentVault: IdentityVault; @@ -26,6 +27,7 @@ type TestAgentParams = { dwnApi: AgentDwnApi; identityApi: AgentIdentityApi; keyManager: TKeyManager; + permissionsApi: AgentPermissionsApi; rpcClient: Web5Rpc; syncApi: AgentSyncApi; } @@ -36,6 +38,7 @@ export class TestAgent implements Web5Platf public dwn: AgentDwnApi; public identity: AgentIdentityApi; public keyManager: TKeyManager; + public permissions: AgentPermissionsApi; public rpc: Web5Rpc; public sync: AgentSyncApi; public vault: IdentityVault; @@ -48,6 +51,7 @@ export class TestAgent implements Web5Platf this.dwn = params.dwnApi; this.identity = params.identityApi; this.keyManager = params.keyManager; + this.permissions = params.permissionsApi; this.rpc = params.rpcClient; this.sync = params.syncApi; this.vault = params.agentVault; @@ -57,6 +61,7 @@ export class TestAgent implements Web5Platf this.dwn.agent = this; this.identity.agent = this; this.keyManager.agent = this; + this.permissions.agent = this; this.sync.agent = this; } diff --git a/packages/api/src/dwn-api.ts b/packages/api/src/dwn-api.ts index eb5e44991..c7c45bbc5 100644 --- a/packages/api/src/dwn-api.ts +++ b/packages/api/src/dwn-api.ts @@ -4,6 +4,13 @@ */ /// +import type { + CreateGrantParams, + CreateRequestParams, + FetchPermissionRequestParams, + FetchPermissionsParams +} from '@web5/agent'; + import { Web5Agent, DwnMessage, @@ -12,15 +19,41 @@ import { DwnResponseStatus, ProcessDwnRequest, DwnPaginationCursor, - DwnDataEncodedRecordsWriteMessage + DwnDataEncodedRecordsWriteMessage, + AgentPermissionsApi } from '@web5/agent'; -import { Convert, isEmptyObject, TtlCache } from '@web5/common'; -import { DwnInterface, getRecordAuthor, DwnPermissionsUtil } from '@web5/agent'; +import { isEmptyObject, TtlCache } from '@web5/common'; +import { DwnInterface, getRecordAuthor } from '@web5/agent'; import { Record } from './record.js'; import { dataToBlob } from './utils.js'; import { Protocol } from './protocol.js'; +import { PermissionGrant } from './permission-grant.js'; +import { PermissionRequest } from './permission-request.js'; + +/** + * Represents the request payload for fetching permission requests from a Decentralized Web Node (DWN). + * + * Optionally, specify a remote DWN target in the `from` property to fetch requests from. + */ +export type FetchRequestsRequest = Omit & { + /** Optional DID specifying the remote target DWN tenant to be queried. */ + from?: string; +}; + +/** + * Represents the request payload for fetching permission grants from a Decentralized Web Node (DWN). + * + * Optionally, specify a remote DWN target in the `from` property to fetch requests from. + * Optionally, specify whether to check if the grant is revoked in the `checkRevoked` property. + */ +export type FetchGrantsRequest = Omit & { + /** Optional DID specifying the remote target DWN tenant to be queried. */ + from?: string; + /** Optionally check if the grant has been revoked. */ + checkRevoked?: boolean; +}; /** * Represents the request payload for configuring a protocol on a Decentralized Web Node (DWN). @@ -234,44 +267,61 @@ export class DwnApi { /** (optional) The DID of the signer when signing with permissions */ private delegateDid?: string; - /** cache for fetching permissions */ - private cachedPermissions: TtlCache = new TtlCache({ ttl: 60 * 1000 }); + /** Holds the instance of {@link AgentPermissionsApi} that helps when dealing with permissions protocol records */ + private permissionsApi: AgentPermissionsApi; + + /** cache for fetching a permission {@link PermissionGrant}, keyed by a specific MessageType and protocol */ + private cachedPermissions: TtlCache = new TtlCache({ ttl: 60 * 1000 }); constructor(options: { agent: Web5Agent, connectedDid: string, delegateDid?: string }) { this.agent = options.agent; this.connectedDid = options.connectedDid; this.delegateDid = options.delegateDid; + this.permissionsApi = new AgentPermissionsApi({ agent: this.agent }); } /** - * API to interact with grants. + * API to interact with the DWN Permissions when the agent is connected to a delegateDid. * * NOTE: This is an EXPERIMENTAL API that will change behavior. * @beta */ - get grants() { + private get connected() { return { /** * Finds the appropriate permission grants associated with a message request + * + * (optionally) Caches the results for the given parameters to avoid redundant queries. */ - findConnectedPermissionGrant: async ({ messageParams }:{ + findPermissionGrantForMessage: async ({ messageParams, cached = true }:{ + cached?: boolean; messageParams: { - messageType: T, - protocol: string, + messageType: T; + protocol: string; } - }) : Promise => { + }) : Promise => { if(!this.delegateDid) { throw new Error('AgentDwnApi: Cannot find connected grants without a signer DID'); } - const permissions = await this.grants.fetchConnectedGrants(); + // Currently we only support finding grants based on protocols + // A different approach may be necessary when we introduce `protocolPath` and `contextId` specific impersonation + const cacheKey = [ this.connectedDid, messageParams.messageType, messageParams.protocol ].join('~'); + const cachedGrant = cached ? this.cachedPermissions.get(cacheKey) : undefined; + if (cachedGrant) { + return cachedGrant; + } + + const permissionGrants = await this.permissions.queryGrants({ checkRevoked: true, grantor: this.connectedDid }); + + const grantEntries = permissionGrants.map(grant => ({ message: grant.rawMessage, grant: grant.toJSON() })); // get the delegate grants that match the messageParams and are associated with the connectedDid as the grantor - const delegateGrant = await DwnPermissionsUtil.matchGrantFromArray( + const delegateGrant = await AgentPermissionsApi.matchGrantFromArray( this.connectedDid, this.delegateDid, messageParams, - permissions, + grantEntries, true ); @@ -279,134 +329,112 @@ export class DwnApi { throw new Error(`AgentDwnApi: No permissions found for ${messageParams.messageType}: ${messageParams.protocol}`); } - return delegateGrant.message; - }, + const grant = await PermissionGrant.parse({ connectedDid: this.delegateDid, agent: this.agent, message: delegateGrant.message }); + this.cachedPermissions.set(cacheKey, grant); + return grant; + } + }; + } + /** + * API to interact with Grants + * + * NOTE: This is an EXPERIMENTAL API that will change behavior. + * @beta + */ + get permissions() { + return { /** - * Performs a RecordsQuery for permission grants that match the given parameters. - * - * (optionally) Caches the results for the given parameters to avoid redundant queries. + * Request permission for a specific scope. */ - fetchConnectedGrants: async (cached: boolean = true): Promise => { - if (!this.delegateDid) { - throw new Error('AgentDwnApi: Cannot fetch grants without a signer DID'); - } - - const cacheKey = [ this.delegateDid, this.connectedDid ].join('~'); - const cachedGrants = cached ? this.cachedPermissions.get(cacheKey) : undefined; - if (cachedGrants) { - return cachedGrants; - } - - const { reply: grantsReply } = await this.agent.processDwnRequest({ - author : this.delegateDid, - target : this.delegateDid, - messageType : DwnInterface.RecordsQuery, - messageParams : { - filter: { - author : this.connectedDid, // the author of the grant would be the grantor and the logical author of the message - recipient : this.delegateDid, // the recipient of the grant would be the grantee - ...DwnPermissionsUtil.permissionsProtocolParams('grant') - } - } + request: async(request: Omit): Promise => { + const { message } = await this.permissionsApi.createRequest({ + ...request, + author: this.delegateDid ?? this.connectedDid, }); - if (grantsReply.status.code !== 200) { - throw new Error(`AgentDwnApi: Failed to fetch grants: ${grantsReply.status.detail}`); - } + const requestParams = { + connectedDid : this.delegateDid ?? this.connectedDid, + agent : this.agent, + message, + }; - const grants:DwnDataEncodedRecordsWriteMessage[] = []; - for (const entry of grantsReply.entries! as DwnDataEncodedRecordsWriteMessage[]) { - // check if the grant is revoked, we set the target to the grantor since the grantor is the author of the revocation - // the revocations should come in through sync, and are checked against the local DWN - if(await this.grants.isGrantRevoked(this.delegateDid, this.connectedDid, entry.recordId)) { - // grant is revoked do not return it in the grants list - continue; - } - grants.push(entry as DwnDataEncodedRecordsWriteMessage); - } + return await PermissionRequest.parse(requestParams); + }, + /** + * Grant permission for a specific scope to a grantee DID. + */ + grant: async(request: Omit): Promise => { + const { message } = await this.permissionsApi.createGrant({ + ...request, + author: this.delegateDid ?? this.connectedDid, + }); - if (cached) { - this.cachedPermissions.set(cacheKey, grants); - } + const grantParams = { + connectedDid : this.delegateDid ?? this.connectedDid, + agent : this.agent, + message, + }; - return grants; + return await PermissionGrant.parse(grantParams); }, - /** - * Check whether a grant is revoked by reading the revocation record for a given grant recordId. + * Query permission requests. You can filter by protocol and specify if you want to query a remote DWN. */ - isGrantRevoked: async (author:string, target: string, grantRecordId: string): Promise => { - const { reply: revocationReply } = await this.agent.processDwnRequest({ - author, - target, - messageType : DwnInterface.RecordsRead, - messageParams : { - filter: { - parentId: grantRecordId, - ...DwnPermissionsUtil.permissionsProtocolParams('revoke') - } - } + queryRequests: async(request: FetchRequestsRequest= {}): Promise => { + const { from, ...params } = request; + const fetchResponse = await this.permissionsApi.fetchRequests({ + ...params, + author : this.delegateDid ?? this.connectedDid, + target : from ?? this.delegateDid ?? this.connectedDid, + remote : from !== undefined, }); - if (revocationReply.status.code === 404) { - // no revocation found, the grant is not revoked - return false; - } else if (revocationReply.status.code === 200) { - // a revocation was found, the grant is revoked - return true; + const requests: PermissionRequest[] = []; + for (const permission of fetchResponse) { + const requestParams = { + connectedDid : this.delegateDid ?? this.connectedDid, + agent : this.agent, + message : permission.message, + }; + requests.push(await PermissionRequest.parse(requestParams)); } - throw new Error(`AgentDwnApi: Failed to check if grant is revoked: ${revocationReply.status.detail}`); + return requests; }, - /** - * Processes a list of delegated grants as the delegated signer so that they are available for the signer to use. - * - * If any of the grants fail, all the input grants are deleted and an error is thrown. - * Grants cache is cleared after processing. + * Query permission grants. You can filter by grantee, grantor, protocol and specify if you want to query a remote DWN. */ - processConnectedGrantsAsOwner: async (grants: DwnDataEncodedRecordsWriteMessage[]): Promise => { - if(!this.delegateDid) { - throw new Error('AgentDwnApi: Cannot process grants without a signer DID'); - } + queryGrants: async(request: FetchGrantsRequest = {}): Promise => { + const { checkRevoked, from, ...params } = request; + const remote = from !== undefined; + const author = this.delegateDid ?? this.connectedDid; + const target = from ?? this.delegateDid ?? this.connectedDid; + const fetchResponse = await this.permissionsApi.fetchGrants({ + ...params, + author, + target, + remote, + }); - for (const grant of grants) { - const data = Convert.base64Url(grant.encodedData).toArrayBuffer(); - const grantMessage = grant as DwnMessage[DwnInterface.RecordsWrite]; - delete grantMessage['encodedData']; - - const { reply } = await this.agent.processDwnRequest({ - author : this.delegateDid, - target : this.delegateDid, - signAsOwner : true, - messageType : DwnInterface.RecordsWrite, - rawMessage : grantMessage, - dataStream : new Blob([ data ]) - }); + const grants: PermissionGrant[] = []; + for (const permission of fetchResponse) { + const grantParams = { + connectedDid : this.delegateDid ?? this.connectedDid, + agent : this.agent, + message : permission.message, + }; - if (reply.status.code !== 202) { - // if any of the grants fail, delete the other grants and throw an error - for (const grant of grants) { - const { reply } = await this.agent.processDwnRequest({ - author : this.delegateDid, - target : this.delegateDid, - messageType : DwnInterface.RecordsDelete, - messageParams : { - recordId: grant.recordId - } - }); - - if (reply.status.code !== 202 && reply.status.code !== 404) { - console.error('Failed to delete grant: ', grant.recordId); - } + if (checkRevoked) { + const grantRecordId = permission.grant.id; + if(await this.permissionsApi.isGrantRevoked({ author, target, grantRecordId, remote })) { + continue; } - - throw new Error(`Failed to process delegated grant: ${reply.status.detail}`); } - - this.cachedPermissions.clear(); + grants.push(await PermissionGrant.parse(grantParams)); } + + return grants; } }; } @@ -538,7 +566,7 @@ export class DwnApi { if (this.delegateDid) { // if an app is scoped down to a specific protocolPath or contextId, it must include those filters in the read request - const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + const { rawMessage: delegatedGrant } = await this.connected.findPermissionGrantForMessage({ messageParams: { messageType : DwnInterface.RecordsDelete, protocol : request.protocol, @@ -585,7 +613,7 @@ export class DwnApi { if (this.delegateDid) { // if an app is scoped down to a specific protocolPath or contextId, it must include those filters in the read request - const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + const { rawMessage: delegatedGrant } = await this.connected.findPermissionGrantForMessage({ messageParams: { messageType : DwnInterface.RecordsQuery, protocol : agentRequest.messageParams.filter.protocol, @@ -661,7 +689,7 @@ export class DwnApi { if (this.delegateDid) { // if an app is scoped down to a specific protocolPath or contextId, it must include those filters in the read request - const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + const { rawMessage: delegatedGrant } = await this.connected.findPermissionGrantForMessage({ messageParams: { messageType : DwnInterface.RecordsRead, protocol : request.protocol @@ -739,7 +767,7 @@ export class DwnApi { // if impersonation is enabled, fetch the delegated grant to use with the write operation if (this.delegateDid) { - const delegatedGrant = await this.grants.findConnectedPermissionGrant({ + const { rawMessage: delegatedGrant } = await this.connected.findPermissionGrantForMessage({ messageParams: { messageType : DwnInterface.RecordsWrite, protocol : dwnRequestParams.messageParams.protocol, @@ -780,4 +808,25 @@ export class DwnApi { }, }; } + + /** + * A static method to process connected grants for a delegate DID. + * + * This will store the grants as the DWN owner to be used later when impersonating the connected DID. + */ + static async processConnectedGrants({ grants, agent, delegateDid }: { + grants: DwnDataEncodedRecordsWriteMessage[], + agent: Web5Agent, + delegateDid: string, + }): Promise { + for (const grantMessage of grants) { + // use the delegateDid as the connectedDid of the grant as they do not yet support impersonation/delegation + const grant = await PermissionGrant.parse({ connectedDid: delegateDid, agent, message: grantMessage }); + // store the grant as the owner of the DWN, this will allow the delegateDid to use the grant when impersonating the connectedDid + const { status } = await grant.store(true); + if (status.code !== 202) { + throw new Error(`AgentDwnApi: Failed to process connected grant: ${status.detail}`); + } + } + } } \ No newline at end of file diff --git a/packages/api/src/grant-revocation.ts b/packages/api/src/grant-revocation.ts new file mode 100644 index 000000000..4bcdaac24 --- /dev/null +++ b/packages/api/src/grant-revocation.ts @@ -0,0 +1,124 @@ +import { AgentPermissionsApi, DwnDataEncodedRecordsWriteMessage, DwnResponseStatus, getRecordAuthor, SendDwnRequest, Web5Agent } from '@web5/agent'; +import { DwnInterface } from '@web5/agent'; +import { Convert } from '@web5/common'; + +/** + * Represents the structured data model of a GrantRevocation record, encapsulating the essential fields that define. + */ +export interface GrantRevocationModel { + /** The DWN message used to construct this revocation */ + rawMessage: DwnDataEncodedRecordsWriteMessage; +} + +/** + * Represents the options for creating a new GrantRevocation instance. + */ +export interface GrantRevocationOptions { + /** The DID of the DWN tenant under which record operations are being performed. */ + connectedDid: string; + /** The DWN message used to construct this revocation */ + message: DwnDataEncodedRecordsWriteMessage; +} + +/** + * The `PermissionGrantRevocation` class encapsulates a permissions protocol `grant/revocation` record, providing a more + * developer-friendly interface for working with Decentralized Web Node (DWN) records. + * + * Methods are provided to manage the grant revocation's lifecycle, including writing to remote DWNs. + * + * @beta + */ +export class PermissionGrantRevocation implements GrantRevocationModel { + /** The PermissionsAPI used to interact with the underlying revocation */ + private _permissions: AgentPermissionsApi; + /** The DID to use as the author and default target for the underlying revocation */ + private _connectedDid: string; + /** The DWN `RecordsWrite` message, along with encodedData that represents the revocation */ + private _message: DwnDataEncodedRecordsWriteMessage; + + private constructor(permissions: AgentPermissionsApi, options: GrantRevocationOptions) { + this._permissions = permissions; + this._connectedDid = options.connectedDid; + + // Store the message that represents the grant. + this._message = options.message; + } + + /** The author of the underlying revocation message */ + get author() { + return getRecordAuthor(this._message); + } + + /** parses the grant revocation given am agent, connectedDid and data encoded records write message */ + static async parse({ connectedDid, agent, message }:{ + connectedDid: string; + agent: Web5Agent; + message: DwnDataEncodedRecordsWriteMessage; + }): Promise { + const permissions = new AgentPermissionsApi({ agent }); + return new PermissionGrantRevocation(permissions, { connectedDid, message }); + } + + /** The agent to use for this instantiation of the grant revocation */ + private get agent(): Web5Agent { + return this._permissions.agent; + } + + /** The raw `RecordsWrite` DWN message with encoded data that was used to instantiate this grant revocation */ + get rawMessage(): DwnDataEncodedRecordsWriteMessage { + return this._message; + } + + /** + * Send the current grant revocation to a remote DWN by specifying their DID + * If no DID is specified, the target is assumed to be the owner (connectedDID). + * + * @param target - the optional DID to send the grant revocation to, if none is set it is sent to the connectedDid + * @returns the status of the send grant revocation request + * + * @beta + */ + async send(target?: string): Promise { + target ??= this._connectedDid; + + const { encodedData, ...rawMessage } = this._message; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const sendRequestOptions: SendDwnRequest = { + messageType : DwnInterface.RecordsWrite, + author : this._connectedDid, + target : target, + dataStream, + rawMessage, + }; + + // Send the current/latest state to the target. + const { reply } = await this.agent.sendDwnRequest(sendRequestOptions); + return reply; + } + + /** + * Stores the current grant revocation to the owner's DWN. + * + * @param importGrant - if true, the grant revocation will signed by the owner before storing it to the owner's DWN. Defaults to false. + * @returns the status of the store request + * + * @beta + */ + async store(importRevocation?: boolean): Promise { + const { encodedData, ...rawMessage } = this.rawMessage; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const { reply, message } = await this.agent.processDwnRequest({ + author : this._connectedDid, + target : this._connectedDid, + messageType : DwnInterface.RecordsWrite, + signAsOwner : importRevocation, + rawMessage, + dataStream, + }); + + this._message = { ...message, encodedData: encodedData }; + return { status: reply.status }; + } +} \ No newline at end of file diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 8d2f52e15..b147a3185 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -23,6 +23,9 @@ export * from './did-api.js'; export * from './dwn-api.js'; +export * from './grant-revocation.js'; +export * from './permission-grant.js'; +export * from './permission-request.js'; export * from './protocol.js'; export * from './record.js'; export * from './vc-api.js'; diff --git a/packages/api/src/permission-grant.ts b/packages/api/src/permission-grant.ts new file mode 100644 index 000000000..a192d61c1 --- /dev/null +++ b/packages/api/src/permission-grant.ts @@ -0,0 +1,327 @@ +import type { + DwnDataEncodedRecordsWriteMessage, + DwnPermissionConditions, + DwnPermissionScope, + DwnResponseStatus, + SendDwnRequest, + Web5Agent +} from '@web5/agent'; + +import { Convert } from '@web5/common'; +import { + AgentPermissionsApi, + DwnInterface, + DwnPermissionGrant, +} from '@web5/agent'; +import { PermissionGrantRevocation } from './grant-revocation.js'; + +/** + * Represents the structured data model of a PermissionGrant record, encapsulating the essential fields that define + */ +export interface PermissionGrantModel { + /** + * The ID of the permission grant, which is the record ID DWN message. + */ + readonly id: string; + + /** + * The grantor of the permission. + */ + readonly grantor: string; + + /** + * The grantee of the permission. + */ + readonly grantee: string; + + /** + * The date at which the grant was given. + */ + readonly dateGranted: string; + + /** + * Optional string that communicates what the grant would be used for + */ + readonly description?: string; + + /** + * Optional CID of a permission request. This is optional because grants may be given without being officially requested + */ + readonly requestId?: string; + + /** + * Timestamp at which this grant will no longer be active. + */ + readonly dateExpires: string; + + /** + * Whether this grant is delegated or not. If `true`, the `grantedTo` will be able to act as the `grantedTo` within the scope of this grant. + */ + readonly delegated?: boolean; + + /** + * The scope of the allowed access. + */ + readonly scope: DwnPermissionScope; + + /** + * Optional conditions that must be met when the grant is used. + */ + readonly conditions?: DwnPermissionConditions; +} + +/** + * Represents the options for creating a new PermissionGrant instance. + */ +export interface PermissionGrantOptions { + /** The DID to use when interacting with the underlying DWN record representing the grant */ + connectedDid: string; + /** The underlying DWN `RecordsWrite` message along with encoded data that represent the grant */ + message: DwnDataEncodedRecordsWriteMessage; + /** The agent to use when interacting with the underlying DWN record representing the grant */ + agent: Web5Agent; +} + +/** + * The `PermissionGrant` class encapsulates a permissions protocol `grant` record, providing a more + * developer-friendly interface for working with Decentralized Web Node (DWN) records. + * + * Methods are provided to revoke, check if isRevoked, and manage the grant's lifecycle, including writing to remote DWNs. + * + * @beta + */ +export class PermissionGrant implements PermissionGrantModel { + /** The PermissionsAPI used to interact with the underlying permission grant */ + private _permissions: AgentPermissionsApi; + /** The DID to use as the author and default target for the underlying permission grant */ + private _connectedDid: string; + /** The underlying DWN `RecordsWrite` message along with encoded data that represent the grant */ + private _message: DwnDataEncodedRecordsWriteMessage; + /** The parsed grant object */ + private _grant: DwnPermissionGrant; + + private constructor({ api, connectedDid, message, grant }:{ + api: AgentPermissionsApi; + connectedDid: string; + message: DwnDataEncodedRecordsWriteMessage; + grant: DwnPermissionGrant; + }) { + this._permissions = api; + + // Store the connected DID for convenience. + this._connectedDid = connectedDid; + + // Store the message that represents the grant. + this._message = message; + + // Store the parsed grant object. + this._grant = grant; + } + + /** parses the grant given an agent, connectedDid and data encoded records write message */ + static async parse(options: PermissionGrantOptions): Promise { + //TODO: this does not have to be async https://github.com/TBD54566975/web5-js/pull/831/files + const grant = await DwnPermissionGrant.parse(options.message); + const api = new AgentPermissionsApi({ agent: options.agent }); + return new PermissionGrant({ ...options, grant, api }); + } + + /** The agent to use for this instantiation of the grant */ + private get agent(): Web5Agent { + return this._permissions.agent; + } + + /** The grant's ID, which is also the underlying record's ID */ + get id(): string { + return this._grant.id; + } + + /** The DID which granted the permission */ + get grantor(): string { + return this._grant.grantor; + } + + /** The DID which the permission was granted to */ + get grantee(): string { + return this._grant.grantee; + } + + /** The date the permission was granted */ + get dateGranted(): string { + return this._grant.dateGranted; + } + + /** (optional) Description of the permission grant */ + get description(): string | undefined { + return this._grant.description; + } + + /** (optional) The Id of the PermissionRequest if one was used */ + get requestId(): string | undefined { + return this._grant.requestId; + } + + /** The date on which the permission expires */ + get dateExpires(): string { + return this._grant.dateExpires; + } + + /** Whether or not the permission grant can be used to impersonate the grantor */ + get delegated(): boolean | undefined { + return this._grant.delegated; + } + + /** The permission scope under which the grant is valid */ + get scope(): DwnPermissionScope { + return this._grant.scope; + } + + /** The conditions under which the grant is valid */ + get conditions(): DwnPermissionConditions { + return this._grant.conditions; + } + + /** The raw `RecordsWrite` DWN message with encoded data that was used to instantiate this grant */ + get rawMessage(): DwnDataEncodedRecordsWriteMessage { + return this._message; + } + + /** + * Send the current grant to a remote DWN by specifying their DID + * If no DID is specified, the target is assumed to be the owner (connectedDID). + * + * @param target - the optional DID to send the grant to, if none is set it is sent to the connectedDid + * @returns the status of the send grant request + * + * @beta + */ + async send(target?: string): Promise { + target ??= this._connectedDid; + + const { encodedData, ...rawMessage } = this._message; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const sendRequestOptions: SendDwnRequest = { + messageType : DwnInterface.RecordsWrite, + author : this._connectedDid, + target : target, + dataStream, + rawMessage, + }; + + // Send the current/latest state to the target. + const { reply } = await this.agent.sendDwnRequest(sendRequestOptions); + return reply; + } + + /** + * Stores the current grant to the owner's DWN. + * + * @param importGrant - if true, the grant will signed by the owner before storing it to the owner's DWN. Defaults to false. + * @returns the status of the store request + * + * @beta + */ + async store(importGrant: boolean = false): Promise { + const { encodedData, ...rawMessage } = this.rawMessage; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const { reply, message } = await this.agent.processDwnRequest({ + store : true, + author : this._connectedDid, + target : this._connectedDid, + messageType : DwnInterface.RecordsWrite, + signAsOwner : importGrant, + rawMessage, + dataStream, + }); + + this._message = { ...message, encodedData: encodedData }; + return { status: reply.status }; + } + + /** + * Signs the current grant as the owner and optionally stores it to the owner's DWN. + * This is useful when importing a grant that was signed by someone else into your own DWN. + * + * @param store - if true, the grant will be stored to the owner's DWN after signing. Defaults to true. + * @returns the status of the import request + * + * @beta + */ + async import(store: boolean = false): Promise { + const { encodedData, ...rawMessage } = this.rawMessage; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const { reply, message } = await this.agent.processDwnRequest({ + store, + author : this._connectedDid, + target : this._connectedDid, + messageType : DwnInterface.RecordsWrite, + signAsOwner : true, + rawMessage, + dataStream, + }); + + this._message = { ...message, encodedData: encodedData }; + return { status: reply.status }; + } + + /** + * Revokes the grant and optionally stores the revocation to the owner's DWN. + * + * @param store - if true, the revocation will be stored to the owner's DWN. Defaults to true. + * @returns {PermissionGrantRevocation} the grant revocation object + * + * @beta + */ + async revoke(store: boolean = true): Promise { + const revocation = await this._permissions.createRevocation({ + store, + author : this._connectedDid, + grant : this._grant, + }); + + return PermissionGrantRevocation.parse({ + connectedDid : this._connectedDid, + agent : this.agent, + message : revocation.message, + }); + } + + /** + * Checks if the grant has been revoked. + * + * @param remote - if true, the check will be made against the remote DWN. Defaults to false. + * @returns true if the grant has been revoked, false otherwise. + * @throws if there is an error checking the revocation status. + * + * @beta + */ + isRevoked(remote: boolean = false): Promise { + return this._permissions.isGrantRevoked({ + author : this._connectedDid, + target : this.grantor, + grantRecordId : this.id, + remote + }); + } + + /** + * @returns the JSON representation of the grant + */ + toJSON(): DwnPermissionGrant { + return { + id : this.id, + grantor : this.grantor, + grantee : this.grantee, + dateGranted : this.dateGranted, + description : this.description, + requestId : this.requestId, + dateExpires : this.dateExpires, + delegated : this.delegated, + scope : this.scope, + conditions : this.conditions + }; + } +} \ No newline at end of file diff --git a/packages/api/src/permission-request.ts b/packages/api/src/permission-request.ts new file mode 100644 index 000000000..25d15a5fb --- /dev/null +++ b/packages/api/src/permission-request.ts @@ -0,0 +1,214 @@ +import { AgentPermissionsApi, DwnDataEncodedRecordsWriteMessage, DwnPermissionConditions, DwnPermissionRequest, DwnPermissionScope, DwnResponseStatus, SendDwnRequest, Web5Agent } from '@web5/agent'; +import { DwnInterface } from '@web5/agent'; +import { Convert } from '@web5/common'; +import { PermissionGrant } from './permission-grant.js'; + +/** + * Represents the structured data model of a PermissionsRequest record, encapsulating the essential fields that define + * the request's data and payload within a Decentralized Web Node (DWN). + */ +export interface PermissionRequestModel { + /** + * The ID of the permission request, which is the record ID DWN message. + */ + readonly id: string; + + /** + * The requester for of the permission. + */ + readonly requester: string; + + /** + * Optional string that communicates what the requested grant would be used for. + */ + readonly description?: string; + + /** + * Whether the requested grant is delegated or not. + * If `true`, the `requestor` will be able to act as the grantor of the permission within the scope of the requested grant. + */ + readonly delegated?: boolean; + + /** + * The scope of the allowed access. + */ + readonly scope: DwnPermissionScope; + + /** + * Optional conditions that must be met when the requested grant is used. + */ + readonly conditions?: DwnPermissionConditions; +} + +/** + * The `PermissionRequest` class encapsulates a permissions protocol `request` record, providing a more + * developer-friendly interface for working with Decentralized Web Node (DWN) records. + * + * Methods are provided to grant the request and manage the request's lifecycle, including writing to remote DWNs. + * + * @beta + */ +export class PermissionRequest implements PermissionRequestModel { + /** The PermissionsAPI used to interact with the underlying permission request */ + private _permissions: AgentPermissionsApi; + /** The DID to use as the author and default target for the underlying permission request */ + private _connectedDid: string; + /** The underlying DWN `RecordsWrite` message along with encoded data that represent the request */ + private _message: DwnDataEncodedRecordsWriteMessage; + /** The parsed permission request object */ + private _request: DwnPermissionRequest; + + private constructor({ api, connectedDid, message, request }: { + api: AgentPermissionsApi; + connectedDid: string; + message: DwnDataEncodedRecordsWriteMessage; + request: DwnPermissionRequest; + }) { + this._permissions = api; + this._connectedDid = connectedDid; + + // Store the parsed request object. + this._request = request; + + // Store the message that represents the grant. + this._message = message; + } + + /** parses the request given an agent, connectedDid and data encoded records write message */ + static async parse({ connectedDid, agent, message }:{ + connectedDid: string; + agent: Web5Agent; + message: DwnDataEncodedRecordsWriteMessage; + }): Promise { + //TODO: this does not have to be async https://github.com/TBD54566975/web5-js/pull/831/files + const request = await DwnPermissionRequest.parse(message); + const api = new AgentPermissionsApi({ agent }); + return new PermissionRequest({ api, connectedDid, message, request }); + } + + /** The agent to use for this instantiation of the request */ + private get agent(): Web5Agent { + return this._permissions.agent; + } + + /** The request's ID, which is also the underlying record's ID */ + get id() { + return this._request.id; + } + + /** The DID that is requesting a permission */ + get requester() { + return this._request.requester; + } + + /** (optional) Description of the permission request */ + get description() { + return this._request.description; + } + + /** Whether or not the permission request can be used to impersonate the grantor */ + get delegated() { + return this._request.delegated; + } + + /** The permission scope under which the requested grant would be valid */ + get scope() { + return this._request.scope; + } + + /** The conditions under which the requested grant would be valid */ + get conditions() { + return this._request.conditions; + } + + /** The `RecordsWrite` DWN message with encoded data that was used to instantiate this request */ + get rawMessage(): DwnDataEncodedRecordsWriteMessage { + return this._message; + } + + /** + * Send the current permission request to a remote DWN by specifying their DID + * If no DID is specified, the target is assumed to be the owner (connectedDID). + * + * @param target - the optional DID to send the permission request to, if none is set it is sent to the connectedDid + * @returns the status of the send permission request + * + * @beta + */ + async send(target?: string): Promise { + target ??= this._connectedDid; + + const { encodedData, ...rawMessage } = this._message; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const sendRequestOptions: SendDwnRequest = { + messageType : DwnInterface.RecordsWrite, + author : this._connectedDid, + target : target, + dataStream, + rawMessage, + }; + + // Send the current/latest state to the target. + const { reply } = await this.agent.sendDwnRequest(sendRequestOptions); + return reply; + } + + /** + * Stores the current permission request to the owner's DWN. + * + * @param importGrant - if true, the permission request will signed by the owner before storing it to the owner's DWN. Defaults to false. + * @returns the status of the store request + * + * @beta + */ + async store(): Promise { + const { encodedData, ...rawMessage } = this.rawMessage; + const dataStream = new Blob([ Convert.base64Url(encodedData).toUint8Array() ]); + + const { reply, message } = await this.agent.processDwnRequest({ + author : this._connectedDid, + target : this._connectedDid, + messageType : DwnInterface.RecordsWrite, + rawMessage, + dataStream, + }); + + this._message = { ...message, encodedData: encodedData }; + return { status: reply.status }; + } + + /** + * Grants the permission request to the requester. + * + * @param dateExpires - the date when the permission grant will expire. + * @param store - if true, the permission grant will be stored in the owner's DWN. Defaults to true. + * @returns {PermissionGrant} the granted permission. + * + * @beta + */ + async grant(dateExpires: string, store: boolean = true): Promise { + const { message } = await this._permissions.createGrant({ + requestId : this.id, + grantedTo : this.requester, + scope : this.scope, + delegated : this.delegated, + author : this._connectedDid, + store, + dateExpires, + }); + + return PermissionGrant.parse({ + connectedDid : this._connectedDid, + agent : this.agent, + message + }); + } + + /** + * @returns the JSON representation of the permission request + */ + toJSON(): PermissionRequestModel { + return this._request; + } +} \ No newline at end of file diff --git a/packages/api/src/web5.ts b/packages/api/src/web5.ts index d8951d67a..e905332c5 100644 --- a/packages/api/src/web5.ts +++ b/packages/api/src/web5.ts @@ -11,7 +11,6 @@ import type { Web5Agent, } from '@web5/agent'; -import { PortableDid } from '@web5/dids'; import { Web5UserAgent } from '@web5/user-agent'; import { DwnRegistrar, WalletConnect } from '@web5/agent'; @@ -276,16 +275,12 @@ export class Web5 { }}); await userAgent.identity.manage({ portableIdentity: await identity.export() }); - // NOTE: We are using the DwnApi directly temporarily, in a future release there will be a more robust Permissions API on the agent level - // to handle specific permissions requests - // - // Process the incoming delegated grants in the UserAgent as the owner of the signing delegatedDID - // this will allow the delegated DID to fetch the grants in order to use them when selecting a grant to sign a record/message with - // If any of the grants fail to process, they are all rolled back and this will throw an error causing the identity to be cleaned up - const dwnApi = new DwnApi({ agent, connectedDid, delegateDid: delegateDid.uri }); - await dwnApi.grants.processConnectedGrantsAsOwner(delegateGrants); + // Attempts to process the connected grants to be used by the delegateDID + // If the process fails, we want to clean up the identity + await DwnApi.processConnectedGrants({ agent, delegateDid: delegateDid.uri, grants: delegateGrants }); } catch (error:any) { // clean up the DID and Identity if import fails and throw + // TODO: Implement the ability to purge all of our messages as a tenant await this.cleanUpIdentity({ identity, userAgent }); throw new Error(`Failed to connect to wallet: ${error.message}`); } diff --git a/packages/api/tests/dwn-api.spec.ts b/packages/api/tests/dwn-api.spec.ts index 204cc83f3..16ae2f8bc 100644 --- a/packages/api/tests/dwn-api.spec.ts +++ b/packages/api/tests/dwn-api.spec.ts @@ -3,13 +3,14 @@ import type { BearerDid } from '@web5/dids'; import sinon from 'sinon'; import { expect } from 'chai'; import { Web5UserAgent } from '@web5/user-agent'; -import { DwnDateSort, DwnInterface, PlatformAgentTestHarness } from '@web5/agent'; +import { AgentPermissionsApi, DwnDateSort, DwnInterface, getRecordAuthor, PlatformAgentTestHarness } from '@web5/agent'; import { DwnApi } from '../src/dwn-api.js'; import { testDwnUrl } from './utils/test-config.js'; import emailProtocolDefinition from './fixtures/protocol-definitions/email.json' assert { type: 'json' }; import photosProtocolDefinition from './fixtures/protocol-definitions/photos.json' assert { type: 'json' }; -import { DwnInterfaceName, DwnMethodName, PermissionGrant, Time } from '@tbd54566975/dwn-sdk-js'; +import { DwnInterfaceName, DwnMethodName, PermissionsProtocol, Time } from '@tbd54566975/dwn-sdk-js'; +import { PermissionGrant } from '../src/permission-grant.js'; let testDwnUrls: string[] = [testDwnUrl]; @@ -45,10 +46,6 @@ describe('DwnApi', () => { // Instantiate DwnApi for both test identities. dwnAlice = new DwnApi({ agent: testHarness.agent, connectedDid: aliceDid.uri }); dwnBob = new DwnApi({ agent: testHarness.agent, connectedDid: bobDid.uri }); - - // clear cached permissions between test runs - dwnAlice['cachedPermissions'].clear(); - dwnBob['cachedPermissions'].clear(); }); after(async () => { @@ -1370,19 +1367,145 @@ describe('DwnApi', () => { }); }); - describe('grants.fetchConnectedGrants()', () => { - it('throws if no signerDID is set', async () => { - // make sure signerDID is undefined + describe('connected.findPermissionGrantForRequest', () => { + it('caches result', async () => { + // create a grant for bob + const deviceXGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + delegated : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // simulate a connect where bobDid can impersonate aliceDid + dwnBob['connectedDid'] = aliceDid.uri; + dwnBob['delegateDid'] = bobDid.uri; + await DwnApi.processConnectedGrants({ + agent : testHarness.agent, + delegateDid : bobDid.uri, + grants : [ deviceXGrant.rawMessage ] + }); + + const fetchGrantsSpy = sinon.spy(AgentPermissionsApi.prototype, 'fetchGrants'); + + // find the grant for a request + let grantForRequest = await dwnBob['connected'].findPermissionGrantForMessage({ + messageParams: { + messageType : DwnInterface.RecordsWrite, + protocol : 'http://example.com/protocol' + } + }); + + // expect to have the grant + expect(grantForRequest).to.exist; + expect(grantForRequest.id).to.equal(deviceXGrant.id); + expect(fetchGrantsSpy.callCount).to.equal(1); + + fetchGrantsSpy.resetHistory(); + + // attempt to find the grant again + grantForRequest = await dwnBob['connected'].findPermissionGrantForMessage({ + messageParams: { + messageType : DwnInterface.RecordsWrite, + protocol : 'http://example.com/protocol' + } + }); + expect(grantForRequest).to.exist; + expect(grantForRequest.id).to.equal(deviceXGrant.id); + expect(fetchGrantsSpy.callCount).to.equal(0); + + // should call again if cached:false is passed + grantForRequest = await dwnBob['connected'].findPermissionGrantForMessage({ + messageParams: { + messageType : DwnInterface.RecordsWrite, + protocol : 'http://example.com/protocol' + }, + cached: false + }); + expect(grantForRequest).to.exist; + expect(grantForRequest.id).to.equal(deviceXGrant.id); + expect(fetchGrantsSpy.callCount).to.equal(1); + + // reset the spy + fetchGrantsSpy.resetHistory(); + expect(fetchGrantsSpy.callCount).to.equal(0); + + // call for a different grant + try { + await dwnBob['connected'].findPermissionGrantForMessage({ + messageParams: { + messageType : DwnInterface.RecordsRead, + protocol : 'http://example.com/protocol' + } + }); + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.equal('AgentDwnApi: No permissions found for RecordsRead: http://example.com/protocol'); + } + expect(fetchGrantsSpy.callCount).to.equal(1); + + // call again to ensure grants which are not found are not cached + try { + await dwnBob['connected'].findPermissionGrantForMessage({ + messageParams: { + messageType : DwnInterface.RecordsRead, + protocol : 'http://example.com/protocol' + } + }); + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.equal('AgentDwnApi: No permissions found for RecordsRead: http://example.com/protocol'); + } + + expect(fetchGrantsSpy.callCount).to.equal(2); // should have been called again + }); + + it('throws if no delegateDid is set', async () => { + // make sure delegateDid is undefined dwnAlice['delegateDid'] = undefined; try { - await dwnAlice.grants.fetchConnectedGrants(); + await dwnAlice['connected'].findPermissionGrantForMessage({ + messageParams: { + messageType : DwnInterface.RecordsWrite, + protocol : 'http://example.com/protocol' + } + }); expect.fail('Error was not thrown'); } catch (e) { - expect(e.message).to.equal('AgentDwnApi: Cannot fetch grants without a signer DID'); + expect(e.message).to.equal('AgentDwnApi: Cannot find connected grants without a signer DID'); } }); + }); + + describe('permissions.grant', () => { + it('uses the connected DID to create a grant if no delegate DID is set', async () => { + // scenario: create a permission grant for bob, confirm that alice is the signer + + // create a permission grant for bob + const deviceXGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + const author = getRecordAuthor(deviceXGrant.rawMessage); + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); // connected DID should be alice + expect(author).to.equal(aliceDid.uri); + }); + + it('uses the delegate DID to create a grant if set', async () => { + // scenario: create a permission grant for aliceDeviceX, confirm that deviceX is the signer - it('caches results', async () => { // create an identity for deviceX const aliceDeviceX = await testHarness.agent.identity.create({ store : true, @@ -1390,322 +1513,412 @@ describe('DwnApi', () => { didMethod : 'jwk' }); - // set the device identity as the signerDID + // set the delegate DID, this happens during a connect flow dwnAlice['delegateDid'] = aliceDeviceX.did.uri; - const recordsWriteGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, + // create a permission grant for deviceX + const deviceXGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - // process the grant to aliceDeviceX's DWN - const { reply: writeReplyX } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), - signAsOwner : true + const author = getRecordAuthor(deviceXGrant.rawMessage); + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); // connected DID should be alice + expect(dwnAlice['delegateDid']).to.equal(aliceDeviceX.did.uri); // delegate DID should be deviceX + expect(author).to.equal(aliceDeviceX.did.uri); + }); + + it('creates and stores a grant', async () => { + // scenario: create a grant for deviceX, confirm the grant exists + + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' }); - expect(writeReplyX.status.code).to.equal(202); - const recordsReadGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, + // create a grant for deviceX + const deviceXGrant = await dwnAlice.permissions.grant({ + store : true, grantedTo : aliceDeviceX.did.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Read, protocol: 'http://example.com/protocol' } + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - // process the grant to aliceDeviceX's DWN - const { reply: readReplyX } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsReadGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), - signAsOwner : true + // query for the grant + const fetchedGrants = await dwnAlice.records.query({ + message: { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.grantPath, + } + } }); - expect(readReplyX.status.code).to.equal(202); + // expect to have the 1 grant created for deviceX + expect(fetchedGrants.status.code).to.equal(200); + expect(fetchedGrants.records).to.exist; + expect(fetchedGrants.records!.length).to.equal(1); + expect(fetchedGrants.records![0].id).to.equal(deviceXGrant.rawMessage.recordId); + }); - // spy on processDwnRequest to ensure it is only called for the first fetch - const dwnRequestSpy = sinon.spy(testHarness.agent, 'processDwnRequest'); - const grants = await dwnAlice.grants.fetchConnectedGrants(); + it('creates a grant without storing it', async () => { + // scenario: create a grant for deviceX, confirm the grant does not exist - expect(grants).to.exist; - expect(grants.length).to.equal(2); + // create an identity for deviceX + const aliceDeviceX = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Alice Device X' }, + didMethod : 'jwk' + }); - // ensure the spy to be called three times, once for fetch and once for each revocation check - expect(dwnRequestSpy.callCount).to.equal(3); + // create a grant for deviceX store is set to false by default + const deviceXGrant = await dwnAlice.permissions.grant({ + grantedTo : aliceDeviceX.did.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); - // get the grants again to ensure they are cached - const cachedGrants = await dwnAlice.grants.fetchConnectedGrants(); + // query for the grant + let fetchedGrants = await dwnAlice.records.query({ + message: { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.grantPath, + } + } + }); - expect(cachedGrants).to.exist; - expect(cachedGrants.length).to.equal(2); + // expect to have no grants + expect(fetchedGrants.status.code).to.equal(200); + expect(fetchedGrants.records).to.exist; + expect(fetchedGrants.records!.length).to.equal(0); - // ensure the spy callCount was unchanged - expect(dwnRequestSpy.callCount).to.equal(3); + // store the grant + const processGrantReply = await deviceXGrant.store(); + expect(processGrantReply.status.code).to.equal(202); - // add a new grant to aliceDeviceX - const recordsWriteGrant2 = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol-two' } + // query for the grants again + fetchedGrants = await dwnAlice.records.query({ + message: { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.grantPath, + } + } }); - // process the grant to aliceDeviceX's DWN - const { reply: writeReplyXTwo } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant2.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsWriteGrant2.permissionGrantBytes]), - signAsOwner : true + // expect to have the 1 grant created for deviceX + expect(fetchedGrants.status.code).to.equal(200); + expect(fetchedGrants.records).to.exist; + expect(fetchedGrants.records!.length).to.equal(1); + expect(fetchedGrants.records![0].id).to.equal(deviceXGrant.rawMessage.recordId); + }); + }); + + describe('permissions.request', () => { + it('uses the connected DID to create a request if no delegate DID is set', async () => { + // scenario: create a permission request for bob, confirm the request exists + + // create a permission request for bob + const deviceXRequest = await dwnAlice.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - expect(writeReplyXTwo.status.code).to.equal(202); - // reset the spy - dwnRequestSpy.resetHistory(); - - // fetch the grants again, the cached results should be returned, and the spy should not be called - const updatedGrants = await dwnAlice.grants.fetchConnectedGrants(); - expect(updatedGrants).to.exist; - expect(updatedGrants.length).to.equal(2); // unchanged - // must not include the new grant - expect(updatedGrants.map(grant => grant.recordId)).to.not.include(recordsWriteGrant2.dataEncodedMessage.recordId); - - // ensure a dwnRequest was not made - expect(dwnRequestSpy.callCount).to.equal(0); - - // now fetch the grants with cache set to false - const updatedGrantsNoCache = await dwnAlice.grants.fetchConnectedGrants(false); - expect(updatedGrantsNoCache).to.exist; - expect(updatedGrantsNoCache.length).to.equal(3); // includes the new grant - // must include the new grant - expect(updatedGrantsNoCache.map(grant => grant.recordId)).to.include(recordsWriteGrant2.dataEncodedMessage.recordId); - - // ensure dwnRequest was called, once for the fetch and once for each revocation check - expect(dwnRequestSpy.callCount).to.equal(4); + const author = getRecordAuthor(deviceXRequest.rawMessage); + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); // connected DID should be alice + expect(author).to.equal(aliceDid.uri); }); - it('fetches grants for the signer', async () => { - // scenario: alice creates grants for recipients deviceY and deviceX - // the grantee fetches their own grants respectively + it('uses the delegate DID to create a request if set', async () => { + // scenario: create a permission request for aliceDeviceX, the signer - // create an identity for deviceX and deviceY + // create an identity for deviceX const aliceDeviceX = await testHarness.agent.identity.create({ store : true, metadata : { name: 'Alice Device X' }, didMethod : 'jwk' }); - // set the device identity as the signerDID, this normally happens when the identity is connected + // set the delegate DID dwnAlice['delegateDid'] = aliceDeviceX.did.uri; - const recordsWriteGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } + // create a permission request for deviceX + const deviceXRequest = await dwnAlice.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - // process the grant to aliceDeviceX's DWN - const { reply: writeReplyX } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), - signAsOwner : true + const author = getRecordAuthor(deviceXRequest.rawMessage); + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); // connected DID should be alice + expect(dwnAlice['delegateDid']).to.equal(aliceDeviceX.did.uri); // delegate DID should be deviceX + expect(author).to.equal(aliceDeviceX.did.uri); + }); + + it('creates a permission request and stores it', async () => { + // scenario: create a permission request confirm the request exists + + // create a permission request + const deviceXRequest = await dwnAlice.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - expect(writeReplyX.status.code).to.equal(202); + // query for the request + const fetchedRequests = await dwnAlice.records.query({ + message: { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.requestPath, + } + } + }); - const recordsReadGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Read, protocol: 'http://example.com/protocol' } + // expect to have the 1 request created + expect(fetchedRequests.status.code).to.equal(200); + expect(fetchedRequests.records).to.exist; + expect(fetchedRequests.records!.length).to.equal(1); + expect(fetchedRequests.records![0].id).to.equal(deviceXRequest.rawMessage.recordId); + }); + + it('creates a permission request without storing it', async () => { + // scenario: create a permission request confirm the request does not exist + + // create a permission request store is set to false by default + const deviceXRequest = await dwnAlice.permissions.request({ + scope: { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - // process the grant to aliceDeviceX's DWN - const { reply: readReplyX } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsReadGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), - signAsOwner : true + // query for the request + let fetchedRequests = await dwnAlice.records.query({ + message: { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.requestPath, + } + } }); - expect(readReplyX.status.code).to.equal(202); + // expect to have no requests + expect(fetchedRequests.status.code).to.equal(200); + expect(fetchedRequests.records).to.exist; + expect(fetchedRequests.records!.length).to.equal(0); - const deviceXGrantRecordIds = [ - recordsWriteGrant.dataEncodedMessage.recordId, - recordsReadGrant.dataEncodedMessage.recordId - ]; + // store the request + const storeDeviceXRequest = await deviceXRequest.store(); + expect(storeDeviceXRequest.status.code).to.equal(202); - // fetch the grants for deviceX from the app agent - const fetchedDeviceXGrants = await dwnAlice.grants.fetchConnectedGrants(); + // query for the requests again + fetchedRequests = await dwnAlice.records.query({ + message: { + filter: { + protocol : PermissionsProtocol.uri, + protocolPath : PermissionsProtocol.requestPath, + } + } + }); - // expect to have the 5 grants created for deviceX - expect(fetchedDeviceXGrants.length).to.equal(2); - expect(fetchedDeviceXGrants.map(grant => grant.recordId)).to.have.members(deviceXGrantRecordIds); + // expect to have the 1 request created for deviceX + expect(fetchedRequests.status.code).to.equal(200); + expect(fetchedRequests.records).to.exist; + expect(fetchedRequests.records!.length).to.equal(1); + expect(fetchedRequests.records![0].id).to.equal(deviceXRequest.rawMessage.recordId); }); + }); - it('should throw if the grant query returns anything other than a 200', async () => { - // setting a signerDID, otherwise fetchConnectedGrants will throw - dwnAlice['delegateDid'] = 'did:example:123'; + describe('permissions.queryRequests', () => { + it('uses the connected DID to query for permission requests if no delegate DID is set', async () => { + // scenario: query for permission requests, confirm that alice is the author of the query - // return empty array if grant query returns something other than a 200 - sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'unknown error' } } }); - try { - await dwnAlice.grants.fetchConnectedGrants(); + // create a permission request + await dwnAlice.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); - expect.fail('Expected fetchGrants to throw'); - } catch(error: any) { - expect(error.message).to.equal('AgentDwnApi: Failed to fetch grants: unknown error'); - } + // spy on the fetch requests method to confirm the author + const fetchRequestsSpy = sinon.spy(AgentPermissionsApi.prototype, 'fetchRequests'); + + // Query for requests + const deviceXRequests = await dwnAlice.permissions.queryRequests(); + expect(deviceXRequests.length).to.equal(1); + + // confirm alice is the connected DID + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); + expect(fetchRequestsSpy.callCount).to.equal(1); + expect(fetchRequestsSpy.args[0][0].author).to.equal(aliceDid.uri); }); - it('should not return revoked grants', async () => { - // create an identity for deviceX and deviceY + it('uses the delegate DID to query for permission requests if set', async () => { + // scenario: query for permission requests for aliceDeviceX, confirm that deviceX is the signer + + // create an identity for deviceX const aliceDeviceX = await testHarness.agent.identity.create({ store : true, metadata : { name: 'Alice Device X' }, didMethod : 'jwk' }); - // set the device identity as the signerDID for alice, this normally happens during a connect flow + // spy on the fetch requests method to confirm the author + const fetchRequestsSpy = sinon.spy(AgentPermissionsApi.prototype, 'fetchRequests'); + + // set the delegate DID, this happens during a connect flow dwnAlice['delegateDid'] = aliceDeviceX.did.uri; - const recordsWriteGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Write, protocol: 'http://example.com/protocol' } + // create a permission request + await dwnAlice.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - // process the grant to alice's DWN - const { reply: writeReply } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : aliceDid.uri, - target : aliceDid.uri, - dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), - }); - expect(writeReply.status.code).to.equal(202); + // Query for requests + const deviceXRequests = await dwnAlice.permissions.queryRequests(); + expect(deviceXRequests.length).to.equal(1); - // process the grant to aliceDeviceX's DWN as owner - const { reply: writeReplyX } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsWriteGrant.permissionGrantBytes]), - signAsOwner : true - }); - expect(writeReplyX.status.code).to.equal(202); + // confirm alice is the connected DID, and aliceDeviceX is the delegate DID + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); + expect(dwnAlice['delegateDid']).to.equal(aliceDeviceX.did.uri); - const recordsReadGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, - dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), - scope : { interface: DwnInterfaceName.Records, method: DwnMethodName.Read, protocol: 'http://example.com/protocol' } - }); + // confirm the author is aliceDeviceX + expect(fetchRequestsSpy.callCount).to.equal(1); + expect(fetchRequestsSpy.args[0][0].author).to.equal(aliceDeviceX.did.uri); + }); - // process the grant to alice's DWN - const { reply: readReply } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsReadGrant.recordsWrite.message, - author : aliceDid.uri, - target : aliceDid.uri, - dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), + it('should query for permission requests from the local DWN', async () => { + // bob creates two different requests and stores it + const bobRequest = await dwnBob.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-1' + } }); - expect(readReply.status.code).to.equal(202); - // process the grant to aliceDeviceX's DWN - const { reply: readReplyX } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsReadGrant.recordsWrite.message, - author : aliceDeviceX.did.uri, - target : aliceDeviceX.did.uri, - dataStream : new Blob([recordsReadGrant.permissionGrantBytes]), - signAsOwner : true + // query for the requests + const fetchedRequests = await dwnBob.permissions.queryRequests(); + expect(fetchedRequests.length).to.equal(1); + expect(fetchedRequests[0].id).to.equal(bobRequest.id); + }); + + it('should query for permission requests from the remote DWN', async () => { + // bob creates two different requests and stores it + const bobRequest = await dwnBob.permissions.request({ + scope: { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-1' + } }); - expect(readReplyX.status.code).to.equal(202); - // fetch the grants for deviceX from the app agent with cache set to false - const fetchedDeviceXGrants = await dwnAlice.grants.fetchConnectedGrants(false); + // send the request to alice's DWN + const sentToAlice = await bobRequest.send(aliceDid.uri); + expect(sentToAlice.status.code).to.equal(202); - // expect to have the 2 grants created for deviceX - expect(fetchedDeviceXGrants.length).to.equal(2); + // alice Queries the remote DWN for the requests + const fetchedRequests = await dwnAlice.permissions.queryRequests({ + from: aliceDid.uri + }); + expect(fetchedRequests.length).to.equal(1); + expect(fetchedRequests[0].id).to.equal(bobRequest.id); + }); - // revoke a grant - const writeGrant = await PermissionGrant.parse(recordsWriteGrant.dataEncodedMessage); - const recordsWriteGrantRevoke = await testHarness.agent.dwn.createRevocation({ - author : aliceDid.uri, - grant : writeGrant, + it('should filter by protocol', async () => { + // bob creates two different requests and stores it + const bobRequest1 = await dwnBob.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-1' + } }); - // process the grant to alice's DWN - const revokeReply = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : recordsWriteGrantRevoke.recordsWrite.message, - author : aliceDid.uri, - target : aliceDid.uri, - dataStream : new Blob([recordsWriteGrantRevoke.permissionRevocationBytes]), + const bobRequest2 = await dwnBob.permissions.request({ + store : true, + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-2' + } }); - expect(revokeReply.reply.status.code).to.equal(202); - // fetch the grants for deviceX from the app agent with cache set to false - const fetchedDeviceXGrantsRevoked = await dwnAlice.grants.fetchConnectedGrants(); - expect(fetchedDeviceXGrantsRevoked.length).to.equal(1); // only the read grant should be available + // query for the requests with protocol-1 + const fetchedRequests = await dwnBob.permissions.queryRequests({ + protocol: 'http://example.com/protocol-1' + }); + expect(fetchedRequests.length).to.equal(1); + expect(fetchedRequests[0].id).to.equal(bobRequest1.id); - // ensure the revoked grant is not included - expect(fetchedDeviceXGrantsRevoked.map(grant => grant.recordId)).to.not.include(recordsWriteGrant.dataEncodedMessage.recordId); + // query for the requests with protocol-2 + const fetchedRequests2 = await dwnBob.permissions.queryRequests({ + protocol: 'http://example.com/protocol-2' + }); + expect(fetchedRequests2.length).to.equal(1); + expect(fetchedRequests2[0].id).to.equal(bobRequest2.id); }); }); - describe('grants.findConnectedPermissionGrant', () => { - it('throws if no signerDID is set', async () => { - // make sure signerDID is undefined - dwnAlice['delegateDid'] = undefined; - try { - await dwnAlice.grants.findConnectedPermissionGrant({ - messageParams: { - messageType : DwnInterface.RecordsWrite, - protocol : 'http://example.com/protocol' - } - }); - expect.fail('Error was not thrown'); - } catch (e) { - expect(e.message).to.equal('AgentDwnApi: Cannot find connected grants without a signer DID'); - } - }); - }); + describe('permissions.queryGrants', () => { + it('uses the connected DID to query for grants if no delegate DID is set', async () => { + // scenario: query for grants, confirm that alice is the author of the query - describe('grants.processConnectedGrantsAsOwner', () => { - it('throws if no signerDID is set', async () => { - // make sure signerDID is undefined - dwnAlice['delegateDid'] = undefined; - try { - await dwnAlice.grants.processConnectedGrantsAsOwner([]); - expect.fail('Error was not thrown'); - } catch (e) { - expect(e.message).to.equal('AgentDwnApi: Cannot process grants without a signer DID'); - } + // spy on the fetch grants method to confirm the author + const fetchGrantsSpy = sinon.spy(AgentPermissionsApi.prototype, 'fetchGrants'); + + // Query for grants + const deviceXGrants = await dwnAlice.permissions.queryGrants(); + expect(deviceXGrants.length).to.equal(0); + + // confirm alice is the connected DID + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); + expect(fetchGrantsSpy.callCount).to.equal(1); + expect(fetchGrantsSpy.args[0][0].author).to.equal(aliceDid.uri); }); - }); - describe('grants.isGrantRevoked', () => { - it('checks if grant is revoked', async () => { - // scenario: create a grant for deviceX, check if the grant is revoked, revoke the grant, check if the grant is revoked + it('uses the delegate DID to query for grants if set', async () => { + // scenario: query for grants for aliceDeviceX, confirm that deviceX is the signer // create an identity for deviceX const aliceDeviceX = await testHarness.agent.identity.create({ @@ -1714,10 +1927,30 @@ describe('DwnApi', () => { didMethod : 'jwk' }); - // create records grants for deviceX - const deviceXGrant = await testHarness.agent.dwn.createGrant({ - grantedFrom : aliceDid.uri, - grantedTo : aliceDeviceX.did.uri, + // spy on the fetch grants method to confirm the author + const fetchGrantsSpy = sinon.spy(AgentPermissionsApi.prototype, 'fetchGrants'); + + // set the delegate DID, this happens during a connect flow + dwnAlice['delegateDid'] = aliceDeviceX.did.uri; + + // Query for grants + const deviceXGrants = await dwnAlice.permissions.queryGrants(); + expect(deviceXGrants.length).to.equal(0); + + // confirm alice is the connected DID, and aliceDeviceX is the delegate DID + expect(dwnAlice['connectedDid']).to.equal(aliceDid.uri); + expect(dwnAlice['delegateDid']).to.equal(aliceDeviceX.did.uri); + + // confirm the author is aliceDeviceX + expect(fetchGrantsSpy.callCount).to.equal(1); + expect(fetchGrantsSpy.args[0][0].author).to.equal(aliceDeviceX.did.uri); + }); + + it('should query for permission grants from the local DWN', async () => { + // alice creates a grant for bob and stores it + const bobGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { interface : DwnInterfaceName.Records, @@ -1726,59 +1959,227 @@ describe('DwnApi', () => { } }); - const { reply: processGrantReply } = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : deviceXGrant.recordsWrite.message, - author : aliceDid.uri, - target : aliceDid.uri, - dataStream : new Blob([deviceXGrant.permissionGrantBytes]), + // query for the grants + const fetchedGrants = await dwnAlice.permissions.queryGrants(); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant.id); + }); + + it('should query for permission grants from the remote DWN', async () => { + // alice creates a grant for bob and doesn't store it locally + const bobGrant = await dwnAlice.permissions.grant({ + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } }); - expect(processGrantReply.status.code).to.equal(202); - // check if the grant is revoked - let isRevoked = await dwnAlice.grants.isGrantRevoked( - aliceDid.uri, - aliceDid.uri, - deviceXGrant.recordsWrite.message.recordId - ); + // alice queries the remote DWN, should not find any grants + let fetchedGrants = await dwnAlice.permissions.queryGrants(); + expect(fetchedGrants.length).to.equal(0); - expect(isRevoked).to.equal(false); + // send the grant to alice's remote DWN + const sentToAlice = await bobGrant.send(aliceDid.uri); + expect(sentToAlice.status.code).to.equal(202); - // revoke the grant - const writeGrant = await PermissionGrant.parse(deviceXGrant.dataEncodedMessage); - const revokeGrant = await testHarness.agent.dwn.createRevocation({ - author : aliceDid.uri, - grant : writeGrant, + // alice queries the remote DWN for the grants + fetchedGrants = await dwnAlice.permissions.queryGrants({ + from: aliceDid.uri }); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant.id); + }); - const revokeReply = await testHarness.agent.dwn.processRequest({ - messageType : DwnInterface.RecordsWrite, - rawMessage : revokeGrant.recordsWrite.message, + it('should filter by protocol', async () => { + // alice creates two different grants for bob + const bobGrant1 = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-1' + } + }); + + const bobGrant2 = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol-2' + } + }); + + // query for the grants with protocol-1 + let fetchedGrants = await dwnAlice.permissions.queryGrants({ + protocol: 'http://example.com/protocol-1' + }); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant1.id); + + // query for the grants with protocol-2 + fetchedGrants = await dwnAlice.permissions.queryGrants({ + protocol: 'http://example.com/protocol-2' + }); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant2.id); + }); + + it('should filter by grantee', async () => { + const { did: carolDid } = await testHarness.agent.identity.create({ + store : false, + metadata : { name: 'Carol' }, + didMethod : 'jwk' + }); + + // alice creates a grant for bob and stores it + const bobGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // alice creates a grant for carol and stores it + const carolGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : carolDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + // query for the grants with bob as the grantee + let fetchedGrants = await dwnAlice.permissions.queryGrants({ + grantee: bobDid.uri + }); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant.id); + + // query for the grants with carol as the grantee + fetchedGrants = await dwnAlice.permissions.queryGrants({ + grantee: carolDid.uri + }); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(carolGrant.id); + }); + + it('should filter by grantor', async () => { + const { did: carolDid } = await testHarness.agent.identity.create({ + store : true, + metadata : { name: 'Carol' }, + didMethod : 'jwk' + }); + + // alice creates a grant for bob + const { message: messageGrantFromAlice } = await testHarness.agent.permissions.createGrant({ + store : false, author : aliceDid.uri, - target : aliceDid.uri, - dataStream : new Blob([revokeGrant.permissionRevocationBytes]), - }); - expect(revokeReply.reply.status.code).to.equal(202); - - // check if the grant is revoked again, should be true - isRevoked = await dwnAlice.grants.isGrantRevoked( - aliceDid.uri, - aliceDid.uri, - deviceXGrant.recordsWrite.message.recordId - ); - expect(isRevoked).to.equal(true); + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + const grantFromAlice = await PermissionGrant.parse({ + agent : testHarness.agent, + connectedDid : bobDid.uri, + message : messageGrantFromAlice + }); + + // import the grant + const importFromAlice = await grantFromAlice.import(true); + expect(importFromAlice.status.code).to.equal(202); + + // carol creates a grant for bob + const { message: messageGrantFromCarol } = await testHarness.agent.permissions.createGrant({ + store : false, + author : carolDid.uri, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); + + const grantFromCarol = await PermissionGrant.parse({ + agent : testHarness.agent, + connectedDid : bobDid.uri, + message : messageGrantFromCarol + }); + + const importGrantCarol = await grantFromCarol.import(true); + expect(importGrantCarol.status.code).to.equal(202); + + // query for the grants with alice as the grantor + const fetchedGrantsAlice = await dwnBob.permissions.queryGrants({ + grantor: aliceDid.uri + }); + expect(fetchedGrantsAlice.length).to.equal(1); + expect(fetchedGrantsAlice[0].id).to.equal(grantFromAlice.id); + + // query for the grants with carol as the grantor + const fetchedGrantsCarol = await dwnBob.permissions.queryGrants({ + grantor: carolDid.uri + }); + expect(fetchedGrantsCarol.length).to.equal(1); + expect(fetchedGrantsCarol[0].id).to.equal(grantFromCarol.id); }); - it('throws if grant revocation query returns anything other than a 200 or 404', async () => { - // return empty array if grant query returns something other than a 200 - sinon.stub(testHarness.agent, 'processDwnRequest').resolves({ messageCid: '', reply: { status: { code: 400, detail: 'unknown error' } } }); + it('should check revocation status if option is set', async () => { + // alice creates a grant for bob and stores it + const bobGrant = await dwnAlice.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : 'http://example.com/protocol' + } + }); - try { - await dwnAlice.grants.isGrantRevoked(aliceDid.uri, aliceDid.uri, 'some-record-id'); - expect.fail('Expected isGrantRevoked to throw'); - } catch (error:any) { - expect(error.message).to.equal('AgentDwnApi: Failed to check if grant is revoked: unknown error'); - } + // query for the grants + let fetchedGrants = await dwnAlice.permissions.queryGrants({ + checkRevoked: true + }); + + // expect to have the 1 grant created + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant.id); + + // stub the isRevoked method to return true + sinon.stub(AgentPermissionsApi.prototype, 'isGrantRevoked').resolves(true); + + // query for the grants + fetchedGrants = await dwnAlice.permissions.queryGrants({ + checkRevoked: true + }); + expect(fetchedGrants.length).to.equal(0); + + // return without checking revoked status + fetchedGrants = await dwnAlice.permissions.queryGrants(); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].id).to.equal(bobGrant.id); }); }); }); \ No newline at end of file diff --git a/packages/api/tests/permission-grant.spec.ts b/packages/api/tests/permission-grant.spec.ts new file mode 100644 index 000000000..77c131923 --- /dev/null +++ b/packages/api/tests/permission-grant.spec.ts @@ -0,0 +1,460 @@ +import type { BearerDid } from '@web5/dids'; + +import sinon from 'sinon'; +import { expect } from 'chai'; +import { Web5UserAgent } from '@web5/user-agent'; +import { testDwnUrl } from './utils/test-config.js'; + +// NOTE: @noble/secp256k1 requires globalThis.crypto polyfill for node.js <=18: https://github.com/paulmillr/noble-secp256k1/blob/main/README.md#usage +// Remove when we move off of node.js v18 to v20, earliest possible time would be Oct 2023: https://github.com/nodejs/release#release-schedule +import { webcrypto } from 'node:crypto'; +import { PlatformAgentTestHarness } from '@web5/agent'; +import { DwnInterfaceName, DwnMethodName, Time } from '@tbd54566975/dwn-sdk-js'; +import { PermissionGrant } from '../src/permission-grant.js'; +import { DwnApi } from '../src/dwn-api.js'; +// @ts-ignore +if (!globalThis.crypto) globalThis.crypto = webcrypto; + +let testDwnUrls: string[] = [testDwnUrl]; + +describe('PermissionGrant', () => { + let aliceDid: BearerDid; + let bobDid: BearerDid; + let aliceDwn: DwnApi; + let bobDwn: DwnApi; + let testHarness: PlatformAgentTestHarness; + + before(async () => { + testHarness = await PlatformAgentTestHarness.setup({ + agentClass : Web5UserAgent, + agentStores : 'memory' + }); + + }); + + beforeEach(async () => { + sinon.restore(); + await testHarness.clearStorage(); + await testHarness.createAgentDid(); + + // Create an "alice" Identity to author the DWN messages. + const alice = await testHarness.createIdentity({ name: 'Alice', testDwnUrls }); + await testHarness.agent.identity.manage({ portableIdentity: await alice.export() }); + aliceDid = alice.did; + + // Create a "bob" Identity to author the DWN messages. + const bob = await testHarness.createIdentity({ name: 'Bob', testDwnUrls }); + await testHarness.agent.identity.manage({ portableIdentity: await bob.export() }); + bobDid = bob.did; + + aliceDwn = new DwnApi({ agent: testHarness.agent, connectedDid: aliceDid.uri }); + bobDwn = new DwnApi({ agent: testHarness.agent, connectedDid: bobDid.uri }); + }); + + after(async () => { + sinon.restore(); + await testHarness.clearStorage(); + await testHarness.closeStorage(); + }); + + describe('parse()',() => { + it('parses a grant message', async () => { + const { grant, message } = await testHarness.agent.permissions.createGrant({ + store : false, + author : aliceDid.uri, + grantedTo : bobDid.uri, + requestId : '123', + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + description : 'This is a grant', + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + const parsedGrant = await PermissionGrant.parse({ + agent : testHarness.agent, + connectedDid : bobDid.uri, + message, + }); + + expect(parsedGrant.toJSON()).to.deep.equal(grant); + expect(parsedGrant.rawMessage).to.deep.equal(message); + expect(parsedGrant.id).to.equal(grant.id); + expect(parsedGrant.grantor).to.equal(grant.grantor); + expect(parsedGrant.grantee).to.equal(grant.grantee); + expect(parsedGrant.scope).to.deep.equal(grant.scope); + expect(parsedGrant.conditions).to.deep.equal(grant.conditions); + expect(parsedGrant.requestId).to.equal(grant.requestId); + expect(parsedGrant.dateGranted).to.equal(grant.dateGranted); + expect(parsedGrant.dateExpires).to.equal(grant.dateExpires); + expect(parsedGrant.description).to.equal(grant.description); + expect(parsedGrant.delegated).to.equal(grant.delegated); + }); + + //TODO: this should happen in the `dwn-sdk-js` helper + xit('throws for an invalid grant'); + }); + + describe('send()', () => { + it('sends to connectedDID target by default', async () => { + // Create a grant message. + const grant = await aliceDwn.permissions.grant({ + store : false, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + // query the remote for the grant + let fetchedRemote = await aliceDwn.permissions.queryGrants({ + from: aliceDid.uri, + }); + expect(fetchedRemote.length).to.equal(0); + + // send the grant + const sent = await grant.send(); + expect(sent.status.code).to.equal(202); + + // query the remote for the grant, should now exist + fetchedRemote = await aliceDwn.permissions.queryGrants({ + from: aliceDid.uri, + }); + expect(fetchedRemote.length).to.equal(1); + }); + + it('sends to a remote target', async () => { + // Alice creates a grant for Bob + const grant = await aliceDwn.permissions.grant({ + store : false, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + // alice sends it to her own DWN + const aliceSent = await grant.send(); + expect(aliceSent.status.code).to.equal(202); + + // bob queries alice's remote for a grant + const fetchedFromAlice = await bobDwn.permissions.queryGrants({ + from: aliceDid.uri, + }); + expect(fetchedFromAlice.length).to.equal(1); + + // fetch from bob's remote. should have no grants + let fetchedRemote = await bobDwn.permissions.queryGrants({ + from: bobDid.uri, + }); + expect(fetchedRemote.length).to.equal(0); + + // fetchedGrant + const fetchedGrant = fetchedFromAlice[0]; + + // import the grant (signing as owner), but do not store it + const imported = await fetchedGrant.import(false); + expect(imported.status.code).to.equal(202); + + // send the grant to bob's remote + const sent = await fetchedGrant.send(bobDid.uri); + expect(sent.status.code).to.equal(202); + // // send the gran + // the grant should now exist in bob's remote + fetchedRemote = await bobDwn.permissions.queryGrants({ + from: bobDid.uri, + }); + expect(fetchedRemote.length).to.equal(1); + expect(fetchedRemote[0].toJSON()).to.deep.equal(grant.toJSON()); + }); + }); + + describe('store()', () => { + it('stores the grant as is', async () => { + // create a grant not marked as stored + const grant = await aliceDwn.permissions.grant({ + store : false, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + // validate the grant does not exist in the DWN + let fetchedGrants = await aliceDwn.permissions.queryGrants(); + expect(fetchedGrants.length).to.equal(0); + + // store the grant + const stored = await grant.store(); + expect(stored.status.code).to.equal(202); + + // validate the grant now exists in the DWN + fetchedGrants = await aliceDwn.permissions.queryGrants(); + expect(fetchedGrants.length).to.equal(1); + expect(fetchedGrants[0].toJSON()).to.deep.equal(grant.toJSON()); + }); + + it('stores the grant and imports it', async () => { + // alice creates a grant and sends it to her remote + const grant = await aliceDwn.permissions.grant({ + store : false, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + const sent = await grant.send(); + expect(sent.status.code).to.equal(202); + + // bob queries alice's remote for a grant + let fetchedFromAlice = await bobDwn.permissions.queryGrants({ + from: aliceDid.uri, + }); + expect(fetchedFromAlice.length).to.equal(1); + + // attempt to store it without importing, should fail + let fetchedGrant = fetchedFromAlice[0]; + let stored = await fetchedGrant.store(); + expect(stored.status.code).to.equal(401); + + // attempt to fetch from local to ensure it was not imported + let fetchedLocal = await bobDwn.permissions.queryGrants(); + expect(fetchedLocal.length).to.equal(0); + + // store the grant and import it + stored = await fetchedGrant.store(true); + expect(stored.status.code).to.equal(202); + + // fetch from local to ensure it was imported + fetchedLocal = await bobDwn.permissions.queryGrants(); + expect(fetchedLocal.length).to.equal(1); + expect(fetchedLocal[0].toJSON()).to.deep.equal(fetchedGrant.toJSON()); + }); + }); + + describe('import()', () => { + it('imports the grant without storing it', async () => { + // alice creates a grant and sends it to her remote + const grant = await aliceDwn.permissions.grant({ + store : false, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + const sent = await grant.send(); + expect(sent.status.code).to.equal(202); + + // bob queries alice's remote for a grant + let fetchedFromAlice = await bobDwn.permissions.queryGrants({ + from: aliceDid.uri, + }); + expect(fetchedFromAlice.length).to.equal(1); + const fetchedGrant = fetchedFromAlice[0]; + + // confirm the grant does not yet exist in bob's remote + let fetchedRemote = await bobDwn.permissions.queryGrants({ + from: bobDid.uri, + }); + expect(fetchedRemote.length).to.equal(0); + + // attempt to send it to bob's remote without importing it first + let sentToBob = await fetchedGrant.send(bobDid.uri); + expect(sentToBob.status.code).to.equal(401); + + // import the grant without storing it + let imported = await fetchedGrant.import(false); + expect(imported.status.code).to.equal(202); + + // fetch from local to ensure it was not stored + const fetchedLocal = await bobDwn.permissions.queryGrants(); + expect(fetchedLocal.length).to.equal(0); + + // send the grant to bob's remote + sentToBob = await fetchedGrant.send(bobDid.uri); + expect(sentToBob.status.code).to.equal(202); + + // fetch from bob's remote to ensure it was imported + fetchedRemote = await bobDwn.permissions.queryGrants({ + from: bobDid.uri, + }); + expect(fetchedRemote.length).to.equal(1); + expect(fetchedRemote[0].toJSON()).to.deep.equal(fetchedGrant.toJSON()); + }); + + it('imports the grant and stores it', async () => { + // alice creates a grant and sends it to her remote + const grant = await aliceDwn.permissions.grant({ + store : false, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + const sent = await grant.send(); + expect(sent.status.code).to.equal(202); + + // bob queries alice's remote for a grant + let fetchedFromAlice = await bobDwn.permissions.queryGrants({ + from: aliceDid.uri, + }); + expect(fetchedFromAlice.length).to.equal(1); + const fetchedGrant = fetchedFromAlice[0]; + + // confirm the grant does not yet exist in bob's remote + let fetchedRemote = await bobDwn.permissions.queryGrants({ + from: bobDid.uri, + }); + expect(fetchedRemote.length).to.equal(0); + + // import the grant and store it + let imported = await fetchedGrant.import(true); + expect(imported.status.code).to.equal(202); + + // fetch from local to ensure it was stored + const fetchedLocal = await bobDwn.permissions.queryGrants(); + expect(fetchedLocal.length).to.equal(1); + expect(fetchedLocal[0].toJSON()).to.deep.equal(fetchedGrant.toJSON()); + }); + }); + + describe('toJSON()', () => { + it('returns the grant as a PermissionsGrant JSON object', async () => { + const { grant, message } = await testHarness.agent.permissions.createGrant({ + store : false, + author : aliceDid.uri, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + const parsedGrant = await PermissionGrant.parse({ + agent : testHarness.agent, + connectedDid : bobDid.uri, + message, + }); + + expect(parsedGrant.toJSON()).to.deep.equal(grant); + }); + }); + + describe('revoke()', () => { + it('revokes the grant, stores it by default', async () => { + // create a grant + const grant = await aliceDwn.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + let isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(false); + + // revoke the grant, stores it by default + const revocation = await grant.revoke(); + expect(revocation.author).to.equal(aliceDid.uri); + + isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(true); + }); + + it('revokes the grant, does not store it', async () => { + // create a grant + const grant = await aliceDwn.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + let isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(false); + + // revoke the grant but do not store it + const revocation = await grant.revoke(false); + expect(revocation.author).to.equal(aliceDid.uri); + + // is still false + isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(false); + + // store the revocation + await revocation.store(); + + // is now true + isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(true); + }); + + it('sends the revocation to a remote target', async () => { + // create a grant + const grant = await aliceDwn.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + // send the grant to alice's remote + const sentGrant = await grant.send(); + expect(sentGrant.status.code).to.equal(202); + + // revoke the grant but do not store it + const revocation = await grant.revoke(false); + const sendToAliceRevoke = await revocation.send(aliceDid.uri); + expect(sendToAliceRevoke.status.code).to.equal(202); + + // should not return revoked since it was not stored locally + let isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(false); + + // check the revocation status of the grant on alice's remote node + isRevoked = await grant.isRevoked(true); + expect(isRevoked).to.equal(true); + }); + }); + + describe('isRevoked()', () => { + it('checks revocation status of local DWN', async () => { + // create a grant + const grant = await aliceDwn.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + let isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(false); + + // revoke the grant + const revocation = await grant.revoke(); + expect(revocation.author).to.equal(aliceDid.uri); + + isRevoked = await grant.isRevoked(); + expect(isRevoked).to.equal(true); + }); + + it('checks revocation status of remote DWN', async () => { + // create a grant + const grant = await aliceDwn.permissions.grant({ + store : true, + grantedTo : bobDid.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + // send the grant to alice's remote + const sentGrant = await grant.send(); + expect(sentGrant.status.code).to.equal(202); + + // revoke the grant but do not store it locally + const revocation = await grant.revoke(false); + expect(revocation.author).to.equal(aliceDid.uri); + + // check the revocation status on alice's remote node first + let isRevoked = await grant.isRevoked(true); + expect(isRevoked).to.equal(false); + + // send the revocation to alice's remote + const sentRevocation = await revocation.send(); + expect(sentRevocation.status.code).to.equal(202); + + // check the revocation status of the grant on alice's remote node + isRevoked = await grant.isRevoked(true); + expect(isRevoked).to.equal(true); + }); + }); +}); \ No newline at end of file diff --git a/packages/api/tests/permission-request.spec.ts b/packages/api/tests/permission-request.spec.ts new file mode 100644 index 000000000..e98d0c487 --- /dev/null +++ b/packages/api/tests/permission-request.spec.ts @@ -0,0 +1,260 @@ +import sinon from 'sinon'; +import { expect } from 'chai'; + +import { testDwnUrl } from './utils/test-config.js'; + +import { BearerDid } from '@web5/dids'; +import { DwnApi } from '../src/dwn-api.js'; +import { PlatformAgentTestHarness } from '@web5/agent'; +import { Web5UserAgent } from '@web5/user-agent'; +import { DwnInterfaceName, DwnMethodName, Time } from '@tbd54566975/dwn-sdk-js'; +import { PermissionRequest } from '../src/permission-request.js'; + +const testDwnUrls = [testDwnUrl]; + +describe('PermissionRequest', () => { + let aliceDid: BearerDid; + let bobDid: BearerDid; + let aliceDwn: DwnApi; + let bobDwn: DwnApi; + let testHarness: PlatformAgentTestHarness; + + before(async () => { + testHarness = await PlatformAgentTestHarness.setup({ + agentClass : Web5UserAgent, + agentStores : 'memory' + }); + + }); + + beforeEach(async () => { + sinon.restore(); + await testHarness.clearStorage(); + await testHarness.createAgentDid(); + + // Create an "alice" Identity to author the DWN messages. + const alice = await testHarness.createIdentity({ name: 'Alice', testDwnUrls }); + await testHarness.agent.identity.manage({ portableIdentity: await alice.export() }); + aliceDid = alice.did; + + // Create a "bob" Identity to author the DWN messages. + const bob = await testHarness.createIdentity({ name: 'Bob', testDwnUrls }); + await testHarness.agent.identity.manage({ portableIdentity: await bob.export() }); + bobDid = bob.did; + + aliceDwn = new DwnApi({ agent: testHarness.agent, connectedDid: aliceDid.uri }); + bobDwn = new DwnApi({ agent: testHarness.agent, connectedDid: bobDid.uri }); + }); + + after(async () => { + sinon.restore(); + await testHarness.clearStorage(); + await testHarness.closeStorage(); + }); + + describe('parse()', () => { + it('should parse a grant request message', async () => { + const { request, message } = await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Read + } + }); + + const parsedRequest = await PermissionRequest.parse({ + agent : testHarness.agent, + connectedDid : bobDid.uri, + message + }); + + expect(parsedRequest.toJSON()).to.deep.equal(request); + expect(parsedRequest.rawMessage).to.deep.equal(message); + expect(parsedRequest.id).to.equal(request.id); + expect(parsedRequest.requester).to.equal(request.requester); + expect(parsedRequest.description).to.equal(request.description); + expect(parsedRequest.delegated).to.equal(request.delegated); + expect(parsedRequest.scope).to.deep.equal(request.scope); + expect(parsedRequest.conditions).to.deep.equal(request.conditions); + }); + + //TODO: this should happen in the `dwn-sdk-js` helper + xit('throws for an invalid request'); + }); + + describe('send()', () => { + it('should send a grant request to connectedDID by default', async () => { + const grantRequest = await aliceDwn.permissions.request({ + store : false, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Read + } + }); + + // confirm the request is not present on the remote + let requests = await aliceDwn.permissions.queryRequests({ + from: aliceDid.uri + }); + expect(requests).to.have.length(0); + + const sendReply = await grantRequest.send(); + expect(sendReply.status.code).to.equal(202); + + // fetch the requests from the remote + requests = await aliceDwn.permissions.queryRequests({ + from: aliceDid.uri + }); + + expect(requests).to.have.length(1); + expect(requests[0].id).to.deep.equal(grantRequest.id); + }); + + it('sends a grant request to a remote target', async () => { + const grantRequest = await aliceDwn.permissions.request({ + store : false, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Read + } + }); + + // confirm the request is not present on the remote + let remoteRequestsBob = await bobDwn.permissions.queryRequests({ + from: bobDid.uri + }); + expect(remoteRequestsBob).to.have.length(0); + + // send from alice to bob's remote DWN + const sendReply = await grantRequest.send(bobDid.uri); + expect(sendReply.status.code).to.equal(202); + + // fetch the requests from the remote + remoteRequestsBob = await bobDwn.permissions.queryRequests({ + from: bobDid.uri + }); + expect(remoteRequestsBob).to.have.length(1); + expect(remoteRequestsBob[0].id).to.deep.equal(grantRequest.id); + }); + }); + + describe('store()', () => { + it('stores the request', async () => { + // create a grant not marked as stored + const request = await aliceDwn.permissions.request({ + store : false, + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + // validate the grant does not exist in the DWN + let fetchedRequests = await bobDwn.permissions.queryRequests({ + from: bobDid.uri, + }); + expect(fetchedRequests.length).to.equal(0); + + const sentToBob = await request.send(bobDid.uri); + expect(sentToBob.status.code).to.equal(202); + + // Bob fetches requests + fetchedRequests = await bobDwn.permissions.queryRequests({ + from: bobDid.uri, + }); + expect(fetchedRequests.length).to.equal(1); + + let localRequests = await bobDwn.permissions.queryRequests(); + expect(localRequests.length).to.equal(0); + + const remoteGrant = fetchedRequests[0]; + + // store the grant + const stored = await remoteGrant.store(); + expect(stored.status.code).to.equal(202); + + // validate the grant now exists in the DWN + localRequests = await bobDwn.permissions.queryRequests(); + expect(localRequests.length).to.equal(1); + expect(localRequests[0].toJSON()).to.deep.equal(request.toJSON()); + }); + }); + + describe('grant()', () => { + it('should create a grant and store it by default', async () => { + const requestFromBob = await bobDwn.permissions.request({ + store : false, + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + const sentToAlice = await requestFromBob.send(aliceDid.uri); + expect(sentToAlice.status.code).to.equal(202); + + // Alice fetches requests + let requests = await aliceDwn.permissions.queryRequests({ + from: aliceDid.uri + }); + expect(requests.length).to.equal(1); + + // confirm no grants exist + let grants = await aliceDwn.permissions.queryGrants(); + expect(grants.length).to.equal(0); + + // Alice grants the request and it will be stored by default + const dateExpires = Time.createOffsetTimestamp({ seconds: 60 }); + const grant = await requests[0].grant(dateExpires); + expect(grant).to.exist; + + // confirm the grant exists + grants = await aliceDwn.permissions.queryGrants(); + expect(grants.length).to.equal(1); + expect(grants[0].id).to.equal(grant.id); + }); + + it('does not store the grant if store is false', async () => { + const requestFromBob = await bobDwn.permissions.request({ + store : false, + scope : { interface: DwnInterfaceName.Messages, method: DwnMethodName.Read } + }); + + const sentToAlice = await requestFromBob.send(aliceDid.uri); + expect(sentToAlice.status.code).to.equal(202); + + // Alice fetches requests + let requests = await aliceDwn.permissions.queryRequests({ + from: aliceDid.uri + }); + expect(requests.length).to.equal(1); + + // confirm no grants exist + let grants = await aliceDwn.permissions.queryGrants(); + expect(grants.length).to.equal(0); + + // Alice grants the request but does not store it + const dateExpires = Time.createOffsetTimestamp({ seconds: 60 }); + const grant = await requests[0].grant(dateExpires, false); + expect(grant).to.exist; + + // confirm the grant does not exist + grants = await aliceDwn.permissions.queryGrants(); + expect(grants.length).to.equal(0); + }); + }); + + describe('toJSON()', () => { + it('should return the PermissionRequest as a JSON object', async () => { + const { request, message } = await testHarness.agent.permissions.createRequest({ + author : aliceDid.uri, + scope : { + interface : DwnInterfaceName.Messages, + method : DwnMethodName.Read + } + }); + + const grantRequest = await PermissionRequest.parse({ + agent : testHarness.agent, + connectedDid : bobDid.uri, + message + }); + + expect(grantRequest.toJSON()).to.deep.equal(request); + }); + }); +}); \ No newline at end of file diff --git a/packages/api/tests/web5.spec.ts b/packages/api/tests/web5.spec.ts index c7c143d86..b91429095 100644 --- a/packages/api/tests/web5.spec.ts +++ b/packages/api/tests/web5.spec.ts @@ -16,6 +16,7 @@ import { Web5 } from '../src/web5.js'; import { DwnInterfaceName, DwnMethodName, Jws, Time } from '@tbd54566975/dwn-sdk-js'; import { testDwnUrl } from './utils/test-config.js'; import { DidJwk } from '@web5/dids'; +import { DwnApi } from '../src/dwn-api.js'; describe('web5 api', () => { describe('using Test Harness', () => { @@ -96,9 +97,9 @@ describe('web5 api', () => { }); // create grants for the app to use - const writeGrant = await testHarness.agent.dwn.createGrant({ + const writeGrant = await testHarness.agent.permissions.createGrant({ delegated : true, - grantedFrom : alice.did.uri, + author : alice.did.uri, grantedTo : app.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { @@ -108,9 +109,9 @@ describe('web5 api', () => { } }); - const readGrant = await testHarness.agent.dwn.createGrant({ + const readGrant = await testHarness.agent.permissions.createGrant({ delegated : true, - grantedFrom : alice.did.uri, + author : alice.did.uri, grantedTo : app.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { @@ -120,28 +121,9 @@ describe('web5 api', () => { } }); - // write the grants to wallet - const { reply: writeGrantReply } = await testHarness.agent.dwn.processRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : writeGrant.recordsWrite.message, - dataStream : new Blob([ writeGrant.permissionGrantBytes ]) - }); - expect(writeGrantReply.status.code).to.equal(202); - - const { reply: readGrantReply } = await testHarness.agent.dwn.processRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : readGrant.recordsWrite.message, - dataStream : new Blob([ readGrant.permissionGrantBytes ]) - }); - expect(readGrantReply.status.code).to.equal(202); - // stub the walletInit method of the Connect placeholder class sinon.stub(WalletConnect, 'initClient').resolves({ - delegateGrants : [ writeGrant.dataEncodedMessage, readGrant.dataEncodedMessage ], + delegateGrants : [ writeGrant.message, readGrant.message ], delegateDid : await app.export(), connectedDid : alice.did.uri }); @@ -182,24 +164,6 @@ describe('web5 api', () => { }); expect(localProtocolReply.status.code).to.equal(202); - const { reply: grantWriteLocalReply } = await web5.agent.processDwnRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : writeGrant.recordsWrite.message, - dataStream : new Blob([ writeGrant.permissionGrantBytes ]) - }); - expect(grantWriteLocalReply.status.code).to.equal(202); - - const { reply: grantReadLocalReply } = await web5.agent.processDwnRequest({ - author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : readGrant.recordsWrite.message, - dataStream : new Blob([ readGrant.permissionGrantBytes ]) - }); - expect(grantReadLocalReply.status.code).to.equal(202); - // use the grant to write a record const writeResult = await web5.dwn.records.write({ data : 'Hello, world!', @@ -256,9 +220,9 @@ describe('web5 api', () => { } // grant query and delete permissions - const queryGrant = await testHarness.agent.dwn.createGrant({ + const queryGrant = await testHarness.agent.permissions.createGrant({ + author : alice.did.uri, delegated : true, - grantedFrom : alice.did.uri, grantedTo : app.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { @@ -268,9 +232,9 @@ describe('web5 api', () => { } }); - const deleteGrant = await testHarness.agent.dwn.createGrant({ + const deleteGrant = await testHarness.agent.permissions.createGrant({ + author : alice.did.uri, delegated : true, - grantedFrom : alice.did.uri, grantedTo : app.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { @@ -282,7 +246,11 @@ describe('web5 api', () => { // write the grants to app as owner // this also clears the grants cache - await web5.dwn.grants.processConnectedGrantsAsOwner([ queryGrant.dataEncodedMessage, deleteGrant.dataEncodedMessage ]); + await DwnApi.processConnectedGrants({ + grants : [ queryGrant.message, deleteGrant.message ], + agent : appTestHarness.agent, + delegateDid : app.uri, + }); // attempt to delete using the grant const deleteResult = await web5.dwn.records.delete({ @@ -350,9 +318,9 @@ describe('web5 api', () => { }); // create grants for the app to use - const writeGrant = await testHarness.agent.dwn.createGrant({ + const writeGrant = await testHarness.agent.permissions.createGrant({ delegated : true, - grantedFrom : alice.did.uri, + author : alice.did.uri, grantedTo : app.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { @@ -362,9 +330,9 @@ describe('web5 api', () => { } }); - const readGrant = await testHarness.agent.dwn.createGrant({ + const readGrant = await testHarness.agent.permissions.createGrant({ delegated : true, - grantedFrom : alice.did.uri, + author : alice.did.uri, grantedTo : app.uri, dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), scope : { @@ -374,28 +342,365 @@ describe('web5 api', () => { } }); - // write the grants to wallet - const { reply: writeGrantReply } = await testHarness.agent.dwn.processRequest({ + // stub the walletInit method of the Connect placeholder class + sinon.stub(WalletConnect, 'initClient').resolves({ + delegateGrants : [ writeGrant.message, readGrant.message ], + delegateDid : await app.export(), + connectedDid : alice.did.uri + }); + + const appTestHarness = await PlatformAgentTestHarness.setup({ + agentClass : Web5UserAgent, + agentStores : 'memory', + testDataLocation : '__TESTDATA__/web5-connect-app' + }); + await appTestHarness.clearStorage(); + await appTestHarness.createAgentDid(); + + + // stub processDwnRequest to return a non 202 error code + sinon.stub(appTestHarness.agent, 'processDwnRequest').resolves({ + messageCid : '', + reply : { status: { code: 400, detail: 'Bad Request' } } + }); + + // stub the create method of the Web5UserAgent to use the test harness agent + sinon.stub(Web5UserAgent, 'create').resolves(appTestHarness.agent as Web5UserAgent); + + try { + // connect to the app, the options don't matter because we're stubbing the initClient method + await Web5.connect({ + walletConnectOptions: { + connectServerUrl : 'https://connect.example.com', + walletUri : 'https://wallet.example.com', + validatePin : async () => { return '1234'; }, + onWalletUriReady : (_walletUri: string) => {}, + permissionRequests : [] + } + }); + + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.equal('Failed to connect to wallet: AgentDwnApi: Failed to process connected grant: Bad Request'); + } + + // check that the Identity was deleted + const appDid = await appTestHarness.agent.identity.list(); + expect(appDid).to.have.lengthOf(0); + + // close the app test harness storage + await appTestHarness.clearStorage(); + await appTestHarness.closeStorage(); + }); + + it('logs an error if there is a failure during cleanup of Identity information, but does not throw', async () => { + // create a DID that is not stored in the agent + const did = await DidJwk.create(); + const identity = new BearerIdentity({ + did, + metadata: { + name : 'Test', + uri : did.uri, + tenant : did.uri + } + }); + + // stub console.error to avoid logging errors into the test output, use as spy to check if the error message is logged + const consoleSpy = sinon.stub(console, 'error').returns(); + + // call identityCleanup on a did that does not exist + await Web5['cleanUpIdentity']({ userAgent: testHarness.agent as Web5UserAgent, identity }); + + expect(consoleSpy.calledTwice, 'console.error called twice').to.be.true; + }); + + it('uses walletConnectOptions to connect to a DID and import the grants', async () => { + // Create a new Identity. + const alice = await testHarness.createIdentity({ + name : 'Alice', + testDwnUrls : [testDwnUrl] + }); + + // alice installs a protocol definition + const protocol: DwnProtocolDefinition = { + protocol : 'https://example.com/test-protocol', + published : true, + types : { + foo : {}, + bar : {} + }, + structure: { + foo: { + bar: {} + } + } + }; + + const { reply: protocolConfigReply, message: protocolConfigureMessage } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.ProtocolsConfigure, + messageParams : { + definition: protocol, + }, + }); + expect(protocolConfigReply.status.code).to.equal(202); + + // create an identity for the app to use + const app = await testHarness.agent.did.create({ + store : false, + method : 'jwk', + }); + + // create grants for the app to use + const writeGrant = await testHarness.agent.permissions.createGrant({ + delegated : true, author : alice.did.uri, - target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : writeGrant.recordsWrite.message, - dataStream : new Blob([ writeGrant.permissionGrantBytes ]) + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : protocol.protocol, + } }); - expect(writeGrantReply.status.code).to.equal(202); - const { reply: readGrantReply } = await testHarness.agent.dwn.processRequest({ + const readGrant = await testHarness.agent.permissions.createGrant({ + delegated : true, + author : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Read, + protocol : protocol.protocol, + } + }); + + // stub the walletInit method + sinon.stub(WalletConnect, 'initClient').resolves({ + delegateGrants : [ writeGrant.message, readGrant.message ], + delegateDid : await app.export(), + connectedDid : alice.did.uri + }); + + const appTestHarness = await PlatformAgentTestHarness.setup({ + agentClass : Web5UserAgent, + agentStores : 'memory', + testDataLocation : '__TESTDATA__/web5-connect-app' + }); + await appTestHarness.clearStorage(); + await appTestHarness.createAgentDid(); + + // stub the create method of the Web5UserAgent to use the test harness agent + sinon.stub(Web5UserAgent, 'create').resolves(appTestHarness.agent as Web5UserAgent); + + // connect to the app, the options don't matter because we're stubbing the initClient method + const { web5, did, delegateDid } = await Web5.connect({ + walletConnectOptions: { + connectServerUrl : 'https://connect.example.com', + walletUri : 'https://wallet.example.com', + validatePin : async () => { return '1234'; }, + onWalletUriReady : (_walletUri: string) => {}, + permissionRequests : [], + } + }); + expect(web5).to.exist; + expect(did).to.exist; + expect(delegateDid).to.exist; + expect(did).to.equal(alice.did.uri); + expect(delegateDid).to.equal(app.uri); + + // in lieu of sync, we will process the grants and protocol definition on the local connected agent + const { reply: localProtocolReply } = await web5.agent.processDwnRequest({ author : alice.did.uri, target : alice.did.uri, - messageType : DwnInterface.RecordsWrite, - rawMessage : readGrant.recordsWrite.message, - dataStream : new Blob([ readGrant.permissionGrantBytes ]) + messageType : DwnInterface.ProtocolsConfigure, + rawMessage : protocolConfigureMessage, + }); + expect(localProtocolReply.status.code).to.equal(202); + + // use the grant to write a record + const writeResult = await web5.dwn.records.write({ + data : 'Hello, world!', + message : { + protocol : protocol.protocol, + protocolPath : 'foo', + } + }); + expect(writeResult.status.code).to.equal(202); + expect(writeResult.record).to.exist; + // test that the logical author is the connected DID and the signer is the impersonator DID + expect(writeResult.record.author).to.equal(did); + const writeSigner = Jws.getSignerDid(writeResult.record.authorization.signature.signatures[0]); + expect(writeSigner).to.equal(delegateDid); + + const readResult = await web5.dwn.records.read({ + protocol : protocol.protocol, + message : { + filter: { recordId: writeResult.record.id } + } + }); + expect(readResult.status.code).to.equal(200); + expect(readResult.record).to.exist; + // test that the logical author is the connected DID and the signer is the impersonator DID + expect(readResult.record.author).to.equal(did); + const readSigner = Jws.getSignerDid(readResult.record.authorization.signature.signatures[0]); + expect(readSigner).to.equal(delegateDid); + + // attempt to query or delete, should fail because we did not grant query permissions + try { + await web5.dwn.records.query({ + protocol : protocol.protocol, + message : { + filter: { protocol: protocol.protocol } + } + }); + + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.include('AgentDwnApi: No permissions found for RecordsQuery'); + } + + try { + await web5.dwn.records.delete({ + protocol : protocol.protocol, + message : { + recordId: writeResult.record.id + } + }); + + expect.fail('Should have thrown an error'); + } catch(error:any) { + expect(error.message).to.include('AgentDwnApi: No permissions found for RecordsDelete'); + } + + // grant query and delete permissions + const queryGrant = await testHarness.agent.permissions.createGrant({ + delegated : true, + author : alice.did.uri, + grantedTo : delegateDid, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Query, + protocol : protocol.protocol, + } + }); + + const deleteGrant = await testHarness.agent.permissions.createGrant({ + delegated : true, + author : alice.did.uri, + grantedTo : delegateDid, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Delete, + protocol : protocol.protocol, + } + }); + + // write the grants to app as owner + // this also clears the grants cache + await DwnApi.processConnectedGrants({ + grants : [ queryGrant.message, deleteGrant.message ], + agent : appTestHarness.agent, + delegateDid, + }); + + // attempt to delete using the grant + const deleteResult = await web5.dwn.records.delete({ + protocol : protocol.protocol, + message : { + recordId: writeResult.record.id + } + }); + expect(deleteResult.status.code).to.equal(202); + + // attempt to query using the grant + const queryResult = await web5.dwn.records.query({ + protocol : protocol.protocol, + message : { + filter: { protocol: protocol.protocol } + } + }); + expect(queryResult.status.code).to.equal(200); + expect(queryResult.records).to.have.lengthOf(0); // record has been deleted + + // connecting a 2nd time will return the same connectedDID and delegatedDID + const { did: did2, delegateDid: delegateDid2 } = await Web5.connect(); + expect(did2).to.equal(did); + expect(delegateDid2).to.equal(delegateDid); + + // Close the app test harness storage. + await appTestHarness.clearStorage(); + await appTestHarness.closeStorage(); + }); + + it('cleans up imported Identity from walletConnectOptions flow if grants cannot be processed', async () => { + const alice = await testHarness.createIdentity({ + name : 'Alice', + testDwnUrls : [testDwnUrl] + }); + + // alice installs a protocol definition + const protocol: DwnProtocolDefinition = { + protocol : 'https://example.com/test-protocol', + published : true, + types : { + foo : {}, + bar : {} + }, + structure: { + foo: { + bar: {} + } + } + }; + + const { reply: protocolConfigReply } = await testHarness.agent.dwn.processRequest({ + author : alice.did.uri, + target : alice.did.uri, + messageType : DwnInterface.ProtocolsConfigure, + messageParams : { + definition: protocol, + }, + }); + expect(protocolConfigReply.status.code).to.equal(202); + // create an identity for the app to use + const app = await testHarness.agent.did.create({ + store : false, + method : 'jwk', + }); + + // create grants for the app to use + const writeGrant = await testHarness.agent.permissions.createGrant({ + delegated : true, + author : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Write, + protocol : protocol.protocol, + } + }); + + const readGrant = await testHarness.agent.permissions.createGrant({ + delegated : true, + author : alice.did.uri, + grantedTo : app.uri, + dateExpires : Time.createOffsetTimestamp({ seconds: 60 }), + scope : { + interface : DwnInterfaceName.Records, + method : DwnMethodName.Read, + protocol : protocol.protocol, + } }); - expect(readGrantReply.status.code).to.equal(202); // stub the walletInit method of the Connect placeholder class sinon.stub(WalletConnect, 'initClient').resolves({ - delegateGrants : [ writeGrant.dataEncodedMessage, readGrant.dataEncodedMessage ], + delegateGrants : [ writeGrant.message, readGrant.message ], delegateDid : await app.export(), connectedDid : alice.did.uri }); @@ -435,16 +740,12 @@ describe('web5 api', () => { expect.fail('Should have thrown an error'); } catch(error:any) { - expect(error.message).to.equal('Failed to connect to wallet: Failed to process delegated grant: Bad Request'); + expect(error.message).to.equal('Failed to connect to wallet: AgentDwnApi: Failed to process connected grant: Bad Request'); } - // because `processDwnRequest` is stubbed to return a 400, deleting the grants will return the same - // we spy on console.error to check if the error messages are logged for the 2 failed grant deletions - expect(consoleSpy.calledTwice, 'console.error called twice').to.be.true; - // check that the Identity was deleted - const appDid = await appTestHarness.agent.identity.list(); - expect(appDid).to.have.lengthOf(0); + const appIdentities = await appTestHarness.agent.identity.list(); + expect(appIdentities).to.have.lengthOf(0); // close the app test harness storage await appTestHarness.clearStorage(); @@ -701,6 +1002,28 @@ describe('web5 api', () => { expect(did2).to.equal(did); }); + it('defaults to the first identity if multiple identities exist', async () => { + // scenario: For some reason more than one identity exists when attempting to re-connect to `Web5` + // the first identity in the array should be the one selected + // TODO: this has happened due to a race condition somewhere. Dig into this issue and implement a better way to select/manage DIDs when using `Web5.connect()` + + // create an identity by connecting + sinon.stub(Web5UserAgent, 'create').resolves(testHarness.agent as Web5UserAgent); + const { web5, did } = await Web5.connect({ techPreview: { dwnEndpoints: [ testDwnUrl ] }}); + expect(web5).to.exist; + expect(did).to.exist; + + // create a second identity + await testHarness.agent.identity.create({ + didMethod : 'jwk', + metadata : { name: 'Second' } + }); + + // connect again + const { did: did2 } = await Web5.connect(); + expect(did2).to.equal(did); + }); + it('defaults to `https://dwn.tbddev.org/beta` as the single DWN Service endpoint if non is provided', async () => { sinon .stub(Web5UserAgent, 'create') diff --git a/packages/identity-agent/src/identity-agent.ts b/packages/identity-agent/src/identity-agent.ts index 78c642ce6..e16231156 100644 --- a/packages/identity-agent/src/identity-agent.ts +++ b/packages/identity-agent/src/identity-agent.ts @@ -1,4 +1,4 @@ -import type { +import { Web5Rpc, DidRequest, VcResponse, @@ -11,6 +11,7 @@ import type { ProcessVcRequest, ProcessDwnRequest, Web5PlatformAgent, + AgentPermissionsApi, } from '@web5/agent'; import { LevelStore } from '@web5/common'; @@ -77,6 +78,8 @@ export type AgentParams = identityApi: AgentIdentityApi; /** Responsible for securely managing the cryptographic keys of the agent. */ keyManager: TKeyManager; + /** Facilitates fetching, requesting, creating, revoking and validating revocation status of permissions */ + permissionsApi: AgentPermissionsApi; /** Remote procedure call (RPC) client used to communicate with other Web5 services. */ rpcClient: Web5Rpc; /** Facilitates data synchronization of DWN records between nodes. */ @@ -89,6 +92,7 @@ export class Web5IdentityAgent; public keyManager: TKeyManager; + public permissions: AgentPermissionsApi; public rpc: Web5Rpc; public sync: AgentSyncApi; public vault: HdIdentityVault; @@ -102,6 +106,7 @@ export class Web5IdentityAgent = {} ): Promise { @@ -158,6 +164,8 @@ export class Web5IdentityAgent { describe('agentDid', () => { it('throws an error if accessed before the Agent is initialized', async () => { // @ts-expect-error - Initializing with empty object to test error. - const identityAgent = new Web5IdentityAgent({ didApi: {}, dwnApi: {}, identityApi: {}, keyManager: {}, syncApi: {} }); + const identityAgent = new Web5IdentityAgent({ didApi: {}, dwnApi: {}, identityApi: {}, keyManager: {}, syncApi: {}, permissionsApi: {} }); try { identityAgent.agentDid; throw new Error('Expected an error'); diff --git a/packages/proxy-agent/src/proxy-agent.ts b/packages/proxy-agent/src/proxy-agent.ts index be9ca934b..2e8c3f772 100644 --- a/packages/proxy-agent/src/proxy-agent.ts +++ b/packages/proxy-agent/src/proxy-agent.ts @@ -1,4 +1,4 @@ -import type { +import { Web5Rpc, DidRequest, VcResponse, @@ -11,6 +11,7 @@ import type { ProcessVcRequest, ProcessDwnRequest, Web5PlatformAgent, + AgentPermissionsApi, } from '@web5/agent'; import { LevelStore } from '@web5/common'; @@ -77,6 +78,8 @@ export type AgentParams = identityApi: AgentIdentityApi; /** Responsible for securely managing the cryptographic keys of the agent. */ keyManager: TKeyManager; + /** Facilitates fetching, requesting, creating, revoking and validating revocation status of permissions */ + permissionsApi: AgentPermissionsApi; /** Remote procedure call (RPC) client used to communicate with other Web5 services. */ rpcClient: Web5Rpc; /** Facilitates data synchronization of DWN records between nodes. */ @@ -89,6 +92,7 @@ export class Web5ProxyAgent; public keyManager: TKeyManager; + public permissions: AgentPermissionsApi; public rpc: Web5Rpc; public sync: AgentSyncApi; public vault: HdIdentityVault; @@ -102,6 +106,7 @@ export class Web5ProxyAgent = {} ): Promise { @@ -156,6 +162,8 @@ export class Web5ProxyAgent { describe('agentDid', () => { it('throws an error if accessed before the Agent is initialized', async () => { // @ts-expect-error - Initializing with empty object to test error. - const userAgent = new Web5ProxyAgent({ didApi: {}, dwnApi: {}, identityApi: {}, keyManager: {}, syncApi: {} }); + const userAgent = new Web5ProxyAgent({ didApi: {}, dwnApi: {}, identityApi: {}, keyManager: {}, permissionsApi: {}, syncApi: {} }); try { userAgent.agentDid; throw new Error('Expected an error'); diff --git a/packages/user-agent/src/user-agent.ts b/packages/user-agent/src/user-agent.ts index f83f0b072..426a0668d 100644 --- a/packages/user-agent/src/user-agent.ts +++ b/packages/user-agent/src/user-agent.ts @@ -1,4 +1,4 @@ -import type { +import { Web5Rpc, DidRequest, VcResponse, @@ -11,6 +11,7 @@ import type { ProcessVcRequest, ProcessDwnRequest, Web5PlatformAgent, + AgentPermissionsApi, } from '@web5/agent'; import { LevelStore } from '@web5/common'; @@ -77,6 +78,8 @@ export type AgentParams = identityApi: AgentIdentityApi; /** Responsible for securely managing the cryptographic keys of the agent. */ keyManager: TKeyManager; + /** Facilitates fetching, requesting, creating, revoking and validating revocation status of permissions */ + permissionsApi: AgentPermissionsApi; /** Remote procedure call (RPC) client used to communicate with other Web5 services. */ rpcClient: Web5Rpc; /** Facilitates data synchronization of DWN records between nodes. */ @@ -89,6 +92,7 @@ export class Web5UserAgent; public keyManager: TKeyManager; + public permissions: AgentPermissionsApi; public rpc: Web5Rpc; public sync: AgentSyncApi; public vault: HdIdentityVault; @@ -102,6 +106,7 @@ export class Web5UserAgent = {} ): Promise { @@ -158,6 +164,8 @@ export class Web5UserAgent { describe('agentDid', () => { it('throws an error if accessed before the Agent is initialized', async () => { // @ts-expect-error - Initializing with empty object to test error. - const userAgent = new Web5UserAgent({ didApi: {}, dwnApi: {}, identityApi: {}, keyManager: {}, syncApi: {} }); + const userAgent = new Web5UserAgent({ didApi: {}, dwnApi: {}, identityApi: {}, keyManager: {}, permissionsApi: {}, syncApi: {} }); try { userAgent.agentDid; throw new Error('Expected an error'); From bec2b03171e329b24e232751f74e17761aadf3ae Mon Sep 17 00:00:00 2001 From: Liran Cohen Date: Wed, 14 Aug 2024 09:27:48 -0400 Subject: [PATCH 3/4] package lock update after rebase --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 25e719847..4307a09ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15184,10 +15184,10 @@ snapshots: puppeteer-core@22.15.0: dependencies: - "@puppeteer/browsers": 2.2.3 - chromium-bidi: 0.5.19(devtools-protocol@0.0.1286932) - debug: 4.3.4(supports-color@8.1.1) - devtools-protocol: 0.0.1286932 + "@puppeteer/browsers": 2.3.0 + chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) + debug: 4.3.6(supports-color@8.1.1) + devtools-protocol: 0.0.1312386 ws: 8.18.0 transitivePeerDependencies: - bufferutil From 9ab0463f4baccf0ee29a7673047c53592f4f5c0a Mon Sep 17 00:00:00 2001 From: Liran Cohen Date: Wed, 14 Aug 2024 10:50:02 -0400 Subject: [PATCH 4/4] add additional comments around the signer for the permissions DWN api --- packages/api/src/dwn-api.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/api/src/dwn-api.ts b/packages/api/src/dwn-api.ts index c7c45bbc5..c8661fe99 100644 --- a/packages/api/src/dwn-api.ts +++ b/packages/api/src/dwn-api.ts @@ -340,6 +340,11 @@ export class DwnApi { * API to interact with Grants * * NOTE: This is an EXPERIMENTAL API that will change behavior. + * + * Currently only supports issuing requests, grants, revokes and queries on behalf without permissions or impersonation. + * If the agent is connected to a delegateDid, the delegateDid will be used to sign/author the underlying records. + * If the agent is not connected to a delegateDid, the connectedDid will be used to sign/author the underlying records. + * * @beta */ get permissions() {