latchkey 3.14.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/src/apiCredentials/base.d.ts +53 -5
- package/dist/src/apiCredentials/base.d.ts.map +1 -1
- package/dist/src/apiCredentials/base.js +43 -9
- package/dist/src/apiCredentials/base.js.map +1 -1
- package/dist/src/apiCredentials/serialization.d.ts +11 -139
- package/dist/src/apiCredentials/serialization.d.ts.map +1 -1
- package/dist/src/apiCredentials/serialization.js +53 -81
- package/dist/src/apiCredentials/serialization.js.map +1 -1
- package/dist/src/apiCredentials/store.d.ts +7 -2
- package/dist/src/apiCredentials/store.d.ts.map +1 -1
- package/dist/src/apiCredentials/store.js +18 -8
- package/dist/src/apiCredentials/store.js.map +1 -1
- package/dist/src/browserStateImport.d.ts +50 -0
- package/dist/src/browserStateImport.d.ts.map +1 -0
- package/dist/src/browserStateImport.js +260 -0
- package/dist/src/browserStateImport.js.map +1 -0
- package/dist/src/cli.js +13 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cliCommands.d.ts +15 -7
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +64 -16
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/config.d.ts +10 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +15 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/configDataStore.d.ts +3 -0
- package/dist/src/configDataStore.d.ts.map +1 -1
- package/dist/src/configDataStore.js +1 -0
- package/dist/src/configDataStore.js.map +1 -1
- package/dist/src/curlInjection.d.ts +2 -0
- package/dist/src/curlInjection.d.ts.map +1 -1
- package/dist/src/curlInjection.js +12 -6
- package/dist/src/curlInjection.js.map +1 -1
- package/dist/src/diagnosticHeaders.d.ts +19 -0
- package/dist/src/diagnosticHeaders.d.ts.map +1 -0
- package/dist/src/diagnosticHeaders.js +20 -0
- package/dist/src/diagnosticHeaders.js.map +1 -0
- package/dist/src/gateway/gatewayEndpoint.d.ts.map +1 -1
- package/dist/src/gateway/gatewayEndpoint.js +1 -0
- package/dist/src/gateway/gatewayEndpoint.js.map +1 -1
- package/dist/src/gateway/server.js +1 -1
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations.d.ts.map +1 -1
- package/dist/src/migrations.js +8 -8
- package/dist/src/migrations.js.map +1 -1
- package/dist/src/oauthUtils.d.ts +17 -0
- package/dist/src/oauthUtils.d.ts.map +1 -1
- package/dist/src/oauthUtils.js +22 -1
- package/dist/src/oauthUtils.js.map +1 -1
- package/dist/src/pluginSdk.d.ts +118 -0
- package/dist/src/pluginSdk.d.ts.map +1 -0
- package/dist/src/pluginSdk.js +98 -0
- package/dist/src/pluginSdk.js.map +1 -0
- package/dist/src/plugins.d.ts +74 -0
- package/dist/src/plugins.d.ts.map +1 -0
- package/dist/src/plugins.js +221 -0
- package/dist/src/plugins.js.map +1 -0
- package/dist/src/serviceRegistry.d.ts +2 -2
- package/dist/src/serviceRegistry.d.ts.map +1 -1
- package/dist/src/serviceRegistry.js +3 -3
- package/dist/src/serviceRegistry.js.map +1 -1
- package/dist/src/services/aws.d.ts +2 -1
- package/dist/src/services/aws.d.ts.map +1 -1
- package/dist/src/services/aws.js +4 -2
- package/dist/src/services/aws.js.map +1 -1
- package/dist/src/services/core/base.d.ts +53 -3
- package/dist/src/services/core/base.d.ts.map +1 -1
- package/dist/src/services/core/base.js +63 -3
- package/dist/src/services/core/base.js.map +1 -1
- package/dist/src/services/dropbox.d.ts.map +1 -1
- package/dist/src/services/dropbox.js +2 -2
- package/dist/src/services/dropbox.js.map +1 -1
- package/dist/src/services/fastmail.d.ts +4 -19
- package/dist/src/services/fastmail.d.ts.map +1 -1
- package/dist/src/services/fastmail.js +17 -22
- package/dist/src/services/fastmail.js.map +1 -1
- package/dist/src/services/google/base.d.ts +8 -3
- package/dist/src/services/google/base.d.ts.map +1 -1
- package/dist/src/services/google/base.js +23 -13
- package/dist/src/services/google/base.js.map +1 -1
- package/dist/src/services/index.d.ts +1 -1
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +1 -1
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/notion-mcp.d.ts +16 -16
- package/dist/src/services/notion-mcp.d.ts.map +1 -1
- package/dist/src/services/notion-mcp.js +36 -21
- package/dist/src/services/notion-mcp.js.map +1 -1
- package/dist/src/services/ramp.d.ts.map +1 -1
- package/dist/src/services/ramp.js +2 -2
- package/dist/src/services/ramp.js.map +1 -1
- package/dist/src/services/slack.d.ts +2 -1
- package/dist/src/services/slack.d.ts.map +1 -1
- package/dist/src/services/slack.js +4 -2
- package/dist/src/services/slack.js.map +1 -1
- package/dist/src/services/tailscale.d.ts +2 -1
- package/dist/src/services/tailscale.d.ts.map +1 -1
- package/dist/src/services/tailscale.js +4 -2
- package/dist/src/services/tailscale.js.map +1 -1
- package/dist/src/services/telegram.d.ts +2 -1
- package/dist/src/services/telegram.d.ts.map +1 -1
- package/dist/src/services/telegram.js +4 -2
- package/dist/src/services/telegram.js.map +1 -1
- package/dist/src/services/zoom.d.ts +7 -5
- package/dist/src/services/zoom.d.ts.map +1 -1
- package/dist/src/services/zoom.js +11 -8
- package/dist/src/services/zoom.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tests/apiCredentialStore.test.js +54 -1
- package/dist/tests/apiCredentialStore.test.js.map +1 -1
- package/dist/tests/apiCredentials.test.js +73 -12
- package/dist/tests/apiCredentials.test.js.map +1 -1
- package/dist/tests/browserStateImport.test.d.ts +2 -0
- package/dist/tests/browserStateImport.test.d.ts.map +1 -0
- package/dist/tests/browserStateImport.test.js +88 -0
- package/dist/tests/browserStateImport.test.js.map +1 -0
- package/dist/tests/cli.test.js +33 -1
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/config.test.js +7 -0
- package/dist/tests/config.test.js.map +1 -1
- package/dist/tests/diagnosticHeaders.test.d.ts +2 -0
- package/dist/tests/diagnosticHeaders.test.d.ts.map +1 -0
- package/dist/tests/diagnosticHeaders.test.js +22 -0
- package/dist/tests/diagnosticHeaders.test.js.map +1 -0
- package/dist/tests/followupFailureRecovery.test.d.ts +11 -0
- package/dist/tests/followupFailureRecovery.test.d.ts.map +1 -0
- package/dist/tests/followupFailureRecovery.test.js +101 -0
- package/dist/tests/followupFailureRecovery.test.js.map +1 -0
- package/dist/tests/gateway.test.js +25 -4
- package/dist/tests/gateway.test.js.map +1 -1
- package/dist/tests/gatewayExtensions.test.js +5 -2
- package/dist/tests/gatewayExtensions.test.js.map +1 -1
- package/dist/tests/latchkeyEndpoint.test.js +8 -6
- package/dist/tests/latchkeyEndpoint.test.js.map +1 -1
- package/dist/tests/notion-mcp.test.d.ts +2 -0
- package/dist/tests/notion-mcp.test.d.ts.map +1 -0
- package/dist/tests/notion-mcp.test.js +16 -0
- package/dist/tests/notion-mcp.test.js.map +1 -0
- package/dist/tests/oauthUtils.test.js +23 -1
- package/dist/tests/oauthUtils.test.js.map +1 -1
- package/dist/tests/plugins.test.d.ts +2 -0
- package/dist/tests/plugins.test.d.ts.map +1 -0
- package/dist/tests/plugins.test.js +506 -0
- package/dist/tests/plugins.test.js.map +1 -0
- package/dist/tests/sharedOperations.test.js +63 -2
- package/dist/tests/sharedOperations.test.js.map +1 -1
- package/dist/tests/tailscale.test.js +1 -3
- package/dist/tests/tailscale.test.js.map +1 -1
- package/package.json +15 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../../src/apiCredentials/serialization.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../../src/apiCredentials/serialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* account is used, or an {@link AmbiguousAccountError} is raised when several
|
|
19
19
|
* accounts exist and the caller must disambiguate.
|
|
20
20
|
*/
|
|
21
|
-
import type { ApiCredentials } from './base.js';
|
|
21
|
+
import type { ApiCredentials, ApiCredentialsType } from './base.js';
|
|
22
22
|
import { EncryptedStorage } from '../encryptedStorage.js';
|
|
23
23
|
export declare class ApiCredentialStoreError extends Error {
|
|
24
24
|
constructor(message: string);
|
|
@@ -35,7 +35,12 @@ export declare class AmbiguousAccountError extends Error {
|
|
|
35
35
|
export declare class ApiCredentialStore {
|
|
36
36
|
readonly path: string;
|
|
37
37
|
private readonly encryptedStorage;
|
|
38
|
-
|
|
38
|
+
private readonly apiCredentialsTypes;
|
|
39
|
+
/**
|
|
40
|
+
* `apiCredentialsTypes` is every credentials type the store can hold. The
|
|
41
|
+
* CLI passes the built-in ones plus those its plugins define.
|
|
42
|
+
*/
|
|
43
|
+
constructor(path: string, encryptedStorage: EncryptedStorage, apiCredentialsTypes?: readonly ApiCredentialsType[]);
|
|
39
44
|
private loadStoreData;
|
|
40
45
|
private saveStoreData;
|
|
41
46
|
private parseCredentials;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/apiCredentials/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/apiCredentials/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAOpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEzB,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;CAU7D;AASD,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAgC;IAEpE;;;OAGG;gBAED,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,GAAE,SAAS,kBAAkB,EAAkC;IAOpF,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,gBAAgB;IAaxB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAU9B,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAejE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAgBjF;;;OAGG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAS1D;;;OAGG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI;IAM1E;;;OAGG;IACH,wBAAwB,IAAI,SAAS,MAAM,EAAE;IAI7C;;;;OAIG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE;IAMpD;;;OAGG;IACH,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAalE;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAyBtD;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAUxC"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* accounts exist and the caller must disambiguate.
|
|
20
20
|
*/
|
|
21
21
|
import { DEFAULT_ACCOUNT, formatAccount } from './account.js';
|
|
22
|
-
import {
|
|
22
|
+
import { ApiCredentialsSerializationError, BUILTIN_API_CREDENTIALS_TYPES, deserializeCredentials, serializeCredentials, } from './serialization.js';
|
|
23
23
|
export class ApiCredentialStoreError extends Error {
|
|
24
24
|
constructor(message) {
|
|
25
25
|
super(message);
|
|
@@ -45,9 +45,15 @@ export class AmbiguousAccountError extends Error {
|
|
|
45
45
|
export class ApiCredentialStore {
|
|
46
46
|
path;
|
|
47
47
|
encryptedStorage;
|
|
48
|
-
|
|
48
|
+
apiCredentialsTypes;
|
|
49
|
+
/**
|
|
50
|
+
* `apiCredentialsTypes` is every credentials type the store can hold. The
|
|
51
|
+
* CLI passes the built-in ones plus those its plugins define.
|
|
52
|
+
*/
|
|
53
|
+
constructor(path, encryptedStorage, apiCredentialsTypes = BUILTIN_API_CREDENTIALS_TYPES) {
|
|
49
54
|
this.path = path;
|
|
50
55
|
this.encryptedStorage = encryptedStorage;
|
|
56
|
+
this.apiCredentialsTypes = apiCredentialsTypes;
|
|
51
57
|
}
|
|
52
58
|
loadStoreData() {
|
|
53
59
|
try {
|
|
@@ -74,11 +80,15 @@ export class ApiCredentialStore {
|
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
parseCredentials(serviceName, credentialData) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
try {
|
|
84
|
+
return deserializeCredentials(credentialData, this.apiCredentialsTypes);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (error instanceof ApiCredentialsSerializationError) {
|
|
88
|
+
throw new ApiCredentialStoreError(`Invalid credential data for service ${serviceName}: ${error.message}`);
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
80
91
|
}
|
|
81
|
-
return deserializeCredentials(parseResult.data);
|
|
82
92
|
}
|
|
83
93
|
/**
|
|
84
94
|
* Resolve which stored account to operate on when the caller did not name
|
|
@@ -118,7 +128,7 @@ export class ApiCredentialStore {
|
|
|
118
128
|
const resolvedAccount = account ?? this.resolveImplicitAccount(serviceName, accounts) ?? DEFAULT_ACCOUNT;
|
|
119
129
|
data.credentials[serviceName] = {
|
|
120
130
|
...serviceData,
|
|
121
|
-
[resolvedAccount]: serializeCredentials(apiCredentials),
|
|
131
|
+
[resolvedAccount]: serializeCredentials(apiCredentials, this.apiCredentialsTypes),
|
|
122
132
|
};
|
|
123
133
|
this.saveStoreData(data);
|
|
124
134
|
}
|
|
@@ -140,7 +150,7 @@ export class ApiCredentialStore {
|
|
|
140
150
|
*/
|
|
141
151
|
savePreparation(serviceName, apiCredentials) {
|
|
142
152
|
const data = this.loadStoreData();
|
|
143
|
-
data.preparations[serviceName] = serializeCredentials(apiCredentials);
|
|
153
|
+
data.preparations[serviceName] = serializeCredentials(apiCredentials, this.apiCredentialsTypes);
|
|
144
154
|
this.saveStoreData(data);
|
|
145
155
|
}
|
|
146
156
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/apiCredentials/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/apiCredentials/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import cookies (and the localStorage of the services Latchkey knows) from the
|
|
3
|
+
* user's regular Google Chrome profile into Latchkey's encrypted browser state,
|
|
4
|
+
* so that browser flows start out logged in.
|
|
5
|
+
*
|
|
6
|
+
* The parts of the profile that hold this data are copied to a temporary
|
|
7
|
+
* location first: Chrome refuses to be automated on its default user data
|
|
8
|
+
* directory, and it would clash with a Chrome instance the user may have
|
|
9
|
+
* running.
|
|
10
|
+
*/
|
|
11
|
+
import type { BrowserContext } from 'playwright';
|
|
12
|
+
import type { EncryptedStorage } from './encryptedStorage.js';
|
|
13
|
+
import type { Service } from './services/index.js';
|
|
14
|
+
export declare class ChromeNotFoundError extends Error {
|
|
15
|
+
constructor();
|
|
16
|
+
}
|
|
17
|
+
export declare class ChromeProfileNotFoundError extends Error {
|
|
18
|
+
constructor(profilePath: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class ChromeProfileTooLargeError extends Error {
|
|
21
|
+
constructor(sizeInBytes: number, limitInBytes: number);
|
|
22
|
+
}
|
|
23
|
+
export declare class InvalidBrowserStateError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
export type BrowserStorageState = Awaited<ReturnType<BrowserContext['storageState']>>;
|
|
27
|
+
export declare function findChromeExecutable(): string | null;
|
|
28
|
+
export declare function getChromeUserDataDirectory(): string;
|
|
29
|
+
/** The distinct web origins of the services' login URLs. */
|
|
30
|
+
export declare function collectLoginOrigins(services: readonly Service[]): readonly string[];
|
|
31
|
+
/**
|
|
32
|
+
* Combine two storage states. Where both have the same cookie (by name, domain
|
|
33
|
+
* and path) or the same origin, the imported one wins.
|
|
34
|
+
*/
|
|
35
|
+
export declare function mergeBrowserStorageStates(existing: BrowserStorageState, imported: BrowserStorageState): BrowserStorageState;
|
|
36
|
+
export declare function parseBrowserStorageState(content: string): BrowserStorageState;
|
|
37
|
+
/** Total size of what {@link copyDefaultProfile} would copy. */
|
|
38
|
+
export declare function measureCopiedUserDataSizeInBytes(chromeUserDataDirectory: string): number;
|
|
39
|
+
export interface BrowserStateImportResult {
|
|
40
|
+
readonly importedCookieCount: number;
|
|
41
|
+
/** Origins (among those asked for) that had localStorage to import. */
|
|
42
|
+
readonly importedLocalStorageOrigins: readonly string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read the cookies of the user's default Chrome profile, and the localStorage
|
|
46
|
+
* of `localStorageOrigins`, and merge them into the encrypted browser state at
|
|
47
|
+
* `browserStatePath`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function importChromeBrowserState(encryptedStorage: EncryptedStorage, browserStatePath: string, localStorageOrigins: readonly string[]): Promise<BrowserStateImportResult>;
|
|
50
|
+
//# sourceMappingURL=browserStateImport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserStateImport.d.ts","sourceRoot":"","sources":["../../src/browserStateImport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,WAAW,EAAE,MAAM;CAIhC;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAQtD;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AA+CtF,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAmBnD;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,MAAM,EAAE,CAOnF;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,mBAAmB,GAC5B,mBAAmB,CAUrB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAe7E;AAkBD,gEAAgE;AAChE,wBAAgB,gCAAgC,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM,CAKxF;AAoFD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,uEAAuE;IACvE,QAAQ,CAAC,2BAA2B,EAAE,SAAS,MAAM,EAAE,CAAC;CACzD;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,MAAM,EACxB,mBAAmB,EAAE,SAAS,MAAM,EAAE,GACrC,OAAO,CAAC,wBAAwB,CAAC,CA+BnC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import cookies (and the localStorage of the services Latchkey knows) from the
|
|
3
|
+
* user's regular Google Chrome profile into Latchkey's encrypted browser state,
|
|
4
|
+
* so that browser flows start out logged in.
|
|
5
|
+
*
|
|
6
|
+
* The parts of the profile that hold this data are copied to a temporary
|
|
7
|
+
* location first: Chrome refuses to be automated on its default user data
|
|
8
|
+
* directory, and it would clash with a Chrome instance the user may have
|
|
9
|
+
* running.
|
|
10
|
+
*/
|
|
11
|
+
import { cpSync, existsSync, mkdtempSync, readdirSync, rmSync, statSync } from 'node:fs';
|
|
12
|
+
import { homedir, platform, tmpdir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { loadPlaywright } from './playwrightLoader.js';
|
|
15
|
+
export class ChromeNotFoundError extends Error {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('Google Chrome is not installed in any of the standard locations.');
|
|
18
|
+
this.name = 'ChromeNotFoundError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class ChromeProfileNotFoundError extends Error {
|
|
22
|
+
constructor(profilePath) {
|
|
23
|
+
super(`No default Google Chrome profile found at ${profilePath}.`);
|
|
24
|
+
this.name = 'ChromeProfileNotFoundError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class ChromeProfileTooLargeError extends Error {
|
|
28
|
+
constructor(sizeInBytes, limitInBytes) {
|
|
29
|
+
const toMebibytes = (bytes) => String(Math.round(bytes / 1024 / 1024));
|
|
30
|
+
super(`The Google Chrome profile data to copy takes ${toMebibytes(sizeInBytes)} MiB, ` +
|
|
31
|
+
`more than the limit of ${toMebibytes(limitInBytes)} MiB.`);
|
|
32
|
+
this.name = 'ChromeProfileTooLargeError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class InvalidBrowserStateError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'InvalidBrowserStateError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const DEFAULT_PROFILE_DIRECTORY_NAME = 'Default';
|
|
42
|
+
/**
|
|
43
|
+
* What gets copied, relative to the user data directory. The rest of it (caches,
|
|
44
|
+
* on-device models, ...) can be huge and is not needed to read cookies and
|
|
45
|
+
* localStorage. Paths that do not exist are skipped.
|
|
46
|
+
*/
|
|
47
|
+
const COPIED_USER_DATA_PATHS = [
|
|
48
|
+
// Holds the key cookies are encrypted with on Windows.
|
|
49
|
+
'Local State',
|
|
50
|
+
`${DEFAULT_PROFILE_DIRECTORY_NAME}/Network/Cookies`,
|
|
51
|
+
`${DEFAULT_PROFILE_DIRECTORY_NAME}/Network/Cookies-journal`,
|
|
52
|
+
// Where cookies lived before Chrome 96.
|
|
53
|
+
`${DEFAULT_PROFILE_DIRECTORY_NAME}/Cookies`,
|
|
54
|
+
`${DEFAULT_PROFILE_DIRECTORY_NAME}/Cookies-journal`,
|
|
55
|
+
`${DEFAULT_PROFILE_DIRECTORY_NAME}/Local Storage`,
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Google Chrome specifically (not Chromium or Edge): the copied cookies can only
|
|
59
|
+
* be decrypted by the browser whose OS keychain entry they were encrypted with.
|
|
60
|
+
*/
|
|
61
|
+
function chromeExecutableCandidates() {
|
|
62
|
+
switch (platform()) {
|
|
63
|
+
case 'darwin':
|
|
64
|
+
return ['/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'];
|
|
65
|
+
case 'linux':
|
|
66
|
+
return [
|
|
67
|
+
'/opt/google/chrome/chrome',
|
|
68
|
+
'/usr/bin/google-chrome',
|
|
69
|
+
'/usr/bin/google-chrome-stable',
|
|
70
|
+
];
|
|
71
|
+
case 'win32':
|
|
72
|
+
return [process.env.PROGRAMFILES, process.env['PROGRAMFILES(X86)'], process.env.LOCALAPPDATA]
|
|
73
|
+
.filter((prefix) => prefix !== undefined && prefix !== '')
|
|
74
|
+
.map((prefix) => join(prefix, 'Google', 'Chrome', 'Application', 'chrome.exe'));
|
|
75
|
+
default:
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function findChromeExecutable() {
|
|
80
|
+
return chromeExecutableCandidates().find((candidate) => existsSync(candidate)) ?? null;
|
|
81
|
+
}
|
|
82
|
+
export function getChromeUserDataDirectory() {
|
|
83
|
+
switch (platform()) {
|
|
84
|
+
case 'darwin':
|
|
85
|
+
return join(homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
|
|
86
|
+
case 'win32':
|
|
87
|
+
return join(process.env.LOCALAPPDATA ?? join(homedir(), 'AppData', 'Local'), 'Google', 'Chrome', 'User Data');
|
|
88
|
+
default: {
|
|
89
|
+
const configHome = process.env.XDG_CONFIG_HOME;
|
|
90
|
+
return join(configHome !== undefined && configHome !== '' ? configHome : join(homedir(), '.config'), 'google-chrome');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** The distinct web origins of the services' login URLs. */
|
|
95
|
+
export function collectLoginOrigins(services) {
|
|
96
|
+
const origins = services
|
|
97
|
+
.filter((service) => URL.canParse(service.loginUrl))
|
|
98
|
+
.map((service) => new URL(service.loginUrl))
|
|
99
|
+
.filter((url) => url.protocol === 'https:' || url.protocol === 'http:')
|
|
100
|
+
.map((url) => url.origin);
|
|
101
|
+
return [...new Set(origins)].sort();
|
|
102
|
+
}
|
|
103
|
+
function cookieKey(cookie) {
|
|
104
|
+
return JSON.stringify([cookie.name, cookie.domain, cookie.path]);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Combine two storage states. Where both have the same cookie (by name, domain
|
|
108
|
+
* and path) or the same origin, the imported one wins.
|
|
109
|
+
*/
|
|
110
|
+
export function mergeBrowserStorageStates(existing, imported) {
|
|
111
|
+
const cookies = new Map();
|
|
112
|
+
for (const cookie of [...existing.cookies, ...imported.cookies]) {
|
|
113
|
+
cookies.set(cookieKey(cookie), cookie);
|
|
114
|
+
}
|
|
115
|
+
const origins = new Map();
|
|
116
|
+
for (const origin of [...existing.origins, ...imported.origins]) {
|
|
117
|
+
origins.set(origin.origin, origin);
|
|
118
|
+
}
|
|
119
|
+
return { cookies: [...cookies.values()], origins: [...origins.values()] };
|
|
120
|
+
}
|
|
121
|
+
export function parseBrowserStorageState(content) {
|
|
122
|
+
let parsed;
|
|
123
|
+
try {
|
|
124
|
+
parsed = JSON.parse(content);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
throw new InvalidBrowserStateError('The stored browser state is not valid JSON.');
|
|
128
|
+
}
|
|
129
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
130
|
+
throw new InvalidBrowserStateError('The stored browser state is not a JSON object.');
|
|
131
|
+
}
|
|
132
|
+
const { cookies, origins } = parsed;
|
|
133
|
+
return {
|
|
134
|
+
cookies: Array.isArray(cookies) ? cookies : [],
|
|
135
|
+
origins: Array.isArray(origins) ? origins : [],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Sanity limit on how much gets copied. The copied data is normally a few
|
|
140
|
+
* megabytes; anything near this means something unexpected is in there.
|
|
141
|
+
*/
|
|
142
|
+
const MAXIMUM_COPY_SIZE_IN_BYTES = 1024 * 1024 * 1024;
|
|
143
|
+
function measureSizeInBytes(path) {
|
|
144
|
+
const stats = statSync(path);
|
|
145
|
+
if (!stats.isDirectory()) {
|
|
146
|
+
return stats.size;
|
|
147
|
+
}
|
|
148
|
+
return readdirSync(path)
|
|
149
|
+
.map((entry) => measureSizeInBytes(join(path, entry)))
|
|
150
|
+
.reduce((total, size) => total + size, 0);
|
|
151
|
+
}
|
|
152
|
+
/** Total size of what {@link copyDefaultProfile} would copy. */
|
|
153
|
+
export function measureCopiedUserDataSizeInBytes(chromeUserDataDirectory) {
|
|
154
|
+
return COPIED_USER_DATA_PATHS.map((relativePath) => join(chromeUserDataDirectory, relativePath))
|
|
155
|
+
.filter((path) => existsSync(path))
|
|
156
|
+
.map(measureSizeInBytes)
|
|
157
|
+
.reduce((total, size) => total + size, 0);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Copy the cookies and localStorage of the default profile into a fresh user
|
|
161
|
+
* data directory and return its path.
|
|
162
|
+
*/
|
|
163
|
+
function copyDefaultProfile(chromeUserDataDirectory) {
|
|
164
|
+
const profileDirectory = join(chromeUserDataDirectory, DEFAULT_PROFILE_DIRECTORY_NAME);
|
|
165
|
+
if (!existsSync(profileDirectory)) {
|
|
166
|
+
throw new ChromeProfileNotFoundError(profileDirectory);
|
|
167
|
+
}
|
|
168
|
+
const copySizeInBytes = measureCopiedUserDataSizeInBytes(chromeUserDataDirectory);
|
|
169
|
+
if (copySizeInBytes > MAXIMUM_COPY_SIZE_IN_BYTES) {
|
|
170
|
+
throw new ChromeProfileTooLargeError(copySizeInBytes, MAXIMUM_COPY_SIZE_IN_BYTES);
|
|
171
|
+
}
|
|
172
|
+
const temporaryUserDataDirectory = mkdtempSync(join(tmpdir(), 'latchkey-chrome-profile-'));
|
|
173
|
+
for (const relativePath of COPIED_USER_DATA_PATHS) {
|
|
174
|
+
const source = join(chromeUserDataDirectory, relativePath);
|
|
175
|
+
if (existsSync(source)) {
|
|
176
|
+
cpSync(source, join(temporaryUserDataDirectory, relativePath), { recursive: true });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return temporaryUserDataDirectory;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Read the localStorage of the given origins. Every request is answered with an
|
|
183
|
+
* empty page, so each origin is visited without any network traffic or site
|
|
184
|
+
* scripts, and what is read is exactly what the profile has stored.
|
|
185
|
+
*/
|
|
186
|
+
async function readLocalStorage(context, origins) {
|
|
187
|
+
await context.route('**/*', (route) => route.fulfill({ status: 200, contentType: 'text/html', body: '' }));
|
|
188
|
+
const page = await context.newPage();
|
|
189
|
+
try {
|
|
190
|
+
const originStorages = [];
|
|
191
|
+
for (const origin of origins) {
|
|
192
|
+
await page.goto(origin);
|
|
193
|
+
const entries = await page.evaluate('Object.entries(window.localStorage)');
|
|
194
|
+
if (entries.length > 0) {
|
|
195
|
+
originStorages.push({
|
|
196
|
+
origin,
|
|
197
|
+
localStorage: entries.map(([name, value]) => ({ name, value })),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return originStorages;
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
await page.close();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function readChromeProfileStorageState(chromeExecutablePath, userDataDirectory, localStorageOrigins) {
|
|
208
|
+
const { chromium } = await loadPlaywright();
|
|
209
|
+
const context = await chromium.launchPersistentContext(userDataDirectory, {
|
|
210
|
+
executablePath: chromeExecutablePath,
|
|
211
|
+
headless: true,
|
|
212
|
+
args: [`--profile-directory=${DEFAULT_PROFILE_DIRECTORY_NAME}`],
|
|
213
|
+
// Playwright's defaults keep Chrome away from the OS keychain, which holds
|
|
214
|
+
// the key needed to decrypt the copied cookies.
|
|
215
|
+
ignoreDefaultArgs: ['--password-store=basic', '--use-mock-keychain', '--enable-automation'],
|
|
216
|
+
// A service worker from the profile could otherwise answer instead of the
|
|
217
|
+
// route that keeps the origin visits offline.
|
|
218
|
+
serviceWorkers: 'block',
|
|
219
|
+
});
|
|
220
|
+
try {
|
|
221
|
+
const cookies = await context.cookies();
|
|
222
|
+
const origins = await readLocalStorage(context, localStorageOrigins);
|
|
223
|
+
return { cookies, origins: [...origins] };
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
await context.close();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Read the cookies of the user's default Chrome profile, and the localStorage
|
|
231
|
+
* of `localStorageOrigins`, and merge them into the encrypted browser state at
|
|
232
|
+
* `browserStatePath`.
|
|
233
|
+
*/
|
|
234
|
+
export async function importChromeBrowserState(encryptedStorage, browserStatePath, localStorageOrigins) {
|
|
235
|
+
const chromeExecutablePath = findChromeExecutable();
|
|
236
|
+
if (chromeExecutablePath === null) {
|
|
237
|
+
throw new ChromeNotFoundError();
|
|
238
|
+
}
|
|
239
|
+
const temporaryUserDataDirectory = copyDefaultProfile(getChromeUserDataDirectory());
|
|
240
|
+
let importedState;
|
|
241
|
+
try {
|
|
242
|
+
importedState = await readChromeProfileStorageState(chromeExecutablePath, temporaryUserDataDirectory, localStorageOrigins);
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
rmSync(temporaryUserDataDirectory, { recursive: true, force: true });
|
|
246
|
+
}
|
|
247
|
+
// Read only now, right before writing, so that changes other processes made
|
|
248
|
+
// to the browser state while Chrome was running are not overwritten.
|
|
249
|
+
const existingContent = encryptedStorage.readFile(browserStatePath);
|
|
250
|
+
const existingState = existingContent === null
|
|
251
|
+
? { cookies: [], origins: [] }
|
|
252
|
+
: parseBrowserStorageState(existingContent);
|
|
253
|
+
const mergedState = mergeBrowserStorageStates(existingState, importedState);
|
|
254
|
+
encryptedStorage.writeFile(browserStatePath, JSON.stringify(mergedState, null, 2));
|
|
255
|
+
return {
|
|
256
|
+
importedCookieCount: importedState.cookies.length,
|
|
257
|
+
importedLocalStorageOrigins: importedState.origins.map((origin) => origin.origin),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=browserStateImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserStateImport.js","sourceRoot":"","sources":["../../src/browserStateImport.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.js
CHANGED
|
@@ -4,15 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { existsSync } from 'node:fs';
|
|
6
6
|
import { program } from 'commander';
|
|
7
|
-
import { registerCommands, createDefaultDependencies } from './cliCommands.js';
|
|
7
|
+
import { registerCommands, createDefaultDependencies, } from './cliCommands.js';
|
|
8
8
|
import { CurlNotFoundError, InsecureFilePermissionsError } from './config.js';
|
|
9
9
|
import { EncryptedStorage } from './encryptedStorage.js';
|
|
10
10
|
import { EncryptionKeyLostError, EncryptionKeyUnavailableError, resolveEncryptionKey, } from './encryption.js';
|
|
11
11
|
import { KeychainTimeoutError } from './keychain.js';
|
|
12
12
|
import { MigrationError, runMigrations } from './migrations.js';
|
|
13
13
|
import { countDailyIfNeeded } from './dailyCounting.js';
|
|
14
|
+
import { PluginLoadError } from './plugins.js';
|
|
14
15
|
import { VERSION } from './version.js';
|
|
15
|
-
|
|
16
|
+
let deps;
|
|
17
|
+
try {
|
|
18
|
+
deps = await createDefaultDependencies();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof PluginLoadError) {
|
|
22
|
+
console.error(`Error: ${error.message}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
16
27
|
const gatewayMode = deps.config.gatewayUrl !== null;
|
|
17
28
|
try {
|
|
18
29
|
deps.config.checkSystemPrerequisites();
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* CLI command implementations with dependency injection for testability.
|
|
3
3
|
*/
|
|
4
4
|
import type { Command } from 'commander';
|
|
5
|
+
import { ApiCredentialsType } from './apiCredentials/base.js';
|
|
5
6
|
import { Config } from './config.js';
|
|
6
7
|
import type { CurlResult } from './curl.js';
|
|
7
8
|
import { ServiceRegistry } from './serviceRegistry.js';
|
|
@@ -20,12 +21,18 @@ export declare const PERMISSION_DENIED_EXIT_CODE = 126;
|
|
|
20
21
|
export interface CliDependencies {
|
|
21
22
|
readonly registry: ServiceRegistry;
|
|
22
23
|
/**
|
|
23
|
-
* The services latchkey ships with
|
|
24
|
-
* of before config.json is applied to it.
|
|
25
|
-
* from these on every request, so it needs
|
|
26
|
-
* which has already had config.json applied
|
|
24
|
+
* The services latchkey ships with plus those its plugins contribute, which
|
|
25
|
+
* is what a registry is built on top of before config.json is applied to it.
|
|
26
|
+
* The gateway rebuilds a registry from these on every request, so it needs
|
|
27
|
+
* them separately from `registry`, which has already had config.json applied
|
|
28
|
+
* and the hidden services removed.
|
|
27
29
|
*/
|
|
28
|
-
readonly
|
|
30
|
+
readonly baseServices: readonly Service[];
|
|
31
|
+
/**
|
|
32
|
+
* Every credentials type that can be stored: the ones latchkey ships with
|
|
33
|
+
* plus those its plugins define.
|
|
34
|
+
*/
|
|
35
|
+
readonly apiCredentialsTypes: readonly ApiCredentialsType[];
|
|
29
36
|
readonly config: Config;
|
|
30
37
|
readonly runCurl: (args: readonly string[]) => CurlResult;
|
|
31
38
|
readonly runCurlAsync: typeof curlRunAsync;
|
|
@@ -38,9 +45,10 @@ export interface CliDependencies {
|
|
|
38
45
|
readonly version: string;
|
|
39
46
|
}
|
|
40
47
|
/**
|
|
41
|
-
* Default implementation of CLI dependencies.
|
|
48
|
+
* Default implementation of CLI dependencies. Loads the plugins, which is why
|
|
49
|
+
* it is asynchronous; throws `PluginLoadError` when one of them is broken.
|
|
42
50
|
*/
|
|
43
|
-
export declare function createDefaultDependencies(): CliDependencies
|
|
51
|
+
export declare function createDefaultDependencies(): Promise<CliDependencies>;
|
|
44
52
|
/**
|
|
45
53
|
* Register all CLI commands on the given program.
|
|
46
54
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliCommands.d.ts","sourceRoot":"","sources":["../../src/cliCommands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cliCommands.d.ts","sourceRoot":"","sources":["../../src/cliCommands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,EAEL,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AA0BlC,OAAO,EAAE,MAAM,EAAU,MAAM,aAAa,CAAC;AAQ7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAKL,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EASL,OAAO,EAIR,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,QAAQ,IAAI,YAAY,EACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAC;AAqC1B;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,mBAAmB,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,UAAU,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,OAAO,YAAY,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,CACxB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,sBAAsB,EAAE,OAAO,EAC/B,QAAQ,CAAC,EAAE,uBAAuB,KAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,eAAe,CAAC,CAgC1E;AAqQD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CA0oC9E"}
|