项目 8 智慧校园管理平台:5 个任务的示例、自绘素材、WisdomCampus 数据库
CI/CD / test (push) Canceled after 0s
CI/CD / deploy (push) Canceled after 0s

- 示例 p8-t1…t5(代码逐个累加):主界面、校园环境界面、环境采集与分析(路灯手动 / 自动控制、
  LED 推送、自动推送火情、7 天温度图表)、校园安防(入侵提示、摄像机方向、拍照入库)、历史图片
  (按日期查询、左右切换),各有评分规则
- 按书补全参考工程里空着的"推送LED信息""自动控制",给"自动推送火情"绑定 CheckedChanged
  (书上第 23 步写成了 ch_autoLamp);任务 5 每次查询前清空 Keys
- 素材:项目 8 的 20 多张图片全部自绘,名字和尺寸与教材一致(project8.py 生成 SVG,
  build-gallery.sh 渲染成 PNG;源文件移到 svg/)
- 数据库 WisdomCampus 按教材的表结构建(EnvironmentData、SecurityData、Users),预置 7 天环境数据
- 测试:参考答案全部通过;没绑定"自动推送火情"、开灯换错背景图片时报出对应原因
- 文档:教材 8 个项目全部有示例,共 23 个

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-23 15:15:00 +08:00
1 parent b20db5721e
commit 65a1b3a81e
109 files changed
+7807 -9

No files matched your search

