@linxin666/dsh-client-ui-skin-center 0.3.24 → 0.4.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.i18n.yaml +2 -2
- package/README.md +4 -3
- package/README.zh.md +4 -3
- package/contracts/README.md +8 -3
- package/contracts/official-tokens-v1.json +23 -2
- package/contracts/semantic-attrs-v1.md +9 -18
- package/icon.svg +3 -0
- package/lib/client.js +322 -157
- package/lib/client.js.map +1 -1
- package/lib/index.js +245 -151
- package/package.json +34 -23
- package/skins/blue-fantasy/patches.css +12 -6
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# node scripts/verify-docs.mjs --write <dir>
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: 8b34505d28cb73c142cf095bde313a15a25ca9d5
|
|
6
|
+
README.zh.md: a160ba8c5e3e0e6650284ec86be989b2586c3c78
|
package/README.md
CHANGED
|
@@ -30,9 +30,10 @@ skin-center is a self-contained bundle meeting the official DSH plugin standard
|
|
|
30
30
|
|
|
31
31
|
- **Enable switch**: turns the whole card (try-on / apply / background controls) on or off; persisted in the v2 active-state document.
|
|
32
32
|
- **Background sliders**: occlusion (0–100%), two backdrop blur radii, input-card blur (0–20 px), and bubble opacity (0–100%); persisted in the same v2 document.
|
|
33
|
-
- **Background persistence (remote-capable)**: background values live in the v2 active-state document (`$DSH_HOME/skin-center-active.json`, the `background` section) and are read/written through `GET|POST /api/skin-center/v2/active`, so paired remote desktops — where the settings
|
|
34
|
-
- **Wallpaper panel**: library folders, selection, render mode (live / static frame), dim, blur, pause-on-hidden, sound toggle and volume; persisted in the `skin-wallpaper`
|
|
35
|
-
- **Custom theme**: light/dark accent, background, foreground and contrast profiles plus the applied marker; persisted as a versioned contract in the
|
|
33
|
+
- **Background persistence (remote-capable)**: background values live in the v2 active-state document (`$DSH_HOME/skin-center-active.json`, the `background` section) and are read/written through `GET|POST /api/skin-center/v2/active`, so paired remote desktops — where the settings surface is loopback-only — load and keep them across sessions. The `skin-background` section of the plugin's own configuration stays as the settings page's input face: a customized section is migrated into the v2 store once at boot, and later page edits are forwarded by the client. Card edits do not write back to that page, so it may show stale values until its next edit.
|
|
34
|
+
- **Wallpaper panel**: library folders, selection, render mode (live / static frame), dim, blur, pause-on-hidden, sound toggle and volume; persisted in the `skin-wallpaper` section of the plugin's own configuration.
|
|
35
|
+
- **Custom theme**: light/dark accent, background, foreground and contrast profiles plus the applied marker; persisted as a versioned contract in the `skin-custom-theme` section of the plugin's own configuration. Wallpaper selection and rendering remain owned by `skin-wallpaper`.
|
|
36
|
+
- **Where these settings live**: the three sections are one plugin configuration — the profile entry's own `Config`. The Host derives that entry's settings page from the schema in the GUI, and the card writes the same values; there is no separate settings document.
|
|
36
37
|
- **User skin directory**: `$DSH_HOME/skins/<id>/`; override precedence is `DSH_SKINS_HOME`, then `DSH_SKINS_DIR`, then `$DSH_HOME/skins`.
|
|
37
38
|
|
|
38
39
|
## Security model
|
package/README.zh.md
CHANGED
|
@@ -30,9 +30,10 @@ dsh plugin --profile web add @linxin666/dsh-client-ui-skin-center
|
|
|
30
30
|
|
|
31
31
|
- **总开关**:开关整张卡片(试穿 / 应用 / 背景控制);持久化在 v2 活跃状态文档中。
|
|
32
32
|
- **背景滑杆**:遮蔽(0–100%)、两个背景模糊半径、输入卡模糊(0–20 px)与气泡不透明度(0–100%),持久化在同一 v2 文档中。
|
|
33
|
-
- **背景持久化(支持远程)**:背景设置存放在 v2 活跃状态文档(`$DSH_HOME/skin-center-active.json` 的 `background` 段),经 `GET|POST /api/skin-center/v2/active` 读写,因此已配对的远程桌面(settings
|
|
34
|
-
- **壁纸面板**:媒体库文件夹、选择、渲染模式(实时 /
|
|
35
|
-
-
|
|
33
|
+
- **背景持久化(支持远程)**:背景设置存放在 v2 活跃状态文档(`$DSH_HOME/skin-center-active.json` 的 `background` 段),经 `GET|POST /api/skin-center/v2/active` 读写,因此已配对的远程桌面(settings 通道仅限本机回环)也能读取并跨会话保存。插件自身配置中的 `skin-background` 段保留为设置页的输入面:已定制的配置在启动时一次性迁移进 v2 存储,之后的设置页修改由客户端转发。卡片内的修改不回写该设置页,因此它可能显示旧值,直到下一次从设置页修改。
|
|
34
|
+
- **壁纸面板**:媒体库文件夹、选择、渲染模式(实时 / 静态帧)、压暗、模糊、隐藏时暂停、声音开关与音量;持久化在插件自身配置的 `skin-wallpaper` 段。
|
|
35
|
+
- **自定义主题**:浅色/深色的强调色、背景色、前景色、对比度配置及应用标记,以版本化契约持久化在插件自身配置的 `skin-custom-theme` 段;壁纸选择与渲染仍完全由 `skin-wallpaper` 负责。
|
|
36
|
+
- **这些设置放在哪里**:以上三段同属一份插件配置——该 profile 条目自己的 `Config`。宿主据此 schema 在 GUI 中生成该条目的设置页,卡片写入的是同一批值;不存在单独的 settings 文档。
|
|
36
37
|
- **用户皮肤目录**:`$DSH_HOME/skins/<id>/`;覆盖优先级为 `DSH_SKINS_HOME`、`DSH_SKINS_DIR`、`$DSH_HOME/skins`。
|
|
37
38
|
|
|
38
39
|
## 安全模型
|
package/contracts/README.md
CHANGED
|
@@ -68,13 +68,18 @@ Locally dropped or third-party skin directories never run hooks unless their exe
|
|
|
68
68
|
## Automatic token fallbacks
|
|
69
69
|
|
|
70
70
|
The loader ships `official-tokens-v1.json`: a snapshot of every `--dsw-*`
|
|
71
|
-
custom property the official
|
|
71
|
+
custom property the official surface publishes (static palette excluded),
|
|
72
72
|
regenerated by `scripts/official-tokens-snapshot.mjs` when the official
|
|
73
|
-
frontend moves.
|
|
73
|
+
frontend moves. Since 0.1.7-alpha.2 the surface comes from two installed
|
|
74
|
+
packages - `@deepseek-ai/dsh-client-ui-theme` (`lib/`) plus
|
|
75
|
+
`@deepseek-ai/dsh-web-frontend` (`dist/assets/`) - and the script records the
|
|
76
|
+
exact scanned roots in the `source` field; pass explicit paths to snapshot an
|
|
77
|
+
unpacked release instead. For a token a skin does NOT remap, the loader derives a
|
|
74
78
|
translucent tint of the skin's own palette via `color-mix()` - the skin's
|
|
75
79
|
main color softly blurred over the surface - so new official surfaces keep
|
|
76
80
|
the skin's look instead of snapping back to the stock palette. Semantic and
|
|
77
|
-
structural groups (buttons,
|
|
81
|
+
structural groups (buttons, state colors named `state`/`error`/`warning`/
|
|
82
|
+
`success`/`danger`/`info`/`caution`, masks, shadows, inverted labels, fonts)
|
|
78
83
|
are never derived, tokens the skin defines are never overridden, and skins
|
|
79
84
|
defining no anchor for a group get no fallback. The derivation is text-only
|
|
80
85
|
and resolves through the skin's own remap, so it stays theme-aware (light
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://schemas.linxin666.org/dsh-skin/official-tokens-v1.json",
|
|
3
3
|
"contractVersion": 1,
|
|
4
|
-
"source": "official @deepseek-ai/dsh-web-frontend dist
|
|
4
|
+
"source": "official surfaces: @deepseek-ai/dsh-client-ui-theme@0.1.7-rc.1 lib + @deepseek-ai/dsh-web-frontend@0.1.7-rc.1 dist/assets",
|
|
5
5
|
"excludedPrefix": "--dsw-static-",
|
|
6
|
-
"count":
|
|
6
|
+
"count": 299,
|
|
7
7
|
"tokens": [
|
|
8
8
|
"--dsw-alias-bg-base",
|
|
9
|
+
"--dsw-alias-bg-document-preview",
|
|
9
10
|
"--dsw-alias-bg-layer-1",
|
|
10
11
|
"--dsw-alias-bg-layer-2",
|
|
11
12
|
"--dsw-alias-bg-layer-3",
|
|
13
|
+
"--dsw-alias-bg-layer-4",
|
|
12
14
|
"--dsw-alias-bg-mask-1",
|
|
13
15
|
"--dsw-alias-bg-mask-2",
|
|
14
16
|
"--dsw-alias-bg-mask-3",
|
|
@@ -44,6 +46,14 @@
|
|
|
44
46
|
"--dsw-alias-button-tool-bar-fill",
|
|
45
47
|
"--dsw-alias-button-tool-bar-fill-invisible",
|
|
46
48
|
"--dsw-alias-button-tool-bar-hover",
|
|
49
|
+
"--dsw-alias-code-diff-added",
|
|
50
|
+
"--dsw-alias-code-diff-deleted",
|
|
51
|
+
"--dsw-alias-file-diff-added-bg",
|
|
52
|
+
"--dsw-alias-file-diff-added-gutter",
|
|
53
|
+
"--dsw-alias-file-diff-added-marker",
|
|
54
|
+
"--dsw-alias-file-diff-deleted-bg",
|
|
55
|
+
"--dsw-alias-file-diff-deleted-gutter",
|
|
56
|
+
"--dsw-alias-file-diff-deleted-marker",
|
|
47
57
|
"--dsw-alias-interactive-bg-active",
|
|
48
58
|
"--dsw-alias-interactive-bg-hover",
|
|
49
59
|
"--dsw-alias-interactive-bg-hover-accent",
|
|
@@ -51,6 +61,8 @@
|
|
|
51
61
|
"--dsw-alias-interactive-bg-hover-solid",
|
|
52
62
|
"--dsw-alias-label-caption",
|
|
53
63
|
"--dsw-alias-label-dimmed",
|
|
64
|
+
"--dsw-alias-label-document-preview",
|
|
65
|
+
"--dsw-alias-label-error",
|
|
54
66
|
"--dsw-alias-label-primary",
|
|
55
67
|
"--dsw-alias-label-primary-bluish",
|
|
56
68
|
"--dsw-alias-label-primary-dimmed",
|
|
@@ -58,6 +70,7 @@
|
|
|
58
70
|
"--dsw-alias-label-primary-inverted",
|
|
59
71
|
"--dsw-alias-label-secondary",
|
|
60
72
|
"--dsw-alias-label-tertiary",
|
|
73
|
+
"--dsw-alias-link",
|
|
61
74
|
"--dsw-alias-markdown-citation",
|
|
62
75
|
"--dsw-alias-markdown-code-block",
|
|
63
76
|
"--dsw-alias-markdown-code-block-banner",
|
|
@@ -74,6 +87,7 @@
|
|
|
74
87
|
"--dsw-alias-state-business-tertiary",
|
|
75
88
|
"--dsw-alias-state-error-primary",
|
|
76
89
|
"--dsw-alias-state-error-secondary",
|
|
90
|
+
"--dsw-alias-state-idle-primary",
|
|
77
91
|
"--dsw-alias-state-success-primary",
|
|
78
92
|
"--dsw-alias-state-success-secondary",
|
|
79
93
|
"--dsw-alias-state-success-tertiary",
|
|
@@ -83,6 +97,12 @@
|
|
|
83
97
|
"--dsw-alias-state-warn-tertiary",
|
|
84
98
|
"--dsw-alias-toast-bg",
|
|
85
99
|
"--dsw-alias-tooltip-bg",
|
|
100
|
+
"--dsw-corner-shape",
|
|
101
|
+
"--dsw-elevation-panel",
|
|
102
|
+
"--dsw-elevation-prominent",
|
|
103
|
+
"--dsw-elevation-soft",
|
|
104
|
+
"--dsw-elevation-stroke",
|
|
105
|
+
"--dsw-elevation-stroke-color",
|
|
86
106
|
"--dsw-font-base-16",
|
|
87
107
|
"--dsw-font-base-16-font-family",
|
|
88
108
|
"--dsw-font-base-16-font-size",
|
|
@@ -268,6 +288,7 @@
|
|
|
268
288
|
"--dsw-linear-gradient-think",
|
|
269
289
|
"--dsw-linear-think-select",
|
|
270
290
|
"--dsw-mask-blur",
|
|
291
|
+
"--dsw-menu-backdrop-filter",
|
|
271
292
|
"--dsw-shadow-lv1",
|
|
272
293
|
"--dsw-shadow-lv1-blur",
|
|
273
294
|
"--dsw-shadow-lv2",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
| --- | --- | --- |
|
|
27
27
|
| `root` | shell | 应用根出口;`[data-slot="root"]` |
|
|
28
28
|
| `sidebar` | shell | 左导航列;`[data-slot="sidebar"]`(列容器本体上游缝落地前经适配器) |
|
|
29
|
-
| `conversation` | shell | 中栏主区;`[data-slot="conversation"]` |
|
|
29
|
+
| `conversation` | shell | 中栏主区;`[data-slot="conversation"]`(旧 shell)/ `[class*="centerCol"]`(dsh 0.1.7 起中栏无 data 钩子,以 CSS-module 后缀锚定) |
|
|
30
30
|
| `session-header` | shell | 会话头;`[data-slot="conversation.session.header"]` |
|
|
31
31
|
| `composer` | shell | 输入区;`[data-slot="conversation.composer"]` |
|
|
32
|
-
| `details` | shell | 右详情列;`[data-slot="details"]` |
|
|
32
|
+
| `details` | shell | 右详情列;`[data-slot="details"]`(旧 shell)/ `[data-rightbar-col]`(dsh 0.1.7 起官方钩子,收起时 0 宽、打标不产生绘制) |
|
|
33
33
|
| `settings` | shell | 设置模态;`[role="dialog"]` 内含 `[data-slot="settings.section"]` 组合判定 |
|
|
34
34
|
| `overlay` | shell | 帧级浮层;`[data-shell-overlay]` / `[data-slot="shell.overlay"]` |
|
|
35
35
|
|
|
@@ -54,7 +54,7 @@ shell 区域(owner: shell):
|
|
|
54
54
|
| `message-row` | 聊天流条目;`[data-chat-flow-kind]` |
|
|
55
55
|
| `message-body` | 助手消息正文;`[data-streaming]` 根 |
|
|
56
56
|
| `scrollport` | 会话滚动口;`[data-conversation-scroll]` |
|
|
57
|
-
| `composer-input` |
|
|
57
|
+
| `composer-input` | 输入框;`textarea[data-phase]`(旧 shell)/ `[data-composer-input]`(现行 Lexical contenteditable 输入框) |
|
|
58
58
|
| `composer-chip` | 输入引用 chip;`[data-decoration="chip"]` |
|
|
59
59
|
| `queue-dock` | 排队条;`[data-queue-dock]` |
|
|
60
60
|
| `turn-tail` | turn 尾行;`[data-turn-tail]` |
|
|
@@ -97,16 +97,6 @@ family / 插件区域:
|
|
|
97
97
|
| `tab-bar` / `tab` | skill-explorer | 技能中心页签条/页签;`[data-dsh-plugin="skill-explorer"] [data-dsh-part="tab-bar"]` / `[data-dsh-plugin="skill-explorer"] [data-dsh-part="tab"]` |
|
|
98
98
|
| `skill-row` | skill-explorer | 技能卡行;`[data-dsh-plugin="skill-explorer"] [data-dsh-part="skill-row"]` |
|
|
99
99
|
| `filter-bar` | skill-explorer | 技能列表筛选条(搜索框 + 工作区选择);`[data-dsh-plugin="skill-explorer"] [data-dsh-part="filter-bar"]` |
|
|
100
|
-
| `header` | doctor | 救助控制台头部;`[data-dsh-plugin="doctor"] [data-dsh-part="header"]` |
|
|
101
|
-
| `enable` | doctor | 救助模式启用行 |
|
|
102
|
-
| `status` | doctor | 系统状态卡 |
|
|
103
|
-
| `profiles` | doctor | 受保护 profile 列表 |
|
|
104
|
-
| `incidents` | doctor | 故障事件列表 |
|
|
105
|
-
| `probe` | doctor | 客户端故障探针列表 |
|
|
106
|
-
| `plugin-row-actions` | doctor | 失败插件行「复制错误 / 禁用并重启」动作组 |
|
|
107
|
-
| `actions` | doctor | 诊断/修复动作组 |
|
|
108
|
-
| `boundary` | doctor | 错误边界回退提示;`role="alert"` |
|
|
109
|
-
| `harness-target` | doctor | “发送给 Harness” 对话框内的目标会话行 |
|
|
110
100
|
| `entry` | session-id | 侧栏 footer 触发器;`button[data-dsh-part="entry"]`(`[data-dsh-plugin="session-id"]` 容器内) |
|
|
111
101
|
| `panel` | session-id | 会话 ID 模态面板;`[role="dialog"]` 根(`[data-dsh-part="panel"]`) |
|
|
112
102
|
| `row` | session-id | 会话列表行;面板内行容器(`[data-dsh-part="row"]`) |
|
|
@@ -127,9 +117,11 @@ family / 插件区域:
|
|
|
127
117
|
| `settings-row` | usage | 插件设置行;`[data-dsh-part="settings-row"]` |
|
|
128
118
|
| `plan-card` / `plan-window` | usage | 套餐卡 / 套餐窗口行(个人套餐页签);`[data-dsh-part="plan-card"]` 内窗口行 |
|
|
129
119
|
| `bank-card` | usage | Token 银行卡(鲸元券,无官方用量时为空状态);`[data-dsh-part="bank-card"]` |
|
|
130
|
-
| `sidebar-panel` | usage | 侧栏用量面板(挂在 `[data-dsh-usage-entry]` 行的下一行,仅展开时渲染);面板内 provider 行 `[data-dsh-part="sidebar-provider"]`、窗口行 `[data-dsh-part="sidebar-window"]` |
|
|
131
|
-
| `sidebar-summary` | usage | 折叠态摘要条(同一锚位,折叠时替代 sidebar-panel 渲染):当前会话提供方名 `[data-dsh-part="sidebar-summary"]` 内的强调段加今日 tokens / 调用数 / 费用事实段 |
|
|
132
120
|
| `voucher-preview` | usage | 票面 canvas 容器;bank-card 内 `[data-dsh-part="voucher-preview"]` |
|
|
121
|
+
| `foot-card` | usage | 侧栏底部用量速览卡(Settings 行下方,栏轨态隐藏;可折叠为单行摘要条);`[data-dsh-plugin="usage"] [data-dsh-part="foot-card"]`,挂载容器 `[data-dsh-usage-foot-card]` |
|
|
122
|
+
| `foot-card-main` / `foot-card-toggle` | usage | 速览卡主体按钮(整卡点击打开设置分区)/ 右上角收起-展开切换钮;foot-card 内裸值 button |
|
|
123
|
+
| `foot-card-strip` | usage | 折叠态单行摘要条(标签 + 头条值);折叠时 foot-card-main 内裸值 span |
|
|
124
|
+
| `foot-card-usage` / `foot-card-balances` | usage | 展开态的 tokens/调用行 / 余额行;foot-card 内裸值 span |
|
|
133
125
|
| `panel` | model-capabilities | 提供方卡片能力扩展区根;`[data-dsh-plugin="model-capabilities"][data-dsh-part="panel"]` |
|
|
134
126
|
| `toggle` | model-capabilities | 扩展区折叠头按钮;panel 内 `button[data-dsh-part="toggle"]` |
|
|
135
127
|
| `model-row` / `model-toggle` | model-capabilities | 逐模型能力行与其展开按钮;panel 内 `li[data-dsh-part="model-row"]` 及其中 `button[data-dsh-part="model-toggle"]` |
|
|
@@ -144,7 +136,7 @@ family / 插件区域:
|
|
|
144
136
|
| `lever-burst` | liangshen | 拨下命中后的中奖特效浮层(闪光 / 冲击环 / 火花 / 横幅);`[data-dsh-part="lever-burst"]`,`prefers-reduced-motion` 下退化为淡出 |
|
|
145
137
|
| `lever-banner` | liangshen | 特效中的梁神横幅(模式名 + 文言文/二进制/摩斯三行);burst 内 `[data-dsh-part="lever-banner"]` |
|
|
146
138
|
|
|
147
|
-
## plugin 组(
|
|
139
|
+
## plugin 组(13 个)
|
|
148
140
|
|
|
149
141
|
| data-dsh-plugin | owner | 锚定方式 |
|
|
150
142
|
| --- | --- | --- |
|
|
@@ -155,11 +147,10 @@ family / 插件区域:
|
|
|
155
147
|
| `remote-web-ui` | dsh-remote-web-ui | slot entry id `remote-web-ui` |
|
|
156
148
|
| `web-ui-settings` | dsh-web-settings | settings.section id `web-ui-plugins` |
|
|
157
149
|
| `skill-explorer` | dsh-skill-explorer | `[data-dsh-skill-explorer-view]` / `[data-dsh-skill-explorer-entry]` |
|
|
158
|
-
| `doctor` | dsh-doctor | web-ui.plugin.item 槽 entry id `doctor`(设置 → Web 插件 → Doctor 卡片);卡片内 `[data-dsh-plugin="doctor"]` |
|
|
159
150
|
| `dsh-web-ui-market` | dsh-market | 创意工坊商店一级页(settings.section id `dsh-web-ui-market`),商店卡与目录条目容器 |
|
|
160
151
|
| `skin-center` | skins/skin-center | 一级设置分区 settings.section id `skin-center`(列已安装皮肤,属内置源时显式标记) |
|
|
161
152
|
| `session-id` | dsh-session-id | footer action slot entry id `session-id`;`[data-dsh-plugin="session-id"]`(面板 overlay 根 + 入口触发器) |
|
|
162
|
-
| `usage` | dsh-usage | 一级设置分区 settings.section id `dsh-usage`(创意工坊下方);`[data-dsh-plugin="usage"]
|
|
153
|
+
| `usage` | dsh-usage | 一级设置分区 settings.section id `dsh-usage`(创意工坊下方);`[data-dsh-plugin="usage"]`;侧栏底部速览卡容器 `[data-dsh-usage-foot-card]` |
|
|
163
154
|
| `model-capabilities` | dsh-model-capabilities | Models 页 `settings.models.provider-card` keyed 槽 key `llm-pi-ai`(提供方卡片扩展区)+ `settings.models.footer` 槽 entry id `ui-model-capabilities`(存档区);`[data-dsh-plugin="model-capabilities"]` |
|
|
164
155
|
| `preset-center` | dsh-preset-center | 创意工坊卡片的「预设」标签页面板(`dsh-workshop.panel` keyed 槽 key `preset`);`[data-dsh-plugin="preset-center"]` |
|
|
165
156
|
| `liangshen` | dsh-liangshen | 首页输入框内的梁神模式拨杆;`[data-dsh-plugin="liangshen"][data-dsh-part="lever"]`,slot entry id `liangshen-lever` |
|
package/icon.svg
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
|
2
|
+
<path fill="#4d6bfe" fill-rule="evenodd" d="M 67.5 120 L 70.5 120 L 72.5 121 L 80.5 129 L 81.5 129 L 84.5 132 L 85.5 132 L 90.5 136 L 93.5 137 L 95.5 139 L 101.5 142 L 103.5 142 L 106.5 144 L 111.5 145 L 112.5 146 L 115.5 146 L 119.5 148 Q 122.75 147.25 123.5 149 L 127.5 149 L 128.5 150 L 133.5 150 L 134.5 151 L 140.5 151 L 141.5 152 L 150.5 152 L 151.5 153 L 160.5 153 L 161.5 154 L 171.5 154 L 172.5 155 L 178.5 155 L 179.5 156 Q 183.5 155 184.5 157 L 189.5 157 Q 190.5 159 194.5 158 L 195.5 159 L 197.5 159 L 198.5 160 L 200.5 160 L 201.5 161 L 206.5 162 L 209.5 164 L 211.5 164 L 219.5 168 L 224.5 172 L 227.5 173 L 247 191.5 L 247 192.5 L 253 199.5 L 255.5 204 L 258 201.5 L 263 193.5 L 272.5 183 L 273.5 183 L 280.5 176 L 281.5 176 L 292.5 168 L 300.5 164 L 302.5 164 L 305.5 162 L 307.5 162 L 308.5 161 L 310.5 161 L 314.5 159 L 317.5 159 L 318.5 158 Q 321.75 158.75 322.5 157 L 326.5 157 L 327.5 156 L 331.5 156 L 332.5 155 L 337.5 155 L 338.5 154 L 348.5 154 L 349.5 153 L 358.5 153 L 359.5 152 L 368.5 152 L 369.5 151 L 376.5 151 L 377.5 150 L 383.5 150 L 384.5 149 L 388.5 149 L 389.5 148 L 392.5 148 L 393.5 147 L 396.5 147 L 397.5 146 L 399.5 146 L 400.5 145 L 405.5 144 L 423.5 135 L 426.5 132 L 431.5 129 L 439.5 121 L 441.5 120 L 444.5 120 L 448 123.5 L 448 140.5 L 447 141.5 L 447 149.5 L 446 150.5 L 446 154.5 L 445 155.5 Q 445.75 158.75 444 159.5 L 444 163.5 Q 442.25 164.25 443 167.5 L 440 173.5 L 439 178.5 L 435 185.5 L 435 187.5 L 432 193.5 L 430 195.5 L 429 198.5 L 427 200.5 L 425 204.5 L 419 211.5 L 419 212.5 L 402.5 229 L 401.5 229 L 394.5 235 L 393.5 235 L 388.5 239 L 385.5 240 L 383.5 242 L 371.5 248 L 369.5 248 L 364.5 251 L 362.5 251 L 361.5 252 L 359.5 252 L 358.5 253 L 356.5 253 L 355.5 254 L 353.5 254 L 349.5 256 L 342.5 257 L 338.5 259 L 335.5 259 L 334.5 260 L 327.5 261 L 326.5 262 L 324.5 262 L 323.5 263 L 321.5 263 L 320.5 264 L 318.5 264 L 317.5 265 L 312.5 266 L 309.5 268 L 307.5 268 L 295.5 275 L 288 282.5 Q 287.5 286 285 287.5 Q 285.5 290 284 290.5 L 284 293.5 L 283 294.5 L 283 311.5 L 284 312.5 L 284 318.5 L 285 319.5 L 285 323.5 L 286 324.5 L 286 328.5 Q 288 329.5 287 333.5 L 288 334.5 L 288 337.5 L 289 338.5 L 289 341.5 L 290 342.5 L 290 345.5 L 291 346.5 L 292 353.5 L 293 354.5 L 293 356.5 L 295 360.5 L 295 363.5 L 296 364.5 L 296 367.5 L 297 368.5 L 297 370.5 L 298 371.5 L 298 373.5 L 299 374.5 L 299 376.5 L 301 380.5 L 301 386.5 L 298.5 389 L 294.5 391 Q 292 390.5 291.5 392 L 286.5 392 L 285.5 393 L 272.5 393 L 271.5 394 L 240.5 394 L 239.5 393 L 227.5 393 L 226.5 392 L 221.5 392 Q 220.75 390.25 217.5 391 L 212 387.5 L 211 385.5 L 211 381.5 L 212 380.5 Q 211.5 378 213 377.5 L 213 374.5 L 214 373.5 L 214 371.5 L 216 367.5 L 216 364.5 L 217 363.5 L 217 361.5 L 219 357.5 L 219 354.5 L 221 350.5 L 221 347.5 L 222 346.5 L 222 343.5 L 223 342.5 L 223 339.5 L 224 338.5 L 224 335.5 L 225 334.5 Q 224.25 331.25 226 330.5 L 226 326.5 L 227 325.5 Q 226 321.5 228 320.5 L 228 315.5 L 229 314.5 L 229 292.5 L 228 291.5 L 227 286.5 L 225 284.5 L 223 280.5 L 219.5 277 L 218.5 277 L 212.5 272 L 202.5 267 L 200.5 267 L 197.5 265 L 194.5 265 L 193.5 264 L 191.5 264 L 190.5 263 L 188.5 263 L 184.5 261 L 181.5 261 L 180.5 260 L 173.5 259 L 172.5 258 L 170.5 258 L 166.5 256 L 159.5 255 L 158.5 254 L 156.5 254 L 155.5 253 L 150.5 252 L 147.5 250 L 145.5 250 L 142.5 248 L 140.5 248 L 128.5 242 L 123.5 238 L 120.5 237 L 109.5 228 L 108.5 228 L 95 214.5 L 95 213.5 L 87 204.5 L 84 198.5 L 82 196.5 L 80 191.5 L 77 187.5 L 77 185.5 L 72 175.5 L 72 173.5 L 71 172.5 L 71 170.5 L 69 166.5 L 69 163.5 L 68 162.5 Q 68.75 159.25 67 158.5 L 67 154.5 L 66 153.5 L 66 148.5 L 65 147.5 L 65 139.5 L 64 138.5 L 64 124.5 L 67.5 120 Z"/>
|
|
3
|
+
</svg>
|