@intentic/machine 1.345.0 → 1.346.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.
Files changed (113) hide show
  1. package/README.md +100 -135
  2. package/dist/device/commands.d.ts +6 -1
  3. package/dist/device/commands.d.ts.map +1 -1
  4. package/dist/device/commands.js +19 -7
  5. package/dist/device/commands.js.map +1 -1
  6. package/dist/device/grant.d.ts +2 -1
  7. package/dist/device/grant.d.ts.map +1 -1
  8. package/dist/device/router.d.ts +2 -1
  9. package/dist/device/router.d.ts.map +1 -1
  10. package/dist/device/sandbox-rounds/keeper.js +1 -1
  11. package/dist/device/sandbox-rounds/keeper.js.map +1 -1
  12. package/dist/device/tools/agent.d.ts.map +1 -1
  13. package/dist/device/tools/agent.js +7 -7
  14. package/dist/device/tools/agent.js.map +1 -1
  15. package/dist/device/tools/ic-binary.d.ts +1 -0
  16. package/dist/device/tools/ic-binary.d.ts.map +1 -1
  17. package/dist/device/tools/ic-binary.js +29 -1
  18. package/dist/device/tools/ic-binary.js.map +1 -1
  19. package/dist/device/tools/os/settings.js +3 -3
  20. package/dist/device/tools/os/settings.js.map +1 -1
  21. package/dist/device/tools/sandboxes.d.ts +1 -0
  22. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  23. package/dist/device/tools/sandboxes.js +7 -2
  24. package/dist/device/tools/sandboxes.js.map +1 -1
  25. package/dist/install.d.ts +9 -1
  26. package/dist/install.d.ts.map +1 -1
  27. package/dist/install.js +28 -4
  28. package/dist/install.js.map +1 -1
  29. package/dist/resident/resident.d.ts.map +1 -1
  30. package/dist/resident/resident.js +1 -2
  31. package/dist/resident/resident.js.map +1 -1
  32. package/dist/status.d.ts.map +1 -1
  33. package/dist/status.js +1 -8
  34. package/dist/status.js.map +1 -1
  35. package/dist/sync/commands.d.ts +1 -9
  36. package/dist/sync/commands.d.ts.map +1 -1
  37. package/dist/sync/commands.js +48 -89
  38. package/dist/sync/commands.js.map +1 -1
  39. package/dist/sync/config.d.ts +21 -25
  40. package/dist/sync/config.d.ts.map +1 -1
  41. package/dist/sync/config.js +76 -35
  42. package/dist/sync/config.js.map +1 -1
  43. package/dist/sync/endpoint.d.ts +1 -1
  44. package/dist/sync/endpoint.d.ts.map +1 -1
  45. package/dist/sync/endpoint.js +2 -3
  46. package/dist/sync/endpoint.js.map +1 -1
  47. package/dist/sync/folders.d.ts.map +1 -1
  48. package/dist/sync/folders.js.map +1 -1
  49. package/dist/sync/gone-watch.d.ts +0 -1
  50. package/dist/sync/gone-watch.d.ts.map +1 -1
  51. package/dist/sync/gone-watch.js +16 -53
  52. package/dist/sync/gone-watch.js.map +1 -1
  53. package/dist/sync/holds.d.ts +30 -0
  54. package/dist/sync/holds.d.ts.map +1 -0
  55. package/dist/sync/holds.js +117 -0
  56. package/dist/sync/holds.js.map +1 -0
  57. package/dist/sync/low-disk.d.ts +2 -9
  58. package/dist/sync/low-disk.d.ts.map +1 -1
  59. package/dist/sync/low-disk.js +10 -38
  60. package/dist/sync/low-disk.js.map +1 -1
  61. package/dist/sync/mirror.d.ts +1 -4
  62. package/dist/sync/mirror.d.ts.map +1 -1
  63. package/dist/sync/mirror.js +57 -161
  64. package/dist/sync/mirror.js.map +1 -1
  65. package/dist/sync/mutagen-env.d.ts +1 -3
  66. package/dist/sync/mutagen-env.d.ts.map +1 -1
  67. package/dist/sync/mutagen-env.js +2 -12
  68. package/dist/sync/mutagen-env.js.map +1 -1
  69. package/dist/sync/mutagen-move.d.ts +3 -1
  70. package/dist/sync/mutagen-move.d.ts.map +1 -1
  71. package/dist/sync/mutagen-move.js +30 -22
  72. package/dist/sync/mutagen-move.js.map +1 -1
  73. package/dist/sync/mutagen.d.ts +4 -9
  74. package/dist/sync/mutagen.d.ts.map +1 -1
  75. package/dist/sync/mutagen.js +11 -71
  76. package/dist/sync/mutagen.js.map +1 -1
  77. package/dist/sync/project/project-commands.d.ts +0 -3
  78. package/dist/sync/project/project-commands.d.ts.map +1 -1
  79. package/dist/sync/project/project-commands.js +3 -2
  80. package/dist/sync/project/project-commands.js.map +1 -1
  81. package/dist/sync/project/project-delivery.d.ts.map +1 -1
  82. package/dist/sync/project/project-delivery.js +3 -3
  83. package/dist/sync/project/project-delivery.js.map +1 -1
  84. package/dist/sync/project/project-transfer.d.ts +4 -0
  85. package/dist/sync/project/project-transfer.d.ts.map +1 -1
  86. package/dist/sync/project/project-transfer.js +9 -2
  87. package/dist/sync/project/project-transfer.js.map +1 -1
  88. package/dist/sync/report.d.ts.map +1 -1
  89. package/dist/sync/report.js +16 -10
  90. package/dist/sync/report.js.map +1 -1
  91. package/dist/sync/retire.d.ts.map +1 -1
  92. package/dist/sync/retire.js +1 -2
  93. package/dist/sync/retire.js.map +1 -1
  94. package/dist/sync/tunnel.d.ts +4 -3
  95. package/dist/sync/tunnel.d.ts.map +1 -1
  96. package/dist/sync/tunnel.js +107 -42
  97. package/dist/sync/tunnel.js.map +1 -1
  98. package/dist/sync/uninstall.d.ts.map +1 -1
  99. package/dist/sync/uninstall.js +1 -1
  100. package/dist/sync/uninstall.js.map +1 -1
  101. package/dist/sync/wake.d.ts +3 -0
  102. package/dist/sync/wake.d.ts.map +1 -0
  103. package/dist/sync/wake.js +43 -0
  104. package/dist/sync/wake.js.map +1 -0
  105. package/package.json +9 -9
  106. package/dist/sync/attach-commands.d.ts +0 -39
  107. package/dist/sync/attach-commands.d.ts.map +0 -1
  108. package/dist/sync/attach-commands.js +0 -164
  109. package/dist/sync/attach-commands.js.map +0 -1
  110. package/dist/sync/swap-pause.d.ts +0 -10
  111. package/dist/sync/swap-pause.d.ts.map +0 -1
  112. package/dist/sync/swap-pause.js +0 -29
  113. package/dist/sync/swap-pause.js.map +0 -1
