- Caddy: custom image with caddy-ratelimit plugin, security headers (X-Frame-Options, HSTS, CSP-adjacent, etc.), per-IP rate limiting on auth/scrape/global zones, static error pages (502/503/504), fix routing to remove /api/scrape/* and /api/chapter-text-preview/* direct-to-backend (were bypassing SvelteKit auth middleware) - docker-compose: Caddy build context + error volume, Watchtower service (label-enable mode, 5 min poll), watchtower labels on backend/runner/ui - Scraper: ScrapeChapterList uses retryGet (9 attempts, Retry-After backoff) to fix 429-induced chapter list failures; upTo param stops pagination early for range scrapes - UI: Browse→Catalogue rename (routes, API, links), admin scrape page Continue/Retry buttons, +error.svelte branded error page, type cleanup (removed dead exports, added BookPreviewMeta/BookPreviewResponse to scraper.ts) - Meilisearch: meta_updated field, sort=update fix, facet distribution - Docs: reorganise into docs/d2/ and docs/mermaid/ subdirectories, update all diagrams to reflect Caddy/Watchtower/routing changes, add api-routing.d2 ownership map with auth-level colour coding, regenerate SVGs
128 lines
57 KiB
XML
128 lines
57 KiB
XML
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 4499 2734"><svg class="d2-822348135 d2-svg" width="4499" height="2734" viewBox="56 -33 4499 2734"><rect x="56.000000" y="-33.000000" width="4499.000000" height="2734.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
|
|
.d2-822348135 .text {
|
|
font-family: "d2-822348135-font-regular";
|
|
}
|
|
@font-face {
|
|
font-family: d2-822348135-font-regular;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}
|
|
.d2-822348135 .text-bold {
|
|
font-family: "d2-822348135-font-bold";
|
|
}
|
|
@font-face {
|
|
font-family: d2-822348135-font-bold;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}
|
|
.d2-822348135 .text-italic {
|
|
font-family: "d2-822348135-font-italic";
|
|
}
|
|
@font-face {
|
|
font-family: d2-822348135-font-italic;
|
|
src: url("data:application/font-woff;base64,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");
|
|
}]]></style><style type="text/css"><![CDATA[.shape {
|
|
shape-rendering: geometricPrecision;
|
|
stroke-linejoin: round;
|
|
}
|
|
.connection {
|
|
stroke-linecap: round;
|
|
stroke-linejoin: round;
|
|
}
|
|
.blend {
|
|
mix-blend-mode: multiply;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.d2-822348135 .fill-N1{fill:#0A0F25;}
|
|
.d2-822348135 .fill-N2{fill:#676C7E;}
|
|
.d2-822348135 .fill-N3{fill:#9499AB;}
|
|
.d2-822348135 .fill-N4{fill:#CFD2DD;}
|
|
.d2-822348135 .fill-N5{fill:#DEE1EB;}
|
|
.d2-822348135 .fill-N6{fill:#EEF1F8;}
|
|
.d2-822348135 .fill-N7{fill:#FFFFFF;}
|
|
.d2-822348135 .fill-B1{fill:#0D32B2;}
|
|
.d2-822348135 .fill-B2{fill:#0D32B2;}
|
|
.d2-822348135 .fill-B3{fill:#E3E9FD;}
|
|
.d2-822348135 .fill-B4{fill:#E3E9FD;}
|
|
.d2-822348135 .fill-B5{fill:#EDF0FD;}
|
|
.d2-822348135 .fill-B6{fill:#F7F8FE;}
|
|
.d2-822348135 .fill-AA2{fill:#4A6FF3;}
|
|
.d2-822348135 .fill-AA4{fill:#EDF0FD;}
|
|
.d2-822348135 .fill-AA5{fill:#F7F8FE;}
|
|
.d2-822348135 .fill-AB4{fill:#EDF0FD;}
|
|
.d2-822348135 .fill-AB5{fill:#F7F8FE;}
|
|
.d2-822348135 .stroke-N1{stroke:#0A0F25;}
|
|
.d2-822348135 .stroke-N2{stroke:#676C7E;}
|
|
.d2-822348135 .stroke-N3{stroke:#9499AB;}
|
|
.d2-822348135 .stroke-N4{stroke:#CFD2DD;}
|
|
.d2-822348135 .stroke-N5{stroke:#DEE1EB;}
|
|
.d2-822348135 .stroke-N6{stroke:#EEF1F8;}
|
|
.d2-822348135 .stroke-N7{stroke:#FFFFFF;}
|
|
.d2-822348135 .stroke-B1{stroke:#0D32B2;}
|
|
.d2-822348135 .stroke-B2{stroke:#0D32B2;}
|
|
.d2-822348135 .stroke-B3{stroke:#E3E9FD;}
|
|
.d2-822348135 .stroke-B4{stroke:#E3E9FD;}
|
|
.d2-822348135 .stroke-B5{stroke:#EDF0FD;}
|
|
.d2-822348135 .stroke-B6{stroke:#F7F8FE;}
|
|
.d2-822348135 .stroke-AA2{stroke:#4A6FF3;}
|
|
.d2-822348135 .stroke-AA4{stroke:#EDF0FD;}
|
|
.d2-822348135 .stroke-AA5{stroke:#F7F8FE;}
|
|
.d2-822348135 .stroke-AB4{stroke:#EDF0FD;}
|
|
.d2-822348135 .stroke-AB5{stroke:#F7F8FE;}
|
|
.d2-822348135 .background-color-N1{background-color:#0A0F25;}
|
|
.d2-822348135 .background-color-N2{background-color:#676C7E;}
|
|
.d2-822348135 .background-color-N3{background-color:#9499AB;}
|
|
.d2-822348135 .background-color-N4{background-color:#CFD2DD;}
|
|
.d2-822348135 .background-color-N5{background-color:#DEE1EB;}
|
|
.d2-822348135 .background-color-N6{background-color:#EEF1F8;}
|
|
.d2-822348135 .background-color-N7{background-color:#FFFFFF;}
|
|
.d2-822348135 .background-color-B1{background-color:#0D32B2;}
|
|
.d2-822348135 .background-color-B2{background-color:#0D32B2;}
|
|
.d2-822348135 .background-color-B3{background-color:#E3E9FD;}
|
|
.d2-822348135 .background-color-B4{background-color:#E3E9FD;}
|
|
.d2-822348135 .background-color-B5{background-color:#EDF0FD;}
|
|
.d2-822348135 .background-color-B6{background-color:#F7F8FE;}
|
|
.d2-822348135 .background-color-AA2{background-color:#4A6FF3;}
|
|
.d2-822348135 .background-color-AA4{background-color:#EDF0FD;}
|
|
.d2-822348135 .background-color-AA5{background-color:#F7F8FE;}
|
|
.d2-822348135 .background-color-AB4{background-color:#EDF0FD;}
|
|
.d2-822348135 .background-color-AB5{background-color:#F7F8FE;}
|
|
.d2-822348135 .color-N1{color:#0A0F25;}
|
|
.d2-822348135 .color-N2{color:#676C7E;}
|
|
.d2-822348135 .color-N3{color:#9499AB;}
|
|
.d2-822348135 .color-N4{color:#CFD2DD;}
|
|
.d2-822348135 .color-N5{color:#DEE1EB;}
|
|
.d2-822348135 .color-N6{color:#EEF1F8;}
|
|
.d2-822348135 .color-N7{color:#FFFFFF;}
|
|
.d2-822348135 .color-B1{color:#0D32B2;}
|
|
.d2-822348135 .color-B2{color:#0D32B2;}
|
|
.d2-822348135 .color-B3{color:#E3E9FD;}
|
|
.d2-822348135 .color-B4{color:#E3E9FD;}
|
|
.d2-822348135 .color-B5{color:#EDF0FD;}
|
|
.d2-822348135 .color-B6{color:#F7F8FE;}
|
|
.d2-822348135 .color-AA2{color:#4A6FF3;}
|
|
.d2-822348135 .color-AA4{color:#EDF0FD;}
|
|
.d2-822348135 .color-AA5{color:#F7F8FE;}
|
|
.d2-822348135 .color-AB4{color:#EDF0FD;}
|
|
.d2-822348135 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-822348135);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-822348135);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-822348135);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-822348135);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-822348135);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-822348135);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-822348135);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-822348135);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="bGVnZW5k"><g class="shape" ><rect x="157.000000" y="381.000000" width="185.000000" height="378.000000" stroke="#d4d4d8" fill="#fafafa" style="stroke-width:2;" /></g><text x="249.500000" y="368.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Legend</text></g><g class="Y2xpZW50"><g class="shape" ><path d="M 319 1815 H 179 V 1814 C 179 1798 194 1784 219 1777 C 205 1771 197 1762 197 1752 C 197 1736 220 1722 249 1722 C 277 1722 301 1736 301 1752 C 301 1762 293 1771 280 1777 C 304 1784 320 1798 320 1814 V 1815 H 319 Z" stroke="#0D32B2" fill="#fff9e6" class=" stroke-B1" style="stroke-width:2;" /></g><text x="249.000000" y="1836.000000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Browser / iOS App</text></g><g class="Y2FkZHk="><g class="shape" ><rect x="930.000000" y="1711.000000" width="262.000000" height="114.000000" stroke="#0D32B2" fill="#f1f5f9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1061.000000" y="1749.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1061.000000" dy="0.000000">Caddy :443</tspan><tspan x="1061.000000" dy="17.250000">custom build · caddy-ratelimit</tspan><tspan x="1061.000000" dy="17.250000">security headers · rate limiting</tspan><tspan x="1061.000000" dy="17.250000">static error pages</tspan></text></g><g class="c2s="><g class="shape" ><rect x="1861.000000" y="367.000000" width="393.000000" height="2119.000000" stroke="#0D32B2" fill="#fef3c7" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2057.500000" y="354.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">SvelteKit UI :3000</text></g><g class="YmU="><g class="shape" ><rect x="3022.000000" y="1301.000000" width="382.000000" height="943.000000" stroke="#0D32B2" fill="#eef3ff" class=" stroke-B1" style="stroke-width:2;" /></g><text x="3213.000000" y="1288.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Backend API :8080</text></g><g class="c3RvcmFnZQ=="><g class="shape" ><rect x="4164.000000" y="565.000000" width="290.000000" height="1885.000000" stroke="#0D32B2" fill="#eaf7ea" class=" stroke-B1" style="stroke-width:2;" /></g><text x="4309.000000" y="552.000000" fill="#0A0F25" class="text fill-N1" style="text-anchor:middle;font-size:28px">Storage</text></g><g class="bGVnZW5kLnB1Yg=="><g class="shape" ><rect x="205.000000" y="411.000000" width="89.000000" height="66.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="249.500000" y="449.500000" fill="#15803d" class="text-bold" style="text-anchor:middle;font-size:16px">public</text></g><g class="bGVnZW5kLnVzZXI="><g class="shape" ><rect x="193.000000" y="537.000000" width="112.000000" height="66.000000" stroke="#93c5fd" fill="#eff6ff" style="stroke-width:2;" /></g><text x="249.000000" y="575.500000" fill="#1d4ed8" class="text-bold" style="text-anchor:middle;font-size:16px">user auth</text></g><g class="bGVnZW5kLmFkbQ=="><g class="shape" ><rect x="187.000000" y="663.000000" width="125.000000" height="66.000000" stroke="#fdba74" fill="#fff7ed" style="stroke-width:2;" /></g><text x="249.500000" y="701.500000" fill="#c2410c" class="text-bold" style="text-anchor:middle;font-size:16px">admin only</text></g><g class="c2suYXV0aA=="><g class="shape" ><rect x="1916.000000" y="397.000000" width="283.000000" height="114.000000" stroke="#f59e0b" fill="#fde68a" style="stroke-width:2;" /></g><text x="2057.500000" y="435.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">POST /api/auth/login</tspan><tspan x="2057.500000" dy="17.250000">POST /api/auth/register</tspan><tspan x="2057.500000" dy="17.250000">POST /api/auth/change-password</tspan><tspan x="2057.500000" dy="17.250000">GET /api/auth/session</tspan></text></g><g class="c2suY2F0YWxvZ3VlX3Nr"><g class="shape" ><rect x="1948.000000" y="2216.000000" width="219.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="2254.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/catalogue-page</tspan><tspan x="2057.500000" dy="18.500000">GET /api/search</tspan></text></g><g class="c2suYm9va19zaw=="><g class="shape" ><rect x="1891.000000" y="1578.000000" width="333.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="1616.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/book/{slug}</tspan><tspan x="2057.500000" dy="17.666667">GET /api/chapter/{slug}/{n}</tspan><tspan x="2057.500000" dy="17.666667">GET /api/chapter-text-preview/{slug}/{n}</tspan></text></g><g class="c2suc2NyYXBlX3Nr"><g class="shape" ><rect x="1934.000000" y="571.000000" width="248.000000" height="130.000000" stroke="#fdba74" fill="#fff7ed" style="stroke-width:2;" /></g><text x="2058.000000" y="609.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/scrape/status</tspan><tspan x="2058.000000" dy="17.000000">GET /api/scrape/tasks</tspan><tspan x="2058.000000" dy="17.000000">POST /api/scrape</tspan><tspan x="2058.000000" dy="17.000000">POST /api/scrape/range</tspan><tspan x="2058.000000" dy="17.000000">POST /api/scrape/cancel/{id}</tspan></text></g><g class="c2suYXVkaW9fc2s="><g class="shape" ><rect x="1921.000000" y="2358.000000" width="274.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2058.000000" y="2396.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">POST /api/audio/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/audio/status/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/voices</tspan></text></g><g class="c2sucHJlc2lnbl9zaw=="><g class="shape" ><rect x="1900.000000" y="1889.000000" width="316.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2058.000000" y="1927.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/presign/chapter/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/presign/audio/{slug}/{n}</tspan><tspan x="2058.000000" dy="17.666667">GET /api/presign/voice-sample/{voice}</tspan></text></g><g class="c2sucHJlc2lnbl91c2Vy"><g class="shape" ><rect x="1893.000000" y="1219.000000" width="330.000000" height="82.000000" stroke="#93c5fd" fill="#eff6ff" style="stroke-width:2;" /></g><text x="2058.000000" y="1257.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/presign/avatar-upload/{userId}</tspan><tspan x="2058.000000" dy="18.500000">GET /api/presign/avatar/{userId}</tspan></text></g><g class="c2sucHJvZ3Jlc3Nfc2s="><g class="shape" ><rect x="1936.000000" y="761.000000" width="243.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="799.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/progress</tspan><tspan x="2057.500000" dy="17.666667">POST /api/progress/{slug}</tspan><tspan x="2057.500000" dy="17.666667">DELETE /api/progress/{slug}</tspan></text></g><g class="c2subGlicmFyeV9zaw=="><g class="shape" ><rect x="1943.000000" y="919.000000" width="229.000000" height="98.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2057.500000" y="957.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2057.500000" dy="0.000000">GET /api/library</tspan><tspan x="2057.500000" dy="17.666667">POST /api/library/{slug}</tspan><tspan x="2057.500000" dy="17.666667">DELETE /api/library/{slug}</tspan></text></g><g class="c2suY29tbWVudHNfc2s="><g class="shape" ><rect x="1938.000000" y="1077.000000" width="240.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="2058.000000" y="1115.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="2058.000000" dy="0.000000">GET /api/comments/{slug}</tspan><tspan x="2058.000000" dy="18.500000">POST /api/comments/{slug}</tspan></text></g><g class="YmUuaGVhbHRoX2Jl"><g class="shape" ><rect x="3132.000000" y="1331.000000" width="162.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3213.000000" y="1369.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3213.000000" dy="0.000000">GET /health</tspan><tspan x="3213.000000" dy="18.500000">GET /api/version</tspan></text></g><g class="YmUuc2NyYXBlX2Jl"><g class="shape" ><rect x="3101.000000" y="1473.000000" width="225.000000" height="98.000000" stroke="#fdba74" fill="#fff7ed" style="stroke-width:2;" /></g><text x="3213.500000" y="1511.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3213.500000" dy="0.000000">POST /scrape</tspan><tspan x="3213.500000" dy="17.666667">POST /scrape/book</tspan><tspan x="3213.500000" dy="17.666667">POST /scrape/book/range</tspan></text></g><g class="YmUuY2F0YWxvZ3VlX2Jl"><g class="shape" ><rect x="3081.000000" y="1893.000000" width="265.000000" height="114.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3213.500000" y="1931.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3213.500000" dy="0.000000">GET /api/browse</tspan><tspan x="3213.500000" dy="17.250000">GET /api/catalogue</tspan><tspan x="3213.500000" dy="17.250000">GET /api/ranking</tspan><tspan x="3213.500000" dy="17.250000">GET /api/cover/{domain}/{slug}</tspan></text></g><g class="YmUuYm9va19iZQ=="><g class="shape" ><rect x="3052.000000" y="1631.000000" width="322.000000" height="114.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3213.000000" y="1669.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3213.000000" dy="0.000000">GET /api/book-preview/{slug}</tspan><tspan x="3213.000000" dy="17.250000">GET /api/chapter-text/{slug}/{n}</tspan><tspan x="3213.000000" dy="17.250000">GET /api/chapter-markdown/{slug}/{n}</tspan><tspan x="3213.000000" dy="17.250000">POST /api/reindex/{slug} ⚠ admin</tspan></text></g><g class="YmUuYXVkaW9fYmU="><g class="shape" ><rect x="3079.000000" y="2132.000000" width="268.000000" height="82.000000" stroke="#86efac" fill="#f0fdf4" style="stroke-width:2;" /></g><text x="3213.000000" y="2170.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="3213.000000" dy="0.000000">GET /api/audio-proxy/{slug}/{n}</tspan><tspan x="3213.000000" dy="18.500000">GET /api/voices</tspan></text></g><g class="c3RvcmFnZS5wYg=="><g class="shape" ><path d="M 4194 619 C 4194 595 4298 595 4309 595 C 4321 595 4424 595 4424 619 V 721 C 4424 745 4321 745 4309 745 C 4298 745 4194 745 4194 721 V 619 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4194 619 C 4194 643 4298 643 4309 643 C 4321 643 4424 643 4424 619" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4309.000000" y="671.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="4309.000000" dy="0.000000">auth · books · progress</tspan><tspan x="4309.000000" dy="17.666667">comments · library</tspan><tspan x="4309.000000" dy="17.666667">scrape_jobs · audio_cache</tspan></text></g><g class="c3RvcmFnZS5tbg=="><g class="shape" ><path d="M 4228 1665 C 4228 1641 4301 1641 4309 1641 C 4317 1641 4390 1641 4390 1665 V 1751 C 4390 1775 4317 1775 4309 1775 C 4301 1775 4228 1775 4228 1751 V 1665 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4228 1665 C 4228 1689 4301 1689 4309 1689 C 4317 1689 4390 1689 4390 1665" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4309.000000" y="1717.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="4309.000000" dy="0.000000">chapters · audio</tspan><tspan x="4309.000000" dy="18.500000">avatars · browse</tspan></text></g><g class="c3RvcmFnZS5tcw=="><g class="shape" ><path d="M 4242 2148 C 4242 2124 4303 2124 4310 2124 C 4316 2124 4377 2124 4377 2148 V 2218 C 4377 2242 4316 2242 4310 2242 C 4303 2242 4242 2242 4242 2218 V 2148 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4242 2148 C 4242 2172 4303 2172 4310 2172 C 4316 2172 4377 2172 4377 2148" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4309.500000" y="2200.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">index: books</text></g><g class="c3RvcmFnZS52aw=="><g class="shape" ><path d="M 4223 2326 C 4223 2302 4301 2302 4310 2302 C 4318 2302 4396 2302 4396 2326 V 2396 C 4396 2420 4318 2420 4310 2420 C 4301 2420 4223 2420 4223 2396 V 2326 Z" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /><path d="M 4223 2326 C 4223 2350 4301 2350 4310 2350 C 4318 2350 4396 2350 4396 2326" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-AA5" style="stroke-width:2;" /></g><text x="4309.500000" y="2378.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">presign URL cache</text></g><g class="KGNsaWVudCAtJmd0OyBjYWRkeSlbMF0="><marker id="mk-d2-822348135-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 294.999999 1768.002438 C 457.000000 1768.199951 757.200012 1768.250000 926.000000 1768.250000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="611.000000" y="1774.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">HTTPS :443</text></g><g class="KGNhZGR5IC0mZ3Q7IHNrKVswXQ=="><path d="M 1193.834252 1825.297194 C 1400.000000 1914.900024 1533.800049 1937.500000 1857.000000 1937.500000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="1516.000000" y="1932.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="1516.000000" dy="0.000000">/* (catch-all)</tspan><tspan x="1516.000000" dy="18.500000">→ SvelteKit handles auth</tspan></text></g><g class="KGNhZGR5IC0mZ3Q7IGJlKVswXQ=="><path d="M 1090.098219 1827.042470 C 1379.442017 2411.649902 1504.000000 2558.250000 1582.000000 2558.250000 C 1660.000000 2558.250000 1781.099976 2558.250000 1884.750000 2558.250000 C 1988.400024 2558.250000 2126.600098 2558.250000 2230.250000 2558.250000 C 2333.899902 2558.250000 2714.800049 1934.250000 3018.000000 1934.250000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="2015.000000" y="2532.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2015.000000" dy="0.000000">/health /scrape*</tspan><tspan x="2015.000000" dy="17.000000">/api/browse /api/book-preview/*</tspan><tspan x="2015.000000" dy="17.000000">/api/chapter-text/* /api/chapter-markdown/*</tspan><tspan x="2015.000000" dy="17.000000">/api/reindex/* /api/cover/*</tspan><tspan x="2015.000000" dy="17.000000">/api/audio-proxy/* /api/catalogue /api/ranking</tspan></text></g><g class="KGNhZGR5IC0mZ3Q7IHN0b3JhZ2UubW4pWzBd"><path d="M 1077.510662 1709.066293 C 1377.000000 575.000000 1504.000000 291.000000 1582.000000 291.000000 C 1660.000000 291.000000 1781.099976 291.000000 1884.750000 291.000000 C 1988.400024 291.000000 2126.600098 291.000000 2230.250000 291.000000 C 2333.899902 291.000000 2450.000000 347.049988 2520.500000 431.125000 C 2591.000000 515.200012 2685.000000 571.250000 2755.500000 571.250000 C 2826.000000 571.250000 2941.000000 571.250000 3043.000000 571.250000 C 3145.000000 571.250000 3281.000000 571.250000 3383.000000 571.250000 C 3485.000000 571.250000 3599.199951 662.299988 3668.500000 798.875000 C 3737.800049 935.450012 4068.199951 1149.599976 4279.413170 1638.328220" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="2471.000000" y="370.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px"><tspan x="2471.000000" dy="0.000000">/avatars/*</tspan><tspan x="2471.000000" dy="18.500000">(presigned GETs)</tspan></text></g><g class="KHNrLmNhdGFsb2d1ZV9zayAtJmd0OyBiZS5jYXRhbG9ndWVfYmUpWzBd"><path d="M 2100.997176 2214.354040 C 2342.312988 1979.150024 2450.000000 1937.599976 2520.500000 1964.000000 C 2591.000000 1990.400024 2914.500000 2000.859009 3076.557926 1972.975271" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="2538.000000" y="1976.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">internal proxy</text></g><g class="KHNrLmJvb2tfc2sgLSZndDsgYmUuYm9va19iZSlbMF0="><path d="M 2225.970665 1656.841289 C 2367.199951 1681.300049 2450.000000 1687.500000 2520.500000 1687.500000 C 2591.000000 1687.500000 2908.800049 1687.500000 3048.000000 1687.500000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="2637.000000" y="1693.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">internal proxy</text></g><g class="KHNrLmF1ZGlvX3NrIC0mZ3Q7IGJlLmF1ZGlvX2JlKVswXQ=="><path d="M 2103.726761 2356.275083 C 2342.875000 2095.149902 2450.000000 2058.100098 2520.500000 2101.000000 C 2591.000000 2143.899902 2914.199951 2172.500000 3075.000000 2172.500000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="2529.000000" y="2112.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">internal proxy</text></g><g class="KHNrLnByZXNpZ25fc2sgLSZndDsgc3RvcmFnZS52aylbMF0="><path d="M 2116.873295 1988.805224 C 2345.470947 2185.699951 2450.000000 2263.850098 2520.500000 2306.750000 C 2591.000000 2349.649902 2685.000000 2378.250000 2755.500000 2378.250000 C 2826.000000 2378.250000 2941.000000 2378.250000 3043.000000 2378.250000 C 3145.000000 2378.250000 3281.000000 2378.250000 3383.000000 2378.250000 C 3485.000000 2378.250000 3599.199951 2370.149902 3668.500000 2358.000000 C 3737.800049 2345.850098 4056.600098 2341.000000 4219.012151 2353.688449" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3107.000000" y="2384.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">check cache</text></g><g class="KHNrLnByZXNpZ25fc2sgLSZndDsgc3RvcmFnZS5tbilbMF0="><path d="M 2081.894799 1886.697090 C 2338.604980 1352.099976 2450.000000 1218.000000 2520.500000 1218.000000 C 2591.000000 1218.000000 2685.000000 1218.000000 2755.500000 1218.000000 C 2826.000000 1218.000000 2941.000000 1218.000000 3043.000000 1218.000000 C 3145.000000 1218.000000 3281.000000 1218.000000 3383.000000 1218.000000 C 3485.000000 1218.000000 3599.199951 1269.900024 3668.500000 1347.750000 C 3737.800049 1425.599976 4059.600098 1512.400024 4234.849831 1649.534957" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3029.500000" y="1224.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">generate presign</text></g><g class="KHNrLnByZXNpZ25fdXNlciAtJmd0OyBzdG9yYWdlLm1uKVswXQ=="><path d="M 2225.500000 1260.000000 C 2367.100098 1260.000000 2450.000000 1260.000000 2520.500000 1260.000000 C 2591.000000 1260.000000 2685.000000 1260.000000 2755.500000 1260.000000 C 2826.000000 1260.000000 2941.000000 1260.000000 3043.000000 1260.000000 C 3145.000000 1260.000000 3281.000000 1260.000000 3383.000000 1260.000000 C 3485.000000 1260.000000 3599.199951 1309.599976 3668.500000 1384.000000 C 3737.800049 1458.400024 4058.399902 1537.599976 4228.695412 1653.746181" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3288.500000" y="1266.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">generate presign</text></g><g class="KHNrLmF1dGggLSZndDsgc3RvcmFnZS5wYilbMF0="><path d="M 2201.000000 454.000000 C 2362.199951 454.000000 2450.000000 378.700012 2520.500000 265.750000 C 2591.000000 152.800003 2685.000000 77.500000 2755.500000 77.500000 C 2826.000000 77.500000 2941.000000 77.500000 3043.000000 77.500000 C 3145.000000 77.500000 3281.000000 77.500000 3383.000000 77.500000 C 3485.000000 77.500000 3599.199951 77.500000 3668.500000 77.500000 C 3737.800049 77.500000 4065.800049 181.199997 4267.240302 592.407861" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3282.000000" y="83.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">sessions / users</text></g><g class="KHNrLnNjcmFwZV9zayAtJmd0OyBzdG9yYWdlLnBiKVswXQ=="><path d="M 2184.000000 636.000000 C 2358.800049 636.000000 2450.000000 544.549988 2520.500000 407.375000 C 2591.000000 270.200012 2685.000000 178.750000 2755.500000 178.750000 C 2826.000000 178.750000 2941.000000 178.750000 3043.000000 178.750000 C 3145.000000 178.750000 3281.000000 178.750000 3383.000000 178.750000 C 3485.000000 178.750000 3599.199951 178.750000 3668.500000 178.750000 C 3737.800049 178.750000 4064.199951 262.399994 4258.972099 593.552157" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3201.000000" y="184.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">scrape job records</text></g><g class="KHNrLnByb2dyZXNzX3NrIC0mZ3Q7IHN0b3JhZ2UucGIpWzBd"><path d="M 2181.000000 810.000000 C 2358.199951 810.000000 2450.000000 704.200012 2520.500000 545.500000 C 2591.000000 386.799011 2685.000000 281.000000 2755.500000 281.000000 C 2826.000000 281.000000 2941.000000 281.000000 3043.000000 281.000000 C 3145.000000 281.000000 3281.000000 281.000000 3383.000000 281.000000 C 3485.000000 281.000000 3599.199951 281.000000 3668.500000 281.000000 C 3737.800049 281.000000 4061.399902 344.399994 4244.637636 594.772116" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /></g><g class="KHNrLmxpYnJhcnlfc2sgLSZndDsgc3RvcmFnZS5wYilbMF0="><path d="M 2174.000000 968.000000 C 2356.800049 968.000000 2450.000000 857.599976 2520.500000 692.000000 C 2591.000000 526.400024 2685.000000 416.000000 2755.500000 416.000000 C 2826.000000 416.000000 2941.000000 416.000000 3043.000000 416.000000 C 3145.000000 416.000000 3281.000000 416.000000 3383.000000 416.000000 C 3485.000000 416.000000 3599.199951 416.000000 3668.500000 416.000000 C 3737.800049 416.000000 4057.800049 453.000000 4225.973980 598.384048" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /></g><g class="KHNrLmNvbW1lbnRzX3NrIC0mZ3Q7IHN0b3JhZ2UucGIpWzBd"><path d="M 2180.500000 1118.000000 C 2358.100098 1118.000000 2450.000000 994.599976 2520.500000 809.500000 C 2591.000000 624.400024 2685.000000 501.000000 2755.500000 501.000000 C 2826.000000 501.000000 2941.000000 501.000000 3043.000000 501.000000 C 3145.000000 501.000000 3281.000000 501.000000 3383.000000 501.000000 C 3485.000000 501.000000 3599.199951 501.000000 3668.500000 501.000000 C 3737.800049 501.000000 4052.399902 522.599976 4198.536183 606.999507" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /></g><g class="KGJlLmNhdGFsb2d1ZV9iZSAtJmd0OyBzdG9yYWdlLm1zKVswXQ=="><path d="M 3298.646662 2008.630861 C 3501.799072 2147.899902 3599.199951 2183.000000 3668.500000 2183.000000 C 3737.800049 2183.000000 4060.399902 2183.000000 4238.000000 2183.000000" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3745.000000" y="2189.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">full-text search</text></g><g class="KGJlLmNhdGFsb2d1ZV9iZSAtJmd0OyBzdG9yYWdlLnBiKVswXQ=="><path d="M 3257.222880 1890.903622 C 3493.603027 1577.699951 3599.199951 1358.599976 3668.500000 1148.000000 C 3737.800049 937.400024 4050.800049 781.400024 4190.333024 720.597901" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3648.000000" y="1216.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">ranking records</text></g><g class="KGJlLmNhdGFsb2d1ZV9iZSAtJmd0OyBzdG9yYWdlLm1uKVswXQ=="><path d="M 3348.500000 1949.500000 C 3511.699951 1949.500000 3599.199951 1949.500000 3668.500000 1949.500000 C 3737.800049 1949.500000 4060.000000 1912.599976 4236.906929 1767.536318" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3820.000000" y="1946.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">cover presign</text></g><g class="KGJlLmJvb2tfYmUgLSZndDsgc3RvcmFnZS5tbilbMF0="><path d="M 3271.246663 1746.913795 C 3496.365967 1971.900024 3599.199951 2028.500000 3668.500000 2028.500000 C 3737.800049 2028.500000 4062.399902 1976.599976 4249.302517 1771.953571" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3754.000000" y="2031.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">chapter objects</text></g><g class="KGJlLmJvb2tfYmUgLSZndDsgc3RvcmFnZS5wYilbMF0="><path d="M 3375.999969 1687.488826 C 3517.199951 1686.699951 3599.199951 1548.400024 3668.500000 1341.250000 C 3737.800049 1134.099976 4060.800049 945.200012 4241.321558 744.970850" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3723.000000" y="1184.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">book metadata</text></g><g class="KGJlLmF1ZGlvX2JlIC0mZ3Q7IHN0b3JhZ2UubW4pWzBd"><path d="M 3348.914098 2131.325178 C 3511.800049 2081.980957 3599.199951 2069.500000 3668.500000 2069.500000 C 3737.800049 2069.500000 4063.399902 2009.599976 4254.486046 1773.111276" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3856.000000" y="2053.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">audio presign</text></g><g class="KGJlLmF1ZGlvX2JlIC0mZ3Q7IHN0b3JhZ2UudmspWzBd"><path d="M 3327.622211 2215.184298 C 3507.548096 2280.699951 3599.199951 2313.050049 3668.500000 2336.750000 C 3737.800049 2360.449951 4056.600098 2374.000000 4219.005838 2365.216031" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-822348135-3488378134)" mask="url(#d2-822348135)" /><text x="3762.000000" y="2367.000000" fill="#676C7E" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">presign cache</text></g><mask id="d2-822348135" maskUnits="userSpaceOnUse" x="56" y="-33" width="4499" height="2734">
|
|
<rect x="56" y="-33" width="4499" height="2734" fill="white"></rect>
|
|
<rect x="572.000000" y="1758.000000" width="78" height="21" fill="black"></rect>
|
|
<rect x="1433.000000" y="1916.000000" width="166" height="37" fill="black"></rect>
|
|
<rect x="1854.000000" y="2516.000000" width="322" height="85" fill="black"></rect>
|
|
<rect x="2413.000000" y="354.000000" width="116" height="37" fill="black"></rect>
|
|
<rect x="2490.000000" y="1960.000000" width="96" height="21" fill="black"></rect>
|
|
<rect x="2589.000000" y="1677.000000" width="96" height="21" fill="black"></rect>
|
|
<rect x="2481.000000" y="2096.000000" width="96" height="21" fill="black"></rect>
|
|
<rect x="3065.000000" y="2368.000000" width="84" height="21" fill="black"></rect>
|
|
<rect x="2972.000000" y="1208.000000" width="115" height="21" fill="black"></rect>
|
|
<rect x="3231.000000" y="1250.000000" width="115" height="21" fill="black"></rect>
|
|
<rect x="3229.000000" y="67.000000" width="106" height="21" fill="black"></rect>
|
|
<rect x="3138.000000" y="168.000000" width="126" height="21" fill="black"></rect>
|
|
<rect x="3694.000000" y="2173.000000" width="102" height="21" fill="black"></rect>
|
|
<rect x="3594.000000" y="1200.000000" width="108" height="21" fill="black"></rect>
|
|
<rect x="3774.000000" y="1930.000000" width="92" height="21" fill="black"></rect>
|
|
<rect x="3701.000000" y="2015.000000" width="106" height="21" fill="black"></rect>
|
|
<rect x="3670.000000" y="1168.000000" width="106" height="21" fill="black"></rect>
|
|
<rect x="3809.000000" y="2037.000000" width="94" height="21" fill="black"></rect>
|
|
<rect x="3714.000000" y="2351.000000" width="96" height="21" fill="black"></rect>
|
|
</mask></svg></svg>
|