+2 -2
View File
@@ -1,7 +1,7 @@
# 项目资源素材库
学生在"项目资源"里添加的图片和声音(`Properties.Resources.xxx`),名字和教材一致,全部由平台自绘或合成(不使用教材配套资料里的素材)。
学生在"项目资源"里添加的图片和声音(`Properties.Resources.xxx`),名字和尺寸与教材一致,全部由平台自绘或合成(不使用教材配套资料里的素材)。
- `gallery/`:发布给运行器和网页的文件,`index.json` 是清单(名字、文件、中文说明、类型)。
- `*.svg`:图片的源文件,改了以后用 `rsvg-convert xxx.svg -o gallery/xxx.png` 重新生成。
- `svg/`:图片的源文件;`project8.py` 生成项目 8 的那些 SVG。改了以后运行 `python3 project8.py && sh build-gallery.sh` 重新生成 PNG(需要 rsvg-convert 和思源黑体)。
- `gallery/ring.mp3`:用 ffmpeg 合成的门铃声(叮—咚),命令见提交记录。
@@ -0,0 +1,6 @@
#!/bin/sh
# 把 svg/ 下的素材渲染成 gallery/ 下的 PNG(尺寸取 SVG 自己的 width / height)。需要 rsvg-convert 和思源黑体等中文字体。
cd "$(dirname "$0")"
for f in svg/*.svg; do
rsvg-convert "$f" -o "gallery/$(basename "$f" .svg).png"
done
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

@@ -1,5 +1,27 @@
[
{ "name": "switch_on", "file": "switch_on.png", "label": "开关:开", "kind": "image" },
{ "name": "switch_off", "file": "switch_off.png", "label": "开关:关", "kind": "image" },
{ "name": "ring", "file": "ring.mp3", "label": "铃声", "kind": "audio" }
{ "name": "ring", "file": "ring.mp3", "label": "铃声", "kind": "audio" },
{ "name": "ico_title", "file": "ico_title.png", "label": "标题:智慧校园", "kind": "image" },
{ "name": "bg_home", "file": "bg_home.png", "label": "主界面背景:校园", "kind": "image" },
{ "name": "icon_02", "file": "icon_02.png", "label": "图标:校园环境", "kind": "image" },
{ "name": "icon_03", "file": "icon_03.png", "label": "图标:校园安防", "kind": "image" },
{ "name": "icon_04", "file": "icon_04.png", "label": "图标:退出", "kind": "image" },
{ "name": "day_01", "file": "day_01.png", "label": "路灯场景:亮灯", "kind": "image" },
{ "name": "day_02", "file": "day_02.png", "label": "路灯场景:灭灯", "kind": "image" },
{ "name": "bg_from1", "file": "bg_from1.png", "label": "面板背景(宽)", "kind": "image" },
{ "name": "bg_from2", "file": "bg_from2.png", "label": "面板背景(窄)", "kind": "image" },
{ "name": "icon_monitor", "file": "icon_monitor.png", "label": "监控:无画面", "kind": "image" },
{ "name": "panel_video_ctrl", "file": "panel_video_ctrl.png", "label": "监控:方向盘底座", "kind": "image" },
{ "name": "btn_arrow_up_normal", "file": "btn_arrow_up_normal.png", "label": "方向键:上", "kind": "image" },
{ "name": "btn_arrow_up_press", "file": "btn_arrow_up_press.png", "label": "方向键:上(按下)", "kind": "image" },
{ "name": "btn_arrow_down_normal", "file": "btn_arrow_down_normal.png", "label": "方向键:下", "kind": "image" },
{ "name": "btn_arrow_down_press", "file": "btn_arrow_down_press.png", "label": "方向键:下(按下)", "kind": "image" },
{ "name": "btn_arrow_left_normal", "file": "btn_arrow_left_normal.png", "label": "方向键:左", "kind": "image" },
{ "name": "btn_arrow_left_press", "file": "btn_arrow_left_press.png", "label": "方向键:左(按下)", "kind": "image" },
{ "name": "btn_arrow_right_normal", "file": "btn_arrow_right_normal.png", "label": "方向键:右", "kind": "image" },
{ "name": "btn_arrow_right_press", "file": "btn_arrow_right_press.png", "label": "方向键:右(按下)", "kind": "image" },
{ "name": "arrow_left_normal", "file": "arrow_left_normal.png", "label": "翻页:上一张", "kind": "image" },
{ "name": "arrow_right_normal", "file": "arrow_right_normal.png", "label": "翻页:下一张", "kind": "image" },
{ "name": "windowstate_closed_hover", "file": "windowstate_closed_hover.png", "label": "关闭按钮", "kind": "image" }
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 B

+170
View File
@@ -0,0 +1,170 @@
#!/usr/bin/env python3
"""
生成教材项目 8(智慧校园管理平台)用到的素材 SVG:名字和尺寸与教材配套资源一致,内容全部自绘(扁平插画)。
运行后用 build-gallery.sh 渲染成 PNG:python3 project8.py && sh build-gallery.sh
"""
from pathlib import Path
OUT = Path(__file__).parent / "svg"
OUT.mkdir(exist_ok=True)
FONT = "Source Han Sans CN, Noto Sans CJK SC, sans-serif"
def save(name, width, height, body):
(OUT / f"{name}.svg").write_text(
f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" viewBox="0 0 {width} {height}">\n{body}\n</svg>\n',
encoding="utf-8",
)
# ---------- 标题图:智慧校园 ----------
save("ico_title", 226, 54, f"""
<g transform="translate(8,7)">
<circle cx="20" cy="20" r="19" fill="#ffffff" opacity="0.95"/>
<path d="M7 27 L20 10 L33 27 Z" fill="#3593ed"/>
<rect x="13" y="22" width="14" height="9" fill="#3593ed"/>
<rect x="18" y="25" width="4" height="6" fill="#ffffff"/>
</g>
<text x="56" y="37" font-family="{FONT}" font-size="27" font-weight="bold" fill="#ffffff" letter-spacing="3">智慧校园</text>
""")
# ---------- 校园建筑:主界面背景、路灯场景共用的元素 ----------
def building(x, y, w, h, color, window="#cfe3f5", rows=4, cols=6, roof="#b36b45"):
parts = [f'<rect x="{x}" y="{y}" width="{w}" height="{h}" fill="{color}"/>',
f'<rect x="{x-8}" y="{y-14}" width="{w+16}" height="16" fill="{roof}"/>']
gap_x = w / cols
gap_y = (h - 30) / rows
for r in range(rows):
for c in range(cols):
parts.append(f'<rect x="{x + c*gap_x + gap_x*0.22:.1f}" y="{y + 18 + r*gap_y:.1f}" width="{gap_x*0.56:.1f}" height="{gap_y*0.55:.1f}" fill="{window}"/>')
return "\n".join(parts)
def tree(x, y, s=1.0, color="#4f9a45"):
return (f'<rect x="{x-6*s}" y="{y}" width="{12*s}" height="{60*s}" fill="#7a5230"/>'
f'<circle cx="{x}" cy="{y-30*s}" r="{48*s}" fill="{color}"/><circle cx="{x-32*s}" cy="{y-5*s}" r="{34*s}" fill="{color}"/>'
f'<circle cx="{x+32*s}" cy="{y-5*s}" r="{34*s}" fill="#468c3e"/>')
save("bg_home", 1440, 748, f"""
<defs>
<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#5aa7ea"/><stop offset="1" stop-color="#cfe8fb"/></linearGradient>
<linearGradient id="lawn" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#8cc66d"/><stop offset="1" stop-color="#5f9e45"/></linearGradient>
</defs>
<rect width="1440" height="748" fill="url(#sky)"/>
<circle cx="1260" cy="120" r="60" fill="#fff3b0" opacity="0.9"/>
<g fill="#ffffff" opacity="0.85">
<ellipse cx="260" cy="120" rx="90" ry="30"/><ellipse cx="320" cy="105" rx="60" ry="28"/>
<ellipse cx="880" cy="90" rx="110" ry="32"/><ellipse cx="950" cy="80" rx="70" ry="28"/>
</g>
<g opacity="0.55" fill="#9fb8cf">
<rect x="40" y="300" width="160" height="260"/><rect x="1230" y="280" width="180" height="280"/><rect x="230" y="340" width="120" height="220"/>
</g>
{building(380, 260, 680, 300, "#f2e3c9")}
<rect x="660" y="190" width="120" height="70" fill="#f2e3c9"/><rect x="650" y="178" width="140" height="16" fill="#b36b45"/>
<circle cx="720" cy="225" r="20" fill="#ffffff" stroke="#8a6a4a" stroke-width="4"/>
<rect x="680" y="470" width="80" height="90" fill="#8a6a4a"/>
{building(1080, 360, 220, 200, "#e8d6bd", rows=3, cols=4)}
{building(150, 380, 210, 180, "#e8d6bd", rows=3, cols=4)}
<rect x="0" y="560" width="1440" height="188" fill="url(#lawn)"/>
<path d="M560 748 L680 560 L760 560 L880 748 Z" fill="#d9c9a8"/>
{tree(120, 600, 1.1)}{tree(330, 620, 0.9)}{tree(1130, 610, 1.0)}{tree(1350, 600, 1.2)}
<g fill="#3f8a3a"><ellipse cx="480" cy="572" rx="90" ry="22"/><ellipse cx="960" cy="572" rx="90" ry="22"/></g>
""")
def street(lit):
sky = ('<stop offset="0" stop-color="#2b3d66"/><stop offset="1" stop-color="#e8a76b"/>' if lit
else '<stop offset="0" stop-color="#6bb0ea"/><stop offset="1" stop-color="#d6ecfb"/>')
window = "#ffd37a" if lit else "#cfe3f5"
lamps = []
for x in (180, 520, 860, 1200):
lamps.append(f'<rect x="{x}" y="380" width="12" height="260" fill="#4b5563"/>'
f'<path d="M{x+6} 386 Q{x+6} 356 {x+46} 356 H{x+70}" stroke="#4b5563" stroke-width="10" fill="none"/>'
f'<rect x="{x+56}" y="348" width="44" height="16" rx="5" fill="#374151"/>')
if lit:
lamps.append(f'<path d="M{x+60} 364 L{x+20} 640 H{x+140} L{x+96} 364 Z" fill="#fff3b0" opacity="0.35"/>'
f'<ellipse cx="{x+78}" cy="366" rx="22" ry="7" fill="#fff8d0"/>')
else:
lamps.append(f'<ellipse cx="{x+78}" cy="366" rx="18" ry="5" fill="#9ca3af"/>')
return f"""
<defs><linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">{sky}</linearGradient></defs>
<rect width="1440" height="716" fill="url(#sky)"/>
{'<circle cx="1180" cy="110" r="36" fill="#fff6c8"/>' if lit else '<circle cx="1220" cy="110" r="50" fill="#fff3b0" opacity="0.9"/>'}
{building(80, 220, 560, 330, "#e9d8bf", window=window, rows=5, cols=7)}
{building(760, 260, 580, 290, "#dcc7a8", window=window, rows=4, cols=7)}
<rect x="0" y="550" width="1440" height="40" fill="#7fb06a"/>
<rect x="0" y="590" width="1440" height="126" fill="#5b6472"/>
<g fill="#f8fafc">{''.join(f'<rect x="{x}" y="648" width="70" height="8"/>' for x in range(30, 1440, 140))}</g>
{''.join(lamps)}
{tree(700, 560, 0.8, "#3f7f45")}{tree(1390, 560, 0.9, "#3f7f45")}
"""
save("day_01", 1440, 716, street(lit=True))
save("day_02", 1440, 716, street(lit=False))
# ---------- 主界面的三个功能图标 ----------
def tile(name, color, icon, label):
save(name, 180, 210, f"""
<rect x="6" y="6" width="168" height="198" rx="18" fill="{color}"/>
<rect x="6" y="6" width="168" height="198" rx="18" fill="#ffffff" opacity="0.08"/>
<g transform="translate(90,82)" fill="#ffffff" stroke="#ffffff">{icon}</g>
<text x="90" y="178" font-family="{FONT}" font-size="24" font-weight="bold" fill="#ffffff" text-anchor="middle">{label}</text>
""")
tile("icon_02", "#2e9e5b", """
<rect x="-6" y="10" width="12" height="40" stroke="none"/>
<circle cx="0" cy="-12" r="34" stroke="none"/><circle cx="-26" cy="8" r="22" stroke="none"/><circle cx="26" cy="8" r="22" stroke="none"/>
<path d="M-4 -2 L0 -30 L4 -2" fill="#2e9e5b" stroke="none"/>""", "校园环境")
tile("icon_03", "#2f7fe0", """
<path d="M0 -48 L40 -32 V2 C40 28 20 44 0 52 C-20 44 -40 28 -40 2 V-32 Z" stroke="none"/>
<path d="M-16 0 L-4 12 L18 -14" fill="none" stroke="#2f7fe0" stroke-width="9" stroke-linecap="round" stroke-linejoin="round"/>""", "校园安防")
tile("icon_04", "#e2803a", """
<path d="M-10 -44 H-40 V44 H-10" fill="none" stroke-width="10" stroke-linejoin="round"/>
<path d="M-12 0 H40 M22 -18 L40 0 L22 18" fill="none" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/>""", "退 出")
# ---------- 面板背景(半透明深蓝) ----------
for name, width in (("bg_from1", 555), ("bg_from2", 425)):
save(name, width, 670, f"""
<rect x="8" y="8" width="{width-16}" height="654" rx="12" fill="#14304f" opacity="0.88"/>
<rect x="8" y="8" width="{width-16}" height="654" rx="12" fill="none" stroke="#7fb3e6" stroke-width="2" opacity="0.6"/>
<rect x="24" y="22" width="{width-48}" height="4" rx="2" fill="#4fa3ff" opacity="0.8"/>
""")
# ---------- 监控:无画面时的图标、方向盘底座、方向键 ----------
save("icon_monitor", 280, 280, """
<g fill="none" stroke="#c9ced6" stroke-width="10" stroke-linejoin="round" stroke-linecap="round">
<rect x="40" y="70" width="160" height="110" rx="14"/>
<path d="M200 105 L245 80 V170 L200 145"/>
<path d="M90 180 L80 225 M150 180 L160 225 M65 225 H175"/>
</g>
<circle cx="120" cy="125" r="26" fill="none" stroke="#c9ced6" stroke-width="10"/>
""")
save("panel_video_ctrl", 500, 500, """
<defs><radialGradient id="pad" cx="0.5" cy="0.45" r="0.6"><stop offset="0" stop-color="#f4f6f9"/><stop offset="1" stop-color="#c7cdd6"/></radialGradient></defs>
<circle cx="250" cy="250" r="240" fill="url(#pad)" stroke="#aab3bf" stroke-width="6"/>
<circle cx="250" cy="250" r="95" fill="#e9edf2" stroke="#aab3bf" stroke-width="4"/>
<circle cx="250" cy="250" r="40" fill="#d4dae2"/>
""")
ROTATE = {"up": 0, "right": 90, "down": 180, "left": 270}
for direction, angle in ROTATE.items():
for state, (fill, stroke) in {"normal": ("#ffffff", "#5b6472"), "press": ("#2f7fe0", "#ffffff")}.items():
save(f"btn_arrow_{direction}_{state}", 28, 28, f"""
<circle cx="14" cy="14" r="13" fill="{fill}" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="{stroke}" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate({angle} 14 14)"/>
""")
for direction, angle in (("left", 270), ("right", 90)):
save(f"arrow_{direction}_normal", 60, 60, f"""
<circle cx="30" cy="30" r="27" fill="#000000" opacity="0.45"/>
<path d="M19 35 L30 23 L41 35" fill="none" stroke="#ffffff" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" transform="rotate({angle} 30 30)"/>
""")
save("windowstate_closed_hover", 36, 36, """
<rect x="2" y="2" width="32" height="32" rx="4" fill="#e81123"/>
<path d="M12 12 L24 24 M24 12 L12 24" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
""")
@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60">
<circle cx="30" cy="30" r="27" fill="#000000" opacity="0.45"/>
<path d="M19 35 L30 23 L41 35" fill="none" stroke="#ffffff" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" transform="rotate(270 30 30)"/>
</svg>

After

Width:  |  Height:  |  Size: 316 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60">
<circle cx="30" cy="30" r="27" fill="#000000" opacity="0.45"/>
<path d="M19 35 L30 23 L41 35" fill="none" stroke="#ffffff" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" transform="rotate(90 30 30)"/>
</svg>

After

Width:  |  Height:  |  Size: 315 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="555" height="670" viewBox="0 0 555 670">
<rect x="8" y="8" width="539" height="654" rx="12" fill="#14304f" opacity="0.88"/>
<rect x="8" y="8" width="539" height="654" rx="12" fill="none" stroke="#7fb3e6" stroke-width="2" opacity="0.6"/>
<rect x="24" y="22" width="507" height="4" rx="2" fill="#4fa3ff" opacity="0.8"/>
</svg>

After

Width:  |  Height:  |  Size: 380 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="425" height="670" viewBox="0 0 425 670">
<rect x="8" y="8" width="409" height="654" rx="12" fill="#14304f" opacity="0.88"/>
<rect x="8" y="8" width="409" height="654" rx="12" fill="none" stroke="#7fb3e6" stroke-width="2" opacity="0.6"/>
<rect x="24" y="22" width="377" height="4" rx="2" fill="#4fa3ff" opacity="0.8"/>
</svg>

After

Width:  |  Height:  |  Size: 380 B

@@ -0,0 +1,78 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="748" viewBox="0 0 1440 748">
<defs>
<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#5aa7ea"/><stop offset="1" stop-color="#cfe8fb"/></linearGradient>
<linearGradient id="lawn" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#8cc66d"/><stop offset="1" stop-color="#5f9e45"/></linearGradient>
</defs>
<rect width="1440" height="748" fill="url(#sky)"/>
<circle cx="1260" cy="120" r="60" fill="#fff3b0" opacity="0.9"/>
<g fill="#ffffff" opacity="0.85">
<ellipse cx="260" cy="120" rx="90" ry="30"/><ellipse cx="320" cy="105" rx="60" ry="28"/>
<ellipse cx="880" cy="90" rx="110" ry="32"/><ellipse cx="950" cy="80" rx="70" ry="28"/>
</g>
<g opacity="0.55" fill="#9fb8cf">
<rect x="40" y="300" width="160" height="260"/><rect x="1230" y="280" width="180" height="280"/><rect x="230" y="340" width="120" height="220"/>
</g>
<rect x="380" y="260" width="680" height="300" fill="#f2e3c9"/>
<rect x="372" y="246" width="696" height="16" fill="#b36b45"/>
<rect x="404.9" y="278.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="518.3" y="278.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="631.6" y="278.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="744.9" y="278.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="858.3" y="278.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="971.6" y="278.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="404.9" y="345.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="518.3" y="345.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="631.6" y="345.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="744.9" y="345.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="858.3" y="345.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="971.6" y="345.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="404.9" y="413.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="518.3" y="413.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="631.6" y="413.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="744.9" y="413.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="858.3" y="413.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="971.6" y="413.0" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="404.9" y="480.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="518.3" y="480.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="631.6" y="480.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="744.9" y="480.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="858.3" y="480.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="971.6" y="480.5" width="63.5" height="37.1" fill="#cfe3f5"/>
<rect x="660" y="190" width="120" height="70" fill="#f2e3c9"/><rect x="650" y="178" width="140" height="16" fill="#b36b45"/>
<circle cx="720" cy="225" r="20" fill="#ffffff" stroke="#8a6a4a" stroke-width="4"/>
<rect x="680" y="470" width="80" height="90" fill="#8a6a4a"/>
<rect x="1080" y="360" width="220" height="200" fill="#e8d6bd"/>
<rect x="1072" y="346" width="236" height="16" fill="#b36b45"/>
<rect x="1092.1" y="378.0" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1147.1" y="378.0" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1202.1" y="378.0" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1257.1" y="378.0" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1092.1" y="434.7" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1147.1" y="434.7" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1202.1" y="434.7" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1257.1" y="434.7" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1092.1" y="491.3" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1147.1" y="491.3" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1202.1" y="491.3" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="1257.1" y="491.3" width="30.8" height="31.2" fill="#cfe3f5"/>
<rect x="150" y="380" width="210" height="180" fill="#e8d6bd"/>
<rect x="142" y="366" width="226" height="16" fill="#b36b45"/>
<rect x="161.6" y="398.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="214.1" y="398.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="266.6" y="398.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="319.1" y="398.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="161.6" y="448.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="214.1" y="448.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="266.6" y="448.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="319.1" y="448.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="161.6" y="498.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="214.1" y="498.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="266.6" y="498.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="319.1" y="498.0" width="29.4" height="27.5" fill="#cfe3f5"/>
<rect x="0" y="560" width="1440" height="188" fill="url(#lawn)"/>
<path d="M560 748 L680 560 L760 560 L880 748 Z" fill="#d9c9a8"/>
<rect x="113.4" y="600" width="13.200000000000001" height="66.0" fill="#7a5230"/><circle cx="120" cy="567.0" r="52.800000000000004" fill="#4f9a45"/><circle cx="84.8" cy="594.5" r="37.400000000000006" fill="#4f9a45"/><circle cx="155.2" cy="594.5" r="37.400000000000006" fill="#468c3e"/><rect x="324.6" y="620" width="10.8" height="54.0" fill="#7a5230"/><circle cx="330" cy="593.0" r="43.2" fill="#4f9a45"/><circle cx="301.2" cy="615.5" r="30.6" fill="#4f9a45"/><circle cx="358.8" cy="615.5" r="30.6" fill="#468c3e"/><rect x="1124.0" y="610" width="12.0" height="60.0" fill="#7a5230"/><circle cx="1130" cy="580.0" r="48.0" fill="#4f9a45"/><circle cx="1098.0" cy="605.0" r="34.0" fill="#4f9a45"/><circle cx="1162.0" cy="605.0" r="34.0" fill="#468c3e"/><rect x="1342.8" y="600" width="14.399999999999999" height="72.0" fill="#7a5230"/><circle cx="1350" cy="564.0" r="57.599999999999994" fill="#4f9a45"/><circle cx="1311.6" cy="594.0" r="40.8" fill="#4f9a45"/><circle cx="1388.4" cy="594.0" r="40.8" fill="#468c3e"/>
<g fill="#3f8a3a"><ellipse cx="480" cy="572" rx="90" ry="22"/><ellipse cx="960" cy="572" rx="90" ry="22"/></g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#ffffff" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#5b6472" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(180 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 338 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#2f7fe0" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(180 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 338 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#ffffff" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#5b6472" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(270 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 338 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#2f7fe0" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(270 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 338 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#ffffff" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#5b6472" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(90 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 337 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#2f7fe0" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(90 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 337 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#ffffff" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#5b6472" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(0 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 336 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28">
<circle cx="14" cy="14" r="13" fill="#2f7fe0" stroke="#aab3bf" stroke-width="1"/>
<path d="M8 16.5 L14 10 L20 16.5" fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" transform="rotate(0 14 14)"/>
</svg>

After

Width:  |  Height:  |  Size: 336 B

@@ -0,0 +1,79 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="716" viewBox="0 0 1440 716">
<defs><linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#2b3d66"/><stop offset="1" stop-color="#e8a76b"/></linearGradient></defs>
<rect width="1440" height="716" fill="url(#sky)"/>
<circle cx="1180" cy="110" r="36" fill="#fff6c8"/>
<rect x="80" y="220" width="560" height="330" fill="#e9d8bf"/>
<rect x="72" y="206" width="576" height="16" fill="#b36b45"/>
<rect x="97.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="177.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="257.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="337.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="417.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="497.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="577.6" y="238.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="97.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="177.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="257.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="337.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="417.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="497.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="577.6" y="298.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="97.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="177.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="257.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="337.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="417.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="497.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="577.6" y="358.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="97.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="177.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="257.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="337.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="417.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="497.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="577.6" y="418.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="97.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="177.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="257.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="337.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="417.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="497.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="577.6" y="478.0" width="44.8" height="33.0" fill="#ffd37a"/>
<rect x="760" y="260" width="580" height="290" fill="#dcc7a8"/>
<rect x="752" y="246" width="596" height="16" fill="#b36b45"/>
<rect x="778.2" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="861.1" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="943.9" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1026.8" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1109.7" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1192.5" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1275.4" y="278.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="778.2" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="861.1" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="943.9" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1026.8" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1109.7" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1192.5" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1275.4" y="343.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="778.2" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="861.1" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="943.9" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1026.8" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1109.7" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1192.5" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1275.4" y="408.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="778.2" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="861.1" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="943.9" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1026.8" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1109.7" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1192.5" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="1275.4" y="473.0" width="46.4" height="35.8" fill="#ffd37a"/>
<rect x="0" y="550" width="1440" height="40" fill="#7fb06a"/>
<rect x="0" y="590" width="1440" height="126" fill="#5b6472"/>
<g fill="#f8fafc"><rect x="30" y="648" width="70" height="8"/><rect x="170" y="648" width="70" height="8"/><rect x="310" y="648" width="70" height="8"/><rect x="450" y="648" width="70" height="8"/><rect x="590" y="648" width="70" height="8"/><rect x="730" y="648" width="70" height="8"/><rect x="870" y="648" width="70" height="8"/><rect x="1010" y="648" width="70" height="8"/><rect x="1150" y="648" width="70" height="8"/><rect x="1290" y="648" width="70" height="8"/><rect x="1430" y="648" width="70" height="8"/></g>
<rect x="180" y="380" width="12" height="260" fill="#4b5563"/><path d="M186 386 Q186 356 226 356 H250" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="236" y="348" width="44" height="16" rx="5" fill="#374151"/><path d="M240 364 L200 640 H320 L276 364 Z" fill="#fff3b0" opacity="0.35"/><ellipse cx="258" cy="366" rx="22" ry="7" fill="#fff8d0"/><rect x="520" y="380" width="12" height="260" fill="#4b5563"/><path d="M526 386 Q526 356 566 356 H590" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="576" y="348" width="44" height="16" rx="5" fill="#374151"/><path d="M580 364 L540 640 H660 L616 364 Z" fill="#fff3b0" opacity="0.35"/><ellipse cx="598" cy="366" rx="22" ry="7" fill="#fff8d0"/><rect x="860" y="380" width="12" height="260" fill="#4b5563"/><path d="M866 386 Q866 356 906 356 H930" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="916" y="348" width="44" height="16" rx="5" fill="#374151"/><path d="M920 364 L880 640 H1000 L956 364 Z" fill="#fff3b0" opacity="0.35"/><ellipse cx="938" cy="366" rx="22" ry="7" fill="#fff8d0"/><rect x="1200" y="380" width="12" height="260" fill="#4b5563"/><path d="M1206 386 Q1206 356 1246 356 H1270" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="1256" y="348" width="44" height="16" rx="5" fill="#374151"/><path d="M1260 364 L1220 640 H1340 L1296 364 Z" fill="#fff3b0" opacity="0.35"/><ellipse cx="1278" cy="366" rx="22" ry="7" fill="#fff8d0"/>
<rect x="695.2" y="560" width="9.600000000000001" height="48.0" fill="#7a5230"/><circle cx="700" cy="536.0" r="38.400000000000006" fill="#3f7f45"/><circle cx="674.4" cy="556.0" r="27.200000000000003" fill="#3f7f45"/><circle cx="725.6" cy="556.0" r="27.200000000000003" fill="#468c3e"/><rect x="1384.6" y="560" width="10.8" height="54.0" fill="#7a5230"/><circle cx="1390" cy="533.0" r="43.2" fill="#3f7f45"/><circle cx="1361.2" cy="555.5" r="30.6" fill="#3f7f45"/><circle cx="1418.8" cy="555.5" r="30.6" fill="#468c3e"/>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

@@ -0,0 +1,79 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="716" viewBox="0 0 1440 716">
<defs><linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#6bb0ea"/><stop offset="1" stop-color="#d6ecfb"/></linearGradient></defs>
<rect width="1440" height="716" fill="url(#sky)"/>
<circle cx="1220" cy="110" r="50" fill="#fff3b0" opacity="0.9"/>
<rect x="80" y="220" width="560" height="330" fill="#e9d8bf"/>
<rect x="72" y="206" width="576" height="16" fill="#b36b45"/>
<rect x="97.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="177.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="257.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="337.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="417.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="497.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="577.6" y="238.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="97.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="177.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="257.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="337.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="417.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="497.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="577.6" y="298.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="97.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="177.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="257.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="337.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="417.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="497.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="577.6" y="358.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="97.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="177.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="257.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="337.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="417.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="497.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="577.6" y="418.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="97.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="177.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="257.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="337.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="417.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="497.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="577.6" y="478.0" width="44.8" height="33.0" fill="#cfe3f5"/>
<rect x="760" y="260" width="580" height="290" fill="#dcc7a8"/>
<rect x="752" y="246" width="596" height="16" fill="#b36b45"/>
<rect x="778.2" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="861.1" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="943.9" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1026.8" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1109.7" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1192.5" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1275.4" y="278.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="778.2" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="861.1" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="943.9" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1026.8" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1109.7" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1192.5" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1275.4" y="343.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="778.2" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="861.1" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="943.9" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1026.8" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1109.7" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1192.5" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1275.4" y="408.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="778.2" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="861.1" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="943.9" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1026.8" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1109.7" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1192.5" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="1275.4" y="473.0" width="46.4" height="35.8" fill="#cfe3f5"/>
<rect x="0" y="550" width="1440" height="40" fill="#7fb06a"/>
<rect x="0" y="590" width="1440" height="126" fill="#5b6472"/>
<g fill="#f8fafc"><rect x="30" y="648" width="70" height="8"/><rect x="170" y="648" width="70" height="8"/><rect x="310" y="648" width="70" height="8"/><rect x="450" y="648" width="70" height="8"/><rect x="590" y="648" width="70" height="8"/><rect x="730" y="648" width="70" height="8"/><rect x="870" y="648" width="70" height="8"/><rect x="1010" y="648" width="70" height="8"/><rect x="1150" y="648" width="70" height="8"/><rect x="1290" y="648" width="70" height="8"/><rect x="1430" y="648" width="70" height="8"/></g>
<rect x="180" y="380" width="12" height="260" fill="#4b5563"/><path d="M186 386 Q186 356 226 356 H250" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="236" y="348" width="44" height="16" rx="5" fill="#374151"/><ellipse cx="258" cy="366" rx="18" ry="5" fill="#9ca3af"/><rect x="520" y="380" width="12" height="260" fill="#4b5563"/><path d="M526 386 Q526 356 566 356 H590" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="576" y="348" width="44" height="16" rx="5" fill="#374151"/><ellipse cx="598" cy="366" rx="18" ry="5" fill="#9ca3af"/><rect x="860" y="380" width="12" height="260" fill="#4b5563"/><path d="M866 386 Q866 356 906 356 H930" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="916" y="348" width="44" height="16" rx="5" fill="#374151"/><ellipse cx="938" cy="366" rx="18" ry="5" fill="#9ca3af"/><rect x="1200" y="380" width="12" height="260" fill="#4b5563"/><path d="M1206 386 Q1206 356 1246 356 H1270" stroke="#4b5563" stroke-width="10" fill="none"/><rect x="1256" y="348" width="44" height="16" rx="5" fill="#374151"/><ellipse cx="1278" cy="366" rx="18" ry="5" fill="#9ca3af"/>
<rect x="695.2" y="560" width="9.600000000000001" height="48.0" fill="#7a5230"/><circle cx="700" cy="536.0" r="38.400000000000006" fill="#3f7f45"/><circle cx="674.4" cy="556.0" r="27.200000000000003" fill="#3f7f45"/><circle cx="725.6" cy="556.0" r="27.200000000000003" fill="#468c3e"/><rect x="1384.6" y="560" width="10.8" height="54.0" fill="#7a5230"/><circle cx="1390" cy="533.0" r="43.2" fill="#3f7f45"/><circle cx="1361.2" cy="555.5" r="30.6" fill="#3f7f45"/><circle cx="1418.8" cy="555.5" r="30.6" fill="#468c3e"/>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="226" height="54" viewBox="0 0 226 54">
<g transform="translate(8,7)">
<circle cx="20" cy="20" r="19" fill="#ffffff" opacity="0.95"/>
<path d="M7 27 L20 10 L33 27 Z" fill="#3593ed"/>
<rect x="13" y="22" width="14" height="9" fill="#3593ed"/>
<rect x="18" y="25" width="4" height="6" fill="#ffffff"/>
</g>
<text x="56" y="37" font-family="Source Han Sans CN, Noto Sans CJK SC, sans-serif" font-size="27" font-weight="bold" fill="#ffffff" letter-spacing="3">智慧校园</text>
</svg>

After

Width:  |  Height:  |  Size: 553 B

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="180" height="210" viewBox="0 0 180 210">
<rect x="6" y="6" width="168" height="198" rx="18" fill="#2e9e5b"/>
<rect x="6" y="6" width="168" height="198" rx="18" fill="#ffffff" opacity="0.08"/>
<g transform="translate(90,82)" fill="#ffffff" stroke="#ffffff">
<rect x="-6" y="10" width="12" height="40" stroke="none"/>
<circle cx="0" cy="-12" r="34" stroke="none"/><circle cx="-26" cy="8" r="22" stroke="none"/><circle cx="26" cy="8" r="22" stroke="none"/>
<path d="M-4 -2 L0 -30 L4 -2" fill="#2e9e5b" stroke="none"/></g>
<text x="90" y="178" font-family="Source Han Sans CN, Noto Sans CJK SC, sans-serif" font-size="24" font-weight="bold" fill="#ffffff" text-anchor="middle">校园环境</text>
</svg>

After

Width:  |  Height:  |  Size: 769 B

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="180" height="210" viewBox="0 0 180 210">
<rect x="6" y="6" width="168" height="198" rx="18" fill="#2f7fe0"/>
<rect x="6" y="6" width="168" height="198" rx="18" fill="#ffffff" opacity="0.08"/>
<g transform="translate(90,82)" fill="#ffffff" stroke="#ffffff">
<path d="M0 -48 L40 -32 V2 C40 28 20 44 0 52 C-20 44 -40 28 -40 2 V-32 Z" stroke="none"/>
<path d="M-16 0 L-4 12 L18 -14" fill="none" stroke="#2f7fe0" stroke-width="9" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="90" y="178" font-family="Source Han Sans CN, Noto Sans CJK SC, sans-serif" font-size="24" font-weight="bold" fill="#ffffff" text-anchor="middle">校园安防</text>
</svg>

After

Width:  |  Height:  |  Size: 724 B

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="180" height="210" viewBox="0 0 180 210">
<rect x="6" y="6" width="168" height="198" rx="18" fill="#e2803a"/>
<rect x="6" y="6" width="168" height="198" rx="18" fill="#ffffff" opacity="0.08"/>
<g transform="translate(90,82)" fill="#ffffff" stroke="#ffffff">
<path d="M-10 -44 H-40 V44 H-10" fill="none" stroke-width="10" stroke-linejoin="round"/>
<path d="M-12 0 H40 M22 -18 L40 0 L22 18" fill="none" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"/></g>
<text x="90" y="178" font-family="Source Han Sans CN, Noto Sans CJK SC, sans-serif" font-size="24" font-weight="bold" fill="#ffffff" text-anchor="middle">退 出</text>
</svg>

After

Width:  |  Height:  |  Size: 713 B

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="280" height="280" viewBox="0 0 280 280">
<g fill="none" stroke="#c9ced6" stroke-width="10" stroke-linejoin="round" stroke-linecap="round">
<rect x="40" y="70" width="160" height="110" rx="14"/>
<path d="M200 105 L245 80 V170 L200 145"/>
<path d="M90 180 L80 225 M150 180 L160 225 M65 225 H175"/>
</g>
<circle cx="120" cy="125" r="26" fill="none" stroke="#c9ced6" stroke-width="10"/>
</svg>

After

Width:  |  Height:  |  Size: 457 B

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500">
<defs><radialGradient id="pad" cx="0.5" cy="0.45" r="0.6"><stop offset="0" stop-color="#f4f6f9"/><stop offset="1" stop-color="#c7cdd6"/></radialGradient></defs>
<circle cx="250" cy="250" r="240" fill="url(#pad)" stroke="#aab3bf" stroke-width="6"/>
<circle cx="250" cy="250" r="95" fill="#e9edf2" stroke="#aab3bf" stroke-width="4"/>
<circle cx="250" cy="250" r="40" fill="#d4dae2"/>
</svg>

After

Width:  |  Height:  |  Size: 487 B

File renamed without changes.

Before

Width:  |  Height:  |  Size: 390 B

After

Width:  |  Height:  |  Size: 390 B

File renamed without changes.

Before

Width:  |  Height:  |  Size: 389 B

After

Width:  |  Height:  |  Size: 389 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36">
<rect x="2" y="2" width="32" height="32" rx="4" fill="#e81123"/>
<path d="M12 12 L24 24 M24 12 L12 24" stroke="#ffffff" stroke-width="3" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 259 B