@@ -1,164 +0,0 @@
1
- import { rm } from "node:fs/promises";
2
- import { resolve } from "node:path";
3
- import { homeDir } from "@intentic/local-agent";
4
- import { isProjectDirName, projectRemoteDir } from "@intentic/sandbox-contract/ids/project-dir";
5
- import { buildCommand } from "../cli-ui.js";
6
- import { baseDir } from "../config.js";
7
- import { ensureResident } from "../resident/resident.js";
8
- import { attachedKey, isAttachedPairing, pairingKey, pairingTransport, readState, removePairing, updateState, withPairing } from "./config.js";
9
- import { transportFor } from "./endpoint.js";
10
- import { runProcess } from "./exec.js";
11
- import { canonicalFolder, folderRefusal, overlappingPairing, sameFolder } from "./folders.js";
12
- import { existingSyncSessions, MUTAGEN_CALL_TIMEOUT_MS, syncSessionNames } from "./mutagen.js";
13
- import { ensureMutagen } from "./binary/mutagen-binary.js";
14
- import { answer, projectPairingFor } from "./project/project-commands.js";
15
- import { assertFolder, listingRecordPath } from "./project/project-local.js";
16
- import { refuseAcrossPc } from "./siblings.js";
17
- import { pairingSshConfig, writeManagedSshConfig } from "./ssh.js";
18
- const hostOf = (url) => (URL.canParse(url) ? new URL(url).host.toLowerCase() : undefined);
19
- export const projectsHostFor = (pairings, sandboxUrl) => {
20
- const wanted = hostOf(sandboxUrl);
21
- return wanted === undefined ? undefined : pairings.find((pairing) => pairing.projectsHost === true && hostOf(pairing.sandboxUrl) === wanted);
22
- };
23
- const expandedFolder = (dir) => resolve(dir.replace(/^~(?=[\\/]|$)/, homeDir()));
24
- const asked = (ask) => {
25
- const missing = (value) => value === undefined || value.trim() === "";
26
- if (missing(ask.sandboxUrl)) {
27
- throw new Error("pass --sandbox (or --sandbox-url) with the address of this device's sandbox");
28
- }
29
- if (missing(ask.dir)) {
30
- throw new Error("pass --dir with the folder to attach");
31
- }
32
- if (missing(ask.name)) {
33
- throw new Error("pass --name with the folder's name in the sandbox (it becomes /work/<name>)");
34
- }
35
- return { sandboxUrl: ask.sandboxUrl ?? "", dir: ask.dir ?? "", name: ask.name ?? "" };
36
- };
37
- const refuseOverlap = async (folder, key, host, pairings) => {
38
- const clash = await overlappingPairing(folder, key, pairings);
39
- if (clash === undefined) {
40
- return;
41
- }
42
- throw new Error(clash.sandboxId === host.sandboxId && isAttachedPairing(clash)
43
- ? `${folder} overlaps ${clash.localDir}, which is already attached as ${clash.remoteDir ?? "a folder of this sandbox"}: one folder is one sync. Detach that one first, or pick a folder that neither is, holds nor sits inside it.`
44
- : `${folder} overlaps ${clash.localDir}, which already syncs with ${clash.sandboxId}: two syncs over one folder overwrite each other's files. Choose a folder that neither is, holds nor sits inside one this device syncs; intentic-machine status lists them.`);
45
- };
46
- export const planAttach = async (pairings, ask, seams = {}) => {
47
- const { sandboxUrl, dir, name } = asked(ask);
48
- const host = projectsHostFor(pairings, sandboxUrl);
49
- if (host === undefined) {
50
- throw new Error(`this device's sandbox is not set up for folders yet: no sandbox at ${sandboxUrl} was enrolled here as the sandbox folders attach to (sync setup --projects-host)`);
51
- }
52
- if (!isProjectDirName(name)) {
53
- throw new Error(`${JSON.stringify(name)} cannot name a folder in the sandbox: a name starts with a letter or digit, holds only letters, digits, ".", "_" and "-", is at most 64 characters, and is not one the sandbox keeps for itself`);
54
- }
55
- const wanted = expandedFolder(dir);
56
- await assertFolder(wanted);
57
- const folder = await canonicalFolder(wanted);
58
- const refusal = folderRefusal(folder, await canonicalFolder(seams.home ?? homeDir()));
59
- if (refusal !== undefined) {
60
- throw new Error(refusal);
61
- }
62
- const key = attachedKey(host.sandboxId, name);
63
- const remoteDir = projectRemoteDir(name);
64
- const sameName = pairings.find((pairing) => pairingKey(pairing) === key);
65
- if (sameName?.localDir !== undefined && !sameFolder(await canonicalFolder(sameName.localDir), folder)) {
66
- throw new Error(`${sameName.localDir} is already attached as ${remoteDir}; detach it first, or pick another name`);
67
- }
68
- await refuseOverlap(folder, key, host, pairings);
69
- const across = await refuseAcrossPc(wanted, seams.siblings);
70
- if (across.refusal !== undefined) {
71
- throw new Error(across.refusal);
72
- }
73
- const reach = await transportFor("auto", { project: true }, host.sandboxUrl, seams.locate);
74
- return {
75
- sandboxUrl: host.sandboxUrl,
76
- sandboxId: host.sandboxId,
77
- key,
78
- mode: "sync",
79
- ...(host.syncToken === undefined ? {} : { syncToken: host.syncToken }),
80
- localDir: wanted,
81
- remoteDir,
82
- project: true,
83
- direction: sameName?.direction ?? "to-sandbox",
84
- deliver: "auto",
85
- mirrorOff: host.mirrorOff,
86
- autoHealOff: sameName?.autoHealOff,
87
- transport: reach.transport,
88
- container: reach.container,
89
- };
90
- };
91
- export const attachFolder = async (ask, log, seams = {}) => {
92
- const pairing = await planAttach((await readState()).pairings, ask, seams);
93
- await updateState((state) => {
94
- const { syncToken: _oldToken, ...held } = state.pairings.find((candidate) => pairingKey(candidate) === pairingKey(pairing)) ?? {};
95
- return { pairings: withPairing(state.pairings, { ...held, ...pairing }) };
96
- });
97
- if (pairingTransport(pairing) === "ssh") {
98
- await writeManagedSshConfig(pairingSshConfig((await readState()).pairings));
99
- }
100
- await (seams.ensureAgent ?? (async (say) => await ensureResident(say)))(log);
101
- return { ok: true, pairing: pairingKey(pairing), remoteDir: pairing.remoteDir ?? "", folder: pairing.localDir ?? "" };
102
- };
103
- const terminateSessions = async (names) => {
104
- const mutagen = await ensureMutagen();
105
- const live = existingSyncSessions(mutagen, names);
106
- for (const batch of live === undefined ? names.map((name) => [name]) : live.length > 0 ? [live] : []) {
107
- await runProcess(mutagen, ["sync", "terminate", ...batch], { timeoutMs: MUTAGEN_CALL_TIMEOUT_MS });
108
- }
109
- };
110
- export const detachFolder = async (dir, stateDir, seams = {}) => {
111
- if (dir === undefined || dir.trim() === "") {
112
- throw new Error("pass --dir with the attached folder");
113
- }
114
- const pairing = await projectPairingFor((await readState()).pairings, dir);
115
- if (!isAttachedPairing(pairing)) {
116
- throw new Error(`${pairing.localDir} has a sandbox of its own (${pairing.sandboxId}) rather than being attached to this device's; unpair it with sync uninstall --sandbox ${pairing.sandboxId}`);
117
- }
118
- const key = pairingKey(pairing);
119
- await removePairing(key);
120
- await (seams.terminate ?? terminateSessions)(syncSessionNames(pairing));
121
- await rm(listingRecordPath(stateDir, key), { force: true });
122
- return { ok: true, pairing: key, folder: pairing.localDir };
123
- };
124
- const attach = buildCommand({
125
- docs: { brief: "Attach a folder to this computer's sandbox as /work/<name>: copied one way into it, landed work delivered back" },
126
- parameters: {
127
- flags: {
128
- sandboxUrl: {
129
- kind: "parsed",
130
- parse: String,
131
- optional: true,
132
- brief: "This computer's sandbox, as `sync setup --projects-host` enrolled it",
133
- },
134
- sandbox: { kind: "parsed", parse: String, optional: true, brief: "The same as --sandbox-url" },
135
- dir: { kind: "parsed", parse: String, optional: true, brief: "The folder to attach" },
136
- name: { kind: "parsed", parse: String, optional: true, brief: "Its name in the sandbox: it becomes /work/<name>" },
137
- json: { kind: "boolean", brief: "Print one JSON object, `ok` first (what the desktop app reads)" },
138
- },
139
- },
140
- async func(flags) {
141
- await answer(this, flags.json, async (ui) => await attachFolder({ ...flags, sandboxUrl: flags.sandboxUrl ?? flags.sandbox }, ui.note), (result, ui) => {
142
- ui.note("Its first copy into the sandbox starts within a few seconds. Landed work comes back into it by itself, a restore point first.");
143
- ui.done(`Attached ${result.folder} as ${result.remoteDir}.`);
144
- ui.later([["see when the copy is done", "intentic-machine status"]]);
145
- }, { doing: "Attaching the folder to this device's sandbox", failed: "The folder was not attached." });
146
- },
147
- });
148
- const detach = buildCommand({
149
- docs: { brief: "Detach a folder from this computer's sandbox; its restore points are kept" },
150
- parameters: {
151
- flags: {
152
- dir: { kind: "parsed", parse: String, optional: true, brief: "The attached folder" },
153
- json: { kind: "boolean", brief: "Print one JSON object, `ok` first (what the desktop app reads)" },
154
- },
155
- },
156
- async func(flags) {
157
- await answer(this, flags.json, async () => await detachFolder(flags.dir, baseDir), (result, ui) => {
158
- ui.note("It no longer syncs with the sandbox. Its restore points are kept.");
159
- ui.done(`Detached ${result.folder}.`);
160
- }, { doing: "Detaching the folder", failed: "The folder was not detached." });
161
- },
162
- });
163
- export const attachCommands = { attach, detach };
164
- //# sourceMappingURL=attach-commands.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attach-commands.js","sourceRoot":"","sources":["../../src/sync/attach-commands.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { SwapRecord } from "../device/sandbox-rounds/swap-records.js";
2
- import type { Pairing } from "./config.js";
3
- export declare const PROBATION_HOLD_MS: number;
4
- export declare const pairingSlugs: (sandboxUrl: string) => string[];
5
- export declare const recordOf: (pairing: Pairing, records: readonly SwapRecord[]) => SwapRecord | undefined;
6
- export declare const holdsSync: (record: SwapRecord | undefined, now: number, answering: boolean) => boolean;
7
- export declare const swapPauseStep: (pairing: Pairing, holds: boolean) => "pause" | "resume" | undefined;
8
- export declare const RELEASE_FORWARDS_MS: number;
9
- export declare const shouldReleaseForwards: (unreachableForMs: number, mirrored: number) => boolean;
10
- //# sourceMappingURL=swap-pause.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swap-pause.d.ts","sourceRoot":"","sources":["../../src/sync/swap-pause.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAU3C,eAAO,MAAM,iBAAiB,QAAc,CAAC;AAM7C,eAAO,MAAM,YAAY,eAAgB,MAAM,KAAG,MAAM,EAGvD,CAAC;AAGF,eAAO,MAAM,QAAQ,YAAa,OAAO,WAAW,SAAS,UAAU,EAAE,KAAG,UAAU,GAAG,SAGxF,CAAC;AAKF,eAAO,MAAM,SAAS,WAAY,UAAU,GAAG,SAAS,OAAO,MAAM,aAAa,OAAO,KAAG,OAQ3F,CAAC;AAIF,eAAO,MAAM,aAAa,YAAa,OAAO,SAAS,OAAO,KAAG,OAAO,GAAG,QAAQ,GAAG,SAKrF,CAAC;AAIF,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAE/C,eAAO,MAAM,qBAAqB,qBAAsB,MAAM,YAAY,MAAM,KAAG,OAAkE,CAAC"}
@@ -1,29 +0,0 @@
1
- import { sandboxIdFromUrl } from "@intentic/sandbox-contract/ids/hostnames";
2
- import { slugOfDaemonUrl } from "@intentic/sandbox-run/slug";
3
- export const PROBATION_HOLD_MS = 15 * 60_000;
4
- export const pairingSlugs = (sandboxUrl) => {
5
- const id = sandboxIdFromUrl(sandboxUrl);
6
- return [...new Set([slugOfDaemonUrl(sandboxUrl), id].filter((slug) => slug !== undefined && slug !== ""))];
7
- };
8
- export const recordOf = (pairing, records) => {
9
- const slugs = pairingSlugs(pairing.sandboxUrl);
10
- return records.find((record) => slugs.includes(record.slug));
11
- };
12
- export const holdsSync = (record, now, answering) => {
13
- if (record?.phase === undefined) {
14
- return false;
15
- }
16
- if (record.phase === "cutover") {
17
- return true;
18
- }
19
- return record.at === undefined || now - record.at < PROBATION_HOLD_MS || !answering;
20
- };
21
- export const swapPauseStep = (pairing, holds) => {
22
- if (holds && pairing.mode === "sync" && pairing.fileSyncSwapPaused !== true) {
23
- return "pause";
24
- }
25
- return !holds && pairing.fileSyncSwapPaused === true ? "resume" : undefined;
26
- };
27
- export const RELEASE_FORWARDS_MS = 10 * 60_000;
28
- export const shouldReleaseForwards = (unreachableForMs, mirrored) => unreachableForMs >= RELEASE_FORWARDS_MS && mirrored > 0;
29
- //# sourceMappingURL=swap-pause.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swap-pause.js","sourceRoot":"","sources":["../../src/sync/swap-pause.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAY7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,MAAM,CAAC;AAM7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAY,EAAE;IACzD,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/H,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAgB,EAAE,OAA8B,EAA0B,EAAE;IACjG,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAA8B,EAAE,GAAW,EAAE,SAAkB,EAAW,EAAE;IAClG,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC;AACxF,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,KAAc,EAAkC,EAAE;IAC9F,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAC1E,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,gBAAwB,EAAE,QAAgB,EAAW,EAAE,CAAC,gBAAgB,IAAI,mBAAmB,IAAI,QAAQ,GAAG,CAAC,CAAC"}