dmux 3.3.1 → 3.5.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/dist/actions/implementations/closeAction.d.ts.map +1 -1
- package/dist/actions/implementations/closeAction.js +22 -6
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/implementations/mergeAction.d.ts +3 -1
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
- package/dist/actions/implementations/mergeAction.js +38 -4
- package/dist/actions/implementations/mergeAction.js.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.d.ts +22 -0
- package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -0
- package/dist/actions/merge/multiMergeOrchestrator.js +452 -0
- package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -0
- package/dist/actions/merge/types.d.ts +62 -0
- package/dist/actions/merge/types.d.ts.map +1 -0
- package/dist/actions/merge/types.js +7 -0
- package/dist/actions/merge/types.js.map +1 -0
- package/dist/chunks/styles.css_vue_type_style_index_0_src_true_lang-pW5mq51o.js +17 -0
- package/dist/components/popups/logsPopup.js +33 -17
- package/dist/components/popups/logsPopup.js.map +1 -1
- package/dist/dashboard.html +2 -2
- package/dist/dashboard.js +2 -2
- package/dist/hooks/useLayoutManagement.d.ts.map +1 -1
- package/dist/hooks/useLayoutManagement.js +43 -14
- package/dist/hooks/useLayoutManagement.js.map +1 -1
- package/dist/hooks/usePaneLoading.d.ts +3 -0
- package/dist/hooks/usePaneLoading.d.ts.map +1 -1
- package/dist/hooks/usePaneLoading.js +21 -1
- package/dist/hooks/usePaneLoading.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +3 -0
- package/dist/hooks/usePaneSync.d.ts.map +1 -1
- package/dist/hooks/usePaneSync.js +11 -0
- package/dist/hooks/usePaneSync.js.map +1 -1
- package/dist/layout/TmuxLayoutApplier.d.ts.map +1 -1
- package/dist/layout/TmuxLayoutApplier.js +4 -9
- package/dist/layout/TmuxLayoutApplier.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +26 -37
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/services/PaneAnalyzer.d.ts +12 -3
- package/dist/services/PaneAnalyzer.d.ts.map +1 -1
- package/dist/services/PaneAnalyzer.js +57 -8
- package/dist/services/PaneAnalyzer.js.map +1 -1
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +7 -1
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/StatusDetector.d.ts.map +1 -1
- package/dist/services/StatusDetector.js +28 -9
- package/dist/services/StatusDetector.js.map +1 -1
- package/dist/services/TmuxService.d.ts +9 -3
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +12 -3
- package/dist/services/TmuxService.js.map +1 -1
- package/dist/terminal.html +2 -2
- package/dist/terminal.js +3 -3
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/layoutManager.d.ts.map +1 -1
- package/dist/utils/layoutManager.js +226 -202
- package/dist/utils/layoutManager.js.map +1 -1
- package/dist/utils/worktreeDiscovery.d.ts +39 -0
- package/dist/utils/worktreeDiscovery.d.ts.map +1 -0
- package/dist/utils/worktreeDiscovery.js +241 -0
- package/dist/utils/worktreeDiscovery.js.map +1 -0
- package/package.json +7 -7
- package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +0 -28
- /package/dist/{_plugin-vue_export-helper.css → styles.css} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeAction.d.ts","sourceRoot":"","sources":["../../../src/actions/implementations/closeAction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"closeAction.d.ts","sourceRoot":"","sources":["../../../src/actions/implementations/closeAction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAO7E;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAsCvB"}
|
|
@@ -5,6 +5,7 @@ import { execSync } from 'child_process';
|
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import { StateManager } from '../../shared/StateManager.js';
|
|
8
|
+
import { PaneLifecycleManager } from '../../services/PaneLifecycleManager.js';
|
|
8
9
|
import { triggerHook } from '../../utils/hooks.js';
|
|
9
10
|
import { LogService } from '../../services/LogService.js';
|
|
10
11
|
import { TMUX_SPLIT_DELAY } from '../../constants/timing.js';
|
|
@@ -54,7 +55,13 @@ export async function closePane(pane, context) {
|
|
|
54
55
|
async function executeCloseOption(pane, context, option) {
|
|
55
56
|
console.error(`[closeAction] executeCloseOption called for pane ${pane.id} (slug: ${pane.slug}) with option: ${option}`);
|
|
56
57
|
console.error(`[closeAction] Context has ${context.panes.length} panes: ${context.panes.map(p => p.id).join(', ')}`);
|
|
58
|
+
const lifecycleManager = PaneLifecycleManager.getInstance();
|
|
57
59
|
try {
|
|
60
|
+
// CRITICAL: Mark pane as closing FIRST to prevent race condition with polling
|
|
61
|
+
// This prevents usePanes from recreating the pane while we're closing it
|
|
62
|
+
await lifecycleManager.beginClose(pane.id, `close action: ${option}`);
|
|
63
|
+
// Also mark by paneId in case polling checks that
|
|
64
|
+
await lifecycleManager.beginClose(pane.paneId, `close action: ${option}`);
|
|
58
65
|
// Get project root for hooks
|
|
59
66
|
const state = StateManager.getInstance().getState();
|
|
60
67
|
const projectRoot = state.projectRoot || process.cwd();
|
|
@@ -64,7 +71,14 @@ async function executeCloseOption(pane, context, option) {
|
|
|
64
71
|
// the watcher reloads the pane list from disk before our save completes
|
|
65
72
|
StateManager.getInstance().pauseConfigWatcher();
|
|
66
73
|
try {
|
|
67
|
-
//
|
|
74
|
+
// CRITICAL: Remove from config FIRST, before killing tmux pane
|
|
75
|
+
// This prevents the race condition where polling detects "missing" pane
|
|
76
|
+
// and recreates it before we finish closing
|
|
77
|
+
const updatedPanes = context.panes.filter(p => p.id !== pane.id);
|
|
78
|
+
console.error(`[closeAction] Removing pane ${pane.id} from config FIRST, result: ${updatedPanes.length} panes`);
|
|
79
|
+
await context.savePanes(updatedPanes);
|
|
80
|
+
console.error(`[closeAction] Config saved, now killing tmux pane`);
|
|
81
|
+
// NOW kill the tmux pane (after config is updated)
|
|
68
82
|
try {
|
|
69
83
|
// First, try to kill any running process in the pane (like Claude)
|
|
70
84
|
try {
|
|
@@ -127,11 +141,6 @@ async function executeCloseOption(pane, context, option) {
|
|
|
127
141
|
}
|
|
128
142
|
}
|
|
129
143
|
}
|
|
130
|
-
// Remove from panes list
|
|
131
|
-
const updatedPanes = context.panes.filter(p => p.id !== pane.id);
|
|
132
|
-
console.error(`[closeAction] Filtering pane ${pane.id} from context.panes, result: ${updatedPanes.length} panes`);
|
|
133
|
-
await context.savePanes(updatedPanes);
|
|
134
|
-
console.error(`[closeAction] Panes saved successfully`);
|
|
135
144
|
if (context.onPaneRemove) {
|
|
136
145
|
context.onPaneRemove(pane.paneId); // Pass tmux pane ID, not dmux ID
|
|
137
146
|
}
|
|
@@ -181,6 +190,10 @@ async function executeCloseOption(pane, context, option) {
|
|
|
181
190
|
finally {
|
|
182
191
|
// CRITICAL: Always resume watcher, even if there was an error
|
|
183
192
|
StateManager.getInstance().resumeConfigWatcher();
|
|
193
|
+
// Complete the lifecycle close (releases lock)
|
|
194
|
+
// Do this AFTER resume to ensure the config is stable
|
|
195
|
+
await lifecycleManager.completeClose(pane.id);
|
|
196
|
+
await lifecycleManager.completeClose(pane.paneId);
|
|
184
197
|
}
|
|
185
198
|
}
|
|
186
199
|
catch (error) {
|
|
@@ -191,6 +204,9 @@ async function executeCloseOption(pane, context, option) {
|
|
|
191
204
|
execSync('tmux refresh-client', { stdio: 'pipe' });
|
|
192
205
|
}
|
|
193
206
|
catch { }
|
|
207
|
+
// Release lifecycle lock on error
|
|
208
|
+
await lifecycleManager.completeClose(pane.id);
|
|
209
|
+
await lifecycleManager.completeClose(pane.paneId);
|
|
194
210
|
return {
|
|
195
211
|
type: 'error',
|
|
196
212
|
message: `Failed to close pane: ${error}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeAction.js","sourceRoot":"","sources":["../../../src/actions/implementations/closeAction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAc,EACd,OAAsB;IAEtB,mEAAmE;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,sCAAsC;IACtC,MAAM,OAAO,GAAmB;QAC9B;YACE,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,0BAA0B;YACvC,OAAO,EAAE,IAAI;SACd;QACD;YACE,EAAE,EAAE,gBAAgB;YACpB,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE,iCAAiC;YAC9C,MAAM,EAAE,IAAI;SACb;QACD;YACE,EAAE,EAAE,mBAAmB;YACvB,KAAK,EAAE,6BAA6B;YACpC,WAAW,EAAE,mCAAmC;YAChD,MAAM,EAAE,IAAI;SACb;KACF,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,6BAA6B,IAAI,CAAC,IAAI,IAAI;QACnD,OAAO;QACP,QAAQ,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;YACnC,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;QACD,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAc,EACd,OAAsB,EACtB,MAAc;IAEd,OAAO,CAAC,KAAK,CAAC,oDAAoD,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,IAAI,kBAAkB,MAAM,EAAE,CAAC,CAAC;IACzH,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,KAAK,CAAC,MAAM,WAAW,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErH,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAEvD,iCAAiC;QACjC,MAAM,WAAW,CAAC,mBAAmB,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAE1D,gEAAgE;QAChE,wEAAwE;QACxE,YAAY,CAAC,WAAW,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAEhD,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"closeAction.js","sourceRoot":"","sources":["../../../src/actions/implementations/closeAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
* MERGE Action - Merge a worktree into the main branch with comprehensive pre-checks
|
|
3
3
|
*
|
|
4
4
|
* This is the simplified orchestrator that delegates to specialized modules.
|
|
5
|
+
* Supports multi-merge: detects sub-worktrees and merges them all sequentially.
|
|
5
6
|
*/
|
|
6
7
|
import type { DmuxPane } from '../../types.js';
|
|
7
8
|
import type { ActionResult, ActionContext } from '../types.js';
|
|
8
9
|
/**
|
|
9
|
-
* Merge a worktree into the main branch with comprehensive pre-checks
|
|
10
|
+
* Merge a worktree into the main branch with comprehensive pre-checks.
|
|
11
|
+
* Supports multi-merge: if sub-worktrees exist, merges all of them sequentially.
|
|
10
12
|
*/
|
|
11
13
|
export declare function mergePane(pane: DmuxPane, context: ActionContext, params?: {
|
|
12
14
|
mainBranch?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeAction.d.ts","sourceRoot":"","sources":["../../../src/actions/implementations/mergeAction.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mergeAction.d.ts","sourceRoot":"","sources":["../../../src/actions/implementations/mergeAction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU/D;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,YAAY,CAAC,CA4CvB"}
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
* MERGE Action - Merge a worktree into the main branch with comprehensive pre-checks
|
|
3
3
|
*
|
|
4
4
|
* This is the simplified orchestrator that delegates to specialized modules.
|
|
5
|
+
* Supports multi-merge: detects sub-worktrees and merges them all sequentially.
|
|
5
6
|
*/
|
|
6
7
|
import { triggerHook } from '../../utils/hooks.js';
|
|
7
8
|
import { executeMerge } from '../merge/mergeExecution.js';
|
|
8
9
|
import { handleNothingToMerge, handleMainDirty, handleWorktreeUncommitted, handleMergeConflict, } from '../merge/issueHandlers/index.js';
|
|
9
10
|
/**
|
|
10
|
-
* Merge a worktree into the main branch with comprehensive pre-checks
|
|
11
|
+
* Merge a worktree into the main branch with comprehensive pre-checks.
|
|
12
|
+
* Supports multi-merge: if sub-worktrees exist, merges all of them sequentially.
|
|
11
13
|
*/
|
|
12
14
|
export async function mergePane(pane, context, params) {
|
|
13
15
|
// 1. Validation
|
|
@@ -18,15 +20,47 @@ export async function mergePane(pane, context, params) {
|
|
|
18
20
|
dismissable: true,
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
|
-
// 2.
|
|
23
|
+
// 2. Detect all worktrees (including sub-worktrees created by hooks)
|
|
24
|
+
const { detectAllWorktrees } = await import('../../utils/worktreeDiscovery.js');
|
|
25
|
+
const worktrees = detectAllWorktrees(pane.worktreePath);
|
|
26
|
+
console.error(`[mergeAction] Detected ${worktrees.length} worktree(s) in ${pane.worktreePath}`);
|
|
27
|
+
for (const wt of worktrees) {
|
|
28
|
+
console.error(`[mergeAction] - ${wt.repoName} (${wt.branch}) at ${wt.relativePath} [depth=${wt.depth}, isRoot=${wt.isRoot}]`);
|
|
29
|
+
}
|
|
30
|
+
// 3. Build merge queue (only worktrees with changes)
|
|
31
|
+
const { buildMergeQueue, executeMultiMerge } = await import('../merge/multiMergeOrchestrator.js');
|
|
32
|
+
const queue = await buildMergeQueue(worktrees);
|
|
33
|
+
console.error(`[mergeAction] Merge queue has ${queue.length} item(s)`);
|
|
34
|
+
// 4. Handle based on queue size
|
|
35
|
+
// No changes anywhere
|
|
36
|
+
if (queue.length === 0) {
|
|
37
|
+
return {
|
|
38
|
+
type: 'info',
|
|
39
|
+
message: 'No changes to merge in any repository',
|
|
40
|
+
dismissable: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Single root worktree = use existing flow (backwards compatible)
|
|
44
|
+
if (queue.length === 1 && queue[0].worktree.isRoot) {
|
|
45
|
+
console.error('[mergeAction] Single root worktree - using existing flow');
|
|
46
|
+
return executeSingleRootMerge(pane, context, params);
|
|
47
|
+
}
|
|
48
|
+
// Multiple worktrees or only sub-worktrees = use multi-merge flow
|
|
49
|
+
console.error('[mergeAction] Multiple worktrees or sub-worktrees - using multi-merge flow');
|
|
50
|
+
return executeMultiMerge(pane, context, queue);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Execute single root worktree merge (original flow, backwards compatible)
|
|
54
|
+
*/
|
|
55
|
+
async function executeSingleRootMerge(pane, context, params) {
|
|
22
56
|
const { validateMerge } = await import('../../utils/mergeValidation.js');
|
|
23
57
|
const mainRepoPath = pane.worktreePath.replace(/\/\.dmux\/worktrees\/[^/]+$/, '');
|
|
24
58
|
const validation = validateMerge(mainRepoPath, pane.worktreePath, pane.slug);
|
|
25
|
-
//
|
|
59
|
+
// Handle detected issues
|
|
26
60
|
if (!validation.canMerge) {
|
|
27
61
|
return handleMergeIssues(pane, context, validation, mainRepoPath);
|
|
28
62
|
}
|
|
29
|
-
//
|
|
63
|
+
// No issues detected, proceed with merge confirmation
|
|
30
64
|
return {
|
|
31
65
|
type: 'confirm',
|
|
32
66
|
title: 'Merge Worktree',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeAction.js","sourceRoot":"","sources":["../../../src/actions/implementations/mergeAction.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mergeAction.js","sourceRoot":"","sources":["../../../src/actions/implementations/mergeAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Merge Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates merging multiple worktrees in sequence with proper
|
|
5
|
+
* dialog handling and error recovery.
|
|
6
|
+
*/
|
|
7
|
+
import type { ActionResult, ActionContext } from '../types.js';
|
|
8
|
+
import type { DmuxPane } from '../../types.js';
|
|
9
|
+
import type { WorktreeInfo, MergeQueueItem } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Build the merge queue from detected worktrees
|
|
12
|
+
* - Runs validation on each worktree
|
|
13
|
+
* - Filters to only those with changes to merge
|
|
14
|
+
* - Already sorted by depth (deepest first from detectAllWorktrees)
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildMergeQueue(worktrees: WorktreeInfo[]): Promise<MergeQueueItem[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute multi-merge with sequential dialogs
|
|
19
|
+
* Returns ActionResult that chains through each merge
|
|
20
|
+
*/
|
|
21
|
+
export declare function executeMultiMerge(pane: DmuxPane, context: ActionContext, queue: MergeQueueItem[]): Promise<ActionResult>;
|
|
22
|
+
//# sourceMappingURL=multiMergeOrchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiMergeOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/actions/merge/multiMergeOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAIjF;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CA0B3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,YAAY,CAAC,CAGvB"}
|