@cerbur/clutch-dsh-worktree 0.1.0 → 0.1.2
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 +34 -6
- package/lib/client/WorktreeModeAction.d.ts +4 -3
- package/lib/client/WorktreeModeAction.d.ts.map +1 -1
- package/lib/client/WorktreeModeAction.js +3 -3
- package/lib/client/WorktreeModeAction.js.map +1 -1
- package/lib/client/WorktreeSurface.d.ts +4 -3
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +146 -64
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/entry.d.ts +6 -0
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +5 -1
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +149 -0
- package/lib/client/locales.d.ts.map +1 -0
- package/lib/client/locales.js +148 -0
- package/lib/client/locales.js.map +1 -0
- package/lib/client/sidebar-overlay-geometry.js +1 -1
- package/lib/client/sidebar-overlay-geometry.js.map +1 -1
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +6 -5
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client/worktree-error-copy.d.ts +7 -0
- package/lib/client/worktree-error-copy.d.ts.map +1 -0
- package/lib/client/worktree-error-copy.js +44 -0
- package/lib/client/worktree-error-copy.js.map +1 -0
- package/lib/client/worktree-view.d.ts +1 -0
- package/lib/client/worktree-view.d.ts.map +1 -1
- package/lib/client/worktree-view.js +15 -5
- package/lib/client/worktree-view.js.map +1 -1
- package/lib/client.js +425 -98
- package/lib/client.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ English marketplace description:
|
|
|
14
14
|
- 搜索 Workspace,并从已有 local branch 创建新的 Git Worktree 和 branch;
|
|
15
15
|
- 在 Main 或指定 Worktree 下创建 Session,并直接打开新 Session;
|
|
16
16
|
- 查看 active、detached 和 repair 状态;
|
|
17
|
+
- 通过 active Worktree 的选项菜单移除 Worktree,并在确认弹窗中完成操作;
|
|
17
18
|
- 继续使用 DSH 原生的 Workspace rename/delete/reorder 和 Session 菜单、排序能力。
|
|
18
19
|
|
|
19
20
|
Worktree Session 仍属于原始 DSH Project/Workspace,因此切回原生 Project/Session 视角时仍可由 DSH 展示。插件不复制 Session 内容,也不修改消息、prompt、transcript 或历史记录。
|
|
@@ -58,16 +59,30 @@ pnpm dsh web
|
|
|
58
59
|
pnpm dsh plugin --profile web remove clutch-dsh-worktree
|
|
59
60
|
```
|
|
60
61
|
|
|
61
|
-
### 从
|
|
62
|
+
### 从 npm registry 安装
|
|
62
63
|
|
|
63
|
-
package
|
|
64
|
+
已发布的 package 可以直接通过 DSH CLI 安装:
|
|
64
65
|
|
|
65
66
|
```bash
|
|
67
|
+
dsh plugin --profile web add @cerbur/clutch-dsh-worktree
|
|
68
|
+
dsh web
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
如果使用的是 `deepseek-harness` 源码 checkout、系统没有独立的 `dsh` 命令,使用等价的转发形式:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
cd /path/to/deepseek-harness
|
|
66
75
|
pnpm dsh plugin --profile web add @cerbur/clutch-dsh-worktree
|
|
67
76
|
pnpm dsh web
|
|
68
77
|
```
|
|
69
78
|
|
|
70
|
-
|
|
79
|
+
安装前可以查看官方 npm registry 的当前发布版本:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm view @cerbur/clutch-dsh-worktree version --registry=https://registry.npmjs.org/
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
从本地 checkout 更新时,只需重新构建 package 并重启 DSH:
|
|
71
86
|
|
|
72
87
|
```bash
|
|
73
88
|
cd /path/to/clutch-dsh
|
|
@@ -91,15 +106,28 @@ pnpm dsh plugin --profile web remove @cerbur/clutch-dsh-worktree
|
|
|
91
106
|
2. 使用 Workspace 的 `+` 选择基线 local branch,填写新的 Worktree name;默认 branch 名为 `dsh/<8位随机串>`。
|
|
92
107
|
3. 使用 Main 旁边的 `+` 创建普通 DSH Session。
|
|
93
108
|
4. 使用 Worktree 旁边的 `+` 创建 cwd 指向该 Worktree 的 Session;插件完成关系绑定后打开它。
|
|
94
|
-
5. 观察 Worktree 的 ready、repair 或 detached
|
|
109
|
+
5. 观察 Worktree 的 ready、repair 或 detached 状态;active Worktree 的选项菜单提供 Remove Worktree 入口,Main 和 detached Worktree 不显示该选项。
|
|
95
110
|
|
|
96
111
|
Workspace 删除只删除 DSH 的 Workspace registration;其目录、Session、Git Worktree 和 plugin sidecar 会保留。
|
|
97
112
|
|
|
113
|
+
## 界面语言
|
|
114
|
+
|
|
115
|
+
Worktree mode 跟随 DSH 当前界面语言。语言选择和偏好持久化由 DSH 提供;插件不增加
|
|
116
|
+
独立的语言设置。当前插件随 DSH 提供中文和 English 文案,切换 DSH 语言后,Worktree
|
|
117
|
+
入口、Workspace/Worktree/Session 树、菜单、弹窗、状态和重试提示会同步切换。
|
|
118
|
+
|
|
119
|
+
Workspace、Session、branch、path 以及 DSH/Host 返回的原始错误信息保持原值,便于
|
|
120
|
+
诊断和继续使用 DSH 原生数据。
|
|
121
|
+
|
|
98
122
|
## 当前限制
|
|
99
123
|
|
|
100
124
|
DSH rc.8 的原生 `session.create` 不能同时接收 `workspaceId` 和独立 `cwd`。Worktree Session 因此先以 `cwd` 创建,再由插件保存关系,并在当前浏览器内投影 Workspace membership;这不会修改 DSH 源码或 Session metadata。需要 DSH 原生持久 attach 时,仍需 DSH 提供同时支持 Workspace 与独立 cwd 的 API。
|
|
101
125
|
|
|
102
|
-
如果 Connection、Gateway 或 Worktree 操作失败,界面会保留可重试的错误,不把失败伪装为空列表。删除 Worktree 不会删除 Session;detached 关系会保留,直到显式解绑。
|
|
126
|
+
如果 Connection、Gateway 或 Worktree 操作失败,界面会保留可重试的错误,不把失败伪装为空列表。删除 Worktree 不会删除 Session;detached 关系会保留,直到显式解绑。Main 与 Worktree 分组共用一个参数化 split-row;Main 使用相同的 branch/tree icon 和 action rail,但不传入 Worktree remove 菜单。
|
|
127
|
+
|
|
128
|
+
## 版本与发布
|
|
129
|
+
|
|
130
|
+
本地路径安装读取当前 checkout,npm 安装读取 registry;两者不是同一个安装来源。`packages/clutch-dsh-worktree/package.json` 的 `version` 是本地和 npm 的唯一版本源。不要在 README 或市场条目中复制当前版本号;发布修复或新功能时,先递增 package version,再通过 `prepack` 构建并发布新的 npm version。完整的版本同步、发布、registry 验证和本地/registry 安装流程见 [`docs/RELEASING.md`](docs/RELEASING.md)。
|
|
103
131
|
|
|
104
132
|
## 开发与验证
|
|
105
133
|
|
|
@@ -120,7 +148,7 @@ pnpm --filter @cerbur/clutch-dsh-worktree test
|
|
|
120
148
|
pnpm run check
|
|
121
149
|
```
|
|
122
150
|
|
|
123
|
-
维护者请先阅读 [AGENTS.md](AGENTS.md)
|
|
151
|
+
维护者请先阅读 [AGENTS.md](AGENTS.md) 了解数据边界、模块权责、生命周期和验证约束;发布流程见 [`docs/RELEASING.md`](docs/RELEASING.md);浏览器 Consumer 的实现说明位于 [`src/client/README.md`](src/client/README.md)。
|
|
124
152
|
|
|
125
153
|
## 插件市场条目建议
|
|
126
154
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type { PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
|
|
1
|
+
import type { PropsLocale, PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
|
|
2
|
+
import { WORKTREE_NS } from './locales.js';
|
|
2
3
|
import type { createWorktreeViewStore } from './view-mode-store.js';
|
|
3
4
|
/** Apply-time facts and callbacks owned by the Consumer entry. */
|
|
4
5
|
export interface WorktreeModeActionInjected {
|
|
5
6
|
readonly available: boolean;
|
|
6
7
|
}
|
|
7
8
|
/** Props derived from the footer slot, shared store, and injected availability face. */
|
|
8
|
-
export type WorktreeModeActionProps = PropsRuntime<'sidebar.footer.action'> & PropsStore<ReturnType<typeof createWorktreeViewStore>> & WorktreeModeActionInjected;
|
|
9
|
+
export type WorktreeModeActionProps = PropsRuntime<'sidebar.footer.action'> & PropsStore<ReturnType<typeof createWorktreeViewStore>> & PropsLocale<typeof WORKTREE_NS> & WorktreeModeActionInjected;
|
|
9
10
|
/** Footer action that enters/exits the peer Worktree navigation mode. */
|
|
10
|
-
export declare function WorktreeModeAction({ wide, useStore, actions, available, }: WorktreeModeActionProps): import("react").JSX.Element | null;
|
|
11
|
+
export declare function WorktreeModeAction({ wide, useStore, actions, t, available, }: WorktreeModeActionProps): import("react").JSX.Element | null;
|
|
11
12
|
//# sourceMappingURL=WorktreeModeAction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeModeAction.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeModeAction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"WorktreeModeAction.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeModeAction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAG9F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,kEAAkE;AAClE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,wFAAwF;AACxF,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC,uBAAuB,CAAC,GACzE,UAAU,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,GACtD,WAAW,CAAC,OAAO,WAAW,CAAC,GAC/B,0BAA0B,CAAC;AAE7B,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,CAAC,EACD,SAAS,GACV,EAAE,uBAAuB,sCAsBzB"}
|
|
@@ -2,13 +2,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { IconBranchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
3
|
import styles from './worktree.css';
|
|
4
4
|
/** Footer action that enters/exits the peer Worktree navigation mode. */
|
|
5
|
-
export function WorktreeModeAction({ wide, useStore, actions, available, }) {
|
|
5
|
+
export function WorktreeModeAction({ wide, useStore, actions, t, available, }) {
|
|
6
6
|
if (!available)
|
|
7
7
|
return null;
|
|
8
8
|
const mode = useStore((state) => state.viewMode);
|
|
9
9
|
const active = mode === 'worktree';
|
|
10
|
-
return (_jsxs("button", { type: "button", className: styles.action, "data-worktree-mode-action": true, "data-active": active || undefined, "data-collapsed": !wide || undefined, "aria-label": active ? '
|
|
10
|
+
return (_jsxs("button", { type: "button", className: styles.action, "data-worktree-mode-action": true, "data-active": active || undefined, "data-collapsed": !wide || undefined, "aria-label": active ? t('mode.exit') : t('mode.open'), "aria-pressed": active, title: active ? t('mode.exit') : t('mode.label'), onClick: () => {
|
|
11
11
|
actions.setViewMode(active ? 'workspace-session' : 'worktree');
|
|
12
|
-
}, children: [_jsx(IconBranchOutline16, { size: wide ? 16 : 18 }), wide && _jsx("span", { className: styles.actionLabel, children:
|
|
12
|
+
}, children: [_jsx(IconBranchOutline16, { size: wide ? 16 : 18 }), wide && _jsx("span", { className: styles.actionLabel, children: t('mode.label') })] }));
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=WorktreeModeAction.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeModeAction.js","sourceRoot":"","sources":["../../src/client/WorktreeModeAction.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"WorktreeModeAction.js","sourceRoot":"","sources":["../../src/client/WorktreeModeAction.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAG5E,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAapC,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,CAAC,EACD,SAAS,GACe;IACxB,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,KAAK,UAAU,CAAC;IACnC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,oDAEX,MAAM,IAAI,SAAS,oBAChB,CAAC,IAAI,IAAI,SAAS,gBACtB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,kBACtC,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAChD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC,aAED,KAAC,mBAAmB,IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAI,EAC5C,IAAI,IAAI,eAAM,SAAS,EAAE,MAAM,CAAC,WAAW,YAAG,CAAC,CAAC,YAAY,CAAC,GAAQ,IAC/D,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
|
|
1
|
+
import type { PropsLocale, PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
|
|
2
2
|
import type { WorktreeManager } from '../contract/index.js';
|
|
3
|
+
import { WORKTREE_NS } from './locales.js';
|
|
3
4
|
import type { createWorktreeViewStore } from './view-mode-store.js';
|
|
4
5
|
import { type CreateSessionForWorktreeInput } from './worktree-view.js';
|
|
5
6
|
/** Apply-time facts and DSH navigation callbacks used by the surface. */
|
|
@@ -24,10 +25,10 @@ export interface WorktreeSurfaceInjected {
|
|
|
24
25
|
readonly openSession: (sessionId: string) => void;
|
|
25
26
|
}
|
|
26
27
|
/** Props derived from the frame overlay slot, shared state, and injected face. */
|
|
27
|
-
export type WorktreeSurfaceProps = PropsRuntime<'shell.overlay'> & PropsStore<ReturnType<typeof createWorktreeViewStore>> & WorktreeSurfaceInjected;
|
|
28
|
+
export type WorktreeSurfaceProps = PropsRuntime<'shell.overlay'> & PropsStore<ReturnType<typeof createWorktreeViewStore>> & PropsLocale<typeof WORKTREE_NS> & WorktreeSurfaceInjected;
|
|
28
29
|
/**
|
|
29
30
|
* Peer Worktree navigation surface. It keeps the original DSH Workspace mode
|
|
30
31
|
* intact and renders a browser-local Workspace → Worktree → Session projection.
|
|
31
32
|
*/
|
|
32
|
-
export declare function WorktreeSurface({ useStore, actions, useSessions, useWorkspaces, available, manager, createWorkspace, createSessionForWorktree: createSessionCallback, createMainSession, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, insertSessionBefore, renameSession, forkSession, archiveSession, ensureSessionWorkspace, syncSessionWorkspaces, openSession, }: WorktreeSurfaceProps): import("react").JSX.Element | null;
|
|
33
|
+
export declare function WorktreeSurface({ useStore, actions, useSessions, useWorkspaces, t, available, manager, createWorkspace, createSessionForWorktree: createSessionCallback, createMainSession, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, insertSessionBefore, renameSession, forkSession, archiveSession, ensureSessionWorkspace, syncSessionWorkspaces, openSession, }: WorktreeSurfaceProps): import("react").JSX.Element | null;
|
|
33
34
|
//# sourceMappingURL=WorktreeSurface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeSurface.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeSurface.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"WorktreeSurface.d.ts","sourceRoot":"","sources":["../../src/client/WorktreeSurface.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EAEX,MAAM,kCAAkC,CAAC;AAsB1C,OAAO,KAAK,EAAkB,eAAe,EAAkB,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EASL,KAAK,6BAA6B,EAGnC,MAAM,oBAAoB,CAAC;AAmB5B,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAClC,KAAK,EAAE,6BAA6B,KACjC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAC/B,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,KACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAC/B,QAAQ,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,KAC5D,IAAI,CAAC;IACV,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,kFAAkF;AAClF,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,eAAe,CAAC,GAC9D,UAAU,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,GACtD,WAAW,CAAC,OAAO,WAAW,CAAC,GAC/B,uBAAuB,CAAC;AA4oB1B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,EACP,WAAW,EACX,aAAa,EACb,CAAC,EACD,SAAS,EACT,OAAO,EACP,eAAe,EACf,wBAAwB,EAAE,qBAAqB,EAC/C,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,GACZ,EAAE,oBAAoB,sCAwpCtB"}
|