Browse Source

Merge remote-tracking branch 'upstream/main' into persistent-http-nodes

pull/708/head
Dan Ditomaso 1 year ago
parent
commit
1222e7c5c1
  1. 12
      .githooks/_/pre-commit
  2. 3
      .github/pull_request_template.md
  3. 14
      .github/workflows/ci.yml
  4. 4
      .github/workflows/crowdin-upload-sources.yml
  5. 37
      .github/workflows/js-ci.yml
  6. 6
      .github/workflows/nightly.yml
  7. 45
      .github/workflows/pr.yml
  8. 8
      .github/workflows/release.yml
  9. 3
      .gitignore
  10. 2
      .vscode/extensions.json
  11. 5
      .vscode/settings.json
  12. 157
      README.md
  13. 56
      deno.json
  14. 4170
      deno.lock
  15. 121
      package.json
  16. 26
      packages/core/README.md
  17. 10
      packages/core/deno.json
  18. 5
      packages/core/mod.ts
  19. 10
      packages/core/src/constants.ts
  20. 1177
      packages/core/src/meshDevice.ts
  21. 128
      packages/core/src/types.ts
  22. 467
      packages/core/src/utils/eventSystem.ts
  23. 5
      packages/core/src/utils/mod.ts
  24. 119
      packages/core/src/utils/queue.ts
  25. 222
      packages/core/src/utils/transform/decodePacket.ts
  26. 73
      packages/core/src/utils/transform/fromDevice.ts
  27. 16
      packages/core/src/utils/transform/toDevice.ts
  28. 135
      packages/core/src/utils/xmodem.ts
  29. 27
      packages/transport-deno/README.md
  30. 7
      packages/transport-deno/deno.json
  31. 1
      packages/transport-deno/mod.ts
  32. 32
      packages/transport-deno/src/transport.ts
  33. 27
      packages/transport-http/README.md
  34. 7
      packages/transport-http/deno.json
  35. 1
      packages/transport-http/mod.ts
  36. 89
      packages/transport-http/src/transport.ts
  37. 34
      packages/transport-web-bluetooth/README.md
  38. 15
      packages/transport-web-bluetooth/deno.json
  39. 1
      packages/transport-web-bluetooth/mod.ts
  40. 134
      packages/transport-web-bluetooth/src/transport.ts
  41. 34
      packages/transport-web-serial/README.md
  42. 15
      packages/transport-web-serial/deno.json
  43. 1
      packages/transport-web-serial/mod.ts
  44. 42
      packages/transport-web-serial/src/transport.ts
  45. 1
      packages/web/.npmrc
  46. 111
      packages/web/CONTRIBUTING_I18N_DEVELOPER_GUIDE.md
  47. 31
      packages/web/CONTRIBUTING_TRANSLATIONS.md
  48. 0
      packages/web/LICENSE
  49. 175
      packages/web/README.md
  50. 4
      packages/web/crowdin.yml
  51. 58
      packages/web/deno.json
  52. 2
      packages/web/index.html
  53. 0
      packages/web/infra/.dockerignore
  54. 0
      packages/web/infra/Containerfile
  55. 2
      packages/web/infra/default.conf
  56. 102
      packages/web/package.json
  57. 0
      packages/web/postcss.config.cjs
  58. 41
      packages/web/public/Logo.svg
  59. 26
      packages/web/public/Logo_Black.svg
  60. 28
      packages/web/public/Logo_White.svg
  61. 0
      packages/web/public/apple-touch-icon.png
  62. 64
      packages/web/public/chirpy.svg
  63. 2233
      packages/web/public/devices/diy.svg
  64. 2604
      packages/web/public/devices/heltec-ht62-esp32c3-sx1262.svg
  65. 271
      packages/web/public/devices/heltec-mesh-node-t114-case.svg
  66. 398
      packages/web/public/devices/heltec-mesh-node-t114.svg
  67. 74
      packages/web/public/devices/heltec-v3-case.svg
  68. 1496
      packages/web/public/devices/heltec-v3.svg
  69. 149
      packages/web/public/devices/heltec-vision-master-e213.svg
  70. 221
      packages/web/public/devices/heltec-vision-master-e290.svg
  71. 213
      packages/web/public/devices/heltec-vision-master-t190.svg
  72. 510
      packages/web/public/devices/heltec-wireless-paper-V1_0.svg
  73. 510
      packages/web/public/devices/heltec-wireless-paper.svg
  74. 2031
      packages/web/public/devices/heltec-wireless-tracker-V1-0.svg
  75. 2031
      packages/web/public/devices/heltec-wireless-tracker.svg
  76. 1068
      packages/web/public/devices/heltec-wsl-v3.svg
  77. 216
      packages/web/public/devices/nano-g2-ultra.svg
  78. 3510
      packages/web/public/devices/pico.svg
  79. 2619
      packages/web/public/devices/promicro.svg
  80. 264
      packages/web/public/devices/rak-wismeshtap.svg
  81. 2794
      packages/web/public/devices/rak11310.svg
  82. 379
      packages/web/public/devices/rak2560.svg
  83. 4244
      packages/web/public/devices/rak4631.svg
  84. 322
      packages/web/public/devices/rak4631_case.svg
  85. 2305
      packages/web/public/devices/rpipicow.svg
  86. 546
      packages/web/public/devices/seeed-sensecap-indicator.svg
  87. 1002
      packages/web/public/devices/seeed-xiao-s3.svg
  88. 512
      packages/web/public/devices/station-g2.svg
  89. 697
      packages/web/public/devices/t-deck.svg
  90. 195
      packages/web/public/devices/t-echo.svg
  91. 126
      packages/web/public/devices/t-watch-s3.svg
  92. 2514
      packages/web/public/devices/tbeam-s3-core.svg
  93. 3447
      packages/web/public/devices/tbeam.svg
  94. 493
      packages/web/public/devices/tlora-c6.svg
  95. 294
      packages/web/public/devices/tlora-t3s3-epaper.svg
  96. 1311
      packages/web/public/devices/tlora-t3s3-v1.svg
  97. 1237
      packages/web/public/devices/tlora-v2-1-1_6.svg
  98. 1237
      packages/web/public/devices/tlora-v2-1-1_8.svg
  99. 441
      packages/web/public/devices/tracker-t1000-e.svg
  100. 242
      packages/web/public/devices/unknown.svg

12
.githooks/_/pre-commit

@ -0,0 +1,12 @@
#!/bin/sh
if [ "$SKIP_SIMPLE_GIT_HOOKS" = "1" ]; then
echo "[INFO] SKIP_SIMPLE_GIT_HOOKS is set to 1, skipping hook."
exit 0
fi
if [ -f "$SIMPLE_GIT_HOOKS_RC" ]; then
. "$SIMPLE_GIT_HOOKS_RC"
fi
cd packages/web && deno task lint:fix && deno task format

3
.github/pull_request_template.md

@ -46,4 +46,5 @@ Check all that apply. If an item doesn't apply to your PR, you can leave it unch
- [ ] Code follows project style guidelines
- [ ] Documentation has been updated or added
- [ ] Tests have been added or updated
- [ ] All i18n translation labels have bee added
- [ ] All i18n translation labels have been added (read
CONTRIBUTING_I18N_DEVELOPER_GUIDE.md for more details)

14
.github/workflows/ci.yml

@ -29,22 +29,16 @@ jobs:
with:
path: |
~/.cache/deno
./deno.lock
key: ${{ runner.os }}-deno-${{ hashFiles('**/deno.lock') }}
packages/web/deno.lock
key: ${{ runner.os }}-deno-${{ hashFiles('packages/web/deno.lock') }}
restore-keys: |
${{ runner.os }}-deno-
- name: Cache Dependencies
run: deno cache src/index.tsx
- name: Run linter
run: deno task lint
run: deno lint
- name: Check formatter
run: deno task format --check
- name: Run tests
run: deno task test
run: deno fmt --check
- name: Build Package
run: deno task build

4
.github/workflows/crowdin-upload-sources.yml

@ -2,10 +2,10 @@ name: Crowdin Upload Sources Action
on:
push:
# Monitor all .json files within the /src/i18n/locales/en/ directory.
# Monitor all .json files within the /i18n/locales/en/ directory.
# This ensures the workflow triggers if any the English namespace files are modified on the main branch.
paths:
- "/src/i18n/locales/en/**/*.json"
- "/i18n/locales/en/*.json"
branches: [main]
workflow_dispatch: # Allow manual triggering

37
.github/workflows/js-ci.yml

@ -0,0 +1,37 @@
name: Pull Request
on:
push:
paths:
- "packages/core"
- "packages/transport-deno"
- "packages/transport-http"
- "packages/transport-web-bluetooth"
- "packages/transport-web-serial"
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: Check formatting
run: deno fmt --check
- name: Check types
run: deno lint
- name: Publish to JSR
run: npx jsr publish

6
.github/workflows/nightly.yml

@ -21,22 +21,26 @@ jobs:
deno-version: v2.x
- name: Install Dependencies
working-directory: packages/web
run: deno install
- name: Run tests
working-directory: packages/web
run: deno task test
- name: Build Package
working-directory: packages/web
run: deno task build
- name: Package Output
working-directory: packages/web
run: deno task package
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
path: packages/web/dist/build.tar
- name: Set up QEMU
uses: docker/setup-qemu-action@v3

45
.github/workflows/pr.yml

@ -1,10 +1,13 @@
name: Pull Request CI
on:
pull_request:
on: pull_request
permissions:
contents: write
packages: write
jobs:
build:
build-and-package:
runs-on: ubuntu-latest
steps:
- name: Checkout code
@ -15,39 +18,29 @@ jobs:
with:
deno-version: v2.x
- name: Install Dependencies
# Commands will run from 'packages/web'
working-directory: packages/web
run: deno install
- name: Cache Deno dependencies
uses: actions/cache@v4
with:
path: |
~/.cache/deno
./deno.lock
key: ${{ runner.os }}-deno-${{ hashFiles('**/deno.lock') }}
packages/web/deno.lock
key: ${{ runner.os }}-deno-${{ hashFiles('packages/web/deno.lock') }}
restore-keys: |
${{ runner.os }}-deno-
- name: Install Dependencies
run: deno install
- name: Cache Dependencies
run: deno cache src/index.tsx
- name: Run linter
run: deno task lint
working-directory: packages/web
run: deno lint
- name: Check formatter
run: deno task format --check
- name: Run tests
run: deno task test
working-directory: packages/web
run: deno fmt --check
- name: Build Package
run: deno task build
- name: Compress build
run: deno task package
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
working-directory: packages/web
run: deno task --filter web build

8
.github/workflows/release.yml

@ -21,26 +21,30 @@ jobs:
deno-version: v2.x
- name: Install Dependencies
working-directory: packages/web
run: deno install
- name: Run tests
working-directory: packages/web
run: deno task test
- name: Build Package
working-directory: packages/web
run: deno task build
- name: Package Output
working-directory: packages/web
run: deno task package
- name: Archive compressed build
uses: actions/upload-artifact@v4
with:
name: build
path: dist/build.tar
path: packages/web/dist/build.tar
- name: Attach build.tar to release
run: |
gh release upload ${{ github.event.release.tag_name }} dist/build.tar
gh release upload ${{ github.event.release.tag_name }} packages/web/dist/build.tar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

3
.gitignore

@ -5,4 +5,5 @@ stats.html
.vite
dev-dist
__screenshots__*
package-lock.json
npm/
*.diff

2
.vscode/extensions.json

@ -1,3 +1,3 @@
{
"recommendations": ["bradlc.vscode-tailwindcss", "biomejs.biome"]
"recommendations": ["bradlc.vscode-tailwindcss", "denoland.vscode-deno"]
}

5
.vscode/settings.json

@ -2,5 +2,8 @@
"deno.enable": true,
"deno.suggest.imports.autoDiscover": true,
"editor.formatOnSave": true,
"editor.defaultFormatter": "denoland.vscode-deno"
"editor.defaultFormatter": "denoland.vscode-deno",
"[typescript]": {
"editor.defaultFormatter": "denoland.vscode-deno"
}
}

157
README.md

@ -1,133 +1,106 @@
# Meshtastic Web
# Meshtastic Web Monorepo
<!--Project specific badges here-->
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/web/ci.yml?branch=main&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/web/ci.yml?branch=main&label=Web%20CI&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=JS%20CI&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/web)](https://cla-assistant.io/meshtastic/web)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted
or served from a node
**[Hosted version](https://client.meshtastic.org)**
## Stats
![Alt](https://repobeats.axiom.co/api/embed/e5b062db986cb005d83e81724c00cb2b9cce8e4c.svg "Repobeats analytics image")
## Progress Web App Support (PWA)
Meshtastic Web Client now includes Progressive Web App (PWA) functionality,
allowing users to:
This monorepo consolidates the official [Meshtastic](https://meshtastic.org) web
interface and its supporting JavaScript libraries. It aims to provide a unified
development experience for interacting with Meshtastic devices.
- Install the app on desktop and mobile devices
- Access the interface offline
- Receive updates automatically
- Experience faster load times with caching
### Projects within this Monorepo (`packages/`)
To install as a PWA:
All projects are located within the `packages/` directory:
- On desktop: Look for the install icon in your browser's address bar
- On mobile: Use "Add to Home Screen" option in your browser menu
- **`packages/web` (Meshtastic Web Client):** The official web interface,
designed to be hosted or served directly from a Meshtastic node.
- **[Hosted version](https://client.meshtastic.org)**
- **`packages/core`:** Core functionality for Meshtastic JS.
- **`packages/transport-deno`:** TCP Transport for the Deno runtime.
- **`packages/transport-http`:** HTTP Transport.
- **`packages/transport-web-bluetooth`:** Web Bluetooth Transport.
- **`packages/transport-web-serial`:** Web Serial Transport.
PWA functionality works with both the hosted version and self-hosted instances.
All `Meshtastic JS` packages (core and transports) are published to
[JSR](https://jsr.io/@meshtastic).
## Self-host
---
The client can be self hosted using the precompiled container images with an OCI
compatible runtime such as [Docker](https://www.docker.com/) or
[Podman](https://podman.io/). The base image used is
[Nginx 1.27](https://hub.docker.com/_/nginx)
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
```
## Release Schedule
## Stats
Our release process follows these guidelines:
| Project | Repobeats |
| :-------------------- | :-------------------------------------------------------------------------------------------------------------------- |
| Meshtastic Web Client | ![Alt](https://repobeats.axiom.co/api/embed/e5b062db986cb005d83e81724c00cb2b9cce8e4c.svg "Repobeats analytics image") |
| Meshtastic JS | ![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image") |
- **Versioning:** We use Semantic Versioning (`Major.Minor.Patch`).
- **Stable Releases:** Published around the beginning of each month (e.g.,
`v2.3.4`).
- **Pre-releases:** A pre-release is typically issued mid-month for testing and
early adoption.
- **Nightly Builds:** An experimental Docker image containing the latest
cutting-edge features and fixes is automatically built nightly from the `main`
branch.
---
### Nightly Builds
## Tech Stack
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly
```
This monorepo leverages the following technologies:
> [!WARNING]
>
> - Nightly builds represent the latest development state and may contain
> breaking changes
> - These builds undergo automated testing but may be less stable than tagged
> release versions
> - Not recommended for production environments unless you are actively testing
> new features
> - No guarantee of backward compatibility between nightly builds
- **Runtime:** Deno
- **Web Client:** React.js
- **Styling:** Tailwind CSS
- **Bundling:** Vite
- **Language:** TypeScript
- **Testing:** Vitest, React Testing Library
#### Version Information
---
Each nightly build is tagged with:
## Getting Started
- The nightly tag for the latest build
- A specific SHA for build reproducibility
### Prerequisites
### Feedback
You'll need to have [Deno](https://deno.com/) installed to work with this
monorepo. Follow the installation instructions on their home page.
If you encounter any issues with nightly builds, please report them in our
[issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps
improve the stability of future releases
### Development Setup
## Development & Building
1. **Clone the repository:**
```bash
git clone [https://github.com/meshtastic/meshtastic-web.git](https://github.com/meshtastic/meshtastic-web.git)
cd meshtastic-web
```
2. **Install dependencies for all packages:**
```bash
deno task install:all
```
This command installs all necessary dependencies for all packages within the
monorepo.
You'll need to download the package manager used with this repo. You can install
it by visiting [deno.com](https://deno.com/) and following the installation
instructions listed on the home page.
### Running Projects
### Development
#### Meshtastic Web Client
Install the dependencies.
To start the development server for the web client:
```bash
deno i
deno task --filter web dev
```
Start the development server:
```bash
deno task dev
```
This will typically run the web client on http://localhost:3000 and requires a
Chromium browser
### Building and Packaging
## Meshtastic JS Packages
Build the project:
While the js packages are primarily libraries, you can run their tests or
specific development scripts if defined within their deno.json files. For
example, to run tests for a specific package:
```bash
deno task build
deno task --filter core test
```
GZip the output:
### Feedback
```bash
deno task package
```
If you encounter any issues with nightly builds, please report them in our
[issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps
improve the stability of future releases
### Why Deno?

56
deno.json

@ -1,48 +1,34 @@
{
"workspace": [
"./packages/web",
"./packages/core",
"./packages/transport-deno",
"./packages/transport-http",
"./packages/transport-web-bluetooth",
"./packages/transport-web-serial"
],
"imports": {
"@app/": "./src/",
"@pages/": "./src/pages/",
"@components/": "./src/components/",
"@core/": "./src/core/",
"@layouts/": "./src/layouts/",
"@std/path": "jsr:@std/path@^1.1.0"
},
"compilerOptions": {
"lib": [
"DOM",
"DOM.Iterable",
"ESNext",
"deno.window",
"deno.ns"
],
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"strictNullChecks": true,
"types": [
"vite/client",
"node",
"@types/web-bluetooth",
"@types/w3c-web-serial"
],
"strictPropertyInitialization": false
"@bufbuild/protobuf": "npm:@bufbuild/protobuf@^2.2.3",
"@meshtastic/protobufs": "jsr:@meshtastic/protobufs@^2.7.0",
"@types/node": "npm:@types/node@^22.13.10",
"ste-simple-events": "npm:ste-simple-events@^3.0.11",
"tslog": "npm:tslog@^4.9.3"
},
"fmt": {
"nodeModulesDir": "auto",
"lint": {
"exclude": [
"src/*.gen.ts",
"*routeTree.gen.ts",
"*.test.ts",
"*.test.tsx"
]
],
"report": "pretty"
},
"lint": {
"fmt": {
"exclude": [
"src/*.gen.ts",
"*routeTree.gen.ts",
"*.test.ts",
"*.test.tsx"
],
"report": "pretty"
]
},
"unstable": [
"sloppy-imports"

4170
deno.lock

File diff suppressed because it is too large

121
package.json

@ -1,121 +0,0 @@
{
"name": "@meshtastic/web",
"version": "2.6.0-0",
"type": "module",
"description": "Meshtastic web client",
"license": "GPL-3.0-only",
"scripts": {
"build": "vite build",
"build:analyze": "BUNDLE_ANALYZE=true deno task build",
"lint": "deno lint src/",
"lint:fix": "deno lint --fix src/",
"format": "deno fmt src/",
"dev": "deno task dev:ui",
"dev:ui": "VITE_APP_VERSION=development deno run -A npm:vite dev",
"test": "deno run -A npm:vitest",
"preview": "deno run -A npm:vite preview",
"package": "gzipper c -i html,js,css,png,ico,svg,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ."
},
"repository": {
"type": "git",
"url": "git+https://github.com/meshtastic/web.git"
},
"bugs": {
"url": "https://github.com/meshtastic/web/issues"
},
"simple-git-hooks": {
"pre-commit": "deno task lint:fix && deno task format"
},
"lint-staged": {
"*.{ts,tsx}": [
"deno task lint:fix",
"deno task format"
]
},
"homepage": "https://meshtastic.org",
"dependencies": {
"@bufbuild/protobuf": "^2.2.5",
"@meshtastic/core": "npm:@jsr/[email protected]",
"@meshtastic/transport-http": "npm:@jsr/[email protected]",
"@meshtastic/transport-web-bluetooth": "npm:@jsr/[email protected]",
"@meshtastic/transport-web-serial": "npm:@jsr/[email protected]",
"@noble/curves": "^1.9.0",
"@radix-ui/react-accordion": "^1.2.8",
"@radix-ui/react-checkbox": "^1.2.3",
"@radix-ui/react-dialog": "^1.1.11",
"@radix-ui/react-dropdown-menu": "^2.1.12",
"@radix-ui/react-label": "^2.1.4",
"@radix-ui/react-menubar": "^1.1.12",
"@radix-ui/react-popover": "^1.1.11",
"@radix-ui/react-scroll-area": "^1.2.6",
"@radix-ui/react-select": "^2.2.2",
"@radix-ui/react-separator": "^1.1.4",
"@radix-ui/react-slider": "^1.3.2",
"@radix-ui/react-switch": "^1.2.2",
"@radix-ui/react-tabs": "^1.1.9",
"@radix-ui/react-toast": "^1.2.11",
"@radix-ui/react-toggle-group": "^1.1.9",
"@radix-ui/react-tooltip": "^1.2.4",
"@tanstack/react-router": "^1.120.15",
"@tanstack/react-router-devtools": "^1.120.16",
"@tanstack/router-devtools": "^1.120.15",
"@turf/turf": "^7.2.0",
"base64-js": "^1.5.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"crypto-random-string": "^5.0.0",
"deno": "^2.3.5",
"i18next": "^25.2.0",
"i18next-browser-languagedetector": "^8.1.0",
"i18next-http-backend": "^3.0.2",
"idb-keyval": "^6.2.1",
"immer": "^10.1.1",
"js-cookie": "^3.0.5",
"lucide-react": "^0.507.0",
"maplibre-gl": "5.4.0",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-error-boundary": "^6.0.0",
"react-hook-form": "^7.56.2",
"react-i18next": "^15.5.1",
"react-map-gl": "8.0.4",
"react-qrcode-logo": "^3.0.0",
"rfc4648": "^1.5.4",
"vite-plugin-i18n-ally": "^6.0.1",
"vite-plugin-node-polyfills": "^0.23.0",
"zod": "^3.25.0",
"zustand": "5.0.4"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.5",
"@tanstack/router-plugin": "^1.120.15",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/chrome": "^0.0.318",
"@types/js-cookie": "^3.0.6",
"@types/node": "^22.15.3",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.1.3",
"@types/serviceworker": "^0.0.133",
"@types/w3c-web-serial": "^1.0.8",
"@types/web-bluetooth": "^0.0.21",
"@vitejs/plugin-react": "^4.4.1",
"autoprefixer": "^10.4.21",
"gzipper": "^8.2.1",
"happy-dom": "^17.4.6",
"postcss": "^8.5.3",
"simple-git-hooks": "^2.13.0",
"tailwind-merge": "^3.2.0",
"tailwindcss": "^4.1.5",
"tailwindcss-animate": "^1.0.7",
"tar": "^7.4.3",
"testing-library": "^0.0.2",
"typescript": "^5.8.3",
"vite": "^6.3.4",
"vite-plugin-pwa": "^1.0.0",
"vite-plugin-static-copy": "^3.0.0",
"vitest": "^3.1.2"
}
}

26
packages/core/README.md

@ -0,0 +1,26 @@
# @meshtastic/core
[![JSR](https://jsr.io/badges/@meshtastic/core)](https://jsr.io/@meshtastic/core)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/meshtastic.js)](https://cla-assistant.io/meshtastic/meshtastic.js)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
`@meshtastic/core` Provides core functionality for interfacing with Meshtastic
devices. Installation instructions are available at
[JSR](https://jsr.io/@meshtastic/core)
## Usage
```ts
import { MeshDevice } from "@meshtastic/core";
// Transport if provided by one of the available transport adapters
const device = new MeshDevice(transport);
```
## Stats
![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image")

10
packages/core/deno.json

@ -0,0 +1,10 @@
{
"name": "@meshtastic/core",
"version": "2.6.4",
"exports": {
".": "./mod.ts"
},
"imports": {
"crc": "npm:crc@^4.3.2"
}
}

5
packages/core/mod.ts

@ -0,0 +1,5 @@
export { Constants } from "./src/constants.ts";
export { MeshDevice } from "./src/meshDevice.ts";
export * as Protobuf from "@meshtastic/protobufs";
export * as Types from "./src/types.ts";
export * as Utils from "./src/utils/mod.ts";

10
packages/core/src/constants.ts

@ -0,0 +1,10 @@
/** Broadcast destination number */
const broadcastNum = 0xffffffff;
/** Minimum device firmware version supported by this version of the library. */
const minFwVer = 2.2;
export const Constants = {
broadcastNum,
minFwVer,
};

1177
packages/core/src/meshDevice.ts

File diff suppressed because it is too large

128
packages/core/src/types.ts

@ -0,0 +1,128 @@
import type * as Protobuf from "@meshtastic/protobufs";
interface Packet {
type: "packet";
data: Uint8Array;
}
interface DebugLog {
type: "debug";
data: string;
}
export type DeviceOutput = Packet | DebugLog;
export interface Transport {
toDevice: WritableStream<Uint8Array>;
fromDevice: ReadableStream<DeviceOutput>;
}
export interface QueueItem {
id: number;
data: Uint8Array;
sent: boolean;
added: Date;
promise: Promise<number>;
}
export interface HttpRetryConfig {
maxRetries: number;
initialDelayMs: number;
maxDelayMs: number;
backoffFactor: number;
}
export enum DeviceStatusEnum {
DeviceRestarting = 1,
DeviceDisconnected = 2,
DeviceConnecting = 3,
DeviceReconnecting = 4,
DeviceConnected = 5,
DeviceConfiguring = 6,
DeviceConfigured = 7,
}
export type LogEventPacket = LogEvent & { date: Date };
export type PacketDestination = "broadcast" | "direct";
export interface PacketMetadata<T> {
id: number;
rxTime: Date;
type: PacketDestination;
from: number;
to: number;
channel: ChannelNumber;
data: T;
}
export enum EmitterScope {
MeshDevice = 1,
SerialConnection = 2,
NodeSerialConnection = 3,
BleConnection = 4,
HttpConnection = 5,
}
export enum Emitter {
Constructor = 0,
SendText = 1,
SendWaypoint = 2,
SendPacket = 3,
SendRaw = 4,
SetConfig = 5,
SetModuleConfig = 6,
ConfirmSetConfig = 7,
SetOwner = 8,
SetChannel = 9,
ConfirmSetChannel = 10,
ClearChannel = 11,
GetChannel = 12,
GetAllChannels = 13,
GetConfig = 14,
GetModuleConfig = 15,
GetOwner = 16,
Configure = 17,
HandleFromRadio = 18,
HandleMeshPacket = 19,
Connect = 20,
Ping = 21,
ReadFromRadio = 22,
WriteToRadio = 23,
SetDebugMode = 24,
GetMetadata = 25,
ResetNodes = 26,
Shutdown = 27,
Reboot = 28,
RebootOta = 29,
FactoryReset = 30,
EnterDfuMode = 31,
RemoveNodeByNum = 32,
SetCannedMessages = 33,
}
export interface LogEvent {
scope: EmitterScope;
emitter: Emitter;
message: string;
level: Protobuf.Mesh.LogRecord_Level;
packet?: Uint8Array;
}
export enum ChannelNumber {
Primary = 0,
Channel1 = 1,
Channel2 = 2,
Channel3 = 3,
Channel4 = 4,
Channel5 = 5,
Channel6 = 6,
Admin = 7,
}
export type Destination = number | "self" | "broadcast";
export interface PacketError {
id: number;
error: Protobuf.Mesh.Routing_Error;
}

467
packages/core/src/utils/eventSystem.ts

@ -0,0 +1,467 @@
import { SimpleEventDispatcher } from "ste-simple-events";
import type * as Protobuf from "@meshtastic/protobufs";
import type { PacketMetadata } from "../types.ts";
import type * as Types from "../types.ts";
export class EventSystem {
/**
* Fires when a new FromRadio message has been received from the device
*
* @event onLogEvent
*/
public readonly onLogEvent: SimpleEventDispatcher<
Types.LogEventPacket
> = new SimpleEventDispatcher<
Types.LogEventPacket
>();
/**
* Fires when a new FromRadio message has been received from the device
*
* @event onFromRadio
*/
public readonly onFromRadio: SimpleEventDispatcher<
Protobuf.Mesh.FromRadio
> = new SimpleEventDispatcher<
Protobuf.Mesh.FromRadio
>();
/**
* Fires when a new FromRadio message containing a Data packet has been
* received from the device
*
* @event onMeshPacket
*/
public readonly onMeshPacket: SimpleEventDispatcher<
Protobuf.Mesh.MeshPacket
> = new SimpleEventDispatcher<
Protobuf.Mesh.MeshPacket
>();
/**
* Fires when a new MyNodeInfo message has been received from the device
*
* @event onMyNodeInfo
*/
public readonly onMyNodeInfo: SimpleEventDispatcher<
Protobuf.Mesh.MyNodeInfo
> = new SimpleEventDispatcher<
Protobuf.Mesh.MyNodeInfo
>();
/**
* Fires when a new MeshPacket message containing a NodeInfo packet has been
* received from device
*
* @event onNodeInfoPacket
*/
public readonly onNodeInfoPacket: SimpleEventDispatcher<
Protobuf.Mesh.NodeInfo
> = new SimpleEventDispatcher<
Protobuf.Mesh.NodeInfo
>();
/**
* Fires when a new Channel message is received
*
* @event onChannelPacket
*/
public readonly onChannelPacket: SimpleEventDispatcher<
Protobuf.Channel.Channel
> = new SimpleEventDispatcher<
Protobuf.Channel.Channel
>();
/**
* Fires when a new Config message is received
*
* @event onConfigPacket
*/
public readonly onConfigPacket: SimpleEventDispatcher<
Protobuf.Config.Config
> = new SimpleEventDispatcher<
Protobuf.Config.Config
>();
/**
* Fires when a new ModuleConfig message is received
*
* @event onModuleConfigPacket
*/
public readonly onModuleConfigPacket: SimpleEventDispatcher<
Protobuf.ModuleConfig.ModuleConfig
> = new SimpleEventDispatcher<
Protobuf.ModuleConfig.ModuleConfig
>();
/**
* Fires when a new MeshPacket message containing a ATAK packet has been
* received from device
*
* @event onAtakPacket
*/
public readonly onAtakPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Text packet has been
* received from device
*
* @event onMessagePacket
*/
public readonly onMessagePacket: SimpleEventDispatcher<
PacketMetadata<string>
> = new SimpleEventDispatcher<
PacketMetadata<string>
>();
/**
* Fires when a new MeshPacket message containing a Remote Hardware packet has
* been received from device
*
* @event onRemoteHardwarePacket
*/
public readonly onRemoteHardwarePacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.RemoteHardware.HardwareMessage>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.RemoteHardware.HardwareMessage>
>();
/**
* Fires when a new MeshPacket message containing a Position packet has been
* received from device
*
* @event onPositionPacket
*/
public readonly onPositionPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.Position>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.Position>
>();
/**
* Fires when a new MeshPacket message containing a User packet has been
* received from device
*
* @event onUserPacket
*/
public readonly onUserPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.User>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.User>
>();
/**
* Fires when a new MeshPacket message containing a Routing packet has been
* received from device
*
* @event onRoutingPacket
*/
public readonly onRoutingPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.Routing>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.Routing>
>();
/**
* Fires when the device receives a Metadata packet
*
* @event onDeviceMetadataPacket
*/
public readonly onDeviceMetadataPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.DeviceMetadata>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.DeviceMetadata>
>();
/**
* Fires when the device receives a Canned Message Module message packet
*
* @event onCannedMessageModulePacket
*/
public readonly onCannedMessageModulePacket: SimpleEventDispatcher<
PacketMetadata<string>
> = new SimpleEventDispatcher<
PacketMetadata<string>
>();
/**
* Fires when a new MeshPacket message containing a Waypoint packet has been
* received from device
*
* @event onWaypointPacket
*/
public readonly onWaypointPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.Waypoint>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.Waypoint>
>();
/**
* Fires when a new MeshPacket message containing an Audio packet has been
* received from device
*
* @event onAudioPacket
*/
public readonly onAudioPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Detection Sensor packet has been
* received from device
*
* @event onDetectionSensorPacket
*/
public readonly onDetectionSensorPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Ping packet has been
* received from device
*
* @event onPingPacket
*/
public readonly onPingPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a IP Tunnel packet has been
* received from device
*
* @event onIpTunnelPacket
*/
public readonly onIpTunnelPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Paxcounter packet has been
* received from device
*
* @event onPaxcounterPacket
*/
public readonly onPaxcounterPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.PaxCount.Paxcount>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.PaxCount.Paxcount>
>();
/**
* Fires when a new MeshPacket message containing a Serial packet has been
* received from device
*
* @event onSerialPacket
*/
public readonly onSerialPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Store and Forward packet
* has been received from device
*
* @event onStoreForwardPacket
*/
public readonly onStoreForwardPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Store and Forward packet
* has been received from device
*
* @event onRangeTestPacket
*/
public readonly onRangeTestPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Telemetry packet has been
* received from device
*
* @event onTelemetryPacket
*/
public readonly onTelemetryPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Telemetry.Telemetry>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Telemetry.Telemetry>
>();
/**
* Fires when a new MeshPacket message containing a ZPS packet has been
* received from device
*
* @event onZPSPacket
*/
public readonly onZpsPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Simulator packet has been
* received from device
*
* @event onSimulatorPacket
*/
public readonly onSimulatorPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Trace Route packet has been
* received from device
*
* @event onTraceRoutePacket
*/
public readonly onTraceRoutePacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.RouteDiscovery>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.RouteDiscovery>
>();
/**
* Fires when a new MeshPacket message containing a Neighbor Info packet has been
* received from device
*
* @event onNeighborInfoPacket
*/
public readonly onNeighborInfoPacket: SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.NeighborInfo>
> = new SimpleEventDispatcher<
PacketMetadata<Protobuf.Mesh.NeighborInfo>
>();
/**
* Fires when a new MeshPacket message containing an ATAK packet has been
* received from device
*
* @event onAtakPluginPacket
*/
public readonly onAtakPluginPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Map Report packet has been
* received from device
*
* @event onMapReportPacket
*/
public readonly onMapReportPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing a Private packet has been
* received from device
*
* @event onPrivatePacket
*/
public readonly onPrivatePacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when a new MeshPacket message containing an ATAK Forwarder packet has been
* received from device
*
* @event onAtakForwarderPacket
*/
public readonly onAtakForwarderPacket: SimpleEventDispatcher<
PacketMetadata<Uint8Array>
> = new SimpleEventDispatcher<
PacketMetadata<Uint8Array>
>();
/**
* Fires when the devices connection or configuration status changes
*
* @event onDeviceStatus
*/
public readonly onDeviceStatus: SimpleEventDispatcher<
Types.DeviceStatusEnum
> = new SimpleEventDispatcher<
Types.DeviceStatusEnum
>();
/**
* Fires when a new FromRadio message containing a LogRecord packet has been
* received from device
*
* @event onLogRecord
*/
public readonly onLogRecord: SimpleEventDispatcher<
Protobuf.Mesh.LogRecord
> = new SimpleEventDispatcher<
Protobuf.Mesh.LogRecord
>();
/**
* Fires when the device receives a meshPacket, returns a timestamp
*
* @event onMeshHeartbeat
*/
public readonly onMeshHeartbeat: SimpleEventDispatcher<Date> =
new SimpleEventDispatcher<Date>();
/**
* Outputs any debug log data (currently serial connections only)
*
* @event onDeviceDebugLog
*/
public readonly onDeviceDebugLog: SimpleEventDispatcher<Uint8Array> =
new SimpleEventDispatcher<Uint8Array>();
/**
* Outputs status of pending settings changes
*
* @event onpendingSettingsChange
*/
public readonly onPendingSettingsChange: SimpleEventDispatcher<
boolean
> = new SimpleEventDispatcher<
boolean
>();
/**
* Fires when a QueueStatus message is generated
*
* @event onQueueStatus
*/
public readonly onQueueStatus: SimpleEventDispatcher<
Protobuf.Mesh.QueueStatus
> = new SimpleEventDispatcher<
Protobuf.Mesh.QueueStatus
>();
}

5
packages/core/src/utils/mod.ts

@ -0,0 +1,5 @@
export { EventSystem } from "./eventSystem.ts";
export { Queue } from "./queue.ts";
export { Xmodem } from "./xmodem.ts";
export { toDeviceStream } from "./transform/toDevice.ts";
export { fromDeviceStream } from "./transform/fromDevice.ts";

119
packages/core/src/utils/queue.ts

@ -0,0 +1,119 @@
import { SimpleEventDispatcher } from "ste-simple-events";
import { fromBinary } from "@bufbuild/protobuf";
import * as Protobuf from "@meshtastic/protobufs";
import type { PacketError, QueueItem } from "../types.ts";
export class Queue {
private queue: QueueItem[] = [];
private lock = false;
private ackNotifier = new SimpleEventDispatcher<number>();
private errorNotifier = new SimpleEventDispatcher<PacketError>();
private timeout: number;
constructor() {
this.timeout = 60000;
}
public getState(): QueueItem[] {
return this.queue;
}
public clear(): void {
this.queue = [];
}
public push(item: Omit<QueueItem, "promise" | "sent" | "added">): void {
const queueItem: QueueItem = {
...item,
sent: false,
added: new Date(),
promise: new Promise<number>((resolve, reject) => {
this.ackNotifier.subscribe((id) => {
if (item.id === id) {
this.remove(item.id);
resolve(id);
}
});
this.errorNotifier.subscribe((e) => {
if (item.id === e.id) {
this.remove(item.id);
reject(e);
}
});
setTimeout(() => {
if (this.queue.findIndex((qi) => qi.id === item.id) !== -1) {
this.remove(item.id);
const decoded = fromBinary(Protobuf.Mesh.ToRadioSchema, item.data);
console.warn(
`Packet ${item.id} of type ${decoded.payloadVariant.case} timed out`,
);
reject({
id: item.id,
error: Protobuf.Mesh.Routing_Error.TIMEOUT,
});
}
}, this.timeout);
}),
};
this.queue.push(queueItem);
}
public remove(id: number): void {
if (this.lock) {
setTimeout(() => this.remove(id), 100);
return;
}
this.queue = this.queue.filter((item) => item.id !== id);
}
public processAck(id: number): void {
this.ackNotifier.dispatch(id);
}
public processError(e: PacketError): void {
console.error(
`Error received for packet ${e.id}: ${
Protobuf.Mesh.Routing_Error[e.error]
}`,
);
this.errorNotifier.dispatch(e);
}
public wait(id: number): Promise<number> {
const queueItem = this.queue.find((qi) => qi.id === id);
if (!queueItem) {
throw new Error("Packet does not exist");
}
return queueItem.promise;
}
public async processQueue(
outputStream: WritableStream<Uint8Array>,
): Promise<void> {
if (this.lock) {
return;
}
this.lock = true;
const writer = outputStream.getWriter();
try {
while (this.queue.filter((p) => !p.sent).length > 0) {
const item = this.queue.filter((p) => !p.sent)[0];
if (item) {
await new Promise((resolve) => setTimeout(resolve, 200));
try {
await writer.write(item.data);
item.sent = true;
} catch (error) {
console.error(`Error sending packet ${item.id}`, error);
}
}
}
} finally {
writer.releaseLock();
this.lock = false;
}
}
}

222
packages/core/src/utils/transform/decodePacket.ts

@ -0,0 +1,222 @@
import { fromBinary } from "@bufbuild/protobuf";
import type { DeviceOutput } from "../../types.ts";
import { Constants, Protobuf, Types } from "../../../mod.ts";
import type { MeshDevice } from "../../../mod.ts";
export const decodePacket = (device: MeshDevice) =>
new WritableStream<DeviceOutput>({
write(chunk) {
switch (chunk.type) {
case "debug": {
break;
}
case "packet": {
const decodedMessage = fromBinary(
Protobuf.Mesh.FromRadioSchema,
chunk.data,
);
device.events.onFromRadio.dispatch(decodedMessage);
/** @todo Add map here when `all=true` gets fixed. */
switch (decodedMessage.payloadVariant.case) {
case "packet": {
device.handleMeshPacket(decodedMessage.payloadVariant.value);
break;
}
case "myInfo": {
device.events.onMyNodeInfo.dispatch(
decodedMessage.payloadVariant.value,
);
device.log.info(
Types.Emitter[Types.Emitter.HandleFromRadio],
"📱 Received Node info for this device",
);
break;
}
case "nodeInfo": {
device.log.info(
Types.Emitter[Types.Emitter.HandleFromRadio],
`📱 Received Node Info packet for node: ${decodedMessage.payloadVariant.value.num}`,
);
device.events.onNodeInfoPacket.dispatch(
decodedMessage.payloadVariant.value,
);
//TODO: HERE
if (decodedMessage.payloadVariant.value.position) {
device.events.onPositionPacket.dispatch({
id: decodedMessage.id,
rxTime: new Date(),
from: decodedMessage.payloadVariant.value.num,
to: decodedMessage.payloadVariant.value.num,
type: "direct",
channel: Types.ChannelNumber.Primary,
data: decodedMessage.payloadVariant.value.position,
});
}
//TODO: HERE
if (decodedMessage.payloadVariant.value.user) {
device.events.onUserPacket.dispatch({
id: decodedMessage.id,
rxTime: new Date(),
from: decodedMessage.payloadVariant.value.num,
to: decodedMessage.payloadVariant.value.num,
type: "direct",
channel: Types.ChannelNumber.Primary,
data: decodedMessage.payloadVariant.value.user,
});
}
break;
}
case "config": {
if (decodedMessage.payloadVariant.value.payloadVariant.case) {
device.log.trace(
Types.Emitter[Types.Emitter.HandleFromRadio],
`💾 Received Config packet of variant: ${decodedMessage.payloadVariant.value.payloadVariant.case}`,
);
} else {
device.log.warn(
Types.Emitter[Types.Emitter.HandleFromRadio],
`⚠️ Received Config packet of variant: ${"UNK"}`,
);
}
device.events.onConfigPacket.dispatch(
decodedMessage.payloadVariant.value,
);
break;
}
case "logRecord": {
device.log.trace(
Types.Emitter[Types.Emitter.HandleFromRadio],
"Received onLogRecord",
);
device.events.onLogRecord.dispatch(
decodedMessage.payloadVariant.value,
);
break;
}
case "configCompleteId": {
if (decodedMessage.payloadVariant.value !== device.configId) {
device.log.error(
Types.Emitter[Types.Emitter.HandleFromRadio],
`❌ Invalid config id received from device, expected ${device.configId} but received ${decodedMessage.payloadVariant.value}`,
);
}
device.log.info(
Types.Emitter[Types.Emitter.HandleFromRadio],
`⚙️ Valid config id received from device: ${device.configId}`,
);
device.updateDeviceStatus(
Types.DeviceStatusEnum.DeviceConfigured,
);
break;
}
case "rebooted": {
device.configure().catch(() => {
// TODO: FIX, workaround for `wantConfigId` not getting acks.
});
break;
}
case "moduleConfig": {
if (decodedMessage.payloadVariant.value.payloadVariant.case) {
device.log.trace(
Types.Emitter[Types.Emitter.HandleFromRadio],
`💾 Received Module Config packet of variant: ${decodedMessage.payloadVariant.value.payloadVariant.case}`,
);
} else {
device.log.warn(
Types.Emitter[Types.Emitter.HandleFromRadio],
"⚠️ Received Module Config packet of variant: UNK",
);
}
device.events.onModuleConfigPacket.dispatch(
decodedMessage.payloadVariant.value,
);
break;
}
case "channel": {
device.log.trace(
Types.Emitter[Types.Emitter.HandleFromRadio],
`🔐 Received Channel: ${decodedMessage.payloadVariant.value.index}`,
);
device.events.onChannelPacket.dispatch(
decodedMessage.payloadVariant.value,
);
break;
}
case "queueStatus": {
device.log.trace(
Types.Emitter[Types.Emitter.HandleFromRadio],
`🚧 Received Queue Status: ${decodedMessage.payloadVariant.value}`,
);
device.events.onQueueStatus.dispatch(
decodedMessage.payloadVariant.value,
);
break;
}
case "xmodemPacket": {
device.xModem.handlePacket(decodedMessage.payloadVariant.value);
break;
}
case "metadata": {
if (
Number.parseFloat(
decodedMessage.payloadVariant.value.firmwareVersion,
) < Constants.minFwVer
) {
device.log.fatal(
Types.Emitter[Types.Emitter.HandleFromRadio],
`Device firmware outdated. Min supported: ${Constants.minFwVer} got : ${decodedMessage.payloadVariant.value.firmwareVersion}`,
);
}
device.log.debug(
Types.Emitter[Types.Emitter.GetMetadata],
"🏷️ Received metadata packet",
);
device.events.onDeviceMetadataPacket.dispatch({
id: decodedMessage.id,
rxTime: new Date(),
from: 0,
to: 0,
type: "direct",
channel: Types.ChannelNumber.Primary,
data: decodedMessage.payloadVariant.value,
});
break;
}
case "mqttClientProxyMessage": {
break;
}
default: {
device.log.warn(
Types.Emitter[Types.Emitter.HandleFromRadio],
`⚠️ Unhandled payload variant: ${decodedMessage.payloadVariant.case}`,
);
}
}
}
}
},
});

73
packages/core/src/utils/transform/fromDevice.ts

@ -0,0 +1,73 @@
import type { DeviceOutput } from "../../types.ts";
export const fromDeviceStream: () => TransformStream<Uint8Array, DeviceOutput> =
(
// onReleaseEvent: SimpleEventDispatcher<boolean>,
) => {
let byteBuffer = new Uint8Array([]);
const textDecoder = new TextDecoder();
return new TransformStream<Uint8Array, DeviceOutput>({
transform(chunk: Uint8Array, controller): void {
// onReleaseEvent.subscribe(() => {
// controller.terminate();
// });
byteBuffer = new Uint8Array([...byteBuffer, ...chunk]);
let processingExhausted = false;
while (byteBuffer.length !== 0 && !processingExhausted) {
const framingIndex = byteBuffer.findIndex((byte) => byte === 0x94);
const framingByte2 = byteBuffer[framingIndex + 1];
if (framingByte2 === 0xc3) {
if (byteBuffer.subarray(0, framingIndex).length) {
controller.enqueue({
type: "debug",
data: textDecoder.decode(byteBuffer.subarray(0, framingIndex)),
});
byteBuffer = byteBuffer.subarray(framingIndex);
}
const msb = byteBuffer[2];
const lsb = byteBuffer[3];
if (
msb !== undefined &&
lsb !== undefined &&
byteBuffer.length >= 4 + (msb << 8) + lsb
) {
const packet = byteBuffer.subarray(4, 4 + (msb << 8) + lsb);
const malformedDetectorIndex = packet.findIndex(
(byte) => byte === 0x94,
);
if (
malformedDetectorIndex !== -1 &&
packet[malformedDetectorIndex + 1] === 0xc3
) {
console.warn(
`⚠️ Malformed packet found, discarding: ${
byteBuffer
.subarray(0, malformedDetectorIndex - 1)
.toString()
}`,
);
byteBuffer = byteBuffer.subarray(malformedDetectorIndex);
} else {
byteBuffer = byteBuffer.subarray(3 + (msb << 8) + lsb + 1);
controller.enqueue({
type: "packet",
data: packet,
});
}
} else {
/** Only partioal message in buffer, wait for the rest */
processingExhausted = true;
}
} else {
/** Message not complete, only 1 byte in buffer */
processingExhausted = true;
}
}
},
});
};

16
packages/core/src/utils/transform/toDevice.ts

@ -0,0 +1,16 @@
/**
* Pads packets with appropriate framing information before writing to the output stream.
*/
export const toDeviceStream: TransformStream<Uint8Array, Uint8Array> =
new TransformStream<Uint8Array, Uint8Array>({
transform(chunk: Uint8Array, controller): void {
const bufLen = chunk.length;
const header = new Uint8Array([
0x94,
0xC3,
(bufLen >> 8) & 0xFF,
bufLen & 0xFF,
]);
controller.enqueue(new Uint8Array([...header, ...chunk]));
},
});

135
packages/core/src/utils/xmodem.ts

@ -0,0 +1,135 @@
import crc16ccitt from "crc/calculators/crc16ccitt";
import { create, toBinary } from "@bufbuild/protobuf";
import * as Protobuf from "@meshtastic/protobufs";
//if counter > 35 then reset counter/clear/error/reject promise
type XmodemProps = (toRadio: Uint8Array, id?: number) => Promise<number>;
export class Xmodem {
private sendRaw: XmodemProps;
private rxBuffer: Uint8Array[];
private txBuffer: Uint8Array[];
private textEncoder: TextEncoder;
private counter: number;
constructor(sendRaw: XmodemProps) {
this.sendRaw = sendRaw;
this.rxBuffer = [];
this.txBuffer = [];
this.textEncoder = new TextEncoder();
this.counter = 0;
}
async downloadFile(filename: string): Promise<number> {
return await this.sendCommand(
Protobuf.Xmodem.XModem_Control.STX,
this.textEncoder.encode(filename),
0,
);
}
async uploadFile(filename: string, data: Uint8Array): Promise<number> {
for (let i = 0; i < data.length; i += 128) {
this.txBuffer.push(data.slice(i, i + 128));
}
return await this.sendCommand(
Protobuf.Xmodem.XModem_Control.SOH,
this.textEncoder.encode(filename),
0,
);
}
async sendCommand(
command: Protobuf.Xmodem.XModem_Control,
buffer?: Uint8Array,
sequence?: number,
crc16?: number,
): Promise<number> {
const toRadio = create(Protobuf.Mesh.ToRadioSchema, {
payloadVariant: {
case: "xmodemPacket",
value: {
buffer,
control: command,
seq: sequence,
crc16: crc16,
},
},
});
return await this.sendRaw(toBinary(Protobuf.Mesh.ToRadioSchema, toRadio));
}
async handlePacket(packet: Protobuf.Xmodem.XModem): Promise<number> {
await new Promise((resolve) => setTimeout(resolve, 100));
switch (packet.control) {
case Protobuf.Xmodem.XModem_Control.NUL: {
// nothing
break;
}
case Protobuf.Xmodem.XModem_Control.SOH: {
this.counter = packet.seq;
if (this.validateCrc16(packet)) {
this.rxBuffer[this.counter] = packet.buffer;
return this.sendCommand(Protobuf.Xmodem.XModem_Control.ACK);
}
return await this.sendCommand(
Protobuf.Xmodem.XModem_Control.NAK,
undefined,
packet.seq,
);
}
case Protobuf.Xmodem.XModem_Control.STX: {
break;
}
case Protobuf.Xmodem.XModem_Control.EOT: {
// end of transmission
break;
}
case Protobuf.Xmodem.XModem_Control.ACK: {
this.counter++;
if (this.txBuffer[this.counter - 1]) {
return this.sendCommand(
Protobuf.Xmodem.XModem_Control.SOH,
this.txBuffer[this.counter - 1],
this.counter,
crc16ccitt(this.txBuffer[this.counter - 1] ?? new Uint8Array()),
);
}
if (this.counter === this.txBuffer.length + 1) {
return this.sendCommand(Protobuf.Xmodem.XModem_Control.EOT);
}
this.clear();
break;
}
case Protobuf.Xmodem.XModem_Control.NAK: {
return this.sendCommand(
Protobuf.Xmodem.XModem_Control.SOH,
this.txBuffer[this.counter],
this.counter,
crc16ccitt(this.txBuffer[this.counter - 1] ?? new Uint8Array()),
);
}
case Protobuf.Xmodem.XModem_Control.CAN: {
this.clear();
break;
}
case Protobuf.Xmodem.XModem_Control.CTRLZ: {
break;
}
}
return Promise.resolve(0);
}
validateCrc16(packet: Protobuf.Xmodem.XModem): boolean {
return crc16ccitt(packet.buffer) === packet.crc16;
}
clear() {
this.counter = 0;
this.rxBuffer = [];
this.txBuffer = [];
}
}

27
packages/transport-deno/README.md

@ -0,0 +1,27 @@
# @meshtastic/transport-deno
[![JSR](https://jsr.io/badges/@meshtastic/transport-deno)](https://jsr.io/@meshtastic/transport-deno)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/meshtastic.js)](https://cla-assistant.io/meshtastic/meshtastic.js)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
`@meshtastic/transport-deno` Provides TCP transport (Deno) for Meshtastic
devices. Installation instructions are avaliable at
[JSR](https://jsr.io/@meshtastic/transport-deno)
## Usage
```ts
import { MeshDevice } from "@meshtastic/core";
import { TransportDeno } from "@meshtastic/transport-deno";
const transport = await TransportDeno.create("10.10.0.57");
const device = new MeshDevice(transport);
```
## Stats
![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image")

7
packages/transport-deno/deno.json

@ -0,0 +1,7 @@
{
"name": "@meshtastic/transport-deno",
"version": "0.1.1",
"exports": {
".": "./mod.ts"
}
}

1
packages/transport-deno/mod.ts

@ -0,0 +1 @@
export { TransportDeno } from "./src/transport.ts";

32
packages/transport-deno/src/transport.ts

@ -0,0 +1,32 @@
import { Utils } from "@meshtastic/core";
import type { Types } from "@meshtastic/core";
export class TransportDeno implements Types.Transport {
private _toDevice: WritableStream<Uint8Array>;
private _fromDevice: ReadableStream<Types.DeviceOutput>;
public static async create(hostname: string): Promise<TransportDeno> {
const connection = await Deno.connect({
hostname,
port: 4403,
});
return new TransportDeno(connection);
}
constructor(connection: Deno.Conn) {
Utils.toDeviceStream.readable.pipeTo(connection.writable);
this._toDevice = Utils.toDeviceStream.writable;
this._fromDevice = connection.readable.pipeThrough(
Utils.fromDeviceStream(),
);
}
get toDevice(): WritableStream<Uint8Array> {
return this._toDevice;
}
get fromDevice(): ReadableStream<Types.DeviceOutput> {
return this._fromDevice;
}
}

27
packages/transport-http/README.md

@ -0,0 +1,27 @@
# @meshtastic/transport-http
[![JSR](https://jsr.io/badges/@meshtastic/transport-http)](https://jsr.io/@meshtastic/transport-http)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/meshtastic.js)](https://cla-assistant.io/meshtastic/meshtastic.js)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
`@meshtastic/transport-http` Provides HTTP(S) transport for Meshtastic devices.
Installation instructions are available at
[JSR](https://jsr.io/@meshtastic/transport-http)
## Usage
```ts
import { MeshDevice } from "@meshtastic/core";
import { TransportHTTP } from "@meshtastic/transport-http";
const transport = await TransportHTTP.create("10.10.0.57");
const device = new MeshDevice(transport);
```
## Stats
![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image")

7
packages/transport-http/deno.json

@ -0,0 +1,7 @@
{
"name": "@meshtastic/transport-http",
"version": "0.2.1",
"exports": {
".": "./mod.ts"
}
}

1
packages/transport-http/mod.ts

@ -0,0 +1 @@
export { TransportHTTP } from "./src/transport.ts";

89
packages/transport-http/src/transport.ts

@ -0,0 +1,89 @@
import type { Types } from "@meshtastic/core";
export class TransportHTTP implements Types.Transport {
private _toDevice: WritableStream<Uint8Array>;
private _fromDevice: ReadableStream<Types.DeviceOutput>;
private url: string;
private receiveBatchRequests: boolean;
private fetchInterval: number;
public static async create(
address: string,
tls?: boolean,
): Promise<TransportHTTP> {
const connectionUrl = `${tls ? "https" : "http"}://${address}`;
await fetch(`${connectionUrl}/json/report`);
await Promise.resolve();
return new TransportHTTP(connectionUrl);
}
constructor(url: string) {
this.url = url;
this.receiveBatchRequests = false;
this.fetchInterval = 3000;
this._toDevice = new WritableStream<Uint8Array>({
write: async (chunk) => {
await this.writeToRadio(chunk);
},
});
let controller: ReadableStreamDefaultController<Types.DeviceOutput>;
this._fromDevice = new ReadableStream<Types.DeviceOutput>({
start: (ctrl) => {
controller = ctrl;
},
});
setInterval(async () => {
await this.readFromRadio(controller);
}, this.fetchInterval);
}
private async readFromRadio(
controller: ReadableStreamDefaultController<Types.DeviceOutput>,
): Promise<void> {
let readBuffer = new ArrayBuffer(1);
while (readBuffer.byteLength > 0) {
const response = await fetch(
`${this.url}/api/v1/fromradio?all=${
this.receiveBatchRequests ? "true" : "false"
}`,
{
method: "GET",
headers: {
Accept: "application/x-protobuf",
},
},
);
readBuffer = await response.arrayBuffer();
if (readBuffer.byteLength > 0) {
controller.enqueue({
type: "packet",
data: new Uint8Array(readBuffer),
});
}
}
}
private async writeToRadio(data: Uint8Array): Promise<void> {
await fetch(`${this.url}/api/v1/toradio`, {
method: "PUT",
headers: {
"Content-Type": "application/x-protobuf",
},
body: data,
});
}
get toDevice(): WritableStream<Uint8Array> {
return this._toDevice;
}
get fromDevice(): ReadableStream<Types.DeviceOutput> {
return this._fromDevice;
}
}

34
packages/transport-web-bluetooth/README.md

@ -0,0 +1,34 @@
# @meshtastic/transport-web-bluetooth
[![JSR](https://jsr.io/badges/@meshtastic/transport-web-bluetooth)](https://jsr.io/@meshtastic/transport-web-bluetooth)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/meshtastic.js)](https://cla-assistant.io/meshtastic/meshtastic.js)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
`@meshtastic/transport-web-bluetooth` Provides Web Bluetooth transport for
Meshtastic devices. Installation instructions are available at
[JSR](https://jsr.io/@meshtastic/transport-web-bluetooth)
## Usage
```ts
import { MeshDevice } from "@meshtastic/core";
import { TransportWebBluetooth } from "@meshtastic/transport-web-bluetooth";
const transport = await TransportWebBluetooth.create();
const device = new MeshDevice(transport);
```
## Stats
![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image")
### Compatibility
The Web Bluetooth API's have limited support in browsers, compatibility is
represented in the matrix below.
![Web Bluetooth compatability matrix](https://caniuse.bitsofco.de/image/web-bluetooth.png)

15
packages/transport-web-bluetooth/deno.json

@ -0,0 +1,15 @@
{
"name": "@meshtastic/transport-web-bluetooth",
"version": "0.1.2",
"exports": {
".": "./mod.ts"
},
"imports": {
"@types/web-bluetooth": "npm:@types/web-bluetooth@^0.0.20"
},
"compilerOptions": {
"types": [
"@types/web-bluetooth"
]
}
}

1
packages/transport-web-bluetooth/mod.ts

@ -0,0 +1 @@
export { TransportWebBluetooth } from "./src/transport.ts";

134
packages/transport-web-bluetooth/src/transport.ts

@ -0,0 +1,134 @@
import type { Types } from "@meshtastic/core";
export class TransportWebBluetooth implements Types.Transport {
private _toDevice: WritableStream<Uint8Array>;
private _fromDevice: ReadableStream<Types.DeviceOutput>;
private _fromDeviceController?: ReadableStreamDefaultController<
Types.DeviceOutput
>;
private _isFirstWrite = true;
private toRadioCharacteristic: BluetoothRemoteGATTCharacteristic;
private fromRadioCharacteristic: BluetoothRemoteGATTCharacteristic;
private fromNumCharacteristic: BluetoothRemoteGATTCharacteristic;
static ToRadioUuid = "f75c76d2-129e-4dad-a1dd-7866124401e7";
static FromRadioUuid = "2c55e69e-4993-11ed-b878-0242ac120002";
static FromNumUuid = "ed9da18c-a800-4f66-a670-aa7547e34453";
static ServiceUuid = "6ba1b218-15a8-461f-9fa8-5dcae273eafd";
public static async create(): Promise<TransportWebBluetooth> {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: [this.ServiceUuid] }],
});
return await this.prepareConnection(device);
}
public static async createFromDevice(
device: BluetoothDevice,
): Promise<TransportWebBluetooth> {
return await this.prepareConnection(device);
}
public static async prepareConnection(
device: BluetoothDevice,
): Promise<TransportWebBluetooth> {
const gattServer = await device.gatt?.connect();
if (!gattServer) {
throw new Error("Failed to connect to GATT server");
}
const service = await gattServer.getPrimaryService(this.ServiceUuid);
const toRadioCharacteristic = await service.getCharacteristic(
this.ToRadioUuid,
);
const fromRadioCharacteristic = await service.getCharacteristic(
this.FromRadioUuid,
);
const fromNumCharacteristic = await service.getCharacteristic(
this.FromNumUuid,
);
if (
!toRadioCharacteristic || !fromRadioCharacteristic ||
!fromNumCharacteristic
) {
throw new Error("Failed to find required characteristics");
}
console.log("Connected to device", device.name);
return new TransportWebBluetooth(
toRadioCharacteristic,
fromRadioCharacteristic,
fromNumCharacteristic,
);
}
constructor(
toRadioCharacteristic: BluetoothRemoteGATTCharacteristic,
fromRadioCharacteristic: BluetoothRemoteGATTCharacteristic,
fromNumCharacteristic: BluetoothRemoteGATTCharacteristic,
) {
this.toRadioCharacteristic = toRadioCharacteristic;
this.fromRadioCharacteristic = fromRadioCharacteristic;
this.fromNumCharacteristic = fromNumCharacteristic;
this._fromDevice = new ReadableStream({
start: (ctrl) => {
this._fromDeviceController = ctrl;
},
});
this._toDevice = new WritableStream({
write: async (chunk) => {
await this.toRadioCharacteristic.writeValue(chunk);
if (this._isFirstWrite && this._fromDeviceController) {
this._isFirstWrite = false;
setTimeout(() => {
this.readFromRadio(this._fromDeviceController!);
}, 50);
}
},
});
this.fromNumCharacteristic.addEventListener(
"characteristicvaluechanged",
() => {
if (this._fromDeviceController) {
this.readFromRadio(this._fromDeviceController);
}
},
);
this.fromNumCharacteristic.startNotifications();
}
get toDevice(): WritableStream<Uint8Array> {
return this._toDevice;
}
get fromDevice(): ReadableStream<Types.DeviceOutput> {
return this._fromDevice;
}
protected async readFromRadio(
controller: ReadableStreamDefaultController<Types.DeviceOutput>,
): Promise<void> {
let hasMoreData = true;
while (hasMoreData && this.fromRadioCharacteristic) {
const value = await this.fromRadioCharacteristic.readValue();
if (value.byteLength === 0) {
hasMoreData = false;
continue;
}
controller.enqueue({
type: "packet",
data: new Uint8Array(value.buffer),
});
}
}
}

34
packages/transport-web-serial/README.md

@ -0,0 +1,34 @@
# @meshtastic/transport-web-serial
[![JSR](https://jsr.io/badges/@meshtastic/transport-web-serial)](https://jsr.io/@meshtastic/transport-web-serial)
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/js/ci.yml?branch=master&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/js/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/meshtastic.js)](https://cla-assistant.io/meshtastic/meshtastic.js)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
`@meshtastic/transport-web-serial` Provides Web Serial transport for Meshtastic
devices. Installation instructions are avaliable at
[JSR](https://jsr.io/@meshtastic/transport-web-serial)
## Usage
```ts
import { MeshDevice } from "@meshtastic/core";
import { TransportWebSerial } from "@meshtastic/transport-web-serial";
const transport = await TransportWebSerial.create();
const device = new MeshDevice(transport);
```
## Stats
![Alt](https://repobeats.axiom.co/api/embed/5330641586e92a2ec84676fedb98f6d4a7b25d69.svg "Repobeats analytics image")
### Compatibility
The Web Serial API's have limited support in browsers, compatibility is
represented in the matrix below.
![Web Serial compatability matrix](https://caniuse.bitsofco.de/image/web-serial.png)

15
packages/transport-web-serial/deno.json

@ -0,0 +1,15 @@
{
"name": "@meshtastic/transport-web-serial",
"version": "0.2.1",
"exports": {
".": "./mod.ts"
},
"imports": {
"@types/w3c-web-serial": "npm:@types/w3c-web-serial@^1.0.7"
},
"compilerOptions": {
"types": [
"@types/w3c-web-serial"
]
}
}

1
packages/transport-web-serial/mod.ts

@ -0,0 +1 @@
export { TransportWebSerial } from "./src/transport.ts";

42
packages/transport-web-serial/src/transport.ts

@ -0,0 +1,42 @@
import { Utils } from "@meshtastic/core";
import type { Types } from "@meshtastic/core";
export class TransportWebSerial implements Types.Transport {
private _toDevice: WritableStream<Uint8Array>;
private _fromDevice: ReadableStream<Types.DeviceOutput>;
public static async create(baudRate?: number): Promise<TransportWebSerial> {
const port = await navigator.serial.requestPort();
await port.open({ baudRate: baudRate || 115200 });
return new TransportWebSerial(port);
}
public static async createFromPort(
port: SerialPort,
baudRate?: number,
): Promise<TransportWebSerial> {
await port.open({ baudRate: baudRate || 115200 });
return new TransportWebSerial(port);
}
constructor(connection: SerialPort) {
if (!connection.readable || !connection.writable) {
throw new Error("Stream not accessible");
}
Utils.toDeviceStream.readable.pipeTo(connection.writable);
this._toDevice = Utils.toDeviceStream.writable;
this._fromDevice = connection.readable.pipeThrough(
Utils.fromDeviceStream(),
);
}
get toDevice(): WritableStream<Uint8Array> {
return this._toDevice;
}
get fromDevice(): ReadableStream<Types.DeviceOutput> {
return this._fromDevice;
}
}

1
packages/web/.npmrc

@ -0,0 +1 @@
@jsr:registry=https://npm.jsr.io

111
packages/web/CONTRIBUTING_I18N_DEVELOPER_GUIDE.md

@ -0,0 +1,111 @@
# i18n Developer Guide
When developing new components, all user-facing text must be added as an i18n
key and rendered using our translation functions. This ensures your UI can be
translated into multiple languages.
## Adding New i18n Keys
### Search Before Creating
Before adding a new key, please perform a quick search to see if one that fits
your needs already exists. Many common labels like "Save," "Cancel," "Name,"
"Description," "Loading...," or "Error" are likely already present, especially
in the common.json namespace. Reusing existing keys prevents duplication and
ensures consistency across the application. Using your code editor's search
function across the /i18n/locales/en/ directory is an effective way to do this.
### Key Naming and Structure Rules
To maintain consistency and ease of use, please adhere to the following rules
when creating new keys in the JSON files.
- **Keys are camelCase:** `exampleKey`, `anotherExampleKey`.
- **Avoid Deep Nesting:** One or two levels of nesting are acceptable for
grouping related keys (e.g., all labels for a specific menu). However, nesting
deeper than two levels should be avoided to maintain readability and ease of
use.
- **Good (1 level):**
```json
"buttons": {
"save": "Save",
"cancel": "Cancel"
}
```
- **Acceptable (2 levels):**
```json
"userMenu": {
"items": {
"profile": "Profile",
"settings": "Settings"
}
}
```
- **Avoid (3+ levels):**
```json
"userMenu": {
"items": {
"actions": {
"viewProfile": "View Profile"
}
}
}
```
- **Organize for Retrieval, Not UI Layout:** Keys should be named logically for
easy retrieval, not to mirror the layout of your component.
### Namespace Rules
We use namespaces to organize keys. All source keys are added to the English
(`en`) files located at `/i18n/locales/en/`. Place your new keys in the
appropriate file based on these rules:
- `common.json`:
- All button labels (`save`, `cancel`, `submit`, etc.).
- Any text that is repeated and used throughout the application (e.g.,
"Loading...", "Error").
- `ui.json`:
- Labels and text specific to a distinct UI element or view that isn't a
dialog or a config page.
- `dialog.json`:
- All text specific to modal dialogs (titles, body text, prompts).
- `messages.json`:
- Text specifically related to the messaging interface.
- `deviceConfig.json` & `moduleConfig.json`:
- Labels and descriptions for the settings on the Device and Module
configuration pages.
## Using i18n Keys in Components
We use the `useTranslation` hook from `react-i18next` to access the translation
function, `t`.
### Default Namespaces
Our i18next configuration has fallback namespaces configured which includes
`common`, `ui`, and `dialog`. This means you **do not** need to explicitly
specify these namespaces when calling the hook. The system will automatically
check these files for your key.
For any keys in `common.json`, `ui.json`, or `dialog.json`, you can instantiate
the hook simply:
```typescript
import { useTranslation } from "react-i18next";
// In your component
const { t } = useTranslation(["messages"]);
// Usage
return <p>{t("someMessageLabel")}</p>;
```
You can also specify the namespace on a per-call basis using the options object.
This is useful if a component primarily uses a default namespace but needs a
single key from another.
```typescript
const { t } = useTranslation();
return <p>{t("someMessageLabel", { ns: "messages" })}</p>;
```

31
packages/web/CONTRIBUTING_TRANSLATIONS.md

@ -0,0 +1,31 @@
# Contributing Translations
Thank you for your interest in making the Meshtastic Web Client accessible to a
global audience! Your translation efforts are greatly appreciated.
## Our Translation Platform: Crowdin
We manage all our translations through a platform called
[Crowdin](https://crowdin.com/). This allows for a collaborative and streamlined
translation process. All translation work should be done on our Crowdin project,
not directly in the code repository via Pull Requests.
### How to Get Started
1. **Create a Crowdin Account:** If you don't already have one, sign up for a
free account on Crowdin.
2. **Join Our Project:** Please ask for a link to our specific Crowdin project
on the Meshtastic Discord.
3. **Request Translator Role:** Once you have an account, join the Meshtastic
Discord and notify an admin in the `#web` channel. They will grant you the
necessary permissions to start translating.
4. **Start Translating:** Once you have your role, you can begin translating the
source labels into your native language directly on the Crowdin platform.
### Language Activation
A new language will only be added to the web client and appear in the language
picker once its translation is 100% complete on Crowdin. The repository
maintainers will handle this process once the milestone is reached.
Thank you for helping us bring Meshtastic to more users around the world!

0
LICENSE → packages/web/LICENSE

175
packages/web/README.md

@ -0,0 +1,175 @@
# Meshtastic Web
<!--Project specific badges here-->
[![CI](https://img.shields.io/github/actions/workflow/status/meshtastic/web/ci.yml?branch=main&label=actions&logo=github&color=yellow)](https://github.com/meshtastic/web/actions/workflows/ci.yml)
[![CLA assistant](https://cla-assistant.io/readme/badge/meshtastic/web)](https://cla-assistant.io/meshtastic/web)
[![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/)
[![Vercel](https://img.shields.io/static/v1?label=Powered%20by&message=Vercel&style=flat&logo=vercel&color=000000)](https://vercel.com?utm_source=meshtastic&utm_campaign=oss)
## Overview
Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted
or served from a node
**[Hosted version](https://client.meshtastic.org)**
## Stats
![Alt](https://repobeats.axiom.co/api/embed/e5b062db986cb005d83e81724c00cb2b9cce8e4c.svg "Repobeats analytics image")
## Progress Web App Support (PWA)
Meshtastic Web Client now includes Progressive Web App (PWA) functionality,
allowing users to:
- Install the app on desktop and mobile devices
- Access the interface offline
- Receive updates automatically
- Experience faster load times with caching
To install as a PWA:
- On desktop: Look for the install icon in your browser's address bar
- On mobile: Use "Add to Home Screen" option in your browser menu
PWA functionality works with both the hosted version and self-hosted instances.
## Self-host
The client can be self hosted using the precompiled container images with an OCI
compatible runtime such as [Docker](https://www.docker.com/) or
[Podman](https://podman.io/). The base image used is
[Nginx 1.27](https://hub.docker.com/_/nginx)
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web
```
## Release Schedule
Our release process follows these guidelines:
- **Versioning:** We use Semantic Versioning (`Major.Minor.Patch`).
- **Stable Releases:** Published around the beginning of each month (e.g.,
`v2.3.4`).
- **Pre-releases:** A pre-release is typically issued mid-month for testing and
early adoption.
- **Nightly Builds:** An experimental Docker image containing the latest
cutting-edge features and fixes is automatically built nightly from the `main`
branch.
### Nightly Builds
```bash
# With Docker
docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly
#With Podman
podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly
```
> [!WARNING]
>
> - Nightly builds represent the latest development state and may contain
> breaking changes
> - These builds undergo automated testing but may be less stable than tagged
> release versions
> - Not recommended for production environments unless you are actively testing
> new features
> - No guarantee of backward compatibility between nightly builds
#### Version Information
Each nightly build is tagged with:
- The nightly tag for the latest build
- A specific SHA for build reproducibility
### Feedback
If you encounter any issues with nightly builds, please report them in our
[issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps
improve the stability of future releases
## Development & Building
You'll need to download the package manager used with this repo. You can install
it by visiting [deno.com](https://deno.com/) and following the installation
instructions listed on the home page.
### Development
Install the dependencies.
```bash
deno i
```
Start the development server:
```bash
deno task dev
```
### Building and Packaging
Build the project:
```bash
deno task build
```
GZip the output:
```bash
deno task package
```
### Why Deno?
Meshtastic Web uses Deno as its development platform for several compelling
reasons:
- **Built-in Security**: Deno's security-first approach requires explicit
permissions for file, network, and environment access, reducing vulnerability
risks.
- **TypeScript Support**: Native TypeScript support without additional
configuration, enhancing code quality and developer experience.
- **Modern JavaScript**: First-class support for ESM imports, top-level await,
and other modern JavaScript features.
- **Simplified Tooling**: Built-in formatter, linter, test runner, and bundler
eliminate the need for multiple third-party tools.
- **Reproducible Builds**: Lockfile ensures consistent builds across all
environments.
- **Web Standard APIs**: Uses browser-compatible APIs, making code more portable
between server and client environments.
### Contributing
We welcome contributions! Here’s how the deployment flow works for pull
requests:
- **Preview Deployments:**\
Every pull request automatically generates a preview deployment on Vercel.
This allows you and reviewers to easily preview changes before merging.
- **Staging Environment (`client-test`):**\
Once your PR is merged, your changes will be available on our staging site:
[client-test.meshtastic.org](https://client-test.meshtastic.org/).\
This environment supports rapid feature iteration and testing without
impacting the production site.
- **Production Releases:**\
At regular intervals, stable and fully tested releases are promoted to our
production site: [client.meshtastic.org](https://client.meshtastic.org/).\
This is the primary interface used by the public to connect with their
Meshtastic nodes.
Please review our
[Contribution Guidelines](https://github.com/meshtastic/web/blob/main/CONTRIBUTING.md)
before submitting a pull request. We appreciate your help in making the project
better!

4
crowdin.yml → packages/web/crowdin.yml

@ -6,5 +6,5 @@ base_url: "https://meshtastic.crowdin.com/api/v2"
preserve_hierarchy: true
files:
- source: "/src/i18n/locales/en/**/*.json"
translation: "/src/i18n/locales/%locale%/%original_file_name%"
- source: "/i18n/locales/en/*.json"
translation: "/i18n/locales/%locale%/%original_file_name%"

58
packages/web/deno.json

@ -0,0 +1,58 @@
{
"imports": {
"@app/": "./src/",
"@public/": "./public/",
"@pages/": "./src/pages/",
"@components/": "./src/components/",
"@core/": "./src/core/",
"@layouts/": "./src/layouts/",
"@std/path": "jsr:@std/path@^1.1.0"
},
"tasks": {
"build": "vite build",
"build:analyze": "BUNDLE_ANALYZE=true deno task build",
"lint": "deno lint src/",
"lint:fix": "deno lint --fix src/",
"format": "deno fmt src/",
"dev": "deno task dev:ui",
"dev:ui": "VITE_APP_VERSION=development deno run -A npm:vite dev",
"test": "deno run -A npm:vitest",
"check": "deno check",
"preview": "deno run -A npm:vite preview",
"generate:routes": "deno run -A npm:@tanstack/router-cli generate --outDir src/ routes --rootRoutePath /",
"package": "gzipper c -i html,js,css,png,ico,svg,json,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ."
},
"include": ["src", "./vite-env.d.ts"],
"compilerOptions": {
"lib": [
"DOM",
"DOM.Iterable",
"ESNext",
"deno.window",
"deno.ns"
],
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"strictNullChecks": true,
"types": [
"vite/client",
"node",
"npm:@types/w3c-web-serial",
"npm:@types/web-bluetooth"
],
"strictPropertyInitialization": false
},
"exclude": [
"routeTree.gen.ts",
"node_modules/",
"dist",
"build",
"coverage",
"out",
".vscode-test"
]
}

2
index.html → packages/web/index.html

@ -7,7 +7,7 @@
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
<link rel="manifest" href="site.webmanifest" />
<link rel="mask-icon" href="Logo_Black.svg" color="#67ea94" />
<link rel="mask-icon" href="logo_black.svg" color="#67ea94" />
<link
rel="stylesheet"
href="https://rsms.me/inter/inter.css"

0
infra/.dockerignore → packages/web/infra/.dockerignore

0
infra/Containerfile → packages/web/infra/Containerfile

2
infra/default.conf → packages/web/infra/default.conf

@ -6,7 +6,7 @@ server {
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;

102
packages/web/package.json

@ -0,0 +1,102 @@
{
"name": "meshtastic-web",
"version": "2.7.0-0",
"type": "module",
"description": "Meshtastic web client",
"license": "GPL-3.0-only",
"repository": {
"type": "git",
"url": "git+https://github.com/meshtastic/web.git"
},
"bugs": {
"url": "https://github.com/meshtastic/web/issues"
},
"simple-git-hooks": {
"pre-commit": "deno task lint:fix && deno task format"
},
"homepage": "https://meshtastic.org",
"dependencies": {
"@bufbuild/protobuf": "^2.6.0",
"@hookform/resolvers": "^5.1.1",
"@meshtastic/core": "npm:@jsr/[email protected]",
"@meshtastic/js": "npm:@jsr/[email protected]",
"@meshtastic/transport-http": "npm:@jsr/meshtastic__transport-http",
"@meshtastic/transport-web-bluetooth": "npm:@jsr/meshtastic__transport-web-bluetooth",
"@meshtastic/transport-web-serial": "npm:@jsr/meshtastic__transport-web-serial",
"@noble/curves": "^1.9.2",
"@radix-ui/react-accordion": "^1.2.11",
"@radix-ui/react-checkbox": "^1.3.2",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-menubar": "^1.1.15",
"@radix-ui/react-popover": "^1.1.14",
"@radix-ui/react-scroll-area": "^1.2.9",
"@radix-ui/react-select": "^2.2.5",
"@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slider": "^1.3.5",
"@radix-ui/react-switch": "^1.2.5",
"@radix-ui/react-tabs": "^1.1.12",
"@radix-ui/react-toast": "^1.2.14",
"@radix-ui/react-toggle-group": "^1.1.10",
"@radix-ui/react-tooltip": "^1.2.7",
"@tanstack/react-router": "^1.125.4",
"@tanstack/react-router-devtools": "^1.125.4",
"@tanstack/router-cli": "^1.125.4",
"@tanstack/router-devtools": "^1.125.4",
"@turf/turf": "^7.2.0",
"@types/node": "^24.0.10",
"@types/web-bluetooth": "^0.0.21",
"base64-js": "^1.5.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"crypto-random-string": "^5.0.0",
"i18next": "^25.3.1",
"i18next-browser-languagedetector": "^8.2.0",
"i18next-http-backend": "^3.0.2",
"idb-keyval": "^6.2.2",
"immer": "^10.1.1",
"js-cookie": "^3.0.5",
"lucide-react": "^0.525.0",
"maplibre-gl": "5.6.1",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-error-boundary": "^6.0.0",
"react-hook-form": "^7.60.0",
"react-i18next": "^15.6.0",
"react-map-gl": "8.0.4",
"react-qrcode-logo": "^3.0.0",
"rfc4648": "^1.5.4",
"zod": "^3.25.75",
"zustand": "5.0.6"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.11",
"@tanstack/router-plugin": "^1.125.5",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/chrome": "^0.0.329",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/serviceworker": "^0.0.140",
"@types/js-cookie": "^3.0.6",
"@types/w3c-web-serial": "^1.0.8",
"@vitejs/plugin-react": "^4.6.0",
"autoprefixer": "^10.4.21",
"gzipper": "^8.2.1",
"happy-dom": "^18.0.1",
"postcss": "^8.5.6",
"simple-git-hooks": "^2.13.0",
"tailwind-merge": "^3.3.1",
"tailwindcss": "^4.1.11",
"tailwindcss-animate": "^1.0.7",
"tar": "^7.4.3",
"testing-library": "^0.0.2",
"typescript": "^5.8.3",
"vite": "^7.0",
"vitest": "^3.2.4"
}
}

0
postcss.config.cjs → packages/web/postcss.config.cjs

41
packages/web/public/Logo.svg

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="512"
height="512"
viewBox="0 0 512 512"
xml:space="preserve"
>
<desc>Created with Fabric.js 4.6.0</desc>
<defs> </defs>
<g transform="matrix(1 0 0 1 256 256)" id="xYQ9Gk9Jwpgj_HMOXB3F_">
<path
style="stroke: rgb(213, 130, 139); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(103, 234, 148); fill-rule: nonzero; opacity: 1"
vector-effect="non-scaling-stroke"
transform=" translate(-256, -256)"
d="M 0 0 L 512 0 L 512 512 L 0 512 z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(1.79 0 0 1.79 313.74 258.36)" id="1xBsk2n9FZp60Rz1O-ceJ">
<path
style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: round; stroke-miterlimit: 2; fill: rgb(44, 45, 60); fill-rule: evenodd; opacity: 1"
vector-effect="non-scaling-stroke"
transform=" translate(-250.97, -362.41)"
d="M 250.908 330.267 L 193.126 415.005 L 180.938 406.694 L 244.802 313.037 C 246.174 311.024 248.453 309.819 250.889 309.816 C 253.326 309.814 255.606 311.015 256.982 313.026 L 320.994 406.536 L 308.821 414.869 L 250.908 330.267 Z"
stroke-linecap="round"
/>
</g>
<g transform="matrix(1.81 0 0 1.81 145 256.15)" id="KxN7E9YpbyPgz0S4z4Cl6">
<path
style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: round; stroke-miterlimit: 2; fill: rgb(44, 45, 60); fill-rule: evenodd; opacity: 1"
vector-effect="non-scaling-stroke"
transform=" translate(-115.14, -528.06)"
d="M 87.642 581.398 L 154.757 482.977 L 142.638 474.713 L 75.523 573.134 L 87.642 581.398 Z"
stroke-linecap="round"
/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

26
packages/web/public/Logo_Black.svg

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
width="100%"
height="100%"
viewBox="0 0 100 55"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve"
xmlns:serif="http://www.serif.com/"
style="fill-rule: evenodd; clip-rule: evenodd; stroke-linejoin: round; stroke-miterlimit: 2"
>
<g transform="matrix(0.802386,0,0,0.460028,-421.748,-122.127)">
<g transform="matrix(0.579082,0,0,1.01004,460.975,-39.6867)">
<path
d="M250.908,330.267L193.126,415.005L180.938,406.694L244.802,313.037C246.174,311.024 248.453,309.819 250.889,309.816C253.326,309.814 255.606,311.015 256.982,313.026L320.994,406.536L308.821,414.869L250.908,330.267Z"
/>
</g>
<g transform="matrix(0.582378,0,0,1.01579,485.019,-211.182)">
<path
d="M87.642,581.398L154.757,482.977L142.638,474.713L75.523,573.134L87.642,581.398Z"
/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

28
packages/web/public/Logo_White.svg

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
width="100%"
height="100%"
viewBox="0 0 100 55"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve"
xmlns:serif="http://www.serif.com/"
style="fill-rule: evenodd; clip-rule: evenodd; stroke-linejoin: round; stroke-miterlimit: 2"
>
<g transform="matrix(0.802386,0,0,0.460028,-421.748,-122.127)">
<g transform="matrix(0.579082,0,0,1.01004,460.975,-39.6867)">
<path
d="M250.908,330.267L193.126,415.005L180.938,406.694L244.802,313.037C246.174,311.024 248.453,309.819 250.889,309.816C253.326,309.814 255.606,311.015 256.982,313.026L320.994,406.536L308.821,414.869L250.908,330.267Z"
style="fill: white"
/>
</g>
<g transform="matrix(0.582378,0,0,1.01579,485.019,-211.182)">
<path
d="M87.642,581.398L154.757,482.977L142.638,474.713L75.523,573.134L87.642,581.398Z"
style="fill: white"
/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

0
public/apple-touch-icon.png → packages/web/public/apple-touch-icon.png

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

64
packages/web/public/chirpy.svg

@ -0,0 +1,64 @@
<svg
xmlns="http://www.w3.org/2000/svg"
id="Layer_1"
data-name="Layer 1"
viewBox="0 0 1871.69 2607.94"
>
<defs><style>
.cls-1, .cls-4 {
fill: #2c2d3c;
stroke-width: 0;
}
.cls-4 {
fill: #fff;
}
</style></defs><path
id="Body_background"
fill="#67ea94"
stroke-width="0"
d="M1349.07 573.19h-855.5c-11.05 0-20.01 8.96-20.01 20.01v1219.19c0 10.12 8.21 18.33 18.33 18.33h854.27c8.7 0 15.75-7.05 15.75-15.75V586.04c0-7.1-5.75-12.85-12.85-12.85Zm-220.55 569.8h-411V787h411v355.99Z"
data-name="Body background"
/><path
id="Body"
d="M1166.62 5.54c-21.2 13.2-31.7 24.3-34.1 36-2.2 10.6-1.8 11.4 13.6 26.9 7.7 7.6 15.3 15.7 17.1 18l3.2 4.1-13.7 5.8c-26.6 11.4-109.5 54-125.2 64.4-4.6 3-5.5 4.1-5.5 6.5 0 3.5 2.7 5.6 5.1 4.1 1.3-.8 2.9-.5 6.4 1.2 9.4 4.5 34.3 10.5 59 14.3 6.9 1.1 27.6 3.3 46 5 49.1 4.5 71 8 71 11.5 0 2.2-21.1 23.5-37.5 38-8.2 7.2-24.4 20.9-36 30.5-29 24-42.2 35.9-62 56.1-27.2 27.7-54.4 60.8-60.9 74.1-2.5 5-2.7 6.1-1.7 9.1.7 1.9 8.9 12.6 18.4 23.9 9.5 11.2 24.2 29.2 32.8 39.9 30.8 38.2 48.3 56.9 75.2 80.4l13.7 12-118.2.6c-65.1.3-203.8.7-308.4.8-182.2.3-221.1.8-237.2 3.1-11.6 1.6-16.2 4.8-18.1 12.7-.9 3.3-1.3 130.7-1.6 479.6-.3 261.4-.7 530.3-.9 597.7-.5 142.7-.1 152.6 6.6 163.8 2.6 4.2 6.9 6.4 13.7 6.8 3.1.2 55 .6 115.4 1 99.7.6 109.7.8 109.7 2.3.2 11.7-9.3 741.7-9.6 742-.2.3-75.5-1.9-167.2-4.8-158.1-4.9-167.1-5.1-171-3.5-11.6 4.6-12.2 20.8-1 26.3 4.1 1.9 10.2 2.2 165.3 7.1 88.6 2.8 168.2 5.1 177 5.1h16l4.7-5.3c2.6-2.9 5.2-6.2 5.7-7.3.7-1.5 10.4-722.4 10.1-757.4v-4.4l159.2.7c87.6.4 159.3.8 159.4.9 0 .1 2.7 169.2 5.9 375.7l5.7 375.5 3 6c1.6 3.3 4.2 7.6 5.8 9.5l2.9 3.5 167.8-.3c158.5-.4 168-.5 171.9-2.2 11.2-4.9 12.1-19.9 1.5-25.8l-3.9-2.2h-318.7l-.3-7.7c-.3-10.8-11.2-710.5-11.2-722.6v-9.7h121.8c85.3.1 123.8-.2 128.7-1 12.4-2 18.1-6.1 21.9-15.8 1.5-4 1.6-46.7 1.6-608.5 0-332.3-.3-610.5-.6-618.2-.7-15.7-1.6-20-4.7-21.8-1.7-.9-24.6-1.3-101.2-1.5l-99-.2-3-3.4c-1.6-1.9-9.1-8.8-16.5-15.4-24.3-21.5-43.4-42.2-71.5-77.2-8.2-10.2-21.9-26.8-30.5-37-8.5-10.2-16.8-20-18.3-21.9-3.4-4.1-3.2-5.1 3.8-15.6 11.1-16.9 35.8-45.8 59-69 16.8-16.9 30.6-29.2 57-51 36-29.7 54.9-46.8 67.7-60.9 8.5-9.4 8.9-10.1 8.6-14-.3-3.8-.7-4.3-5-6.4-8-4-29.7-7.2-76.3-11.2-36.5-3.1-62.7-7.4-84.3-13.6-8.9-2.6-17.8-6.1-17.1-6.8 1.4-1.3 31.8-17.6 56.9-30.4 31.9-16.3 56.3-27.9 73.3-34.8l10.7-4.5 6.3 5.2c11.6 9.7 23.7 13.6 38.1 12.1 8.3-.8 10-2.6 11.7-11.7 2.1-11.2-.9-22.9-12-47.4-9.8-21.7-19.8-36.9-31.4-47.9-7.3-6.8-8.8-6.8-20.6.5Zm190.1 570.1c1.1 1.1 1.3 114 1.6 619.5l.2 618.3-2.2 4.4c-3.2 6.3-8.1 8.7-19.8 10-9.2.9-48.7.8-618.5-.9-254.3-.8-236.4-.3-239.4-6.6-3.2-6.6-4.2-16-4.7-44-.2-15.4 0-283.4.4-595.5.5-312.1.5-569.2 0-571.3-.9-4.2.5-18.4 2.5-24.5 1-3.2 1.9-3.9 6.3-5.4 10.9-3.6 32.3-3.9 396.9-4.7 448.7-1 475-1 476.7.7Z"
class="cls-1"
/><path d="M717.52 787h411v355.99h-411z" class="cls-4" /><path
id="Dot"
fill="#454656"
stroke="#2c2d3c"
stroke-miterlimit="10"
stroke-width="7"
d="M1246.61 622.56c-10.79 3.78-18.53 10.79-23.69 21.39-2.77 5.62-2.95 6.45-2.95 16.59s.18 10.97 2.95 16.87c7.56 15.86 22.03 24.34 40.29 23.51 7.38-.28 9.31-.74 15.58-3.69 8.67-4.15 15.4-10.6 18.99-18.25 9.96-21.02 1.94-43.79-19.18-54.21-6.55-3.23-7.47-3.41-17.06-3.69-8.02-.18-11.25.18-14.94 1.48Z"
/><path
id="Eyes"
d="M651.62 705.94c-8 1.6-10.3 5.2-12 19.4-1.4 12-1.8 452.5-.4 459.2 1.4 6.4 2.7 8.9 5.7 10.8 2.1 1.4 31.7 1.6 275.1 1.5 150 0 275.3-.3 278.4-.6 6.8-.7 9.6-1.9 10.7-4.8.5-1.1.7-106.1.4-235.6-.6-263.8.3-239.2-8.5-243.1-5.2-2.3-17.1-5-23-5.1-8-.3-489.4-2.8-505.5-2.7-9.1.1-18.5.5-20.9 1Zm186.5 82c6.5 1.2 8.4 2.3 8.4 4.9s-2.3 3.1-11.3 1.8c-12.3-1.6-35.6-.4-50.4 2.7-14.5 3-33.7 9.1-43.7 13.9-7.3 3.5-16.6 10-16.6 11.6 0 .5 1.7 1 3.8 1.2 3.2.3 3.7.6 3.7 2.8s-.4 2.5-5.8 2.8c-7 .4-8.7-.8-8.7-5.6 0-10.9 30.8-26.7 65.5-33.7 6.6-1.3 13.6-2.6 15.5-2.8 7.9-.9 34-.6 39.6.4Zm224.9 3.3c35.7 7.5 65.5 22.9 65.5 33.8 0 4.8-1.7 6-8.7 5.6-5.4-.3-5.8-.5-5.8-2.8s.5-2.5 3.8-2.8c2-.2 3.7-.7 3.7-1.2 0-1.6-9.3-8.1-16.6-11.6-10-4.8-29.2-10.9-43.7-13.9-14.8-3.1-38.1-4.3-50.4-2.7-9 1.3-11.3.9-11.3-1.8 0-4.7 7.5-6 32-5.5 16.1.3 21.6.8 31.5 2.9Zm-238.5 58.4c4.6 2.3 5.9 3.6 8.4 8.4 3.2 6.3 3.7 10.2 5.6 42.3.6 9.9 1.5 26.3 2.1 36.5 1.2 20.5.5 96.3-1.1 122.6-3.3 53.9-5 74.5-6.1 76.6-.5 1-1.6 1.8-2.5 1.8-.8 0-4.1.9-7.3 2-17.1 5.7-43.2-.5-50.3-12-6-9.7-7.6-27-8.8-97-.5-27.2-1.4-56.5-2.2-65-.7-8.5-1.3-29-1.3-45.5 0-40.5 1.5-46.7 14.4-59.6 5.3-5.2 8.2-7.2 14.6-9.9 10.4-4.3 13.6-5 22-4.4 4.9.3 8.6 1.3 12.5 3.2Zm230.7 1.9c7.3 3 10 4.8 15.4 10.2 12.9 12.9 14.4 19.1 14.4 59.6 0 16.5-.6 37-1.3 45.5-.8 8.5-1.7 37.8-2.2 65-1.2 70-2.8 87.3-8.8 97-7.1 11.5-33.2 17.7-50.3 12-3.2-1.1-6.5-2-7.3-2-.9 0-2-.8-2.5-1.8-1.1-2.1-2.8-22.7-6.1-76.6-1.6-26.3-2.3-102.1-1.1-122.6 4.3-73.4 4.1-71.4 7.5-78.5 6.2-12.6 23.2-15.8 42.3-7.8Z"
class="cls-1"
/><path
id="Meshtastic_M"
fill="#2c2d3c"
fill-rule="evenodd"
stroke-width="0"
d="m1034.49 1359.63-215.84 316.53-45.53-31.04 238.56-349.85c5.12-7.52 13.64-12.02 22.74-12.03 9.1 0 17.62 4.48 22.76 11.99l239.11 349.3-45.47 31.13-216.33-316.02Zm-452.9 316.2 252.13-369.74-45.53-31.05-252.13 369.73 45.53 31.05Z"
data-name="Meshtastic M"
/><path
id="Left_hand_background"
d="M407.1 1220.22v-6.7h-23.16v-8.98c0-11.12-1.6-21.87-4.56-32.04-3.4-45.86-33.88-84.17-75.5-99.01v-2.21c0-10.27-5.04-19.37-12.77-24.96v-2.05c0-10.55-5.65-19.77-14.08-24.82v-5.24c0-6.87-2.64-13.12-6.95-17.81l-39.54-206.2c-1.2-6.26-4.31-11.66-8.6-15.74-.62-15.68-13.52-28.2-29.35-28.2-15.68 0-28.49 12.29-29.33 27.76-5.01 5.27-8.1 12.39-8.1 20.24v3.47c-5.03 6.13-8.05 13.97-8.05 22.52v146.27c0 8.02 2.66 15.43 7.15 21.38h-10.15c-6.08-10.25-17.26-17.12-30.04-17.12h-10.13c-13.97 0-25.55 10.26-27.61 23.65-16.09 8.06-28.16 22.94-32.44 40.85-9.36 8.59-16.53 19.51-20.63 31.83-11.66 13.48-18.74 31.05-18.74 50.28v32.99c0 18.66 10.95 34.76 26.77 42.23 6.87 11.27 18.91 19.02 32.83 19.97 8.64 8.63 20.58 13.97 33.76 13.97h.65c.06 18.39 10.27 34.39 25.32 42.7v2.98l-31.54 15.79c-3.23 1.62-4.54 5.54-2.92 8.77l27.13 54.21c2.71 5.41 8.24 8.47 13.91 8.31 7.05 12.52 19.2 21.77 33.64 24.94 4.35 8.18 12.87 13.82 22.79 14.02l45.97.91c12.54.25 23.88-5.09 31.68-13.72h2.9c19.87 0 38.76-4.16 55.88-11.64 57.39-6.54 101.98-55.26 101.98-114.4v-12.05c0-12.25-7.5-22.75-18.16-27.16Z"
class="cls-4"
data-name="Left hand background"
/><path
id="Left_Hand"
d="M180.02 744.24c-2.7 1.3-7.1 4.6-9.7 7.3-9.1 9.9-19.7 35.8-25.5 63l-2.8 12.8.1 49.5c0 52.1 1.1 75.2 4.5 94.8 1 6.3 1.9 11.9 1.9 12.4 0 .6-3.7-2.5-8.3-6.9-11.1-10.6-15.7-12.8-26.7-12.7-9.8.1-14.6 1.8-24.4 8.8-13 9.3-34.8 35.8-54.7 66.6-19 29.4-26.9 47.1-32 71.5-3.4 16.1-3.2 36.1.5 50 3.2 12.1 8.1 22.9 13.1 28.3 2 2.3 7.1 6.3 11.3 9 10.8 6.9 43 22.9 53.6 26.6l8.8 3.1 7.2 12.8c9 16.1 14.1 22.7 21.1 27.4l5.6 3.7-4.3 1.6c-26.9 10.4-28.9 11.3-30.8 14-1.1 1.6-2 3.7-2 4.7 0 2.4 13.9 34.6 18.7 43.3 7.2 13.2 15.8 23.2 29.7 34.7 16.4 13.7 26.1 20.2 39 26.4 13.9 6.6 25.5 9.3 36.6 8.4 12.4-1 22.4-3.1 38.5-8.1 7.9-2.4 19.1-5.5 24.9-6.9 5.8-1.4 14.7-3.8 19.9-5.5 5.1-1.6 18-5.2 28.5-8 30.2-7.9 59.5-19.7 70.7-28.7 6.4-5.1 16.6-19.3 22.2-31 2.7-5.6 6-15.4 8.6-25 4.1-15.4 4.2-16.2 4.2-31.8 0-17.1-1.1-23.6-5.1-31.6-5.5-11-13.1-16.3-23.4-16.4-3.6 0-8 .3-9.8.7-3.1.7-3.2.7-2.5-2 .5-1.5.8-7.7.7-13.7 0-9.7-.4-12.4-3.8-23.5-11.8-39.3-19.9-57.4-34.4-76.7-5.3-7.1-7.6-8.8-10.3-7.8-.8.3-2.6-.3-4-1.2-17.5-11.7-23-17.7-35.4-38.4-22.6-38.2-34.7-77-44.4-143.4-1.7-11.6-4.2-28.7-5.6-38-1.4-9.4-3.2-21.6-4-27.2-1.5-10.9-3-17.4-10.1-43.3-4.9-17.7-6.8-22.3-14.2-33.4-12.9-19.5-16.9-22.6-29.3-22.6-5.7 0-8.6.6-12.4 2.4Zm20.1 5.5c4.4 2 8.2 6.5 16.6 19.7 6.8 10.5 7.4 12.1 11.7 27.1 7 24.4 10.2 38.5 12.1 52.8 1 7.7 2.5 18 3.4 23 .8 4.9 1.8 11.7 2.1 15 1.1 10.6 7.4 49 10.1 61.7 6.9 33.1 15.3 59.9 24.9 79.7 6.6 13.4 16.5 31.1 19.3 34.3 1.9 2.2 1.8 2.2-4.6-.2-7.7-3-21-2.8-27.7.4-9.8 4.6-18.9 16.8-23.6 31.6-3.8 12.3-4.7 20.2-3.7 32.3 1 12.7 3 21.2 7.2 30.2 7.3 15.7 16.1 25.9 30.2 35.2 22.4 14.5 47.8 22.4 82.1 25.5l13.7 1.2-4.3 1.8c-2.3 1-9.9 2.9-16.9 4.4-7 1.5-20.3 5.3-29.5 8.5-29.2 10.1-50.1 14.5-99.7 20.9-28.9 3.7-62.9 9.1-78.5 12.4-8.3 1.7-11.4 1.2-19.9-3.3-8.1-4.3-16.2-14.3-23.5-28.9l-3.1-6.2h8.2c4.6 0 12.8-.7 18.2-1.5 5.5-.8 11.6-1.5 13.7-1.5 6.1 0 18.1-4.3 26.1-9.4 4.2-2.7 13.4-10.5 21.5-18.4 15.9-15.4 18.4-19.4 23.9-38.2 3.9-13.5 3.8-22.5-.3-35-1.7-5.2-4.8-15.1-6.8-22-11.3-38.1-20.2-61.5-30.5-80.3-3.7-6.8-7-13.5-7.3-14.9-.4-1.4-2.2-5.1-4.1-8.2-8.9-14.9-12.5-50.6-12.9-128.4-.1-34.8.1-38.6 2-49.2 5.5-28.9 16.4-57.2 26-66.7 6.7-6.7 16.2-8.9 23.9-5.4Zm-75.9 223.2c2.5 1.2 9.2 6.6 15.1 12 9 8.4 11.4 11.3 15.2 18.4 2.5 4.6 6.1 11.2 8.1 14.7 7.3 12.8 9.2 16.5 13.5 26.9 8.3 20.2 30.1 88.8 29 91.4-.7 1.9-3.2 1.9-13.9 0-19.4-3.4-34.8-11.1-53.2-26.5-22.6-19.1-38.4-35.1-53.4-54.5-8.7-11.1-23.7-33.2-25-36.7-1.6-4.3 23.2-33.2 35.5-41.3 10.2-6.8 20.9-8.4 29.1-4.4Zm-59.7 65.4c18.6 28 33.5 45.1 59.5 68.3 17.3 15.5 25.2 21.1 38 27.3 12.8 6.1 22.5 8.8 34.8 9.6 8.2.5 9.7.9 9.7 2.3 0 2.5-5.9 21.7-8.5 27.5-2.4 5.6-10.9 15.2-19.9 22.7l-5.8 4.9-8.2-.6c-14.7-1.2-43.1-12.1-64-24.5-33.2-19.8-62.4-49.6-77.6-79.3-2.7-5.4-5-10.5-5-11.3 0-5.6 35-63.9 37.1-61.7.3.5 4.8 7.1 9.9 14.8Zm231.1 31.7c5.3 2.4 22.2 13.2 33.5 21.3 3.1 2.2 6.6 3.8 8.5 4 3.1.2 4.1 1.2 10.2 10.1 11.9 17.3 19 34.1 29.6 69.9 4 13.7 5.2 21.9 4.2 28.2-1.3 8.5-1.6 8.7-16.1 8-40.6-1.9-82-17.7-99.4-37.8-5-5.9-11.1-16.4-14.2-24.6-3.3-8.8-5.7-24.9-5-33.8.6-8.7 5.8-25.5 9.7-31.6 3.9-6.2 13-14.7 16.5-15.4 1.6-.4 3.4-.8 3.9-1.1 3-1.1 13.5.4 18.6 2.8Zm-268.6 46.6c16.2 24.3 40.8 47.5 67.1 63.5 22.1 13.5 49.9 24.7 65.5 26.5l6.4.8-4.5 2.9c-6.7 4.3-15.9 7.8-21.5 8.1-2.7.2-9.2 1.1-14.2 2-6.8 1.2-12.9 1.5-23 1.2-16.4-.6-20.1-1.7-44.8-14-29.6-14.8-38-21-42.9-31.8-10-22-11.1-45.9-3.4-74.3l2.1-7.9 4.3 8.2c2.4 4.5 6.4 11.1 8.9 14.8Zm378.2 103.3c1.5.5 4.3 2.5 6.1 4.2 7.3 6.9 10.2 17.1 10.2 35.8 0 10.9-.4 14.3-3.4 26.5-1.9 7.7-4.7 17.2-6.1 21-5.1 13.4-16.7 30.6-24.8 36.5-11.8 8.6-40.4 19.8-69 26.9-6.7 1.7-17.8 4.9-24.7 7-6.9 2.2-17.4 5.1-23.5 6.5-6 1.4-15.7 4.1-21.5 6-14.3 4.8-26.7 7.4-38 8.1-8 .6-10.8.3-17.5-1.5-15.3-4.2-33.7-14.7-51.3-29.3-16.7-14-22.8-21.2-31.4-36.8-5.1-9.3-17.1-37.9-16.5-39.4s30.2-12.6 39.7-15c17-4.1 61-11.4 95.5-15.6 43.6-5.4 62.3-9.3 93.5-19.6 12.4-4 27.7-8.4 34-9.8 6.3-1.3 14.4-3.6 18-5.1 18.2-7.7 24.1-8.9 30.7-6.4Z"
class="cls-1"
data-name="Left Hand"
/><path
id="Right_hand_background"
d="M1819.8 966.37c-25.94-6.6-55.37 12.34-80.21 47.23-7.22 2.11-13.85 6.48-18.71 12.96l-62.66 83.5c-3.95 5.27-6.58 11.11-7.97 17.13l-5.41 1.59c-13.38 3.92-23.69 13.25-29.27 24.9-5.72 2.53-10.71 6.15-14.76 10.55-3.12-3.5-6.87-6.34-11.02-8.41l-8.6-29.33c-2.43-8.29-7.39-15.15-13.8-19.98-1.3-3.05-2.95-5.86-4.89-8.42l-1.83-6.25c-5.53-18.87-25.32-29.69-44.19-24.16l-1.17.34c-17.05 5-27.52 21.63-25.3 38.71-2.25 3.8-4 7.88-5.2 12.14-6.93 11-9.29 24.81-5.34 38.27l4.28 14.6c-2.84 8.7-3.18 18.32-.41 27.76l43.82 149.44-4.59-1.51c-5.42-1.79-11.01-1.75-16.1-.23l-5.24-1.73c-6.73-2.22-14 1.43-16.22 8.17-1.95 5.9-1.07 12.05 1.87 17.01-2.25 10.55-.41 21.21 4.6 30.14 1.2 12.02 7.42 23.12 17.2 30.4 5.03 12.25 15.17 22.32 28.74 26.8l6.25 2.06c4.14 7.04 10.75 12.68 19.12 15.44l20.53 6.78 1.08 3.7 5.36-1.57 15.54 5.13 1.09 3.73 5.4-1.58 78.79 26.01c6.91 2.28 14.02 2.19 20.48.2l18.24 6.02c18.8 6.21 39.08-4 45.29-22.81 6.21-18.8-4-39.08-22.81-45.29l-4.43-1.46c-1.72-4.44-4.32-8.51-7.65-11.96l13.47-3.95-.5-1.72c10.19-4.24 17.61-12.72 20.8-22.72l4.6 3.75 41.26-50.64c3.18-3.9 5.25-8.34 6.27-12.94 25.27-12.22 42.7-38.1 42.7-68.05v-186.05c5.89-69.09-12.51-124.56-48.47-133.71Z"
class="cls-4"
data-name="Right hand background"
/><path
id="Right_Hand"
d="M1797.02 960.24c-13.1 3.3-25.8 12.9-52.1 39.1-30.1 30-54.1 58.2-80.5 94.5-15.4 21.1-16.2 22.5-15.6 25.7.5 2.7.2 2.9-5.5 4.7-3.3 1-7.2 2.9-8.7 4-1.4 1.2-3.9 3-5.6 4-7.2 4.5-16.8 13.3-22.5 20.7-5.2 6.7-6.5 7.8-7.6 6.7-2.9-3-12.7-23.3-17.8-37.1-3-8.1-7.4-18.3-9.7-22.7-7.7-14.4-23.3-30.5-34.8-35.8-7.3-3.4-18-2.9-26.1 1.3-7.9 4-17.1 13.8-21.3 22.7-8.5 17.7-11.2 34-11.1 66.8 0 24.7 1.1 36.1 6 62.9 5.7 31.1 21.6 85.9 33.3 114.6 2.2 5.4 3.8 10.1 3.6 10.3s-5.8-.1-12.4-.7c-14.8-1.5-18.2-.9-22 3.5-6.6 7.5-6.7 17.7-.6 51.3 1.2 6.6 2.8 10.9 7.1 19 3.1 5.8 6.4 11.7 7.3 13.1s2.3 3.8 3.1 5.4 4.9 6.3 9 10.5c6.7 6.8 10.1 9.1 32.5 21.8 32.7 18.6 41.4 22.6 69.5 32.1 41.9 14.1 68.2 21 94.5 24.6 6.1.8 16.3 2.4 22.8 3.6 20.4 3.5 26.1 2.6 34.3-5.1 2.8-2.8 6.3-6.7 7.7-8.7 3.8-5.5 6.8-15.6 7-23.3.2-5.7-.2-7.2-2.1-9.6-1.2-1.5-4.4-5.7-7-9.3-8.5-11.8-35.6-37.2-44.4-41.6-7.5-3.8-22.4-9-33.6-11.8-10.4-2.6-27.5-9.1-46.7-17.9-43.6-19.9-57.9-26.8-76.7-36.6-11.6-6.2-23.4-11.9-26.2-12.8s-5.5-2-6-2.4c-.6-.5-1.8-.9-2.8-.9s-1.8-.5-1.8-1.1-1.6-2.5-3.5-4.4c-4-3.7-8-13.2-16.3-38.5-25.9-79.2-34.5-139.3-26.7-185 4-23.4 13.7-40 27.2-46.7 11.6-5.6 20.3-3.1 33.6 9.6s18.2 20.7 26.2 42.6c5.2 14.3 17.1 38.5 21.8 44.3 4 5 16.6 30.8 21.1 43.4 9.7 26.8 16.6 65.4 16.6 92.4v13.4h2.4c1.9 0 2.7-.8 3.7-3.7 2.5-7.8-.7-41.8-6.8-70.8-4.5-21.7-12.8-44.4-23.8-65l-5.4-10 2.7-3.1c1.5-1.7 3.9-4.7 5.4-6.6 1.5-1.9 6-6.1 10.2-9.2 4.1-3.1 7.7-6.4 8-7.4.9-2.6 10.3-8 19.3-11 12.9-4.2 20.3-3.7 39.3 2.8 8.5 2.9 18.3 6.6 21.8 8.2 6.9 3.3 9.6 3.3 10 .2.4-2.6-5-6.9-11.3-9.1-2.5-.8-4.7-1.9-5.1-2.4-.3-.5-1.6-.9-2.9-.9s-4.8-.9-7.7-2c-11.8-4.3-21.7-6.2-30.8-5.8l-8.8.3 1-2.4c1.1-3.1 26.2-37 39.2-53 16.1-19.8 40.9-47.2 59.2-65.2 34.3-33.6 47-39.6 65.4-30.8 10.3 4.9 16.8 11.2 25.6 24.6 13.3 20.1 15.3 26.3 19.9 61.4l.5 3.5-14.3 3.9c-26.3 7-48.8 16-84.2 33.6-24.9 12.4-33 17.4-33 20.4 0 3.5 4.1 2.9 12.3-1.8 20.3-11.7 60.9-30.7 81.9-38.3 13.4-4.9 36.3-11.5 37.4-10.8 1 .6 1.2 89.5.3 93.1-.4 1.6-1.7 2.3-4.7 2.8-14.3 2.5-43.6 18.3-57.9 31.4-6.7 6.1-8.6 9.4-6.8 11.6.7.8 1.6 1.5 2.1 1.5s3.7-2.7 7-6c11.7-11.3 37.2-26.7 51.7-31 4-1.2 7.5-2.1 7.6-1.9.4.4 1 78.5.8 89.4l-.2 7-5.2 1.9c-7.2 2.5-19.6 9.4-20.7 11.4-2 4 2.3 5.7 6.8 2.6 1.2-.9 5.7-3.4 9.9-5.5l7.7-3.9.3 12.3c.1 6.7-.1 17.2-.7 23.3-.7 9.4-1.3 12-3.7 16-6 10.6-16.7 21.8-24.9 26.1-2 1.1-2 .7-2.3-13.5-.3-15.1-1.1-18-4.4-16.7-1.4.5-1.7 3.1-2 15.3-.4 13.5-.6 15.3-3.3 21.7-3.7 8.8-18.4 28.6-28.4 38-4 3.8-9.4 9.2-11.9 12-9.2 10-16 16.1-25 22.5-6.8 4.7-9.2 7-9.2 8.6 0 2.9 2.5 3.7 5.9 1.9 6.1-3.1 23.6-17.7 29.6-24.6 3.5-4.1 9.4-10.1 13.1-13.4 8.2-7.2 24.8-27.9 28.9-35.8 2.8-5.4 3.6-6.1 10.5-9.6 4.1-2 8.7-4.5 10.2-5.5 4.3-2.9 16.4-18 19.7-24.8 2.9-5.9 3.2-7.6 4.3-22.8.6-9.1 1.2-44.9 1.3-79.5.1-34.7.4-84.4.6-110.5.3-50.6-.2-59.6-5.2-84.4-2.9-14.5-11.3-31-23.8-46.9-11.9-15.3-31.5-24-45.6-20.3Zm-287 388.6c6.1.6 13.3 1.7 16 2.5 2.8.8 7.5 2.1 10.5 3 3 .8 16.3 7.1 29.5 14 13.2 7 30.1 15.3 37.5 18.7 7.4 3.3 20.9 9.5 30 13.8 22.9 10.8 46.9 20.5 57 22.8 9.6 2.3 27.5 8.4 33.1 11.3 7.5 3.8 36.6 30.4 39.5 36.2.8 1.5 3.7 5.2 6.4 8.3 6 6.5 6.4 9.6 2.5 21.3-2.1 6.3-3.6 8.6-8.2 13.5-6.5 6.7-8.4 7.6-15.6 7.6-12.4 0-68.1-10.2-90.2-16.6-28.9-8.3-65.5-21.3-79-27.9-13.3-6.5-40.2-21.3-51-28-7.7-4.8-16.5-15.2-24.2-28.5-10.7-18.5-10.8-18.9-14.9-47.9-1.7-11.8-.8-18.9 2.8-22.8 2.4-2.6 3.3-2.7 18.3-1.3Z"
class="cls-1"
data-name="Right Hand"
/>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

2233
packages/web/public/devices/diy.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 102 KiB

2604
packages/web/public/devices/heltec-ht62-esp32c3-sx1262.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 77 KiB

271
packages/web/public/devices/heltec-mesh-node-t114-case.svg

@ -0,0 +1,271 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="795.27 277.13 409.46 1319.35">
<defs><style>
.cls-1 {
fill: #353535;
}
.cls-2 {
fill: #1e1e1d;
}
.cls-3 {
fill: #b1a368;
}
.cls-10, .cls-11, .cls-4, .cls-6, .cls-8, .cls-9 {
fill: none;
}
.cls-4, .cls-6 {
stroke: #050606;
}
.cls-10, .cls-11, .cls-4, .cls-6, .cls-8 {
stroke-miterlimit: 10;
}
.cls-4 {
stroke-width: 2.41px;
}
.cls-5 {
fill: #30c2db;
}
.cls-6 {
stroke-width: 3.91px;
}
.cls-7 {
fill: #dcf0f2;
}
.cls-10, .cls-11, .cls-8 {
stroke: #dcf0f2;
}
.cls-8 {
stroke-width: 1.81px;
}
.cls-9 {
stroke: #17afbf;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 7.23px;
}
.cls-10 {
stroke-width: 1.78px;
}
.cls-11 {
stroke-width: 1.81px;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><path
class="cls-1"
d="M915.62,278.34h22.61a35,35,0,0,1,35,35V715.74a0,0,0,0,1,0,0H880.6a0,0,0,0,1,0,0V313.36A35,35,0,0,1,915.62,278.34Z"
></path><rect
class="cls-2"
x="880.6"
y="340.15"
width="92.65"
height="7.54"
></rect><rect
class="cls-2"
x="880.6"
y="356.68"
width="92.65"
height="7.54"
></rect><rect
class="cls-3"
x="885.8"
y="844.3"
width="84.14"
height="19.02"
></rect><rect
class="cls-3"
x="880.6"
y="819.07"
width="92.65"
height="25.23"
></rect><rect
class="cls-3"
x="885.8"
y="790.65"
width="84.14"
height="28.41"
></rect><rect
class="cls-3"
x="880.6"
y="723.02"
width="92.65"
height="67.63"
></rect><rect
class="cls-3"
x="885.8"
y="715.74"
width="84.14"
height="7.28"
></rect><rect
class="cls-4"
x="885.8"
y="844.3"
width="84.14"
height="19.02"
></rect><rect
class="cls-4"
x="880.6"
y="819.07"
width="92.65"
height="25.23"
></rect><rect
class="cls-4"
x="885.8"
y="790.65"
width="84.14"
height="28.41"
></rect><rect
class="cls-4"
x="880.6"
y="723.02"
width="92.65"
height="67.63"
></rect><rect
class="cls-4"
x="885.8"
y="715.74"
width="84.14"
height="7.28"
></rect><path
class="cls-4"
d="M915.62,278.34h22.61a35,35,0,0,1,35,35V715.74a0,0,0,0,1,0,0H880.6a0,0,0,0,1,0,0V313.36A35,35,0,0,1,915.62,278.34Z"
></path><rect
class="cls-4"
x="880.6"
y="340.15"
width="92.65"
height="7.54"
></rect><rect
class="cls-4"
x="880.6"
y="356.68"
width="92.65"
height="7.54"
></rect><rect
class="cls-5"
x="796.48"
y="856.3"
width="407.05"
height="738.98"
rx="47.74"
></rect><rect
class="cls-1"
x="900.05"
y="973.19"
width="202.03"
height="354.65"
rx="16.4"
></rect><rect
class="cls-6"
x="900.05"
y="973.19"
width="202.03"
height="354.65"
rx="16.4"
></rect><rect
class="cls-7"
x="871.51"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><rect
class="cls-7"
x="1070.16"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><rect
class="cls-4"
x="871.51"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><rect
class="cls-4"
x="1070.16"
y="890.41"
width="55.42"
height="31.12"
rx="15.56"
></rect><circle
class="cls-8"
cx="841.7"
cy="1537.01"
r="16.25"
></circle><circle
class="cls-8"
cx="841.7"
cy="913.26"
r="16.25"
></circle><circle
class="cls-8"
cx="1157.32"
cy="913.26"
r="16.25"
></circle><circle
class="cls-8"
cx="1157.32"
cy="1504.51"
r="16.25"
></circle><line
class="cls-9"
x1="942.51"
y1="1592.42"
x2="942.51"
y2="1381.55"
></line><line
class="cls-9"
x1="966.52"
y1="1592.42"
x2="966.52"
y2="1381.55"
></line><line
class="cls-9"
x1="990.57"
y1="1592.42"
x2="990.57"
y2="1381.55"
></line><line
class="cls-9"
x1="1014.59"
y1="1592.42"
x2="1014.59"
y2="1381.55"
></line><line
class="cls-9"
x1="1038.63"
y1="1592.42"
x2="1038.63"
y2="1381.55"
></line><line
class="cls-9"
x1="1062.65"
y1="1592.42"
x2="1062.65"
y2="1381.55"
></line><rect
class="cls-4"
x="796.48"
y="856.3"
width="407.05"
height="738.98"
rx="47.74"
></rect><path
class="cls-10"
d="M1040.1,947.74H960.65A13.93,13.93,0,0,1,947,936.64l-10.23-49.2a13.93,13.93,0,0,1,13.64-16.77h97.72a13.93,13.93,0,0,1,13.75,16.18l-8,49.2A13.94,13.94,0,0,1,1040.1,947.74Z"
></path><rect
class="cls-11"
x="816.35"
y="870.67"
width="365.51"
height="703.12"
rx="32.37"
></rect><rect
class="cls-11"
x="888.77"
y="963.84"
width="223.2"
height="374.66"
rx="25.21"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 5.3 KiB

398
packages/web/public/devices/heltec-mesh-node-t114.svg

@ -0,0 +1,398 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="502.65 765.65 1000.06 433.43">
<defs><style>
.cls-1 {
fill: #8e8d8e;
}
.cls-2 {
fill: #cccccb;
}
.cls-3 {
fill: #ddd;
}
.cls-4 {
fill: #2b2b2b;
}
.cls-5 {
fill: #383839;
}
.cls-6 {
fill: #599cbd;
}
.cls-10, .cls-11, .cls-14, .cls-7, .cls-9 {
fill: none;
stroke-miterlimit: 10;
}
.cls-7 {
stroke: #fff;
}
.cls-10, .cls-14, .cls-7 {
stroke-width: 1.65px;
}
.cls-8 {
fill: #cbcccb;
}
.cls-10, .cls-11, .cls-9 {
stroke: #050606;
}
.cls-9 {
stroke-width: 2px;
}
.cls-11 {
stroke-width: 1.67px;
}
.cls-12 {
fill: #fff;
}
.cls-13 {
fill: #eecc42;
}
.cls-14 {
stroke: #eecc42;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M554.23,774h907.26a0,0,0,0,1,0,0v415.1a0,0,0,0,1,0,0H554.23a32.53,32.53,0,0,1-32.53-32.53v-350A32.53,32.53,0,0,1,554.23,774Z"
></path><path
class="cls-2"
d="M1363,985.65v82.44a8.42,8.42,0,0,0,8.42,8.42h75.41a18.61,18.61,0,0,1,18.61,18.62v82.15a20.79,20.79,0,0,1-20.79,20.79h-37.14a15,15,0,0,1-15-15v-40.46a23.46,23.46,0,0,0-23.46-23.47h-22.26a4.57,4.57,0,0,0-4.57,4.58h0a4.57,4.57,0,0,0,4.57,4.57h22.31a15.19,15.19,0,0,1,15.19,15.19V1181a17.08,17.08,0,0,1-17.08,17.08H549a45.49,45.49,0,0,1-45.35-42h37.39a57.24,57.24,0,0,0,57.24-57.23V864.62a57.24,57.24,0,0,0-57.24-57.23H503.79A45.49,45.49,0,0,1,549,766.65h818.24a17.08,17.08,0,0,1,17.08,17.08v37.46a15.19,15.19,0,0,1-15.19,15.18h-22.31a4.57,4.57,0,0,0-4.57,4.58h0a4.57,4.57,0,0,0,4.57,4.57h22.26a23.46,23.46,0,0,0,23.46-23.46V781.6a15,15,0,0,1,15-15h37.14a20.79,20.79,0,0,1,20.79,20.79v82.15a18.62,18.62,0,0,1-18.61,18.62h-75.41a8.41,8.41,0,0,0-8.42,8.41v89Z"
></path><path
class="cls-3"
d="M1363,897.36h130.87a8,8,0,0,1,8,8v155.38a8,8,0,0,1-8,8H1363a0,0,0,0,1,0,0V897.36A0,0,0,0,1,1363,897.36Z"
></path><rect
class="cls-4"
x="1404.64"
y="937.34"
width="10.03"
height="22.38"
></rect><rect
class="cls-4"
x="1404.64"
y="1003.72"
width="10.03"
height="22.38"
></rect><rect
class="cls-4"
x="1363.01"
y="1001.56"
width="23.63"
height="34.15"
></rect><rect
class="cls-4"
x="1363.01"
y="930.05"
width="23.63"
height="34.15"
></rect><path
class="cls-5"
d="M598.31,864.62v234.21a57.24,57.24,0,0,1-57.24,57.23H521.7V807.39h19.37A57.24,57.24,0,0,1,598.31,864.62Z"
></path><rect
class="cls-5"
x="728.25"
y="817.13"
width="158.2"
height="330.36"
></rect><path
class="cls-6"
d="M572.27,1146.81v-26.49a1.33,1.33,0,0,0-1.33-1.33H540.27a1.33,1.33,0,0,0-1.33,1.33v35.74a43.86,43.86,0,0,0,15.13-1.49C561.47,1152.31,572.27,1146.81,572.27,1146.81Z"
></path><path
class="cls-7"
d="M538.94,1156.06v-35.74a1.33,1.33,0,0,1,1.33-1.33h30.67a1.33,1.33,0,0,1,1.33,1.33v26.49"
></path><path
class="cls-8"
d="M528.57,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,528.57,837.41Z"
></path><path
class="cls-9"
d="M503.68,1156.06h37.39a57.24,57.24,0,0,0,57.24-57.23V864.62a57.24,57.24,0,0,0-57.24-57.23H503.79"
></path><line
class="cls-10"
x1="521.7"
y1="807.39"
x2="521.7"
y2="1156.06"
></line><path
class="cls-9"
d="M1363,979.06V896.62a8.41,8.41,0,0,1,8.42-8.41h75.41a18.62,18.62,0,0,0,18.61-18.62V787.44a20.79,20.79,0,0,0-20.79-20.79h-37.14a15,15,0,0,0-15,15v40.46a23.46,23.46,0,0,1-23.46,23.46h-22.26a4.57,4.57,0,0,1-4.57-4.57h0a4.57,4.57,0,0,1,4.57-4.58h22.31a15.19,15.19,0,0,0,15.19-15.18V783.73a17.08,17.08,0,0,0-17.08-17.08H549a45.49,45.49,0,0,0-45.24,40.74"
></path><path
class="cls-9"
d="M1363,985.65v82.44a8.42,8.42,0,0,0,8.42,8.42h75.41a18.61,18.61,0,0,1,18.61,18.62v82.15a20.79,20.79,0,0,1-20.79,20.79h-37.14a15,15,0,0,1-15-15v-40.46a23.46,23.46,0,0,0-23.46-23.47h-22.26a4.57,4.57,0,0,0-4.57,4.58h0a4.57,4.57,0,0,0,4.57,4.57h22.31a15.19,15.19,0,0,1,15.19,15.19V1181a17.08,17.08,0,0,1-17.08,17.08H549a45.49,45.49,0,0,1-45.35-42"
></path><path
class="cls-7"
d="M618.9,981.73V862.12a6.16,6.16,0,0,1,6.16-6.17h87.49A10.48,10.48,0,0,0,723,845.48v-28a7.08,7.08,0,0,1,7.08-7.08H833.83A14.5,14.5,0,0,0,844,806.25l23.23-22.52a15.93,15.93,0,0,1,11.11-4.5h273.84a16,16,0,0,1,11.73,5.13l19.69,21.32a14.55,14.55,0,0,0,10.69,4.68h122.44a5.85,5.85,0,0,1,5.86,5.85v331.55a5.86,5.86,0,0,1-5.86,5.86H730.11a7.08,7.08,0,0,1-7.08-7.08v-74A10.48,10.48,0,0,0,712.55,1062H625.06a6.16,6.16,0,0,1-6.16-6.16V982.25"
></path><circle
class="cls-7"
cx="1012.63"
cy="1176.42"
r="15.95"
></circle><circle
class="cls-7"
cx="1347.86"
cy="1165.18"
r="15.95"
></circle><circle
class="cls-7"
cx="1347.86"
cy="801.82"
r="15.95"
></circle><rect
class="cls-7"
x="1406.28"
y="1109.79"
width="43.15"
height="63.43"
rx="21.58"
></rect><rect
class="cls-7"
x="1406.28"
y="796.41"
width="43.15"
height="63.43"
rx="21.58"
></rect><path
class="cls-11"
d="M1363,897.36h130.87a8,8,0,0,1,8,8v155.38a8,8,0,0,1-8,8H1363a0,0,0,0,1,0,0V897.36A0,0,0,0,1,1363,897.36Z"
></path><rect
class="cls-11"
x="1404.64"
y="937.34"
width="10.03"
height="22.38"
></rect><rect
class="cls-11"
x="1404.64"
y="1003.72"
width="10.03"
height="22.38"
></rect><rect
class="cls-11"
x="1363.01"
y="1001.56"
width="23.63"
height="34.15"
></rect><rect
class="cls-11"
x="1363.01"
y="930.05"
width="23.63"
height="34.15"
></rect><line
class="cls-11"
x1="1461.49"
y1="881.06"
x2="1461.49"
y2="897.36"
></line><line
class="cls-11"
x1="1461.49"
y1="1068.83"
x2="1461.49"
y2="1083.65"
></line><line
class="cls-11"
x1="1381.33"
y1="774.04"
x2="1394.21"
y2="774.04"
></line><line
class="cls-11"
x1="1382.28"
y1="1189.14"
x2="1394.21"
y2="1189.14"
></line><rect
class="cls-12"
x="532.16"
y="831.98"
width="49.07"
height="49.07"
rx="2.75"
></rect><rect
class="cls-10"
x="532.16"
y="831.98"
width="49.07"
height="49.07"
rx="2.75"
></rect><circle
class="cls-13"
cx="556.69"
cy="856.52"
r="9.63"
></circle><circle
class="cls-14"
cx="556.69"
cy="856.52"
r="19.11"
></circle><path
class="cls-10"
d="M528.57,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,528.57,837.41Z"
></path><path
class="cls-8"
d="M584.21,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,584.21,837.41Z"
transform="translate(1169.02 1713.04) rotate(-180)"
></path><path
class="cls-10"
d="M584.21,837.41h3.59a0,0,0,0,1,0,0v38.22a0,0,0,0,1,0,0h-3.59a3,3,0,0,1-3-3V840.39A3,3,0,0,1,584.21,837.41Z"
transform="translate(1169.02 1713.04) rotate(-180)"
></path><rect
class="cls-7"
x="525.59"
y="961.1"
width="31.1"
height="17.96"
rx="0.79"
></rect><rect
class="cls-7"
x="525.59"
y="985.65"
width="31.1"
height="17.96"
rx="0.79"
></rect><path
class="cls-12"
d="M576.68,978.9h-2V962h2Zm8.64-7.59H575.6v-1.93h9.72Zm1.3,7.59h-2V962h2Z"
></path><path
class="cls-12"
d="M569.32,978.9h-9.47V977h9.47Zm0-7.7h-8.19v-1.9h8.19Zm1.16,7.7h-2V962h2Z"
></path><path
class="cls-12"
d="M585.44,988.92h-9.67V987h9.67Zm1.18,15h-2V987h2Z"
></path><path
class="cls-12"
d="M571.82,1003.9h-9.46V1002h9.46Zm0-7.7h-8.19v-1.9h8.19Zm1.17,7.7h-2V987h2Z"
></path><rect
class="cls-8"
x="530.71"
y="989.79"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="546"
y="989.79"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="530.71"
y="965.24"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="556.69"
y="913.16"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="583.14"
y="913.16"
width="5.58"
height="9.68"
rx="1.05"
></rect><rect
class="cls-8"
x="546"
y="965.24"
width="5.58"
height="9.68"
rx="1.05"
></rect><path
class="cls-7"
d="M552.28,913.61v-5.5a1.36,1.36,0,0,1,1.36-1.36H590.7a1.36,1.36,0,0,1,1.36,1.36v5.5"
></path><path
class="cls-7"
d="M565.9,922.84v5.63a1.36,1.36,0,0,1-1.37,1.36H553.64a1.36,1.36,0,0,1-1.36-1.36v-5.63"
></path><rect
class="cls-8"
x="541.49"
y="1082.41"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1697.94 1471.19) rotate(135)"
></rect><path
class="cls-7"
d="M536.32,1088.36l-4-4a1.36,1.36,0,0,1,0-1.92l7.7-7.7a1.35,1.35,0,0,1,1.93,0l4,4"
></path><rect
class="cls-8"
x="571.96"
y="1050.39"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1727.32 1394.99) rotate(135)"
></rect><rect
class="cls-8"
x="583.85"
y="1059.62"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1754.13 1402.34) rotate(135)"
></rect><rect
class="cls-8"
x="574.63"
y="1068.83"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1744.92 1424.58) rotate(135)"
></rect><rect
class="cls-8"
x="561.03"
y="1083.6"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1732.15 1459.41) rotate(135)"
></rect><rect
class="cls-8"
x="551.82"
y="1092.82"
width="5.58"
height="9.68"
rx="1.05"
transform="translate(1722.93 1481.65) rotate(135)"
></rect><path
class="cls-7"
d="M566.79,1056.35l-4-4a1.36,1.36,0,0,1,0-1.92l7.71-7.71a1.36,1.36,0,0,1,1.92,0l4,4"
></path><path
class="cls-7"
d="M592.06,922.84v5.63a1.36,1.36,0,0,1-1.36,1.36H581a1.36,1.36,0,0,1-1.36-1.36v-5.63"
></path><line
class="cls-7"
x1="565.9"
y1="918.69"
x2="579.63"
y2="918.69"
></line><path
class="cls-7"
d="M551,1103.25l3.72,3.21a3.16,3.16,0,0,0,4.33-.19l35.69-36.8a3.15,3.15,0,0,0,0-4.44l-3.79-3.76"
></path><line
class="cls-7"
x1="573.31"
y1="1065.02"
x2="553.89"
y2="1084.25"
></line><path
class="cls-7"
d="M569.42,1116.78V1115a1.89,1.89,0,0,0-1.89-1.89h-23.2a1.88,1.88,0,0,0-1.89,1.89v1.8"
></path><rect
class="cls-12"
x="542.44"
y="1121.36"
width="26.13"
height="7.79"
></rect><rect
class="cls-4"
x="790.91"
y="817.13"
width="522.47"
height="330.36"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

74
packages/web/public/devices/heltec-v3-case.svg

@ -0,0 +1,74 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="404.68 390.65 1217.15 959.26">
<defs><style>
.cls-1 {
fill: #dfeaf7;
}
.cls-2 {
fill: #17907f;
}
.cls-3 {
fill: #2b2b2b;
}
.cls-4, .cls-5 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-4 {
stroke-width: 2.25px;
}
.cls-5 {
stroke-width: 4px;
}
.cls-6 {
fill: #050606;
}
</style></defs><g id="Layer_5" data-name="Layer 5"><path
class="cls-1"
d="M1517.73,392.65h0a102.1,102.1,0,0,0-102.1,102.1V770.37A40.62,40.62,0,0,1,1375,811H455.16a48.49,48.49,0,0,0-48.48,48.48v126a11.85,11.85,0,0,0,3.46,8.37l15.34,15.34a11.81,11.81,0,0,1,3.47,8.37v137.16a11.81,11.81,0,0,1-3.47,8.37l-15.34,15.34a11.85,11.85,0,0,0-3.46,8.37v112.67a48.49,48.49,0,0,0,48.48,48.49H1571.34a48.51,48.51,0,0,0,48.49-48.5V494.75A102.1,102.1,0,0,0,1517.73,392.65Zm-110.61,815V954a33.14,33.14,0,0,1,66.27,0v253.65a33.14,33.14,0,0,1-66.27,0Z"
></path><path
class="cls-2"
d="M1516,439.16c-30.23.91-53.92,26.54-53.92,56.79V770.37A87.11,87.11,0,0,1,1375,857.48H732.31A27.51,27.51,0,0,0,704.8,885v388.93a27.51,27.51,0,0,0,27.51,27.51h828.38a12.7,12.7,0,0,0,12.65-12.65v-794A55.69,55.69,0,0,0,1516,439.16Zm-108.9,768.47V954a33.14,33.14,0,0,1,66.27,0v253.65a33.14,33.14,0,0,1-66.27,0Z"
></path><rect
class="cls-3"
x="787.14"
y="943.38"
width="429.45"
height="224.42"
></rect><path
class="cls-1"
d="M1478.6,915.35A54.23,54.23,0,0,0,1386,953.69v254.23a54.23,54.23,0,1,0,108.45,0V953.69A54,54,0,0,0,1478.6,915.35Zm-5.21,292.28a33.14,33.14,0,0,1-66.27,0V954a33.14,33.14,0,0,1,66.27,0Z"
></path></g><g id="Layer_2" data-name="Layer 2"><path
class="cls-4"
d="M1573.34,494.75v794a12.68,12.68,0,0,1-12.65,12.65H732.31a27.51,27.51,0,0,1-27.51-27.51V885a27.51,27.51,0,0,1,27.51-27.51H1375a87.11,87.11,0,0,0,87.11-87.11V496c0-30.25,23.69-55.88,53.92-56.79A55.69,55.69,0,0,1,1573.34,494.75Z"
></path><path
class="cls-5"
d="M410.14,1178.39,425.49,1163a11.78,11.78,0,0,0,3.46-8.35V1017.5a11.8,11.8,0,0,0-3.46-8.35l-15.35-15.36a11.77,11.77,0,0,1-3.46-8.35v-126A48.47,48.47,0,0,1,455.16,811H1375a40.63,40.63,0,0,0,40.63-40.63V494.75a102.1,102.1,0,0,1,102.1-102.1h0a102.1,102.1,0,0,1,102.1,102.1v804.66a48.51,48.51,0,0,1-48.49,48.5H455.16a48.48,48.48,0,0,1-48.48-48.49V1186.74A11.78,11.78,0,0,1,410.14,1178.39Z"
></path><rect
class="cls-4"
x="1407.12"
y="920.85"
width="66.26"
height="319.9"
rx="33.13"
></rect><rect
class="cls-4"
x="1386.03"
y="899.46"
width="108.46"
height="362.69"
rx="54.23"
></rect><path
class="cls-6"
d="M639.76,1070.55a2.91,2.91,0,0,1-2.91-2.91v-30.53a5.42,5.42,0,0,0-1.6-3.86l-32.44-32.44a11.86,11.86,0,0,1-3.5-8.44V901a12.52,12.52,0,0,0-12.51-12.51H483.92a12.7,12.7,0,0,0-12.68,12.69v76.78a24.13,24.13,0,0,0,7.11,17.18l14.33,14.33a24.13,24.13,0,0,0,17.18,7.11h50.75a11.86,11.86,0,0,1,8.44,3.5l24.26,24.26a12.47,12.47,0,0,1,3.68,8.88v14.46a2.91,2.91,0,1,1-5.81,0v-14.46a6.72,6.72,0,0,0-2-4.77l-24.26-24.26a6.09,6.09,0,0,0-4.33-1.8H509.86a29.91,29.91,0,0,1-21.29-8.81l-14.33-14.33a29.87,29.87,0,0,1-8.81-21.29V901.14a18.51,18.51,0,0,1,18.49-18.5H586.8A18.34,18.34,0,0,1,605.12,901v91.41a6.09,6.09,0,0,0,1.8,4.33l32.44,32.44a11.19,11.19,0,0,1,3.3,8v30.53A2.9,2.9,0,0,1,639.76,1070.55Z"
></path><path
class="cls-6"
d="M586.8,1289.46H483.92a18.51,18.51,0,0,1-18.49-18.5v-76.78a29.87,29.87,0,0,1,8.81-21.29l14.33-14.34a29.91,29.91,0,0,1,21.29-8.81h50.75a6.09,6.09,0,0,0,4.33-1.8l24.26-24.25a6.74,6.74,0,0,0,2-4.78v-14.46a2.91,2.91,0,0,1,5.81,0v14.46a12.51,12.51,0,0,1-3.68,8.89l-24.26,24.25a11.86,11.86,0,0,1-8.44,3.5H509.86a24.17,24.17,0,0,0-17.18,7.11L478.35,1177a24.09,24.09,0,0,0-7.11,17.18V1271a12.71,12.71,0,0,0,12.68,12.69H586.8a12.53,12.53,0,0,0,12.51-12.52v-91.4a11.83,11.83,0,0,1,3.5-8.44l32.44-32.44a5.46,5.46,0,0,0,1.6-3.87v-30.53a2.91,2.91,0,0,1,5.81,0V1135a11.19,11.19,0,0,1-3.3,8l-32.44,32.45a6.06,6.06,0,0,0-1.8,4.33v91.4A18.35,18.35,0,0,1,586.8,1289.46Z"
></path><rect
class="cls-4"
x="787.14"
y="943.38"
width="429.45"
height="224.42"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

1496
packages/web/public/devices/heltec-v3.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 40 KiB

149
packages/web/public/devices/heltec-vision-master-e213.svg

@ -0,0 +1,149 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="528.89 806.04 942.22 446.84">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #dbdddb;
}
.cls-3 {
fill: #c6842a;
}
.cls-4, .cls-5, .cls-7, .cls-9 {
fill: none;
stroke-miterlimit: 10;
}
.cls-4, .cls-5 {
stroke: #050606;
}
.cls-4, .cls-9 {
stroke-width: 2.44px;
}
.cls-5, .cls-7 {
stroke-width: 1.22px;
}
.cls-6 {
fill: #b7b7b7;
}
.cls-7, .cls-9 {
stroke: #b7b7b7;
}
.cls-8 {
fill: #cbcccb;
}
.cls-10 {
fill: #434543;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1469.9,826.68v390.94a19.43,19.43,0,0,1-19.43,19.43H549.53a19.43,19.43,0,0,1-19.43-19.43V826.68a19.42,19.42,0,0,1,19.43-19.42h900.94A19.42,19.42,0,0,1,1469.9,826.68Z"
></path><path
class="cls-2"
d="M574.23,807.26v429.79h-24.7a19.43,19.43,0,0,1-19.43-19.43V826.68a19.42,19.42,0,0,1,19.43-19.42Z"
></path><path
class="cls-2"
d="M1469.9,826.68v390.94a19.43,19.43,0,0,1-19.43,19.43h-37.56V807.26h37.56A19.42,19.42,0,0,1,1469.9,826.68Z"
></path><path
class="cls-3"
d="M574.23,1129.8h-7.47a4.55,4.55,0,0,1-4.55-4.54V919.05a4.55,4.55,0,0,1,4.55-4.55h7.47"
></path><rect
class="cls-4"
x="530.11"
y="807.26"
width="939.78"
height="429.79"
rx="19.42"
></rect><line
class="cls-5"
x1="574.23"
y1="807.26"
x2="574.23"
y2="1237.05"
></line><path
class="cls-5"
d="M574.23,1129.8h-7.47a4.55,4.55,0,0,1-4.55-4.54V919.05a4.55,4.55,0,0,1,4.55-4.55h7.47"
></path><rect
class="cls-6"
x="599.01"
y="970.1"
width="11.52"
height="104.11"
></rect><rect
class="cls-5"
x="599.01"
y="970.1"
width="11.52"
height="104.11"
></rect><path
class="cls-2"
d="M610.53,816.78V935.32l38.37,11.55a7.85,7.85,0,0,1,5.6,7.53V1107a7.87,7.87,0,0,1-7.87,7.87h-36.1v110.58H1406V816.78Zm775.41,384.75H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66h754.51Z"
></path><path
class="cls-1"
d="M1385.94,840.45v361.08H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66Z"
></path><path
class="cls-7"
d="M610.53,816.78V935.32l38.37,11.55a7.85,7.85,0,0,1,5.6,7.53V1107a7.87,7.87,0,0,1-7.87,7.87h-36.1v110.58H1406V816.78Zm775.41,384.75H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66h754.51Z"
></path><path
class="cls-7"
d="M1385.94,840.45v361.08H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66Z"
></path><path
class="cls-7"
d="M1385.94,840.45v361.08H631.43a3.66,3.66,0,0,1-3.66-3.66V1138a3.65,3.65,0,0,1,3.66-3.65h28.3a14.7,14.7,0,0,0,14.71-14.71V931a14.7,14.7,0,0,0-14.71-14.71h-28.3a3.65,3.65,0,0,1-3.66-3.66V844.11a3.66,3.66,0,0,1,3.66-3.66Z"
></path><line
class="cls-7"
x1="666.4"
y1="1132.79"
x2="666.4"
y2="1201.53"
></line><line
class="cls-7"
x1="663.66"
y1="916.86"
x2="663.66"
y2="840.45"
></line><circle
class="cls-8"
cx="644.99"
cy="878.66"
r="10.7"
></circle><circle
class="cls-8"
cx="644.99"
cy="1171.55"
r="10.7"
></circle><circle
class="cls-9"
cx="644.99"
cy="878.66"
r="10.7"
></circle><circle
class="cls-9"
cx="644.99"
cy="1171.55"
r="10.7"
></circle><path
class="cls-10"
d="M1225,1237.05l2.23,11.19a4.25,4.25,0,0,0,4.17,3.42H1249a4.26,4.26,0,0,0,4.18-3.42l2.22-11.19"
></path><path
class="cls-10"
d="M1306.87,1237.05l2.22,11.19a4.26,4.26,0,0,0,4.18,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.22-11.19"
></path><path
class="cls-10"
d="M1388.77,1237.05l2.23,11.19a4.24,4.24,0,0,0,4.17,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.23-11.19"
></path><path
class="cls-4"
d="M1225,1237.05l2.23,11.19a4.25,4.25,0,0,0,4.17,3.42H1249a4.26,4.26,0,0,0,4.18-3.42l2.22-11.19"
></path><path
class="cls-4"
d="M1306.87,1237.05l2.22,11.19a4.26,4.26,0,0,0,4.18,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.22-11.19"
></path><path
class="cls-4"
d="M1388.77,1237.05l2.23,11.19a4.24,4.24,0,0,0,4.17,3.42h17.62a4.25,4.25,0,0,0,4.17-3.42l2.23-11.19"
></path><line
class="cls-4"
x1="1412.9"
y1="807.26"
x2="1412.9"
y2="1237.05"
></line></g>
</svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

221
packages/web/public/devices/heltec-vision-master-e290.svg

@ -0,0 +1,221 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="479.87 739.66 1073.46 452.36">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #2b2b2b;
}
.cls-3, .cls-5, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-3, .cls-5 {
stroke: #050606;
}
.cls-3, .cls-7 {
stroke-width: 2.44px;
}
.cls-4 {
fill: #cbcccb;
}
.cls-5 {
stroke-width: 1.73px;
}
.cls-6 {
fill: #434543;
}
.cls-7, .cls-8 {
stroke: #b7b7b7;
}
.cls-8 {
stroke-width: 1.22px;
}
.cls-9 {
fill: #dbdddb;
}
.cls-10 {
fill: #b7b7b7;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><rect
class="cls-1"
x="541.37"
y="740.89"
width="950.47"
height="441.77"
></rect><path
class="cls-2"
d="M1511.86,740.89h-20V907.47h13.88a4.83,4.83,0,1,1,0,9.65h-13.88v87h13.88a4.82,4.82,0,0,1,4.82,4.83,4.81,4.81,0,0,1-4.82,4.82h-13.88v168.83h20a40.25,40.25,0,0,0,40.25-40.25V781.15A40.25,40.25,0,0,0,1511.86,740.89Zm22.9,400.64a10.68,10.68,0,0,1-21.36,0v-17.4a10.68,10.68,0,1,1,21.36,0Zm0-343.24a10.68,10.68,0,1,1-21.36,0v-17.4a10.68,10.68,0,0,1,21.36,0Z"
></path><path
class="cls-3"
d="M1532.09,740.89h20a0,0,0,0,1,0,0v441.77a0,0,0,0,1,0,0h-20a40.25,40.25,0,0,1-40.25-40.25V781.14a40.25,40.25,0,0,1,40.25-40.25Z"
transform="translate(3043.95 1923.54) rotate(-180)"
></path><path
class="cls-4"
d="M1508.36,780.88V798.3a15.89,15.89,0,0,0,31.78,0V780.88a15.89,15.89,0,1,0-31.78,0Zm5,0a10.68,10.68,0,0,1,21.36,0v17.4a10.68,10.68,0,1,1-21.36,0Z"
></path><path
class="cls-4"
d="M1508.36,1124.11v17.42a15.89,15.89,0,1,0,31.78,0v-17.42a15.89,15.89,0,0,0-31.78,0Zm5,0a10.68,10.68,0,1,1,21.36,0v17.4a10.68,10.68,0,0,1-21.36,0Z"
></path><rect
class="cls-5"
x="1513.41"
y="770.21"
width="21.36"
height="38.76"
rx="10.68"
transform="translate(3048.18 1579.19) rotate(-180)"
></rect><rect
class="cls-5"
x="1508.36"
y="764.99"
width="31.78"
height="49.2"
rx="15.89"
transform="translate(3048.5 1579.18) rotate(-180)"
></rect><rect
class="cls-5"
x="1513.41"
y="1113.44"
width="21.36"
height="38.76"
rx="10.68"
transform="translate(3048.18 2265.65) rotate(-180)"
></rect><rect
class="cls-5"
x="1508.36"
y="1108.22"
width="31.78"
height="49.2"
rx="15.89"
transform="translate(3048.5 2265.65) rotate(-180)"
></rect><path
class="cls-4"
d="M1513.13,912.3a6.95,6.95,0,0,1-7,7h-14.33v-2.15h13.88a4.83,4.83,0,0,0,0-9.65h-13.88v-2.14h14.33A7,7,0,0,1,1513.13,912.3Z"
></path><path
class="cls-4"
d="M1513.13,1009a6.95,6.95,0,0,1-7,7h-14.33v-2.15h13.88a4.83,4.83,0,0,0,0-9.65h-13.88V1002h14.33A7,7,0,0,1,1513.13,1009Z"
></path><path
class="cls-2"
d="M521.33,740.89a40.26,40.26,0,0,0-40.25,40.26V1142.4a40.26,40.26,0,0,0,40.25,40.25h20V740.89Zm-1.53,400.64a10.68,10.68,0,0,1-21.36,0v-17.4a10.68,10.68,0,1,1,21.36,0ZM498.44,780.89a10.68,10.68,0,0,1,21.36,0v17.4a10.68,10.68,0,1,1-21.36,0Z"
></path><rect
class="cls-3"
x="541.37"
y="740.89"
width="950.47"
height="441.77"
></rect><path
class="cls-3"
d="M521.34,740.89h20a0,0,0,0,1,0,0v441.77a0,0,0,0,1,0,0h-20a40.25,40.25,0,0,1-40.25-40.25V781.14A40.25,40.25,0,0,1,521.34,740.89Z"
></path><path
class="cls-4"
d="M520.19,769.64a15.9,15.9,0,0,0-27.13,11.24V798.3a15.89,15.89,0,0,0,31.78,0V780.88A15.87,15.87,0,0,0,520.19,769.64Zm-.39,28.65a10.68,10.68,0,1,1-21.36,0v-17.4a10.68,10.68,0,0,1,21.36,0Z"
></path><path
class="cls-4"
d="M520.19,1112.88a15.89,15.89,0,0,0-27.13,11.23v17.42a15.89,15.89,0,1,0,31.78,0v-17.42A15.85,15.85,0,0,0,520.19,1112.88Zm-.39,28.65a10.68,10.68,0,0,1-21.36,0v-17.4a10.68,10.68,0,1,1,21.36,0Z"
></path><rect
class="cls-5"
x="498.43"
y="770.21"
width="21.36"
height="38.76"
rx="10.68"
></rect><rect
class="cls-5"
x="493.06"
y="764.99"
width="31.78"
height="49.2"
rx="15.89"
></rect><rect
class="cls-5"
x="498.43"
y="1113.44"
width="21.36"
height="38.76"
rx="10.68"
></rect><rect
class="cls-5"
x="493.06"
y="1108.22"
width="31.78"
height="49.2"
rx="15.89"
></rect><rect
class="cls-4"
x="501.66"
y="859.82"
width="14.3"
height="198.79"
rx="7.15"
></rect><rect
class="cls-5"
x="501.66"
y="859.82"
width="14.3"
height="198.79"
rx="7.15"
></rect><path
class="cls-6"
d="M528.29,869.68h13.07a0,0,0,0,1,0,0v179.06a0,0,0,0,1,0,0H528.29a3.45,3.45,0,0,1-3.45-3.45V873.13A3.45,3.45,0,0,1,528.29,869.68Z"
></path><path
class="cls-5"
d="M528.29,869.68h13.07a0,0,0,0,1,0,0v179.06a0,0,0,0,1,0,0H528.29a3.45,3.45,0,0,1-3.45-3.45V873.13A3.45,3.45,0,0,1,528.29,869.68Z"
></path><path
class="cls-6"
d="M1213.75,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1213.75,1182.65Z"
></path><path
class="cls-6"
d="M1297.35,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1297.35,1182.65Z"
></path><path
class="cls-6"
d="M1381,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2H1383a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1381,1182.65Z"
></path><path
class="cls-3"
d="M1213.75,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1213.75,1182.65Z"
></path><path
class="cls-3"
d="M1297.35,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2h-18.8a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1297.35,1182.65Z"
></path><path
class="cls-3"
d="M1381,1182.65h22.83a0,0,0,0,1,0,0v6.15a2,2,0,0,1-2,2H1383a2,2,0,0,1-2-2v-6.15A0,0,0,0,1,1381,1182.65Z"
></path><path
class="cls-7"
d="M1465.76,777.61v370.21H637.27V831.44a9.18,9.18,0,0,0-9.18-9.18H605.76a4.34,4.34,0,0,1-4.34-4.33V782a4.34,4.34,0,0,1,4.34-4.34Z"
></path><line
class="cls-8"
x1="637.28"
y1="831.44"
x2="637.28"
y2="777.61"
></line><path
class="cls-9"
d="M1472.8,766.19H588.58a2.34,2.34,0,0,0-2.34,2.34v63.55a2.34,2.34,0,0,0,2.34,2.34h29.94a4.74,4.74,0,0,1,4.74,4.74v312.71a5.55,5.55,0,0,0,5.57,5.55h844a4.87,4.87,0,0,0,4.88-4.87V771.07A4.87,4.87,0,0,0,1472.8,766.19Zm-7,381.63H637.27V831.44a9.18,9.18,0,0,0-9.18-9.18H605.76a4.34,4.34,0,0,1-4.34-4.33V782a4.34,4.34,0,0,1,4.34-4.34h860Z"
></path><circle
class="cls-4"
cx="620.54"
cy="798.13"
r="8.42"
></circle><circle
class="cls-7"
cx="620.54"
cy="798.13"
r="8.42"
></circle><rect
class="cls-10"
x="564.75"
y="905.43"
width="11.84"
height="114.57"
rx="2.32"
></rect><rect
class="cls-5"
x="564.75"
y="905.43"
width="11.84"
height="114.57"
rx="2.32"
></rect><path
class="cls-8"
d="M1472.8,766.19H588.58a2.34,2.34,0,0,0-2.34,2.34v63.55a2.34,2.34,0,0,0,2.34,2.34h29.94a4.74,4.74,0,0,1,4.74,4.74v312.71a5.55,5.55,0,0,0,5.57,5.55h844a4.87,4.87,0,0,0,4.88-4.87V771.07A4.87,4.87,0,0,0,1472.8,766.19Zm-7,381.63H637.27V831.44a9.18,9.18,0,0,0-9.18-9.18H605.76a4.34,4.34,0,0,1-4.34-4.33V782a4.34,4.34,0,0,1,4.34-4.34h860Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

213
packages/web/public/devices/heltec-vision-master-t190.svg

@ -0,0 +1,213 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="479.57 786.58 1040.84 433.17">
<defs><style>
.cls-1 {
fill: #cccccb;
}
.cls-2 {
fill: #2b2b2b;
}
.cls-3, .cls-6, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-3, .cls-6, .cls-7 {
stroke: #050606;
}
.cls-3, .cls-8 {
stroke-width: 1.65px;
}
.cls-4 {
fill: #40403f;
}
.cls-5 {
fill: #ddd;
}
.cls-6 {
stroke-width: 1.62px;
}
.cls-7 {
stroke-width: 1.64px;
}
.cls-8 {
stroke: #fff;
}
.cls-9 {
fill: #353535;
}
.cls-10 {
fill: #c08c2d;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M595,923.44H519.6A10.46,10.46,0,0,1,509.14,913V802.7a15.28,15.28,0,0,1,15.28-15.28h979.89a15.29,15.29,0,0,1,15.29,15.29v400.93a15.3,15.3,0,0,1-15.29,15.29H524.42a15.28,15.28,0,0,1-15.28-15.28V1102.1a10.46,10.46,0,0,1,10.46-10.46H595"
></path><rect
class="cls-2"
x="611.37"
y="796.48"
width="819.83"
height="411.47"
></rect><line
class="cls-3"
x1="1441.99"
y1="787.41"
x2="1441.99"
y2="1218.92"
></line><path
class="cls-4"
d="M620.91,851.7v302.78a1.87,1.87,0,0,1-1.87,1.87h-13.8a8.7,8.7,0,0,1-.89,0,10.23,10.23,0,0,1-9.35-10.2v-286a10.24,10.24,0,0,1,9.35-10.2,8.7,8.7,0,0,1,.89,0H619A1.87,1.87,0,0,1,620.91,851.7Z"
></path><rect
class="cls-5"
x="480.4"
y="942.42"
width="114.6"
height="127.58"
></rect><rect
class="cls-3"
x="480.4"
y="942.42"
width="114.6"
height="127.58"
></rect><path
class="cls-6"
d="M595,923.44H519.6A10.46,10.46,0,0,1,509.14,913V802.7a15.28,15.28,0,0,1,15.28-15.28h979.89a15.29,15.29,0,0,1,15.29,15.29v400.93a15.3,15.3,0,0,1-15.29,15.29H524.42a15.28,15.28,0,0,1-15.28-15.28V1102.1a10.46,10.46,0,0,1,10.46-10.46H595"
></path><path
class="cls-2"
d="M584.65,970.14H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3V973.11A3,3,0,0,1,584.65,970.14Z"
></path><rect
class="cls-2"
x="560.58"
y="976.5"
width="9.04"
height="16.58"
rx="2.72"
></rect><path
class="cls-2"
d="M584.65,1026.63H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3v-18.49A3,3,0,0,1,584.65,1026.63Z"
></path><rect
class="cls-2"
x="560.58"
y="1028.91"
width="9.04"
height="16.58"
rx="2.72"
></rect><path
class="cls-3"
d="M584.65,970.14H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3V973.11A3,3,0,0,1,584.65,970.14Z"
></path><rect
class="cls-3"
x="560.58"
y="976.5"
width="9.04"
height="16.58"
rx="2.72"
></rect><path
class="cls-3"
d="M584.65,1026.63H595a0,0,0,0,1,0,0v24.44a0,0,0,0,1,0,0H584.65a3,3,0,0,1-3-3v-18.49A3,3,0,0,1,584.65,1026.63Z"
></path><rect
class="cls-3"
x="560.58"
y="1028.91"
width="9.04"
height="16.58"
rx="2.72"
></rect><polyline
class="cls-7"
points="611.37 1156.35 611.37 1207.95 1431.2 1207.95 1431.2 796.48 611.37 796.48 611.37 849.83"
></polyline><line
class="cls-3"
x1="611.37"
y1="1207.95"
x2="611.37"
y2="1218.93"
></line><line
class="cls-3"
x1="611.37"
y1="796.48"
x2="611.37"
y2="787.42"
></line><rect
class="cls-8"
x="560.58"
y="1107.17"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="1107.17"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="560.58"
y="1166.28"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="1166.28"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="560.58"
y="804.46"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="804.46"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="560.58"
y="863.57"
width="18.37"
height="41.67"
rx="4.91"
></rect><rect
class="cls-8"
x="528.51"
y="863.57"
width="18.37"
height="41.67"
rx="4.91"
></rect><circle
class="cls-8"
cx="1476.63"
cy="831.74"
r="27.15"
></circle><circle
class="cls-8"
cx="1476.63"
cy="1173.49"
r="27.15"
></circle><rect
class="cls-9"
x="676.15"
y="804.6"
width="742.79"
height="396.03"
></rect><path
class="cls-10"
d="M604.35,849.87v306.44a10.23,10.23,0,0,1-9.35-10.2v-286A10.24,10.24,0,0,1,604.35,849.87Z"
></path><path
class="cls-3"
d="M605.24,849.83H619a1.87,1.87,0,0,1,1.87,1.87v302.78a1.87,1.87,0,0,1-1.87,1.87h-13.8A10.24,10.24,0,0,1,595,1146.11v-286A10.24,10.24,0,0,1,605.24,849.83Z"
></path><rect
class="cls-6"
x="676.15"
y="804.6"
width="742.79"
height="396.03"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

510
packages/web/public/devices/heltec-wireless-paper-V1_0.svg

@ -0,0 +1,510 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="505.33 784.55 1040.95 426.95">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #c5c9c9;
}
.cls-3 {
fill: #d3d3d3;
}
.cls-4 {
fill: #c6842a;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #dbdddb;
}
.cls-11, .cls-12, .cls-13, .cls-15, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-12, .cls-13, .cls-7, .cls-8 {
stroke: #050606;
}
.cls-7 {
stroke-width: 2.44px;
}
.cls-11, .cls-15, .cls-8 {
stroke-width: 1.22px;
}
.cls-9 {
fill: #ffe091;
}
.cls-10 {
fill: #cbcccb;
}
.cls-11 {
stroke: #b7b7b7;
}
.cls-12 {
stroke-width: 2.36px;
}
.cls-13 {
stroke-width: 1.25px;
}
.cls-14 {
fill: #050606;
}
.cls-15 {
stroke: #ffe091;
stroke-linecap: round;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-2"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-3"
x="506.55"
y="858.91"
width="88.59"
height="276.51"
></rect><rect
class="cls-1"
x="579.58"
y="785.78"
width="191.61"
height="424.5"
></rect><path
class="cls-1"
d="M595.13,1210.27H528.66a22.1,22.1,0,0,1-22.11-22.11v-65.81l52.68-22.79-1.8-192.37L506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47Z"
></path><path
class="cls-4"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><path
class="cls-5"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><path
class="cls-6"
d="M1429.58,785.78v424.49H632.82V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93a12.75,12.75,0,0,0-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78Z"
></path><path
class="cls-7"
d="M557.43,907.19,506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47"
></path><path
class="cls-7"
d="M559.23,1099.56l-52.68,22.79v65.81a22.1,22.1,0,0,0,22.11,22.11h66.47"
></path><path
class="cls-2"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><path
class="cls-8"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><circle
class="cls-9"
cx="541.04"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><path
class="cls-8"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><circle
class="cls-9"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><path
class="cls-8"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><path
class="cls-8"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><path
class="cls-1"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><circle
class="cls-10"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-10"
cx="672.06"
cy="838.98"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="838.98"
r="8.89"
></circle><line
class="cls-7"
x1="506.55"
y1="884.01"
x2="506.55"
y2="1122.35"
></line><path
class="cls-12"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><rect
class="cls-2"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-13"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-1"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><path
class="cls-7"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-8"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><path
class="cls-7"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><circle
class="cls-14"
cx="1453.85"
cy="1032.4"
r="5.56"
></circle><circle
class="cls-14"
cx="1453.85"
cy="1114.38"
r="5.56"
></circle><line
class="cls-11"
x1="688.05"
y1="1106.97"
x2="688.05"
y2="1176.29"
></line><line
class="cls-11"
x1="688.05"
y1="881.43"
x2="688.05"
y2="816.13"
></line><rect
class="cls-11"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><line
class="cls-15"
x1="538.46"
y1="928.91"
x2="568.22"
y2="928.91"
></line><line
class="cls-15"
x1="538.46"
y1="933.4"
x2="568.22"
y2="933.4"
></line><line
class="cls-15"
x1="538.46"
y1="937.89"
x2="568.22"
y2="937.89"
></line><line
class="cls-15"
x1="538.46"
y1="942.37"
x2="568.22"
y2="942.37"
></line><line
class="cls-15"
x1="538.46"
y1="946.86"
x2="568.22"
y2="946.86"
></line><line
class="cls-15"
x1="538.46"
y1="951.35"
x2="568.22"
y2="951.35"
></line><line
class="cls-15"
x1="538.46"
y1="955.83"
x2="568.22"
y2="955.83"
></line><line
class="cls-15"
x1="538.46"
y1="960.32"
x2="568.22"
y2="960.32"
></line><line
class="cls-15"
x1="538.46"
y1="964.81"
x2="568.22"
y2="964.81"
></line><line
class="cls-15"
x1="538.46"
y1="969.29"
x2="568.22"
y2="969.29"
></line><line
class="cls-15"
x1="538.46"
y1="973.78"
x2="568.22"
y2="973.78"
></line><line
class="cls-15"
x1="538.46"
y1="978.26"
x2="568.22"
y2="978.26"
></line><line
class="cls-15"
x1="538.46"
y1="982.75"
x2="568.22"
y2="982.75"
></line><line
class="cls-15"
x1="538.46"
y1="987.24"
x2="568.22"
y2="987.24"
></line><line
class="cls-15"
x1="538.46"
y1="991.72"
x2="568.22"
y2="991.72"
></line><line
class="cls-15"
x1="538.46"
y1="996.21"
x2="568.22"
y2="996.21"
></line><line
class="cls-15"
x1="538.46"
y1="1000.7"
x2="568.22"
y2="1000.7"
></line><line
class="cls-15"
x1="538.46"
y1="1005.18"
x2="568.22"
y2="1005.18"
></line><line
class="cls-15"
x1="538.46"
y1="1009.67"
x2="568.22"
y2="1009.67"
></line><line
class="cls-15"
x1="538.46"
y1="1014.16"
x2="568.22"
y2="1014.16"
></line><line
class="cls-15"
x1="538.46"
y1="1018.64"
x2="568.22"
y2="1018.64"
></line><line
class="cls-15"
x1="538.46"
y1="1023.13"
x2="568.22"
y2="1023.13"
></line><line
class="cls-15"
x1="538.46"
y1="1027.62"
x2="568.22"
y2="1027.62"
></line><line
class="cls-15"
x1="538.46"
y1="1032.1"
x2="568.22"
y2="1032.1"
></line><line
class="cls-15"
x1="538.46"
y1="1036.59"
x2="568.22"
y2="1036.59"
></line><line
class="cls-15"
x1="538.46"
y1="1041.08"
x2="568.22"
y2="1041.08"
></line><line
class="cls-15"
x1="538.46"
y1="1045.56"
x2="568.22"
y2="1045.56"
></line><line
class="cls-15"
x1="538.46"
y1="1050.05"
x2="568.22"
y2="1050.05"
></line><line
class="cls-15"
x1="538.46"
y1="1054.53"
x2="568.22"
y2="1054.53"
></line><line
class="cls-15"
x1="538.46"
y1="1059.02"
x2="568.22"
y2="1059.02"
></line><line
class="cls-15"
x1="538.46"
y1="1063.51"
x2="568.22"
y2="1063.51"
></line><line
class="cls-15"
x1="538.46"
y1="1067.99"
x2="568.22"
y2="1067.99"
></line><line
class="cls-15"
x1="538.46"
y1="1072.48"
x2="568.22"
y2="1072.48"
></line><line
class="cls-15"
x1="538.46"
y1="1076.97"
x2="568.22"
y2="1076.97"
></line><path
class="cls-11"
d="M632.82,1210.27V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93c0-6.85-5.05-10.17-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78"
></path><path
class="cls-11"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><polyline
class="cls-7"
points="632.82 785.77 1429.58 785.77 1429.58 1210.27 632.82 1210.27"
></polyline><polyline
class="cls-7"
points="632.82 1210.27 595.13 1210.27 595.13 785.77 632.82 785.77"
></polyline></g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

510
packages/web/public/devices/heltec-wireless-paper.svg

@ -0,0 +1,510 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="505.33 784.55 1040.95 426.95">
<defs><style>
.cls-1 {
fill: #e8eae8;
}
.cls-2 {
fill: #c5c9c9;
}
.cls-3 {
fill: #d3d3d3;
}
.cls-4 {
fill: #c6842a;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #dbdddb;
}
.cls-11, .cls-12, .cls-13, .cls-15, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-12, .cls-13, .cls-7, .cls-8 {
stroke: #050606;
}
.cls-7 {
stroke-width: 2.44px;
}
.cls-11, .cls-15, .cls-8 {
stroke-width: 1.22px;
}
.cls-9 {
fill: #ffe091;
}
.cls-10 {
fill: #cbcccb;
}
.cls-11 {
stroke: #b7b7b7;
}
.cls-12 {
stroke-width: 2.36px;
}
.cls-13 {
stroke-width: 1.25px;
}
.cls-14 {
fill: #050606;
}
.cls-15 {
stroke: #ffe091;
stroke-linecap: round;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-2"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-2"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-3"
x="506.55"
y="858.91"
width="88.59"
height="276.51"
></rect><rect
class="cls-1"
x="579.58"
y="785.78"
width="191.61"
height="424.5"
></rect><path
class="cls-1"
d="M595.13,1210.27H528.66a22.1,22.1,0,0,1-22.11-22.11v-65.81l52.68-22.79-1.8-192.37L506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47Z"
></path><path
class="cls-4"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><path
class="cls-5"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><path
class="cls-6"
d="M1429.58,785.78v424.49H632.82V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93a12.75,12.75,0,0,0-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78Z"
></path><path
class="cls-7"
d="M557.43,907.19,506.55,884V807.9a22.11,22.11,0,0,1,22.11-22.12h66.47"
></path><path
class="cls-7"
d="M559.23,1099.56l-52.68,22.79v65.81a22.1,22.1,0,0,0,22.11,22.11h66.47"
></path><path
class="cls-2"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><path
class="cls-8"
d="M529.59,841.87h22.9a5.13,5.13,0,0,0,4.43-2.56l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.83a5.13,5.13,0,0,0-4.43-2.56h-22.9a5.11,5.11,0,0,0-4.42,2.56l-11.45,19.83a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.11,5.11,0,0,0,529.59,841.87Z"
></path><circle
class="cls-9"
cx="541.04"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><path
class="cls-8"
d="M529.59,1202h22.9a5.12,5.12,0,0,0,4.43-2.55l11.45-19.83a5.12,5.12,0,0,0,0-5.11l-11.45-19.84a5.12,5.12,0,0,0-4.43-2.55h-22.9a5.1,5.1,0,0,0-4.42,2.55l-11.45,19.84a5.08,5.08,0,0,0,0,5.11l11.45,19.83A5.1,5.1,0,0,0,529.59,1202Z"
></path><circle
class="cls-9"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="541.04"
cy="1177.09"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><path
class="cls-8"
d="M1494.14,841.87H1517a5.11,5.11,0,0,0,4.42-2.56l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.83A5.11,5.11,0,0,0,1517,792h-22.9a5.13,5.13,0,0,0-4.43,2.56l-11.45,19.83a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.13,5.13,0,0,0,1494.14,841.87Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="816.93"
r="14.1"
></circle><path
class="cls-2"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><path
class="cls-8"
d="M1494.14,1202H1517a5.1,5.1,0,0,0,4.42-2.55l11.45-19.83a5.08,5.08,0,0,0,0-5.11l-11.45-19.84a5.1,5.1,0,0,0-4.42-2.55h-22.9a5.12,5.12,0,0,0-4.43,2.55l-11.45,19.84a5.12,5.12,0,0,0,0,5.11l11.45,19.83A5.12,5.12,0,0,0,1494.14,1202Z"
></path><circle
class="cls-9"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><circle
class="cls-8"
cx="1505.59"
cy="1177.09"
r="14.1"
></circle><path
class="cls-1"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><circle
class="cls-10"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="1154.92"
r="8.89"
></circle><circle
class="cls-10"
cx="672.06"
cy="838.98"
r="8.89"
></circle><circle
class="cls-11"
cx="672.06"
cy="838.98"
r="8.89"
></circle><line
class="cls-7"
x1="506.55"
y1="884.01"
x2="506.55"
y2="1122.35"
></line><path
class="cls-12"
d="M595.13,901.4H571.68a20,20,0,0,0-13.93,5.48,58.89,58.89,0,0,1-20,12.61,7,7,0,0,0-4.53,6.57v153a7,7,0,0,0,4.53,6.57,58.89,58.89,0,0,1,20,12.61,20,20,0,0,0,13.93,5.49h23.45"
></path><rect
class="cls-2"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-13"
x="621.34"
y="935.2"
width="11.49"
height="113.49"
></rect><rect
class="cls-1"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><path
class="cls-7"
d="M1421.48,785.78h91.06A22.44,22.44,0,0,1,1535,808.22v379.61a22.45,22.45,0,0,1-22.44,22.45h-91.06"
></path><rect
class="cls-8"
x="1435.08"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1005.05"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1435.08"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><rect
class="cls-8"
x="1494.51"
y="1128.44"
width="26.44"
height="11.33"
rx="5.67"
></rect><path
class="cls-7"
d="M1535,1014.12h5.26a4.8,4.8,0,0,1,4.8,4.8v104.72a4.8,4.8,0,0,1-4.8,4.8H1535a0,0,0,0,1,0,0V1014.12A0,0,0,0,1,1535,1014.12Z"
></path><circle
class="cls-14"
cx="1453.85"
cy="1032.4"
r="5.56"
></circle><circle
class="cls-14"
cx="1453.85"
cy="1114.38"
r="5.56"
></circle><line
class="cls-11"
x1="688.05"
y1="1106.97"
x2="688.05"
y2="1176.29"
></line><line
class="cls-11"
x1="688.05"
y1="881.43"
x2="688.05"
y2="816.13"
></line><rect
class="cls-11"
x="712.79"
y="826.99"
width="685.79"
height="336.38"
></rect><line
class="cls-15"
x1="538.46"
y1="928.91"
x2="568.22"
y2="928.91"
></line><line
class="cls-15"
x1="538.46"
y1="933.4"
x2="568.22"
y2="933.4"
></line><line
class="cls-15"
x1="538.46"
y1="937.89"
x2="568.22"
y2="937.89"
></line><line
class="cls-15"
x1="538.46"
y1="942.37"
x2="568.22"
y2="942.37"
></line><line
class="cls-15"
x1="538.46"
y1="946.86"
x2="568.22"
y2="946.86"
></line><line
class="cls-15"
x1="538.46"
y1="951.35"
x2="568.22"
y2="951.35"
></line><line
class="cls-15"
x1="538.46"
y1="955.83"
x2="568.22"
y2="955.83"
></line><line
class="cls-15"
x1="538.46"
y1="960.32"
x2="568.22"
y2="960.32"
></line><line
class="cls-15"
x1="538.46"
y1="964.81"
x2="568.22"
y2="964.81"
></line><line
class="cls-15"
x1="538.46"
y1="969.29"
x2="568.22"
y2="969.29"
></line><line
class="cls-15"
x1="538.46"
y1="973.78"
x2="568.22"
y2="973.78"
></line><line
class="cls-15"
x1="538.46"
y1="978.26"
x2="568.22"
y2="978.26"
></line><line
class="cls-15"
x1="538.46"
y1="982.75"
x2="568.22"
y2="982.75"
></line><line
class="cls-15"
x1="538.46"
y1="987.24"
x2="568.22"
y2="987.24"
></line><line
class="cls-15"
x1="538.46"
y1="991.72"
x2="568.22"
y2="991.72"
></line><line
class="cls-15"
x1="538.46"
y1="996.21"
x2="568.22"
y2="996.21"
></line><line
class="cls-15"
x1="538.46"
y1="1000.7"
x2="568.22"
y2="1000.7"
></line><line
class="cls-15"
x1="538.46"
y1="1005.18"
x2="568.22"
y2="1005.18"
></line><line
class="cls-15"
x1="538.46"
y1="1009.67"
x2="568.22"
y2="1009.67"
></line><line
class="cls-15"
x1="538.46"
y1="1014.16"
x2="568.22"
y2="1014.16"
></line><line
class="cls-15"
x1="538.46"
y1="1018.64"
x2="568.22"
y2="1018.64"
></line><line
class="cls-15"
x1="538.46"
y1="1023.13"
x2="568.22"
y2="1023.13"
></line><line
class="cls-15"
x1="538.46"
y1="1027.62"
x2="568.22"
y2="1027.62"
></line><line
class="cls-15"
x1="538.46"
y1="1032.1"
x2="568.22"
y2="1032.1"
></line><line
class="cls-15"
x1="538.46"
y1="1036.59"
x2="568.22"
y2="1036.59"
></line><line
class="cls-15"
x1="538.46"
y1="1041.08"
x2="568.22"
y2="1041.08"
></line><line
class="cls-15"
x1="538.46"
y1="1045.56"
x2="568.22"
y2="1045.56"
></line><line
class="cls-15"
x1="538.46"
y1="1050.05"
x2="568.22"
y2="1050.05"
></line><line
class="cls-15"
x1="538.46"
y1="1054.53"
x2="568.22"
y2="1054.53"
></line><line
class="cls-15"
x1="538.46"
y1="1059.02"
x2="568.22"
y2="1059.02"
></line><line
class="cls-15"
x1="538.46"
y1="1063.51"
x2="568.22"
y2="1063.51"
></line><line
class="cls-15"
x1="538.46"
y1="1067.99"
x2="568.22"
y2="1067.99"
></line><line
class="cls-15"
x1="538.46"
y1="1072.48"
x2="568.22"
y2="1072.48"
></line><line
class="cls-15"
x1="538.46"
y1="1076.97"
x2="568.22"
y2="1076.97"
></line><path
class="cls-11"
d="M632.82,1210.27V1097.4a4.66,4.66,0,0,1,4.67-4.65h28.16a11.68,11.68,0,0,0,11.67-11.68V916.93c0-6.85-5.05-10.17-12.24-12.74l-27.79-7.41a4.66,4.66,0,0,1-4.47-4.64V785.78"
></path><path
class="cls-11"
d="M1412.61,816.13v360.16h-755a2.5,2.5,0,0,1-2.51-2.5v-64.32a2.5,2.5,0,0,1,2.51-2.5h30.47a12.81,12.81,0,0,0,12.81-12.82V894.25a12.81,12.81,0,0,0-12.81-12.82H657.58a2.5,2.5,0,0,1-2.51-2.5V818.64a2.51,2.51,0,0,1,2.51-2.51Z"
></path><polyline
class="cls-7"
points="632.82 785.77 1429.58 785.77 1429.58 1210.27 632.82 1210.27"
></polyline><polyline
class="cls-7"
points="632.82 1210.27 595.13 1210.27 595.13 785.77 632.82 785.77"
></polyline></g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

2031
packages/web/public/devices/heltec-wireless-tracker-V1-0.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 95 KiB

2031
packages/web/public/devices/heltec-wireless-tracker.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 95 KiB

1068
packages/web/public/devices/heltec-wsl-v3.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 47 KiB

216
packages/web/public/devices/nano-g2-ultra.svg

@ -0,0 +1,216 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="340.47 241 263.8 451.32">
<defs><style>
.cls-1 {
fill: #434143;
}
.cls-2, .cls-6, .cls-7 {
fill: none;
}
.cls-2 {
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-3 {
fill: #2b2b2b;
}
.cls-4 {
fill: #181818;
}
.cls-5 {
fill: #e8eae8;
}
.cls-6, .cls-7 {
stroke: #e8eae8;
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-7 {
stroke-width: 2px;
}
</style></defs><g id="Layer_2" data-name="Layer 2"><rect
class="cls-1"
x="340.97"
y="241.5"
width="262.8"
height="450.32"
rx="27.43"
></rect><rect
class="cls-2"
x="340.97"
y="241.5"
width="262.8"
height="450.32"
rx="27.43"
></rect><circle
class="cls-3"
cx="364.66"
cy="264.01"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="264.01"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,264a2.39,2.39,0,0,1-2.39,2.38h-2.61V269a2.38,2.38,0,1,1-4.76,0v-2.62h-2.63a2.39,2.39,0,1,1,0-4.77h2.63V259a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,264Z"
></path><circle
class="cls-3"
cx="579.41"
cy="264.01"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="264.01"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,264a2.39,2.39,0,0,1-2.38,2.38h-2.62V269a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77H577V259a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,264Z"
></path><circle
class="cls-3"
cx="364.66"
cy="666.6"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="666.6"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,666.61a2.39,2.39,0,0,1-2.39,2.38h-2.61v2.62a2.38,2.38,0,1,1-4.76,0V669h-2.63a2.39,2.39,0,1,1,0-4.77h2.63V661.6a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,666.61Z"
></path><circle
class="cls-3"
cx="579.41"
cy="666.6"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="666.6"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,666.61a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V669h-2.62a2.39,2.39,0,1,1,0-4.77H577V661.6a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,666.61Z"
></path><circle
class="cls-3"
cx="579.41"
cy="440.79"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="440.79"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,440.79a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77H577v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,440.79Z"
></path><circle
class="cls-3"
cx="361.13"
cy="442.81"
r="10.92"
></circle><circle
class="cls-2"
cx="361.13"
cy="442.81"
r="10.92"
></circle><path
class="cls-4"
d="M368.51,442.81a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62V437.8a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,368.51,442.81Z"
></path><rect
class="cls-5"
x="442.52"
y="591.7"
width="6.5"
height="54.62"
transform="translate(432.79 -143.7) rotate(34.78)"
></rect><path
class="cls-5"
d="M521.39,639.18l-5.34,3.71L489,604.34l-26.94,39-5.34-3.71,28.32-41,1.06-1.53a3.53,3.53,0,0,1,5.8,0l1.06,1.53Z"
></path><rect
class="cls-3"
x="407.64"
y="511.78"
width="135.85"
height="67.27"
rx="3.52"
></rect><rect
class="cls-2"
x="407.64"
y="511.78"
width="135.85"
height="67.27"
rx="3.52"
></rect><circle class="cls-6" cx="586.93" cy="479.19" r="9.9"></circle><rect
class="cls-5"
x="581.12"
y="478.38"
width="9.09"
height="1.63"
rx="0.82"
></rect><circle
class="cls-5"
cx="591.91"
cy="479.19"
r="0.83"
></circle><path
class="cls-7"
d="M592.84,629.48a7.9,7.9,0,1,1-.29-6.3"
></path><line
class="cls-7"
x1="586.78"
y1="626.67"
x2="594.43"
y2="626.67"
></line><path
class="cls-5"
d="M408.88,655.16h3.51l4.58,7.29v-7.29h3.55v13.18H417l-4.56-7.24v7.24h-3.53Z"
></path><path
class="cls-5"
d="M425.87,661.88l-3.23-.37a4.06,4.06,0,0,1,.53-1.44,3,3,0,0,1,1-.91,3.82,3.82,0,0,1,1.28-.43,8.86,8.86,0,0,1,1.76-.16,13.09,13.09,0,0,1,2.44.19,3,3,0,0,1,1.54.77,2.86,2.86,0,0,1,.68,1.14,4.67,4.67,0,0,1,.25,1.42v4.22a5.74,5.74,0,0,0,.07,1.05,5.4,5.4,0,0,0,.35,1h-3.17a3.65,3.65,0,0,1-.25-.56,4.32,4.32,0,0,1-.12-.61,4.38,4.38,0,0,1-1.32,1,5.18,5.18,0,0,1-2.08.39,3.32,3.32,0,0,1-2.4-.79,2.61,2.61,0,0,1-.81-2A2.71,2.71,0,0,1,423,664a3.89,3.89,0,0,1,2.18-1c1.27-.28,2.09-.47,2.47-.58a11.09,11.09,0,0,0,1.19-.44,1.35,1.35,0,0,0-.26-.94,1.21,1.21,0,0,0-.9-.27,2.22,2.22,0,0,0-1.25.29A1.6,1.6,0,0,0,425.87,661.88Zm2.93,1.93a12.94,12.94,0,0,1-1.45.47,3.35,3.35,0,0,0-1.31.59,1,1,0,0,0,0,1.38,1.14,1.14,0,0,0,.82.27,2,2,0,0,0,1.05-.3,1.7,1.7,0,0,0,.69-.72,2.66,2.66,0,0,0,.2-1.11Z"
></path><path
class="cls-5"
d="M434.13,658.79h3.15v1.55A5,5,0,0,1,438.7,659a3.58,3.58,0,0,1,1.76-.41,2.75,2.75,0,0,1,2.2.91,4.13,4.13,0,0,1,.79,2.79v6.07h-3.39v-5.25a2,2,0,0,0-.31-1.27,1,1,0,0,0-.86-.38,1.2,1.2,0,0,0-1,.51,3.12,3.12,0,0,0-.38,1.8v4.59h-3.38Z"
></path><path
class="cls-5"
d="M445.06,663.59a5,5,0,0,1,1.36-3.6,5.55,5.55,0,0,1,7.68.25,5.08,5.08,0,0,1,1.08,3.3,5,5,0,0,1-1.35,3.61,5.64,5.64,0,0,1-7.16.23A4.81,4.81,0,0,1,445.06,663.59Zm3.38,0a3.06,3.06,0,0,0,.48,1.89,1.49,1.49,0,0,0,2.4,0,3.18,3.18,0,0,0,.47-1.93,3,3,0,0,0-.47-1.85,1.43,1.43,0,0,0-1.17-.61,1.51,1.51,0,0,0-1.23.62A3,3,0,0,0,448.44,663.58Z"
></path><path
class="cls-5"
d="M468.82,663.56v-2.74h5.81v5.62a11.64,11.64,0,0,1-2.95,1.68,9.47,9.47,0,0,1-3,.44,6.86,6.86,0,0,1-3.53-.8,5.31,5.31,0,0,1-2.12-2.38,8.38,8.38,0,0,1-.75-3.63,8.11,8.11,0,0,1,.82-3.76,5.53,5.53,0,0,1,2.41-2.42,7.36,7.36,0,0,1,3.33-.64,8.56,8.56,0,0,1,3,.4,3.89,3.89,0,0,1,1.66,1.23,5.54,5.54,0,0,1,1,2.1l-3.63.71a2.15,2.15,0,0,0-.76-1.15,2.26,2.26,0,0,0-1.36-.39,2.39,2.39,0,0,0-2,.93,4.74,4.74,0,0,0-.73,2.94,4.94,4.94,0,0,0,.74,3.06,2.53,2.53,0,0,0,2.07.92,3.74,3.74,0,0,0,1.21-.2,6.12,6.12,0,0,0,1.31-.68v-1.24Z"
></path><path
class="cls-5"
d="M486.22,668.34H476.07a7.23,7.23,0,0,1,1.06-3.06,14.61,14.61,0,0,1,3.32-3.39,10.56,10.56,0,0,0,1.9-1.81,2.21,2.21,0,0,0,.41-1.18,1.4,1.4,0,0,0-.41-1,1.35,1.35,0,0,0-1-.43,1.39,1.39,0,0,0-1.06.44,2.84,2.84,0,0,0-.55,1.56l-3.39-.3a6.13,6.13,0,0,1,.73-2.41,3.41,3.41,0,0,1,1.5-1.33,6.28,6.28,0,0,1,2.68-.47,7.05,7.05,0,0,1,2.77.44,3.44,3.44,0,0,1,1.56,1.36,3.76,3.76,0,0,1,.57,2,4.36,4.36,0,0,1-.65,2.3,9.09,9.09,0,0,1-2.37,2.41c-.68.51-1.13.87-1.36,1.07s-.5.47-.81.8h5.28Z"
></path><path
class="cls-5"
d="M501.8,655.16h3.75V663a7,7,0,0,1-.34,2.21,4.76,4.76,0,0,1-1,1.81,4.16,4.16,0,0,1-1.51,1.09,6.89,6.89,0,0,1-2.63.44,15.27,15.27,0,0,1-1.94-.13,4.69,4.69,0,0,1-1.75-.54,4.38,4.38,0,0,1-1.29-1.13,4.22,4.22,0,0,1-.8-1.52,8.17,8.17,0,0,1-.35-2.23v-7.85h3.75v8a2.38,2.38,0,0,0,.55,1.68,2,2,0,0,0,1.53.61,2,2,0,0,0,1.53-.6,2.44,2.44,0,0,0,.55-1.69Z"
></path><path
class="cls-5"
d="M507.93,655.16h3.39v13.18h-3.39Z"
></path><path
class="cls-5"
d="M517.56,655.16v3.63h1.86v2.68h-1.86v3.38a2,2,0,0,0,.1.81.61.61,0,0,0,.58.3,3.33,3.33,0,0,0,1-.23l.25,2.53a10.1,10.1,0,0,1-2.34.29,3.74,3.74,0,0,1-1.86-.35,2,2,0,0,1-.88-1.06,6.52,6.52,0,0,1-.29-2.31v-3.36h-1.25v-2.68h1.25V657Z"
></path><path
class="cls-5"
d="M521.06,658.79h3.16v1.56a3.81,3.81,0,0,1,.94-1.39,1.88,1.88,0,0,1,1.2-.39,3.33,3.33,0,0,1,1.64.51l-1,2.6a2.43,2.43,0,0,0-.94-.26,1.12,1.12,0,0,0-1,.59,6.43,6.43,0,0,0-.53,3.13v3.2h-3.39Z"
></path><path
class="cls-5"
d="M531.94,661.88l-3.23-.37a4.06,4.06,0,0,1,.53-1.44,3,3,0,0,1,1-.91,3.82,3.82,0,0,1,1.28-.43,8.86,8.86,0,0,1,1.76-.16,13.09,13.09,0,0,1,2.44.19,3,3,0,0,1,1.54.77,2.86,2.86,0,0,1,.68,1.14,4.67,4.67,0,0,1,.25,1.42v4.22a4.85,4.85,0,0,0,.08,1.05,4.6,4.6,0,0,0,.34,1h-3.17a3.65,3.65,0,0,1-.25-.56,4.32,4.32,0,0,1-.12-.61,4.38,4.38,0,0,1-1.32,1,5.15,5.15,0,0,1-2.08.39,3.28,3.28,0,0,1-2.39-.79,2.58,2.58,0,0,1-.82-2A2.67,2.67,0,0,1,529,664a3.86,3.86,0,0,1,2.17-1c1.27-.28,2.09-.47,2.47-.58a11.09,11.09,0,0,0,1.19-.44,1.36,1.36,0,0,0-.25-.94,1.25,1.25,0,0,0-.91-.27,2.18,2.18,0,0,0-1.24.29A1.6,1.6,0,0,0,531.94,661.88Zm2.93,1.93a12.94,12.94,0,0,1-1.45.47,3.21,3.21,0,0,0-1.3.59,1,1,0,0,0-.29.67,1,1,0,0,0,.28.71,1.14,1.14,0,0,0,.82.27,1.94,1.94,0,0,0,1.05-.3,1.7,1.7,0,0,0,.69-.72,2.51,2.51,0,0,0,.2-1.11Z"
></path><path
class="cls-6"
d="M579.88,583.57v16l.41-.47a7.4,7.4,0,0,1,5.54-2.48h.24a8.27,8.27,0,0,0,6.37-3l.18-.21a3.11,3.11,0,0,0,.14-3.78l-.24-.34a8.29,8.29,0,0,0-6.76-3.49h-.57a7.4,7.4,0,0,1-4.87-1.83Z"
></path><path
class="cls-6"
d="M579.87,594.24a2.68,2.68,0,1,1,0-5.35"
></path><path
class="cls-5"
d="M588.69,547.89a6.85,6.85,0,0,0-3.84,1.17l-.15.11-8,5.63,8,5.63.15.11a6.91,6.91,0,1,0,3.84-12.65Zm0,9.72a2.81,2.81,0,1,1,2.81-2.81A2.81,2.81,0,0,1,588.69,557.61Z"
></path><polygon
class="cls-6"
points="582.55 520.31 588.06 528.85 577.03 528.85 577.03 511.78 588.06 511.78 582.55 520.31"
></polygon><polygon
class="cls-6"
points="594.05 520.03 588.06 528.85 582.55 520.31 588.06 511.78 594.05 520.03"
></polygon></g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

3510
packages/web/public/devices/pico.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 102 KiB

2619
packages/web/public/devices/promicro.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 86 KiB

264
packages/web/public/devices/rak-wismeshtap.svg

@ -0,0 +1,264 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="663.59 325.94 640.35 1015.71">
<defs><style>
.cls-1 {
fill: #353535;
}
.cls-2 {
fill: #1d1e1e;
}
.cls-3 {
fill: #9f9f9e;
}
.cls-4 {
fill: #434343;
}
.cls-5, .cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-5 {
stroke-width: 2px;
}
.cls-6 {
fill: #b1a368;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><rect
class="cls-1"
x="1079.47"
y="834.15"
width="56.53"
height="9.97"
></rect><rect
class="cls-1"
x="1075.53"
y="800.89"
width="63.83"
height="33.26"
></rect><path
class="cls-1"
d="M1079.93,800.89v-5.28a2.81,2.81,0,0,1,2.81-2.81h50.45a2.81,2.81,0,0,1,2.82,2.81v5.28"
></path><rect
class="cls-1"
x="1076.7"
y="718.27"
width="62.66"
height="70.68"
rx="3.45"
></rect><rect
class="cls-1"
x="1082.84"
y="788.94"
width="50.73"
height="3.86"
></rect><path
class="cls-2"
d="M1085.24,695.85s-2.75-3.82-4.5-3.27-3.94.3-1.53,2.72l12.9,13s.75.76.61,3.43.07,5.63.65,5.91,30.43,1.59,30.64-.79.67-6.25-.74-5.68-11.35,4.43-19.55.05S1085.24,695.85,1085.24,695.85Z"
></path><path
class="cls-1"
d="M1282,938.23v321.64a59.85,59.85,0,0,1-59.78,59.78H745.37a59.84,59.84,0,0,1-59.78-59.78V938.23a59.84,59.84,0,0,1,59.78-59.78h476.8A59.84,59.84,0,0,1,1282,938.23Z"
></path><path
class="cls-3"
d="M1222.17,857.45H745.37a80.77,80.77,0,0,0-80.78,80.78v321.64a80.77,80.77,0,0,0,80.78,80.78h476.8a80.78,80.78,0,0,0,80.78-80.78V938.23A80.78,80.78,0,0,0,1222.17,857.45ZM1282,1259.87a59.85,59.85,0,0,1-59.78,59.78H745.37a59.84,59.84,0,0,1-59.78-59.78V938.23a59.84,59.84,0,0,1,59.78-59.78h476.8A59.84,59.84,0,0,1,1282,938.23Z"
></path><rect
class="cls-4"
x="819.33"
y="971.15"
width="328.86"
height="250.93"
></rect><path
class="cls-5"
d="M1222.17,878.45a59.83,59.83,0,0,1,59.77,59.77v321.65a59.84,59.84,0,0,1-59.77,59.78H745.36a59.84,59.84,0,0,1-59.77-59.78V938.22a59.83,59.83,0,0,1,59.77-59.77h476.81m0-21H745.36a80.77,80.77,0,0,0-80.77,80.77v321.65a80.78,80.78,0,0,0,80.77,80.78h476.81a80.78,80.78,0,0,0,80.77-80.78V938.22a80.77,80.77,0,0,0-80.77-80.77Z"
></path><rect
class="cls-5"
x="819.33"
y="971.15"
width="328.86"
height="250.93"
></rect><rect
class="cls-6"
x="1080.45"
y="847.88"
width="55.55"
height="9.57"
></rect><rect
class="cls-5"
x="1080.45"
y="847.88"
width="55.55"
height="9.57"
></rect><rect
class="cls-5"
x="1079.47"
y="834.15"
width="56.53"
height="9.97"
></rect><rect
class="cls-5"
x="1075.53"
y="800.89"
width="63.83"
height="33.26"
></rect><path
class="cls-5"
d="M1079.93,800.89v-5.28a2.81,2.81,0,0,1,2.81-2.81h50.45a2.81,2.81,0,0,1,2.82,2.81v5.28"
></path><rect
class="cls-5"
x="1076.7"
y="718.27"
width="62.66"
height="70.68"
rx="3.45"
></rect><rect
class="cls-5"
x="1082.84"
y="788.94"
width="50.73"
height="3.86"
></rect><line
class="cls-5"
x1="1093.01"
y1="718.27"
x2="1093.01"
y2="703.17"
></line><line
class="cls-5"
x1="1124.56"
y1="718.27"
x2="1124.56"
y2="710.55"
></line><path
class="cls-1"
d="M784.41,333.86l363.94,355.78-18.09,16.92a24.62,24.62,0,0,1-33.69,0l-14.9-14a.44.44,0,0,0-.5-.09h0a13.35,13.35,0,0,1-14.85-2.89L750.32,368a24.13,24.13,0,0,1,1.18-35h0A24.13,24.13,0,0,1,784.41,333.86Z"
></path><path
class="cls-2"
d="M818.35,367.13c-2.26-2.12-11.86,3.59-21.07,13.42s-15.34,19.55-13.08,21.67l-2.53-2.8c-2.26-2.12,3.87-11.84,13.08-21.67s18.8-15.54,21.07-13.42l-4.24-3.58c-2.27-2.12-11.86,3.6-21.07,13.42s-15.34,19.56-13.08,21.68l-2.53-2.8c-2.26-2.12,3.87-11.85,13.08-21.68s18.8-15.54,21.07-13.42"
></path><path
class="cls-5"
d="M784.41,333.86l363.94,355.78-18.09,16.92a24.62,24.62,0,0,1-33.69,0l-14.9-14a.44.44,0,0,0-.5-.09h0a13.35,13.35,0,0,1-14.85-2.89L750.32,368a24.13,24.13,0,0,1,1.18-35h0A24.13,24.13,0,0,1,784.41,333.86Z"
></path><line
class="cls-5"
x1="1077.35"
y1="693.43"
x2="1093.01"
y2="709.21"
></line><circle
class="cls-2"
cx="1111.17"
cy="687.29"
r="6"
></circle><circle
class="cls-5"
cx="1111.17"
cy="687.29"
r="6"
></circle><path
class="cls-7"
d="M774.9,393.05c-2.26-2.12,3.87-11.85,13.08-21.68s18.8-15.54,21.07-13.42"
></path><path
class="cls-7"
d="M777.43,395.85c-2.26-2.12,3.87-11.85,13.08-21.68s18.8-15.54,21.07-13.42"
></path><path
class="cls-7"
d="M781.67,399.42c-2.26-2.12,3.87-11.84,13.08-21.67s18.8-15.54,21.07-13.42"
></path><path
class="cls-7"
d="M784.2,402.22c-2.26-2.12,3.87-11.84,13.08-21.67s18.81-15.54,21.07-13.42"
></path><rect
class="cls-6"
x="1086.52"
y="844.12"
width="41.63"
height="3.76"
></rect><rect
class="cls-5"
x="1086.52"
y="844.12"
width="41.63"
height="3.76"
></rect><rect
class="cls-2"
x="1079.47"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1083.7"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1087.92"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1092.15"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1096.38"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1100.6"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1104.83"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1109.05"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1113.28"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1117.51"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1121.73"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1125.96"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1130.18"
y="805.49"
width="1.59"
height="25.02"
></rect><rect
class="cls-2"
x="1134.41"
y="805.49"
width="1.59"
height="25.02"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

2794
packages/web/public/devices/rak11310.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 164 KiB

379
packages/web/public/devices/rak2560.svg

@ -0,0 +1,379 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="281.97 168.43 271.78 510.19">
<defs><style>
.cls-1 {
fill: #1c60ac;
}
.cls-2 {
fill: #33353d;
}
.cls-3 {
fill: #0e5796;
}
.cls-4 {
fill: #fff;
}
.cls-5 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-6 {
fill: #9e9d9e;
}
</style></defs><g id="Layer_3" data-name="Layer 3"><rect
class="cls-1"
x="355.63"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-1"
x="352.62"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-1"
d="M389.88,671h0a7.12,7.12,0,0,1-7.12,7.12H366.14A7.12,7.12,0,0,1,359,671h0"
></path><rect
class="cls-2"
x="356.31"
y="576.3"
width="37.38"
height="5.41"
></rect><path
class="cls-2"
d="M392.3,606.94s-4.84,14.19-4.84,38.78H361.15c0-24.59-4.84-38.78-4.84-38.78Z"
></path><rect
class="cls-3"
x="355.63"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="364.31"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="372.98"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="381.65"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="390.32"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="357.21"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="364.91"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="372.6"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="380.3"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="388"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-1"
x="432.13"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-1"
x="429.12"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-1"
d="M466.38,671h0a7.12,7.12,0,0,1-7.12,7.12H442.63a7.11,7.11,0,0,1-7.11-7.12h0"
></path><rect
class="cls-2"
x="432.81"
y="576.3"
width="37.38"
height="5.41"
></rect><path
class="cls-2"
d="M468.79,606.94S464,621.13,464,645.72H437.64c0-24.59-4.83-38.78-4.83-38.78Z"
></path><rect
class="cls-3"
x="432.13"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="440.8"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="449.48"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="458.15"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="466.82"
y="584.04"
width="4.39"
height="20.14"
rx="0.9"
></rect><rect
class="cls-3"
x="433.71"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="441.4"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="449.1"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="456.8"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect><rect
class="cls-3"
x="464.5"
y="648.27"
width="3.9"
height="20.14"
rx="0.85"
></rect></g><g id="Layer_2" data-name="Layer 2"><path
class="cls-4"
d="M553.25,218.93V526.3a50,50,0,0,1-50,50H332.47a50,50,0,0,1-50-50V218.93a50,50,0,0,1,50-50H503.24A50,50,0,0,1,553.25,218.93Z"
></path><path
class="cls-1"
d="M553.25,218.93V328.61H282.47V218.93a50,50,0,0,1,50-50H503.24A50,50,0,0,1,553.25,218.93Z"
></path><path
class="cls-5"
d="M553.25,218.93V526.3a50,50,0,0,1-50,50H332.47a50,50,0,0,1-50-50V218.93a50,50,0,0,1,50-50H503.24A50,50,0,0,1,553.25,218.93Z"
></path><path
class="cls-4"
d="M356.47,248.86a8.83,8.83,0,0,0-5.13.45s-1.27-2.38-.86-7.18c.16-1.81.47-4.26,2.63-4.63l.1,0a2.54,2.54,0,0,1,3.26,3.1C355.85,246.23,356.69,248.83,356.47,248.86Z"
></path><path
class="cls-4"
d="M346.81,236.93a2.33,2.33,0,0,1,2.16,2.94,13,13,0,0,0-.33,4.26c.27,4.34,1.76,5.88,1.76,5.88a4.28,4.28,0,0,0-1.49,2.75,16.14,16.14,0,0,1-4.74-13,3.29,3.29,0,0,1,.94-2.14,2.34,2.34,0,0,1,1.41-.69A1.42,1.42,0,0,1,346.81,236.93Z"
></path><path
class="cls-4"
d="M348.3,260.57A18.32,18.32,0,0,1,338,249.31a20.24,20.24,0,0,1-1-7.95,4.84,4.84,0,0,1,1-3.08,2.87,2.87,0,0,1,4.25,1,5.05,5.05,0,0,1,.08,2.19,14.84,14.84,0,0,0,.62,5.95c1.39,4.89,6.95,9.07,6.95,9.07A5.94,5.94,0,0,0,348.3,260.57Z"
></path><path
class="cls-4"
d="M358,242.89a8.93,8.93,0,0,0-.45-5.13s2.38-1.26,7.18-.86c1.81.16,4.26.48,4.63,2.64a.29.29,0,0,0,0,.09,2.55,2.55,0,0,1-3.1,3.27C360.62,242.28,358,243.12,358,242.89Z"
></path><path
class="cls-4"
d="M369.93,233.24a2.33,2.33,0,0,1-2.94,2.15,13.43,13.43,0,0,0-4.26-.32c-4.34.27-5.88,1.75-5.88,1.75a4.24,4.24,0,0,0-2.75-1.48,16.14,16.14,0,0,1,13-4.74,3.28,3.28,0,0,1,2.14.93,2.36,2.36,0,0,1,.69,1.41A1.51,1.51,0,0,1,369.93,233.24Z"
></path><path
class="cls-4"
d="M346.29,234.73a18.29,18.29,0,0,1,11.26-10.34,20.05,20.05,0,0,1,7.95-1,4.77,4.77,0,0,1,3.08,1,2.87,2.87,0,0,1-1,4.25,4.77,4.77,0,0,1-2.19.08,15.07,15.07,0,0,0-5.95.63c-4.89,1.39-9.07,7-9.07,7A5.94,5.94,0,0,0,346.29,234.73Z"
></path><path
class="cls-4"
d="M363.86,244.84a8.93,8.93,0,0,0,5.13-.45s1.26,2.38.86,7.17c-.16,1.82-.48,4.27-2.64,4.63l-.09,0a2.53,2.53,0,0,1-3.26-3.09C364.48,247.46,363.64,244.87,363.86,244.84Z"
></path><path
class="cls-4"
d="M373.51,256.77a2.33,2.33,0,0,1-2.15-2.94,13.37,13.37,0,0,0,.33-4.26c-.27-4.34-1.76-5.88-1.76-5.88a4.28,4.28,0,0,0,1.49-2.75,16.14,16.14,0,0,1,4.74,13,3.29,3.29,0,0,1-.94,2.14,2.36,2.36,0,0,1-1.41.69Z"
></path><path
class="cls-4"
d="M372,233.13a18.29,18.29,0,0,1,10.34,11.26,19.87,19.87,0,0,1,1,8,4.77,4.77,0,0,1-1,3.08,2.87,2.87,0,0,1-4.25-1,4.91,4.91,0,0,1-.08-2.19,15.21,15.21,0,0,0-.62-5.95c-1.39-4.89-7-9.07-7-9.07A5.89,5.89,0,0,0,372,233.13Z"
></path><path
class="cls-4"
d="M362.33,250.81a8.79,8.79,0,0,0,.45,5.12s-2.38,1.27-7.18.87c-1.81-.16-4.26-.48-4.63-2.64a.29.29,0,0,0,0-.09,3,3,0,0,1,.8-2.79,3,3,0,0,1,2.3-.48C359.7,251.42,362.3,250.58,362.33,250.81Z"
></path><path
class="cls-4"
d="M350.4,260.46a2.32,2.32,0,0,1,2.93-2.15,13.5,13.5,0,0,0,4.27.32c4.34-.27,5.87-1.75,5.87-1.75a4.24,4.24,0,0,0,2.76,1.48,16.14,16.14,0,0,1-13,4.74,3.23,3.23,0,0,1-2.14-.93,2.43,2.43,0,0,1-.7-1.41C350.4,260.66,350.4,260.56,350.4,260.46Z"
></path><path
class="cls-4"
d="M374,259a18.29,18.29,0,0,1-11.26,10.34,20.26,20.26,0,0,1-7.95,1,4.76,4.76,0,0,1-3.08-1,2.87,2.87,0,0,1,1-4.25,4.86,4.86,0,0,1,2.18-.07,15.11,15.11,0,0,0,6-.63c4.89-1.39,9.06-7,9.06-7A6,6,0,0,0,374,259Z"
></path><path
class="cls-4"
d="M400.1,250.29v13h-7.47V230.88h15.53c7.7,0,11.84,3.89,11.84,8.88a7.75,7.75,0,0,1-5.13,7.66c1.75.59,4.39,2.26,4.39,8.05v1.6a23.55,23.55,0,0,0,.51,6.17h-7.24c-.62-1.41-.74-3.83-.74-7.27v-.47c0-3.54-1-5.21-6.67-5.21Zm0-5.57h6.4c4.18,0,5.8-1.46,5.8-4.17s-1.88-4.1-5.62-4.1H400.1Z"
></path><path
class="cls-4"
d="M430.81,255.76l-2.43,7.48h-6.65l10.62-32.36h8.48l11.07,32.36h-7.1l-2.57-7.48Zm10-5.73c-2.22-6.83-3.64-11.19-4.39-14.1h-.05c-.77,3.19-2.33,8.26-4.11,14.1Z"
></path><path
class="cls-4"
d="M454.41,230.88h6.68v14.44c2.06-2.49,8.49-9.79,12.44-14.44h8.09l-12.56,13.45,13,18.91H474l-9.59-14.38-3.29,3.27v11.11h-6.68Z"
></path><path
class="cls-4"
d="M487.73,235.1V237h-.79v-4.39h2.15c1.12,0,1.72.5,1.72,1.18a1.06,1.06,0,0,1-.89,1,1,1,0,0,1,.79,1.11v.2a2.79,2.79,0,0,0,.07.86H490a2.67,2.67,0,0,1-.09-.95V236c0-.6-.21-.86-1.15-.86Zm0-.54h1.13c.79,0,1.13-.24,1.13-.71s-.36-.7-1.06-.7h-1.2Z"
></path><path
class="cls-4"
d="M488.62,239.49a4.7,4.7,0,1,1,4.71-4.7A4.71,4.71,0,0,1,488.62,239.49Zm0-8.74a4,4,0,1,0,4,4A4,4,0,0,0,488.62,230.75Z"
></path><path class="cls-4" d="M396.73,277.19v-7.92h1v7.92Z"></path><path
class="cls-4"
d="M403.93,274.43c0,1.6-.9,2.89-2.54,2.89s-2.48-1.22-2.48-2.87.92-2.89,2.54-2.89S403.93,272.71,403.93,274.43Zm-4,0c0,1.18.56,2,1.47,2s1.44-.79,1.44-2-.52-2-1.46-2S400,273.2,400,274.44Z"
></path><path
class="cls-4"
d="M405.89,270.63h-2.32v-.94h5.72v.94H407v6.56h-1.08Z"
></path><path
class="cls-4"
d="M419.12,274.07c0-1.38,0-2.8.05-3.6h0c-.32,1.28-1.41,4.36-2.21,6.72h-1c-.61-1.94-1.74-5.41-2.06-6.73h0c.06.87.09,2.51.09,3.8v2.93h-1v-7.5h1.61c.77,2.26,1.71,5.16,1.95,6.14h0c.17-.77,1.29-3.94,2.09-6.14h1.56v7.5h-1.05Z"
></path><path
class="cls-4"
d="M425.77,276a9.39,9.39,0,0,0,.08,1.24h-1a2.46,2.46,0,0,1-.09-.68,1.88,1.88,0,0,1-3.41-.88c0-1.23.94-1.8,2.52-1.8h.88v-.44c0-.47-.15-1-1.09-1s-1,.42-1.07.85h-1c.07-.8.55-1.66,2.1-1.66,1.32,0,2,.56,2,1.82Zm-1-1.41H424c-1,0-1.55.3-1.55,1a.9.9,0,0,0,1,.94c1.21,0,1.37-.85,1.37-1.8Z"
></path><path
class="cls-4"
d="M431.82,269.27v6.38c0,.51,0,1,0,1.54h-1c0-.15,0-.54,0-.74a1.63,1.63,0,0,1-1.64.87c-1.36,0-2.21-1.14-2.21-2.82s.91-2.94,2.39-2.94c.91,0,1.33.37,1.46.67v-3Zm-3.81,5.2c0,1.27.57,2,1.38,2,1.2,0,1.44-.94,1.44-2.06s-.22-1.93-1.37-1.93C428.55,272.45,428,273.19,428,274.47Z"
></path><path
class="cls-4"
d="M433.73,274.64c0,1,.51,1.81,1.38,1.81a1.15,1.15,0,0,0,1.21-.8h1a2.19,2.19,0,0,1-2.27,1.67c-1.69,0-2.39-1.39-2.39-2.82,0-1.65.81-2.94,2.44-2.94a2.33,2.33,0,0,1,2.32,2.63,3.24,3.24,0,0,1,0,.45Zm2.68-.72c0-.85-.42-1.54-1.29-1.54s-1.28.64-1.36,1.54Z"
></path><path
class="cls-4"
d="M446,273.74h-3.59v2.51h3.94l-.13.94h-4.86v-7.5h4.81v.94h-3.76v2.16H446Z"
></path><path
class="cls-4"
d="M451.59,276a9.9,9.9,0,0,0,.07,1.24h-1a2.93,2.93,0,0,1-.09-.68,1.88,1.88,0,0,1-3.41-.88c0-1.23.94-1.8,2.52-1.8h.88v-.44c0-.47-.15-1-1.08-1s-1,.42-1.08.85h-1c.07-.8.55-1.66,2.1-1.66,1.33,0,2.06.56,2.06,1.82Zm-1-1.41h-.81c-1,0-1.55.3-1.55,1a.91.91,0,0,0,1,.94c1.21,0,1.37-.85,1.37-1.8Z"
></path><path
class="cls-4"
d="M453.63,275.6a1.16,1.16,0,0,0,1.25.9c.74,0,1-.32,1-.78s-.24-.7-1.2-1c-1.57-.39-1.88-.89-1.88-1.64s.56-1.57,2-1.57a1.8,1.8,0,0,1,2,1.6h-1a1,1,0,0,0-1.1-.8c-.69,0-.9.35-.9.68s.21.58,1.16.81c1.65.4,2,1,2,1.79s-.73,1.68-2.11,1.68a2,2,0,0,1-2.23-1.72Z"
></path><path
class="cls-4"
d="M458.65,271.69c.8,2.49,1.28,4,1.41,4.55h0c.16-.61.52-1.87,1.35-4.55h1l-1.89,5.74c-.53,1.6-.94,2-2.07,2a4.38,4.38,0,0,1-.59,0v-.9a2.9,2.9,0,0,0,.43,0c.65,0,.91-.29,1.2-1.15l-2-5.7Z"
></path><path
class="cls-6"
d="M437,480.69v22.45a6.83,6.83,0,0,1-6.83,6.83h-11.1a8,8,0,0,1-5.42-2.38,9.05,9.05,0,0,1-2.56-6.44V482.62l11.73,11.74v-3.69l-11.73-11.74-3-3v25.17c0,3.22,1.82,8.05,4,8.9h-5.75a6.83,6.83,0,0,1-6.83-6.83V480.69a6.83,6.83,0,0,1,6.83-6.83H418a8,8,0,0,1,5.42,2.38,9.05,9.05,0,0,1,2.56,6.44v18.53l-11.73-11.74v3.69L426,504.9l3,3V482.76c0-3.22-1.82-8.05-4-8.9h5.22A6.83,6.83,0,0,1,437,480.69Z"
></path><rect
class="cls-5"
x="355.63"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-5"
x="352.62"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-5"
d="M389.88,671h0a7.12,7.12,0,0,1-7.12,7.12H366.14A7.12,7.12,0,0,1,359,671h0"
></path><line
class="cls-5"
x1="356.31"
y1="581.71"
x2="356.31"
y2="576.3"
></line><line
class="cls-5"
x1="393.69"
y1="581.71"
x2="393.69"
y2="576.3"
></line><path
class="cls-5"
d="M356.31,606.94s4.84,14.19,4.84,38.78"
></path><path
class="cls-5"
d="M392.3,606.94s-4.84,14.19-4.84,38.78"
></path><rect
class="cls-5"
x="432.13"
y="645.72"
width="37.63"
height="25.23"
rx="3.38"
></rect><rect
class="cls-5"
x="429.12"
y="581.71"
width="44.76"
height="25.23"
rx="3.69"
></rect><path
class="cls-5"
d="M466.38,671h0a7.12,7.12,0,0,1-7.12,7.12H442.63a7.11,7.11,0,0,1-7.11-7.12h0"
></path><line
class="cls-5"
x1="432.81"
y1="581.71"
x2="432.81"
y2="576.3"
></line><line
class="cls-5"
x1="470.19"
y1="581.71"
x2="470.19"
y2="576.3"
></line><path
class="cls-5"
d="M432.81,606.94s4.83,14.19,4.83,38.78"
></path><path
class="cls-5"
d="M468.79,606.94S464,621.13,464,645.72"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

4244
packages/web/public/devices/rak4631.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 128 KiB

322
packages/web/public/devices/rak4631_case.svg

@ -0,0 +1,322 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="754.63 172.39 553.95 1466.51">
<defs><style>
.cls-1 {
fill: #e2d299;
}
.cls-2 {
fill: #2d2d2d;
}
.cls-3 {
fill: #e6e8e8;
}
.cls-4 {
fill: #999;
}
.cls-5 {
fill: #c8cccb;
}
.cls-10, .cls-11, .cls-12, .cls-6, .cls-7, .cls-8, .cls-9 {
fill: none;
stroke-miterlimit: 10;
}
.cls-6 {
stroke: #999;
}
.cls-6, .cls-8 {
stroke-width: 1.35px;
}
.cls-10, .cls-11, .cls-12, .cls-7, .cls-8, .cls-9 {
stroke: #050606;
}
.cls-7 {
stroke-width: 4.05px;
}
.cls-9 {
stroke-width: 1.33px;
}
.cls-10 {
stroke-width: 2.66px;
}
.cls-11 {
stroke-width: 1.19px;
}
.cls-12 {
stroke-width: 1.31px;
}
</style></defs><g id="Layer_3" data-name="Layer 3"><rect
class="cls-1"
x="880.79"
y="713.97"
width="84.29"
height="27.63"
></rect><rect
class="cls-1"
x="887.38"
y="684.75"
width="71.66"
height="29.22"
></rect><rect
class="cls-1"
x="876.01"
y="620.75"
width="93.9"
height="64"
rx="15.57"
></rect><rect
class="cls-2"
x="891.84"
y="608.7"
width="62.51"
height="12.05"
></rect><path
class="cls-2"
d="M922.93,174.42h0a42.15,42.15,0,0,1,42.15,42.15V605.22a3.48,3.48,0,0,1-3.48,3.48H884.26a3.48,3.48,0,0,1-3.48-3.48V216.56a42.15,42.15,0,0,1,42.15-42.15Z"
></path><rect
class="cls-3"
x="756.66"
y="741.6"
width="549.89"
height="895.27"
rx="39.55"
></rect><path
class="cls-3"
d="M1274.64,647.59h-62.29a31.92,31.92,0,0,0-31.91,31.93v62.09l126.12,51.15V679.52A31.93,31.93,0,0,0,1274.64,647.59Zm3.87,59.81a13.86,13.86,0,0,1-13.87,13.86h-43.72a13.85,13.85,0,0,1-13.86-13.86V686.45a13.87,13.87,0,0,1,13.86-13.87h43.72a13.88,13.88,0,0,1,13.87,13.87Z"
></path><polygon
class="cls-4"
points="810.18 770.29 795.58 770.29 788.28 782.93 795.58 795.58 810.18 795.58 817.48 782.93 810.18 770.29"
></polygon><polygon
class="cls-4"
points="1253.04 770.29 1267.64 770.29 1274.94 782.93 1267.64 795.58 1253.04 795.58 1245.74 782.93 1253.04 770.29"
></polygon><polygon
class="cls-4"
points="810.18 1608.19 795.58 1608.19 788.28 1595.55 795.58 1582.9 810.18 1582.9 817.48 1595.55 810.18 1608.19"
></polygon><polygon
class="cls-4"
points="1253.04 1608.19 1267.64 1608.19 1274.94 1595.55 1267.64 1582.9 1253.04 1582.9 1245.74 1595.55 1253.04 1608.19"
></polygon><rect
class="cls-2"
x="872.9"
y="1131.27"
width="321.03"
height="160.93"
rx="17.15"
></rect><rect
class="cls-5"
x="811.61"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
></rect><path
class="cls-5"
d="M930.19,840.33v169.11a18.61,18.61,0,0,1-18.6,18.61h0A18.61,18.61,0,0,1,893,1009.44V840.91c0-10.24,8.37-19.19,18.6-19.19a18.62,18.62,0,0,1,18.61,18.61Z"
></path><path
class="cls-5"
d="M911.59,1323.24h0a18.61,18.61,0,0,1,18.6,18.61v198.51c0,10.05-7.72,18.72-17.76,19.16A18.59,18.59,0,0,1,893,1540.93V1341.85A18.61,18.61,0,0,1,911.59,1323.24Z"
></path><path
class="cls-5"
d="M1012,808.86V957.94a18.61,18.61,0,0,1-18.61,18.6h0a18.6,18.6,0,0,1-18.6-18.6V809.44c0-10.24,8.36-19.2,18.6-19.19A18.62,18.62,0,0,1,1012,808.86Z"
></path><path
class="cls-5"
d="M993.38,1323.24h0a18.61,18.61,0,0,1,18.61,18.61v231.46c0,10-7.73,18.72-17.77,19.16a18.59,18.59,0,0,1-19.44-18.59v-232A18.61,18.61,0,0,1,993.38,1323.24Z"
></path><rect
class="cls-5"
x="1218.69"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
transform="translate(2474.6 2382.59) rotate(180)"
></rect><path
class="cls-5"
d="M1137.33,840.33v169.11a18.61,18.61,0,0,0,18.61,18.61h0a18.61,18.61,0,0,0,18.6-18.61V840.91c0-10.24-8.36-19.19-18.6-19.19a18.64,18.64,0,0,0-18.61,18.61Z"
></path><path
class="cls-5"
d="M1155.94,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v198.51c0,10.05,7.72,18.72,17.77,19.16a18.59,18.59,0,0,0,19.44-18.59V1341.85A18.61,18.61,0,0,0,1155.94,1323.24Z"
></path><path
class="cls-5"
d="M1055.53,808.86V957.94a18.61,18.61,0,0,0,18.61,18.6h0a18.61,18.61,0,0,0,18.61-18.6V809.44c0-10.24-8.37-19.2-18.61-19.19a18.62,18.62,0,0,0-18.61,18.61Z"
></path><path
class="cls-5"
d="M1074.14,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v231.46c0,10,7.73,18.72,17.77,19.16a18.6,18.6,0,0,0,19.45-18.59v-232A18.61,18.61,0,0,0,1074.14,1323.24Z"
></path><path
class="cls-6"
d="M1294.4,841.87v694.74a14.87,14.87,0,0,1-14.87,14.87h-27.46a35.75,35.75,0,0,0-35.75,35.75v22.61a14.87,14.87,0,0,1-14.87,14.88H861.76a14.88,14.88,0,0,1-14.87-14.88v-22.61a35.74,35.74,0,0,0-35.75-35.75H783.69a14.87,14.87,0,0,1-14.87-14.87V841.87A14.87,14.87,0,0,1,783.69,827h27.45a35.75,35.75,0,0,0,35.75-35.75V768.63a14.87,14.87,0,0,1,14.87-14.87h339.69a14.87,14.87,0,0,1,14.87,14.87v22.62A35.76,35.76,0,0,0,1252.07,827h27.46A14.87,14.87,0,0,1,1294.4,841.87Z"
></path><rect
class="cls-5"
x="963.72"
y="986.16"
width="13.22"
height="126.83"
rx="1.27"
transform="translate(787.46 -368.06) rotate(35.4)"
></rect><path
class="cls-5"
d="M1144.31,1098.17l-8.71,6.19a1.28,1.28,0,0,1-1.77-.3l-64.47-90.7-64.46,90.7a1.28,1.28,0,0,1-1.77.3l-8.71-6.19a1.27,1.27,0,0,1-.3-1.77l67.12-94.45,4-5.67a5,5,0,0,1,8.17,0l4,5.67,67.13,94.45A1.28,1.28,0,0,1,1144.31,1098.17Z"
></path></g><g id="Layer_2" data-name="Layer 2"><rect
class="cls-7"
x="756.66"
y="741.6"
width="549.89"
height="895.27"
rx="39.55"
></rect><path
class="cls-7"
d="M1180.43,741.6V679.52a31.92,31.92,0,0,1,31.92-31.92h62.29a31.92,31.92,0,0,1,31.92,31.92V792.76"
></path><path
class="cls-7"
d="M834.74,741.61v47.3a25.93,25.93,0,0,1-25.94,25.93H756.66"
></path><circle
class="cls-8"
cx="802.88"
cy="782.93"
r="27.34"
></circle><polygon
class="cls-8"
points="810.18 770.29 795.58 770.29 788.28 782.93 795.58 795.58 810.18 795.58 817.48 782.93 810.18 770.29"
></polygon><path
class="cls-7"
d="M1306.56,814.84h-52.14a25.93,25.93,0,0,1-25.94-25.93v-47.3"
></path><circle
class="cls-8"
cx="1260.34"
cy="782.93"
r="27.34"
></circle><polygon
class="cls-8"
points="1253.04 770.29 1267.64 770.29 1274.94 782.93 1267.64 795.58 1253.04 795.58 1245.74 782.93 1253.04 770.29"
></polygon><path
class="cls-7"
d="M756.66,1563.63H808.8a25.94,25.94,0,0,1,25.94,25.94v47.3"
></path><circle
class="cls-8"
cx="802.88"
cy="1595.55"
r="27.34"
></circle><polygon
class="cls-8"
points="810.18 1608.19 795.58 1608.19 788.28 1595.55 795.58 1582.9 810.18 1582.9 817.48 1595.55 810.18 1608.19"
></polygon><path
class="cls-7"
d="M1228.48,1636.87v-47.3a25.94,25.94,0,0,1,25.94-25.94h52.14"
></path><circle
class="cls-8"
cx="1260.34"
cy="1595.55"
r="27.34"
></circle><polygon
class="cls-8"
points="1253.04 1608.19 1267.64 1608.19 1274.94 1595.55 1267.64 1582.9 1253.04 1582.9 1245.74 1595.55 1253.04 1608.19"
></polygon><rect
class="cls-8"
x="872.9"
y="1131.27"
width="321.03"
height="160.93"
rx="17.15"
></rect><rect
class="cls-8"
x="811.61"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
></rect><path
class="cls-8"
d="M930.19,840.33v169.11a18.61,18.61,0,0,1-18.6,18.61h0A18.61,18.61,0,0,1,893,1009.44V840.91c0-10.24,8.37-19.19,18.6-19.19a18.62,18.62,0,0,1,18.61,18.61Z"
></path><path
class="cls-8"
d="M911.59,1323.24h0a18.61,18.61,0,0,1,18.6,18.61v198.51c0,10.05-7.72,18.72-17.76,19.16A18.59,18.59,0,0,1,893,1540.93V1341.85A18.61,18.61,0,0,1,911.59,1323.24Z"
></path><path
class="cls-8"
d="M1012,808.86V957.94a18.61,18.61,0,0,1-18.61,18.6h0a18.6,18.6,0,0,1-18.6-18.6V809.44c0-10.24,8.36-19.2,18.6-19.19A18.62,18.62,0,0,1,1012,808.86Z"
></path><path
class="cls-8"
d="M993.38,1323.24h0a18.61,18.61,0,0,1,18.61,18.61v231.46c0,10-7.73,18.72-17.77,19.16a18.59,18.59,0,0,1-19.44-18.59v-232A18.61,18.61,0,0,1,993.38,1323.24Z"
></path><rect
class="cls-8"
x="1218.69"
y="854.23"
width="37.22"
height="674.13"
rx="18.61"
transform="translate(2474.6 2382.59) rotate(180)"
></rect><path
class="cls-8"
d="M1137.33,840.33v169.11a18.61,18.61,0,0,0,18.61,18.61h0a18.61,18.61,0,0,0,18.6-18.61V840.91c0-10.24-8.36-19.19-18.6-19.19a18.64,18.64,0,0,0-18.61,18.61Z"
></path><path
class="cls-8"
d="M1155.94,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v198.51c0,10.05,7.72,18.72,17.77,19.16a18.59,18.59,0,0,0,19.44-18.59V1341.85A18.61,18.61,0,0,0,1155.94,1323.24Z"
></path><path
class="cls-8"
d="M1055.53,808.86V957.94a18.61,18.61,0,0,0,18.61,18.6h0a18.61,18.61,0,0,0,18.61-18.6V809.44c0-10.24-8.37-19.2-18.61-19.19a18.62,18.62,0,0,0-18.61,18.61Z"
></path><path
class="cls-8"
d="M1074.14,1323.24h0a18.61,18.61,0,0,0-18.61,18.61v231.46c0,10,7.73,18.72,17.77,19.16a18.6,18.6,0,0,0,19.45-18.59v-232A18.61,18.61,0,0,0,1074.14,1323.24Z"
></path><rect
class="cls-7"
x="1207.05"
y="672.58"
width="71.46"
height="48.69"
rx="13.87"
></rect><rect
class="cls-9"
x="1200.59"
y="665.84"
width="84.39"
height="61.92"
rx="20.35"
></rect><rect
class="cls-7"
x="880.79"
y="713.97"
width="84.29"
height="27.63"
></rect><rect
class="cls-7"
x="887.38"
y="684.75"
width="71.66"
height="29.22"
></rect><rect
class="cls-7"
x="876.01"
y="620.75"
width="93.9"
height="64"
rx="15.57"
></rect><rect
class="cls-7"
x="891.84"
y="608.7"
width="62.51"
height="12.05"
></rect><path
class="cls-7"
d="M922.93,174.42h0a42.15,42.15,0,0,1,42.15,42.15V605.22a3.48,3.48,0,0,1-3.48,3.48H884.26a3.48,3.48,0,0,1-3.48-3.48V216.56a42.15,42.15,0,0,1,42.15-42.15Z"
></path><line
class="cls-10"
x1="880.79"
y1="251.39"
x2="965.08"
y2="251.39"
></line><line
class="cls-10"
x1="880.79"
y1="260.37"
x2="965.08"
y2="260.37"
></line><rect
class="cls-11"
x="963.72"
y="986.16"
width="13.22"
height="126.83"
rx="1.27"
transform="translate(787.46 -368.06) rotate(35.4)"
></rect><path
class="cls-12"
d="M1144.31,1098.17l-8.71,6.19a1.28,1.28,0,0,1-1.77-.3l-64.47-90.7-64.46,90.7a1.28,1.28,0,0,1-1.77.3l-8.71-6.19a1.27,1.27,0,0,1-.3-1.77l67.12-94.45,4-5.67a5,5,0,0,1,8.17,0l4,5.67,67.13,94.45A1.28,1.28,0,0,1,1144.31,1098.17Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

2305
packages/web/public/devices/rpipicow.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 89 KiB

546
packages/web/public/devices/seeed-sensecap-indicator.svg

@ -0,0 +1,546 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="713.62 574.61 677 692.34">
<defs><style>
.cls-1 {
fill: #d3d3d3;
}
.cls-2 {
fill: #bfbfbe;
}
.cls-3 {
fill: #b0b0af;
}
.cls-4 {
fill: #e5e5e3;
}
.cls-5 {
fill: #353535;
}
.cls-6, .cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-6 {
stroke-width: 1.65px;
}
.cls-7 {
stroke-width: 3px;
}
.cls-8 {
fill: #cccccb;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M742.78,1220.62c-19.75-8.13-31.52-23.69-26.5-40.61l69.29-233.38a11,11,0,0,1,2.09,4.35l4.07,19.26"
></path><path
class="cls-2"
d="M790,962.24l-65.73,221.37a30.26,30.26,0,0,0,33.33,38.56L842.4,1210"
></path><path
class="cls-3"
d="M807.29,1043.86l-30.5,104.26-18.71,2.1,30-98.73a3,3,0,0,0-2.87-3.87,6.45,6.45,0,0,1-6.16-8.36l16.23-52.36Z"
></path><polygon
class="cls-3"
points="828.12 1142.37 783.87 1147.34 809.96 1056.49 828.12 1142.37"
></polygon><path
class="cls-3"
d="M775.27,1153.34,761.91,1199a3.68,3.68,0,0,1,0-2.11,5.17,5.17,0,0,0-5-6.53h-2.43a6.34,6.34,0,0,1-6.07-8.19l8.14-26.82Z"
></path><polygon
class="cls-3"
points="839.03 1193.99 768.37 1201.28 782.36 1152.58 829.2 1147.52 839.03 1193.99"
></polygon><path
class="cls-4"
d="M1375,1178.08c-9.54,7.22-39,20.08-59.5,23.23l-414.72,63.57A48.48,48.48,0,0,1,846,1227l-7-33L795.25,986.9,787.66,951a10,10,0,0,0-2.09-4.35l-9.8-11.87a10,10,0,0,1-2.09-4.35L718.39,668.87c-.1-.45-.18-.91-.26-1.36a26.13,26.13,0,0,1,14.41-27.36l36.79-18.33c11.15-5.55,21.79-6.71,34.35-7.73Z"
></path><path
class="cls-1"
d="M1235.26,576.22a28.15,28.15,0,0,1,29.92,21.84l123.06,543.61a35.82,35.82,0,0,1-29.51,43.32L944,1248.56a48.48,48.48,0,0,1-54.77-37.89L770.75,650.17A29.51,29.51,0,0,1,797,614.67Z"
></path><path
class="cls-5"
d="M802.91,657.25,916.05,1194.5a17,17,0,0,0,19.22,13.33l426-64.41a14.6,14.6,0,0,0,12-17.67L1257.48,615.46a14.27,14.27,0,0,0-15.18-11.05L813.65,642.73A12.07,12.07,0,0,0,802.91,657.25Z"
></path><path
class="cls-6"
d="M802.91,657.25,916.05,1194.5a17,17,0,0,0,19.22,13.33l426-64.41a14.6,14.6,0,0,0,12-17.67L1257.48,615.46a14.27,14.27,0,0,0-15.18-11.05L813.65,642.73A12.07,12.07,0,0,0,802.91,657.25Z"
></path><path
class="cls-7"
d="M1235.26,576.22a28.15,28.15,0,0,1,29.92,21.84l123.06,543.61a35.82,35.82,0,0,1-29.51,43.32L944,1248.56a48.48,48.48,0,0,1-54.77-37.89L770.75,650.17A29.51,29.51,0,0,1,797,614.67Z"
></path><path
class="cls-7"
d="M803.68,614.09c-12.56,1-23.2,2.18-34.35,7.73l-36.79,18.33a26.12,26.12,0,0,0-14.41,27.36c.08.46.16.91.26,1.36l55.29,261.54a10,10,0,0,0,2.09,4.35l9.8,11.87a10,10,0,0,1,2.09,4.35L846,1227a48.48,48.48,0,0,0,54.77,37.89l414.72-63.57c20.54-3.15,50-16,59.5-23.22"
></path><path
class="cls-7"
d="M742.78,1220.62c-19.75-8.13-31.52-23.69-26.5-40.61l69.29-233.38"
></path><path
class="cls-7"
d="M790,962.24l-65.73,221.37a30.26,30.26,0,0,0,33.33,38.56L842.4,1210"
></path><ellipse
class="cls-8"
cx="837.63"
cy="1070.6"
rx="2.7"
ry="3.34"
transform="translate(-119.45 105.29) rotate(-6.72)"
></ellipse><ellipse
class="cls-8"
cx="776.45"
cy="893.91"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="783.68"
cy="890.78"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="790.92"
cy="887.66"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="798.15"
cy="884.53"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="805.38"
cy="881.4"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="774.39"
cy="883.96"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="781.62"
cy="880.84"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="788.85"
cy="877.71"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="796.08"
cy="874.58"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="803.31"
cy="871.46"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="772.32"
cy="874.01"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="779.56"
cy="870.89"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="786.79"
cy="867.76"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="794.02"
cy="864.64"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="801.25"
cy="861.51"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="770.26"
cy="864.07"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="777.49"
cy="860.94"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="784.72"
cy="857.81"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="791.95"
cy="854.69"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="799.18"
cy="851.56"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="768.2"
cy="854.12"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="775.43"
cy="850.99"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="782.66"
cy="847.87"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="789.89"
cy="844.74"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="797.12"
cy="841.61"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="766.13"
cy="844.17"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="773.36"
cy="841.05"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="780.59"
cy="837.92"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="787.82"
cy="834.79"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="795.05"
cy="831.67"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="764.07"
cy="834.23"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="771.3"
cy="831.1"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="778.53"
cy="827.97"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="785.76"
cy="824.85"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="792.99"
cy="821.72"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="762"
cy="824.28"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="769.23"
cy="821.15"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="776.46"
cy="818.03"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="783.69"
cy="814.9"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="790.92"
cy="811.77"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="759.94"
cy="814.33"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="767.17"
cy="811.21"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="774.4"
cy="808.08"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="781.63"
cy="804.95"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="788.86"
cy="801.83"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="757.87"
cy="804.38"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="765.1"
cy="801.26"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="772.33"
cy="798.13"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="779.57"
cy="795.01"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="786.8"
cy="791.88"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="755.81"
cy="794.44"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="763.04"
cy="791.31"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="770.27"
cy="788.18"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="777.5"
cy="785.06"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="784.73"
cy="781.93"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="753.74"
cy="784.49"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="760.97"
cy="781.36"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="768.21"
cy="778.24"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="775.44"
cy="775.11"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="782.67"
cy="771.98"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="751.68"
cy="774.54"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="758.91"
cy="771.42"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="766.14"
cy="768.29"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="773.37"
cy="765.16"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="780.6"
cy="762.04"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="749.62"
cy="764.6"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="756.85"
cy="761.47"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="764.08"
cy="758.34"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="771.31"
cy="755.22"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="778.54"
cy="752.09"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="747.55"
cy="754.65"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="754.78"
cy="751.52"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="762.01"
cy="748.4"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="769.24"
cy="745.27"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="776.47"
cy="742.14"
rx="2.21"
ry="2.73"
></ellipse><ellipse
class="cls-8"
cx="841.13"
cy="1084.42"
rx="2.7"
ry="3.34"
transform="translate(-121.04 105.8) rotate(-6.72)"
></ellipse><ellipse
class="cls-8"
cx="844.62"
cy="1098.25"
rx="2.7"
ry="3.34"
transform="translate(-122.63 106.3) rotate(-6.72)"
></ellipse></g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

1002
packages/web/public/devices/seeed-xiao-s3.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 34 KiB

512
packages/web/public/devices/station-g2.svg

@ -0,0 +1,512 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="340.47 223.69 263.8 485.94">
<defs><style>
.cls-1 {
fill: #434143;
}
.cls-2, .cls-6, .cls-7 {
fill: none;
}
.cls-2 {
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-3 {
fill: #2b2b2b;
}
.cls-4 {
fill: #181818;
}
.cls-5 {
fill: #e8eae8;
}
.cls-6, .cls-7 {
stroke: #e8eae8;
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-7 {
stroke-width: 2px;
}
.cls-8 {
fill: #b1a368;
}
</style></defs><g id="Layer_2" data-name="Layer 2"><rect
class="cls-1"
x="340.97"
y="258.81"
width="262.8"
height="450.32"
rx="27.43"
></rect><rect
class="cls-2"
x="340.97"
y="258.81"
width="262.8"
height="450.32"
rx="27.43"
></rect><circle
class="cls-3"
cx="364.66"
cy="281.32"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="281.32"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,281.32a2.39,2.39,0,0,1-2.39,2.38h-2.61v2.62a2.38,2.38,0,1,1-4.76,0V283.7h-2.63a2.39,2.39,0,1,1,0-4.77h2.63v-2.62a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,281.32Z"
></path><circle
class="cls-3"
cx="579.41"
cy="281.32"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="281.32"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,281.32a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0V283.7h-2.62a2.39,2.39,0,1,1,0-4.77H577v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,281.32Z"
></path><circle
class="cls-3"
cx="364.66"
cy="683.91"
r="10.92"
></circle><circle
class="cls-2"
cx="364.66"
cy="683.91"
r="10.92"
></circle><path
class="cls-4"
d="M372.05,683.92a2.39,2.39,0,0,1-2.39,2.38h-2.61v2.62a2.38,2.38,0,1,1-4.76,0V686.3h-2.63a2.39,2.39,0,1,1,0-4.77h2.63v-2.62a2.38,2.38,0,0,1,2.37-2.38,2.39,2.39,0,0,1,2.39,2.38v2.62h2.61A2.4,2.4,0,0,1,372.05,683.92Z"
></path><circle
class="cls-3"
cx="579.41"
cy="683.91"
r="10.92"
></circle><circle
class="cls-2"
cx="579.41"
cy="683.91"
r="10.92"
></circle><path
class="cls-4"
d="M586.79,683.92a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V686.3h-2.62a2.39,2.39,0,1,1,0-4.77H577v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,586.79,683.92Z"
></path><circle
class="cls-3"
cx="561.1"
cy="512.26"
r="10.92"
></circle><circle
class="cls-2"
cx="561.1"
cy="512.26"
r="10.92"
></circle><path
class="cls-4"
d="M568.49,512.26a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,568.49,512.26Z"
></path><circle
class="cls-3"
cx="478.84"
cy="406.37"
r="10.92"
></circle><circle
class="cls-2"
cx="478.84"
cy="406.37"
r="10.92"
></circle><path
class="cls-4"
d="M486.22,406.37a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,1,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0V404h2.62A2.39,2.39,0,0,1,486.22,406.37Z"
></path><rect
class="cls-3"
x="380.01"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="399.24"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="418.47"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-5"
x="442.52"
y="443.28"
width="6.5"
height="54.62"
transform="translate(348.12 -170.22) rotate(34.78)"
></rect><path
class="cls-5"
d="M521.39,490.76l-5.34,3.71L489,455.92,462,494.9l-5.34-3.71,28.32-41,1.06-1.53a3.53,3.53,0,0,1,5.8,0l1.06,1.53Z"
></path><rect
class="cls-3"
x="437.7"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="492.51"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="511.74"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="530.97"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="550.2"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><rect
class="cls-3"
x="465.19"
y="302.06"
width="5.45"
height="72.48"
rx="1.75"
></rect><path
class="cls-5"
d="M420.79,519.77l4-.25a3.13,3.13,0,0,0,.53,1.48,2.21,2.21,0,0,0,1.85.82,2,2,0,0,0,1.38-.42,1.24,1.24,0,0,0,.49-1,1.29,1.29,0,0,0-.46-.95,5.44,5.44,0,0,0-2.15-.78,9.1,9.1,0,0,1-3.93-1.65,3.31,3.31,0,0,1-1.19-2.62,3.59,3.59,0,0,1,.61-2,4,4,0,0,1,1.82-1.46,8.43,8.43,0,0,1,3.34-.54,6.85,6.85,0,0,1,4,1,4.17,4.17,0,0,1,1.62,3.08l-3.95.23a2.06,2.06,0,0,0-.66-1.33,2.1,2.1,0,0,0-1.39-.42,1.66,1.66,0,0,0-1.1.31,1,1,0,0,0-.37.75.76.76,0,0,0,.31.59,3.42,3.42,0,0,0,1.4.5,17.67,17.67,0,0,1,3.94,1.19,4.19,4.19,0,0,1,1.73,1.51,3.8,3.8,0,0,1,.54,2,4.31,4.31,0,0,1-.72,2.41,4.57,4.57,0,0,1-2,1.67,8.13,8.13,0,0,1-3.27.57c-2.3,0-3.9-.45-4.79-1.33A5.26,5.26,0,0,1,420.79,519.77Z"
></path><path
class="cls-5"
d="M439.49,510.7v3.73h2.07v2.76h-2.07v3.48a1.85,1.85,0,0,0,.12.83.69.69,0,0,0,.65.32,4.09,4.09,0,0,0,1.16-.24l.28,2.59a11.86,11.86,0,0,1-2.61.31,4.54,4.54,0,0,1-2.07-.36,2.2,2.2,0,0,1-1-1.1,6.25,6.25,0,0,1-.32-2.37v-3.46h-1.39v-2.76h1.39v-1.8Z"
></path><path
class="cls-5"
d="M446.79,517.62l-3.6-.38a4.06,4.06,0,0,1,.59-1.49,3.23,3.23,0,0,1,1.1-.94,4.57,4.57,0,0,1,1.43-.44,11,11,0,0,1,2-.16,15.27,15.27,0,0,1,2.72.19,3.56,3.56,0,0,1,1.71.79,2.84,2.84,0,0,1,.76,1.18,4.43,4.43,0,0,1,.28,1.46v4.34a5.16,5.16,0,0,0,.08,1.08,4.81,4.81,0,0,0,.39,1h-3.54a3.68,3.68,0,0,1-.27-.58,3.18,3.18,0,0,1-.13-.63,4.9,4.9,0,0,1-1.47,1,6.18,6.18,0,0,1-2.33.41,3.86,3.86,0,0,1-2.66-.81,2.76,2.76,0,0,1-.26-3.85,4.52,4.52,0,0,1,2.42-1.08c1.42-.28,2.33-.48,2.75-.59s.86-.27,1.33-.45a1.32,1.32,0,0,0-.28-1,1.42,1.42,0,0,0-1-.28,2.59,2.59,0,0,0-1.39.3A1.6,1.6,0,0,0,446.79,517.62Zm3.26,2c-.51.18-1.05.34-1.62.49a3.72,3.72,0,0,0-1.45.6,1,1,0,0,0,0,1.42,1.34,1.34,0,0,0,.91.28,2.28,2.28,0,0,0,1.17-.31,1.84,1.84,0,0,0,.77-.74,2.49,2.49,0,0,0,.22-1.14Z"
></path><path
class="cls-5"
d="M460.21,510.7v3.73h2.07v2.76h-2.07v3.48a1.85,1.85,0,0,0,.12.83.69.69,0,0,0,.65.32,4.09,4.09,0,0,0,1.16-.24l.28,2.59a11.86,11.86,0,0,1-2.61.31,4.57,4.57,0,0,1-2.07-.36,2.2,2.2,0,0,1-1-1.1,6.25,6.25,0,0,1-.32-2.37v-3.46h-1.39v-2.76h1.39v-1.8Z"
></path><path
class="cls-5"
d="M464.22,510.7H468v2.56h-3.76Zm0,3.73H468v9.83h-3.76Z"
></path><path
class="cls-5"
d="M469.92,519.37a4.91,4.91,0,0,1,1.52-3.7,6.58,6.58,0,0,1,8.56.25,5.36,5.36,0,0,1-.29,7.11,5.74,5.74,0,0,1-4.16,1.45,5.83,5.83,0,0,1-3.83-1.2A4.84,4.84,0,0,1,469.92,519.37Zm3.78,0a3,3,0,0,0,.53,1.95,1.74,1.74,0,0,0,2.67,0,3.08,3.08,0,0,0,.53-2,2.89,2.89,0,0,0-.53-1.9,1.64,1.64,0,0,0-1.31-.63,1.67,1.67,0,0,0-1.35.64A2.89,2.89,0,0,0,473.7,519.36Z"
></path><path
class="cls-5"
d="M483,514.43h3.51V516a5.16,5.16,0,0,1,1.59-1.4,4.2,4.2,0,0,1,2-.42,3.23,3.23,0,0,1,2.45.93,4,4,0,0,1,.88,2.87v6.25h-3.78v-5.41a2,2,0,0,0-.34-1.3,1.22,1.22,0,0,0-1-.39,1.37,1.37,0,0,0-1.11.52,3.07,3.07,0,0,0-.42,1.86v4.72H483Z"
></path><path
class="cls-5"
d="M509,519.35v-2.83h6.48v5.79a13.27,13.27,0,0,1-3.29,1.72,11,11,0,0,1-3.39.46,8.38,8.38,0,0,1-3.94-.82,5.6,5.6,0,0,1-2.35-2.46,8,8,0,0,1-.84-3.73,7.85,7.85,0,0,1,.91-3.87,6,6,0,0,1,2.69-2.49,8.68,8.68,0,0,1,3.71-.66,10.45,10.45,0,0,1,3.36.41,4.37,4.37,0,0,1,1.85,1.26,5.63,5.63,0,0,1,1.1,2.17l-4,.73a2.16,2.16,0,0,0-.84-1.18,2.68,2.68,0,0,0-1.53-.41,2.72,2.72,0,0,0-2.19,1,4.59,4.59,0,0,0-.82,3,4.72,4.72,0,0,0,.83,3.15,2.93,2.93,0,0,0,2.3.94,4.64,4.64,0,0,0,1.35-.2,7.55,7.55,0,0,0,1.46-.7v-1.27Z"
></path><path
class="cls-5"
d="M528.42,524.26h-11.3a7,7,0,0,1,1.18-3.15,16,16,0,0,1,3.69-3.49,11.11,11.11,0,0,0,2.12-1.86,2.11,2.11,0,0,0,.47-1.22,1.42,1.42,0,0,0-.46-1,1.58,1.58,0,0,0-1.15-.44,1.61,1.61,0,0,0-1.18.45,2.75,2.75,0,0,0-.62,1.6l-3.77-.31a6,6,0,0,1,.81-2.48,3.85,3.85,0,0,1,1.67-1.37,7.49,7.49,0,0,1,3-.48,8.47,8.47,0,0,1,3.1.46,3.71,3.71,0,0,1,2.37,3.5,4.32,4.32,0,0,1-.72,2.36,9.93,9.93,0,0,1-2.65,2.48c-.75.53-1.26.89-1.52,1.1s-.55.49-.9.83h5.88Z"
></path><rect
class="cls-3"
x="407.64"
y="558.27"
width="135.85"
height="67.27"
rx="3.52"
></rect><rect
class="cls-2"
x="407.64"
y="558.27"
width="135.85"
height="67.27"
rx="3.52"
></rect><circle class="cls-6" cx="586.93" cy="513.44" r="9.9"></circle><rect
class="cls-5"
x="581.12"
y="512.62"
width="9.09"
height="1.63"
rx="0.82"
></rect><circle
class="cls-5"
cx="591.91"
cy="513.44"
r="0.83"
></circle><path
class="cls-5"
d="M595.54,604.4v-2a3.26,3.26,0,0,0-3.27-3.27H579.86a3.26,3.26,0,0,0-3.27,3.27v14.63a3.26,3.26,0,0,0,3.27,3.27h12.41a3.26,3.26,0,0,0,3.27-3.27v-1.57h-6.38V604.4ZM584,615.49h-5.05V604.4H584Z"
></path><rect
class="cls-5"
x="592.44"
y="610.44"
width="4.83"
height="3.64"
rx="0.91"
></rect><path
class="cls-7"
d="M579,655.86a9.88,9.88,0,0,0,15.29-1"
></path><path
class="cls-7"
d="M595.57,652.31a9.9,9.9,0,1,0-19.26-3.19"
></path><polygon
class="cls-5"
points="571.82 649.11 580.81 649.11 576.5 653.13 571.82 649.11"
></polygon><path
class="cls-6"
d="M513.83,395.84l-10,18.22a1.21,1.21,0,0,0,1.06,1.79H525a1.21,1.21,0,0,0,1.06-1.8L516,395.83A1.21,1.21,0,0,0,513.83,395.84Z"
></path><line
class="cls-6"
x1="508.31"
y1="412.99"
x2="521.75"
y2="412.99"
></line><path
class="cls-6"
d="M511.9,411.29s1.88-2,.68-3.24-2.34-2.69-.68-4.1"
></path><path
class="cls-6"
d="M514.9,411.29s1.88-2,.69-3.24-2.35-2.69-.69-4.1"
></path><path
class="cls-6"
d="M517.91,411.29s1.87-2,.68-3.24-2.35-2.69-.68-4.1"
></path><rect
class="cls-8"
x="497.97"
y="253.53"
width="25.55"
height="5.28"
></rect><path
class="cls-8"
d="M502.42,224.19h17a1.73,1.73,0,0,1,1.73,1.73v27.61a0,0,0,0,1,0,0H500.69a0,0,0,0,1,0,0V225.92A1.73,1.73,0,0,1,502.42,224.19Z"
></path><rect
class="cls-8"
x="497.97"
y="230.25"
width="25.55"
height="19.98"
rx="1.55"
></rect><rect
class="cls-2"
x="497.97"
y="253.53"
width="25.55"
height="5.28"
></rect><path
class="cls-2"
d="M521.11,225.92v4.33H500.68v-4.33a1.73,1.73,0,0,1,1.74-1.73h16.95A1.73,1.73,0,0,1,521.11,225.92Z"
></path><rect
class="cls-2"
x="500.68"
y="250.22"
width="20.43"
height="3.31"
></rect><path
class="cls-2"
d="M523.51,231.8v16.87a1.54,1.54,0,0,1-1.55,1.55H499.52a1.55,1.55,0,0,1-1.56-1.55V231.8a1.55,1.55,0,0,1,1.56-1.55H522A1.54,1.54,0,0,1,523.51,231.8Z"
></path><path
class="cls-5"
d="M382.68,266.74H383c.17,0,.27.07.28.19l.31,3.68c0,.35.11.53.18.53s.2-.17.31-.5l.34-1a.2.2,0,0,1,.2-.11.23.23,0,0,1,.2.11l.33,1c.11.33.21.5.29.5s.15-.18.18-.53l.32-3.68c0-.12.1-.19.28-.19h.38c.18,0,.28.08.28.21l-.55,6.79c0,.12-.12.19-.29.19h-.45c-.14,0-.26-.06-.28-.16l-.42-1.45c-.09-.28-.19-.43-.28-.43s-.19.15-.27.43l-.41,1.45c0,.1-.14.16-.29.16h-.46c-.17,0-.27-.07-.28-.19l-.55-6.79C382.39,266.82,382.5,266.74,382.68,266.74Z"
></path><path
class="cls-5"
d="M390.76,273.76l-.28-1.33c0-.11-.14-.17-.28-.17h-1.29a.27.27,0,0,0-.28.17l-.26,1.33a.29.29,0,0,1-.29.17h-.34c-.19,0-.29-.07-.29-.19a1.58,1.58,0,0,1,0-.21l1.42-6.62c0-.11.14-.17.28-.17h.75c.14,0,.26.06.28.17l1.41,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.11.19-.29.19h-.33A.28.28,0,0,1,390.76,273.76Zm-1.21-5c-.1,0-.19.2-.28.6l-.36,1.78a1,1,0,0,0,0,.24c0,.11.1.18.27.18H390c.16,0,.28-.06.28-.18a1,1,0,0,0,0-.24l-.37-1.78C389.75,269,389.66,268.78,389.55,268.78Z"
></path><path
class="cls-5"
d="M393.2,273.93h-.4c-.16,0-.28-.08-.28-.2v-6.79c0-.12.12-.2.28-.2h1.68c1,0,1.91.52,1.91,1.54v.78a1.42,1.42,0,0,1-.85,1.32.19.19,0,0,0-.13.19.49.49,0,0,0,0,.15l.87,2.69a1.13,1.13,0,0,1,.09.33c0,.12-.09.19-.28.19h-.41c-.15,0-.26-.06-.29-.16l-.93-3c0-.09-.14-.15-.28-.15h-.44c-.17,0-.28.08-.28.2v2.92C393.49,273.85,393.37,273.93,393.2,273.93Zm.57-6.51c-.17,0-.28.08-.28.2v2.1c0,.12.11.21.28.21h.71c.53,0,1-.28,1-.8v-.91c0-.53-.43-.8-1-.8Z"
></path><path
class="cls-5"
d="M401,273.93h-.46a.3.3,0,0,1-.29-.15L399,270.5c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.15l1.24,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2H401c.17,0,.28.08.28.2v6.79C401.3,273.85,401.19,273.93,401,273.93Z"
></path><path
class="cls-5"
d="M406.34,273.45v.28c0,.12-.12.2-.29.2h-3.47c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2h.95c.16,0,.28-.08.28-.2v-5.43c0-.12-.12-.2-.28-.2h-.95c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2h3.47c.17,0,.29.08.29.2v.28c0,.12-.12.2-.29.2h-1c-.17,0-.28.08-.28.2v5.43c0,.12.11.2.28.2h1C406.22,273.25,406.34,273.33,406.34,273.45Z"
></path><path
class="cls-5"
d="M410.85,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.39-.61s-.16.22-.16.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.27.27,0,0,1,.28.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C411.14,273.85,411,273.93,410.85,273.93Z"
></path><path
class="cls-5"
d="M415.1,271.54c0-.12-.12-.2-.29-.2h-.33c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h1.29c.16,0,.28.08.28.2v1.59a2,2,0,0,1-3.82,0v-4.23a2,2,0,0,1,3.82,0v.19c0,.12-.12.2-.27.2h-.37c-.17,0-.29-.08-.29-.2v-.25c0-.53-.44-.81-1-.81s-1,.28-1,.81v4.36c0,.52.41.8.94.8s1-.28,1-.8Z"
></path><path
class="cls-5"
d="M418,269.21h-.4c-.17,0-.28-.08-.28-.2v-.38c0-.12.11-.2.28-.2h.4c.17,0,.28.08.28.2V269C418.32,269.13,418.21,269.21,418,269.21Zm0,3.08h-.4c-.17,0-.28-.09-.28-.21v-.37c0-.12.11-.2.28-.2h.4c.17,0,.28.08.28.2v.37C418.32,272.2,418.21,272.29,418,272.29Z"
></path><path
class="cls-5"
d="M424.5,267.91c0-.78.5-1.17,1.51-1.17h.81c1,0,1.5.39,1.5,1.17v4.85c0,.78-.49,1.17-1.5,1.17H426c-1,0-1.51-.39-1.51-1.17Zm1,4.91c0,.29.18.43.54.43h.81c.36,0,.55-.14.55-.43v-5c0-.29-.19-.43-.55-.43H426c-.36,0-.54.14-.54.43Z"
></path><path
class="cls-5"
d="M430.1,273.93h-.4c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h1.57c1,0,1.93.52,1.93,1.54v.82c0,1-1,1.54-1.93,1.54h-.6c-.17,0-.29.08-.29.2v2.89C430.38,273.85,430.27,273.93,430.1,273.93Zm.57-6.51c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h.6c.53,0,1-.27,1-.8v-.94c0-.53-.42-.8-1-.8Z"
></path><path
class="cls-5"
d="M437.53,270.16v.28c0,.12-.12.2-.28.2h-1.67c-.16,0-.28.08-.28.2v2.21c0,.12.12.2.28.2H438c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-3.36c-.17,0-.29-.08-.29-.2v-6.79c0-.12.12-.2.29-.2H438c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-2.4c-.16,0-.28.08-.28.2v2.14c0,.12.12.2.28.2h1.67C437.41,270,437.53,270,437.53,270.16Z"
></path><path
class="cls-5"
d="M439.88,273.93h-.4c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h1.68c.95,0,1.9.52,1.9,1.54v.78a1.42,1.42,0,0,1-.85,1.32.19.19,0,0,0-.13.19,1.31,1.31,0,0,0,0,.15l.88,2.69a1.65,1.65,0,0,1,.09.33c0,.12-.09.19-.29.19h-.41c-.14,0-.26-.06-.28-.16l-.93-3a.28.28,0,0,0-.29-.15h-.43c-.17,0-.29.08-.29.2v2.92C440.16,273.85,440.05,273.93,439.88,273.93Zm.57-6.51c-.17,0-.29.08-.29.2v2.1c0,.12.12.21.29.21h.71c.52,0,.95-.28.95-.8v-.91c0-.53-.43-.8-.95-.8Z"
></path><path
class="cls-5"
d="M447.27,273.76l-.28-1.33a.28.28,0,0,0-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.41-6.62c0-.11.14-.17.29-.17h.74c.15,0,.26.06.29.17l1.4,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.1.19-.28.19h-.34A.26.26,0,0,1,447.27,273.76Zm-1.21-5c-.1,0-.2.2-.29.6l-.36,1.78a1.66,1.66,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.28-.06.28-.18a1.66,1.66,0,0,0,0-.24l-.38-1.78C446.25,269,446.16,268.78,446.06,268.78Z"
></path><path
class="cls-5"
d="M452.56,266.94v.28c0,.12-.12.2-.28.2h-1c-.16,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.39c-.17,0-.29-.08-.29-.2v-6.11c0-.12-.11-.2-.28-.2h-.94c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h3.47C452.44,266.74,452.56,266.82,452.56,266.94Z"
></path><path
class="cls-5"
d="M457.47,273.45v.28c0,.12-.11.2-.28.2h-3.47c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h.94c.17,0,.29-.08.29-.2v-5.43c0-.12-.12-.2-.29-.2h-.94c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h3.47c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-1c-.17,0-.29.08-.29.2v5.43c0,.12.12.2.29.2h1C457.36,273.25,457.47,273.33,457.47,273.45Z"
></path><path
class="cls-5"
d="M458.35,267.91c0-.78.51-1.17,1.51-1.17h.81c1,0,1.5.39,1.5,1.17v4.85c0,.78-.49,1.17-1.5,1.17h-.81c-1,0-1.51-.39-1.51-1.17Zm1,4.91c0,.29.18.43.54.43h.81c.37,0,.55-.14.55-.43v-5c0-.29-.18-.43-.55-.43h-.81c-.36,0-.54.14-.54.43Z"
></path><path
class="cls-5"
d="M466.8,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.39-.61s-.16.22-.16.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.27.27,0,0,1,.28.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C467.09,273.85,467,273.93,466.8,273.93Z"
></path><path
class="cls-5"
d="M470.57,266.74h.36c.17,0,.27.07.29.19l.31,3.68c0,.35.1.53.18.53s.19-.17.3-.5l.34-1a.22.22,0,0,1,.21-.11.21.21,0,0,1,.19.11l.33,1c.11.33.21.5.29.5s.15-.18.18-.53l.32-3.68c0-.12.1-.19.29-.19h.37c.18,0,.28.08.28.21l-.55,6.79c0,.12-.12.19-.29.19h-.45a.27.27,0,0,1-.28-.16l-.41-1.45c-.09-.28-.2-.43-.29-.43s-.19.15-.27.43l-.41,1.45a.27.27,0,0,1-.28.16h-.47c-.17,0-.27-.07-.28-.19l-.54-6.79C470.29,266.82,470.39,266.74,470.57,266.74Z"
></path><path
class="cls-5"
d="M479.48,273.45v.28c0,.12-.11.2-.28.2h-3.47c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h.94c.17,0,.29-.08.29-.2v-5.43c0-.12-.12-.2-.29-.2h-.94c-.17,0-.28-.08-.28-.2v-.28c0-.12.11-.2.28-.2h3.47c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-1c-.17,0-.29.08-.29.2v5.43c0,.12.12.2.29.2h1C479.37,273.25,479.48,273.33,479.48,273.45Z"
></path><path
class="cls-5"
d="M484.4,266.94v.28c0,.12-.12.2-.29.2h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.16,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.28-.2h-.94c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h3.46C484.28,266.74,484.4,266.82,484.4,266.94Z"
></path><path
class="cls-5"
d="M486.35,266.94v2.82c0,.12.11.2.28.2H488c.17,0,.28-.08.28-.2v-2.82c0-.12.12-.2.29-.2h.38c.17,0,.29.08.29.2v6.79c0,.12-.12.2-.29.2h-.38c-.17,0-.29-.08-.29-.2v-2.89c0-.12-.11-.2-.28-.2h-1.33c-.17,0-.28.08-.28.2v2.89c0,.12-.12.2-.29.2h-.4c-.16,0-.28-.08-.28-.2v-6.79c0-.12.12-.2.28-.2h.4C486.23,266.74,486.35,266.82,486.35,266.94Z"
></path><path
class="cls-5"
d="M490.3,267.91q0-1.17,1.5-1.17h.82c1,0,1.49.39,1.49,1.17v4.85c0,.78-.49,1.17-1.49,1.17h-.82q-1.5,0-1.5-1.17Zm1,4.91c0,.29.18.43.54.43h.82c.36,0,.54-.14.54-.43v-5c0-.29-.18-.43-.54-.43h-.82c-.36,0-.54.14-.54.43Z"
></path><path
class="cls-5"
d="M495.21,266.94c0-.12.12-.2.29-.2h.39c.17,0,.29.08.29.2v5.58c0,.52.41.8.94.8s.95-.28.95-.8v-5.58c0-.12.12-.2.29-.2h.38c.17,0,.29.08.29.2v5.51a2,2,0,0,1-3.82,0Z"
></path><path
class="cls-5"
d="M504.06,266.94v.28c0,.12-.12.2-.28.2h-1c-.16,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.39c-.17,0-.29-.08-.29-.2v-6.11c0-.12-.11-.2-.28-.2h-.94c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h3.47C503.94,266.74,504.06,266.82,504.06,266.94Z"
></path><path
class="cls-5"
d="M510.6,273.76l-.28-1.33a.28.28,0,0,0-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.41-6.62c0-.11.14-.17.29-.17h.74c.15,0,.26.06.29.17l1.4,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.1.19-.28.19h-.34A.26.26,0,0,1,510.6,273.76Zm-1.21-5c-.1,0-.2.2-.29.6l-.36,1.78a1.66,1.66,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.28-.06.28-.18a1.66,1.66,0,0,0,0-.24l-.38-1.78C509.58,269,509.49,268.78,509.39,268.78Z"
></path><path
class="cls-5"
d="M515.94,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.15l1.24,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.28.08.28.2v6.79C516.22,273.85,516.11,273.93,515.94,273.93Z"
></path><path
class="cls-5"
d="M522.88,273.76l-.28-1.33c0-.11-.14-.17-.29-.17H521a.28.28,0,0,0-.28.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.41-6.62a.28.28,0,0,1,.29-.17h.75a.26.26,0,0,1,.28.17l1.41,6.62a2.07,2.07,0,0,1,0,.21c0,.12-.1.19-.28.19h-.33C523,273.93,522.91,273.87,522.88,273.76Zm-1.21-5c-.1,0-.19.2-.28.6l-.37,1.78a1.66,1.66,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a2.28,2.28,0,0,0,0-.24l-.38-1.78C521.86,269,521.77,268.78,521.67,268.78Z"
></path><path
class="cls-5"
d="M528.22,273.93h-.46a.3.3,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.39-.61s-.16.22-.16.67v3.17c0,.12-.12.2-.28.2H525c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.27.27,0,0,1,.28.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C528.51,273.85,528.39,273.93,528.22,273.93Z"
></path><path
class="cls-5"
d="M533.54,266.94v.28c0,.12-.12.2-.29.2h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.16,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.28-.2h-1c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2h3.47C533.42,266.74,533.54,266.82,533.54,266.94Z"
></path><path
class="cls-5"
d="M537.72,270.16v.28c0,.12-.12.2-.29.2h-1.66c-.17,0-.28.08-.28.2v2.21c0,.12.11.2.28.2h2.4c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2H534.8c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h3.37c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-2.4c-.17,0-.28.08-.28.2v2.14c0,.12.11.2.28.2h1.66C537.6,270,537.72,270,537.72,270.16Z"
></path><path
class="cls-5"
d="M543,273.93h-.47a.29.29,0,0,1-.28-.15l-1.29-3.28c-.17-.41-.3-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.29.2h-.37c-.17,0-.28-.08-.28-.2v-6.79c0-.12.11-.2.28-.2h.54a.26.26,0,0,1,.27.15l1.24,3.19c.17.42.3.64.4.64s.15-.23.15-.69v-3.09c0-.12.12-.2.29-.2H543c.17,0,.28.08.28.2v6.79C543.25,273.85,543.14,273.93,543,273.93Z"
></path><path
class="cls-5"
d="M547.88,273.93h-.46a.3.3,0,0,1-.29-.15l-1.28-3.28c-.17-.41-.3-.61-.4-.61s-.16.22-.16.67v3.17c0,.12-.11.2-.28.2h-.38c-.16,0-.28-.08-.28-.2v-6.79c0-.12.12-.2.28-.2h.55a.27.27,0,0,1,.27.15l1.23,3.19c.17.42.3.64.4.64s.16-.23.16-.69v-3.09c0-.12.11-.2.28-.2h.36c.17,0,.29.08.29.2v6.79C548.17,273.85,548.05,273.93,547.88,273.93Z"
></path><path
class="cls-5"
d="M552.37,273.76l-.28-1.33a.26.26,0,0,0-.28-.17h-1.29a.28.28,0,0,0-.29.17l-.26,1.33a.27.27,0,0,1-.28.17h-.35c-.18,0-.28-.07-.28-.19a1.58,1.58,0,0,1,0-.21l1.42-6.62c0-.11.14-.17.28-.17h.75c.14,0,.26.06.28.17l1.41,6.62a1.58,1.58,0,0,1,0,.21c0,.12-.11.19-.29.19h-.33C552.51,273.93,552.4,273.87,552.37,273.76Zm-1.21-5c-.1,0-.19.2-.28.6l-.36,1.78a1,1,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a2.28,2.28,0,0,0,0-.24l-.38-1.78C551.35,269,551.26,268.78,551.16,268.78Z"
></path><path
class="cls-5"
d="M395.77,285h-.36c-.17,0-.28-.08-.28-.2v-3.55c0-.36-.06-.54-.13-.54s-.17.16-.3.5l-.37,1a.25.25,0,0,1-.25.13.26.26,0,0,1-.26-.13l-.37-1c-.13-.34-.23-.5-.31-.5s-.12.18-.12.54v3.55c0,.12-.11.2-.28.2h-.36c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.49a.27.27,0,0,1,.27.15l.66,1.8c.08.23.18.34.27.34s.18-.11.27-.34l.67-1.81a.28.28,0,0,1,.27-.14h.49c.17,0,.28.08.28.2v6.79C396.05,284.88,395.94,285,395.77,285Z"
></path><path
class="cls-5"
d="M400.18,284.78l-.28-1.32a.26.26,0,0,0-.28-.17h-1.29a.28.28,0,0,0-.29.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.42-6.61c0-.11.14-.17.28-.17h.75c.14,0,.26.06.28.17l1.41,6.61c0,.2,0,.21,0,.22s-.1.19-.28.19h-.33A.28.28,0,0,1,400.18,284.78Zm-1.21-5c-.1,0-.19.2-.28.6l-.36,1.78a1,1,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a1.93,1.93,0,0,0,0-.24l-.38-1.78C399.16,280,399.07,279.81,399,279.81Z"
></path><path
class="cls-5"
d="M402.69,281.21l-1.33-3.07a.6.6,0,0,1-.08-.22c0-.11.1-.15.3-.15h.4c.14,0,.23,0,.27.14l.72,1.74c.08.2.17.29.27.29s.18-.09.27-.29l.75-1.74c0-.1.13-.14.27-.14h.39c.19,0,.29.05.29.15a.7.7,0,0,1-.07.22l-1.33,3.07a1,1,0,0,0-.08.39v3.16c0,.13-.09.2-.28.2h-.4c-.2,0-.29-.07-.29-.2V281.6A1,1,0,0,0,402.69,281.21Z"
></path><path
class="cls-5"
d="M409.39,285H409c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h1.57a1.72,1.72,0,0,1,1.92,1.54v.82a1.72,1.72,0,0,1-1.92,1.54H410c-.17,0-.28.08-.28.2v2.89C409.68,284.88,409.56,285,409.39,285Zm.57-6.51c-.17,0-.28.08-.28.2v2.14c0,.12.11.2.28.2h.61c.53,0,.94-.27.94-.8v-.94c0-.53-.41-.8-.94-.8Z"
></path><path
class="cls-5"
d="M416.82,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2h2.4c.16,0,.28.08.28.2v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h3.37c.16,0,.28.08.28.2v.27c0,.12-.12.21-.28.21h-2.4c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C416.71,281,416.82,281.07,416.82,281.19Z"
></path><path
class="cls-5"
d="M419.17,285h-.4c-.16,0-.28-.08-.28-.2V278c0-.12.12-.2.28-.2h1.68c.95,0,1.91.52,1.91,1.54v.78a1.41,1.41,0,0,1-.85,1.31.19.19,0,0,0-.13.2,1,1,0,0,0,0,.15l.88,2.69a1.65,1.65,0,0,1,.09.33c0,.12-.09.19-.28.19h-.42a.28.28,0,0,1-.28-.16l-.93-3a.27.27,0,0,0-.28-.16h-.44c-.17,0-.28.09-.28.21v2.92C419.46,284.88,419.34,285,419.17,285Zm.57-6.51c-.17,0-.28.08-.28.2v2.1c0,.12.11.2.28.2h.71c.53,0,.95-.27.95-.8v-.9c0-.53-.42-.8-.95-.8Z"
></path><path
class="cls-5"
d="M427.07,285h-.36c-.17,0-.29-.08-.29-.2v-3.55c0-.36-.05-.54-.13-.54s-.16.16-.29.5l-.38,1c0,.08-.13.13-.24.13a.26.26,0,0,1-.26-.13l-.37-1c-.13-.34-.24-.5-.31-.5s-.12.18-.12.54v3.55c0,.12-.12.2-.28.2h-.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h.49a.28.28,0,0,1,.27.15l.65,1.8c.08.23.18.34.28.34s.17-.11.27-.34l.67-1.81c0-.08.14-.14.27-.14h.49c.16,0,.28.08.28.2v6.79C427.35,284.88,427.23,285,427.07,285Z"
></path><path
class="cls-5"
d="M431.48,284.78l-.28-1.32a.28.28,0,0,0-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.41-6.61c0-.11.14-.17.29-.17h.74c.15,0,.26.06.29.17l1.4,6.61a1.79,1.79,0,0,1,0,.22c0,.12-.1.19-.28.19h-.34A.27.27,0,0,1,431.48,284.78Zm-1.21-5c-.1,0-.2.2-.29.6l-.36,1.78a1.93,1.93,0,0,0,0,.24c0,.11.11.18.28.18h.82c.17,0,.28-.06.28-.18a1.52,1.52,0,0,0,0-.24l-.38-1.78C430.46,280,430.37,279.81,430.27,279.81Z"
></path><path
class="cls-5"
d="M436.82,285h-.46a.31.31,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.14l1.24,3.2c.17.42.3.63.4.63s.16-.23.16-.68V278c0-.12.11-.2.28-.2h.36c.17,0,.28.08.28.2v6.79C437.1,284.88,437,285,436.82,285Z"
></path><path
class="cls-5"
d="M441.4,281.19v.28c0,.12-.12.2-.28.2h-1.67c-.16,0-.28.08-.28.2v2.21c0,.12.12.2.28.2h2.4c.17,0,.28.08.28.2v.28c0,.12-.11.2-.28.2h-3.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h3.36c.17,0,.28.08.28.2v.27c0,.12-.11.21-.28.21h-2.4c-.16,0-.28.08-.28.2v2.14c0,.12.12.2.28.2h1.67C441.28,281,441.4,281.07,441.4,281.19Z"
></path><path
class="cls-5"
d="M446.65,285h-.46a.31.31,0,0,1-.29-.15l-1.29-3.28c-.16-.41-.29-.61-.4-.61s-.15.22-.15.67v3.17c0,.12-.12.2-.28.2h-.38c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.54c.13,0,.25.05.27.14l1.24,3.2c.17.42.3.63.4.63s.16-.23.16-.68V278c0-.12.11-.2.28-.2h.36c.17,0,.28.08.28.2v6.79C446.93,284.88,446.82,285,446.65,285Z"
></path><path
class="cls-5"
d="M452,278v.27c0,.12-.11.21-.28.21h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.17,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.29-.2h-.94c-.16,0-.28-.09-.28-.21V278c0-.12.12-.2.28-.2h3.47C451.85,277.77,452,277.85,452,278Z"
></path><path
class="cls-5"
d="M456.88,284.48v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.4c.17,0,.29.08.29.2v6.11c0,.12.11.2.28.2h2.4C456.76,284.28,456.88,284.36,456.88,284.48Z"
></path><path
class="cls-5"
d="M458.3,281.21,457,278.14a.7.7,0,0,1-.07-.22c0-.11.1-.15.29-.15h.4c.14,0,.23,0,.27.14l.72,1.74c.08.2.17.29.28.29s.18-.09.27-.29l.74-1.74c0-.1.13-.14.28-.14h.38q.3,0,.3.15a.6.6,0,0,1-.08.22l-1.33,3.07a1,1,0,0,0-.07.39v3.16c0,.13-.09.2-.29.2h-.4c-.19,0-.28-.07-.28-.2V281.6A1,1,0,0,0,458.3,281.21Z"
></path><path
class="cls-5"
d="M464.42,285c-.17,0-.29-.08-.29-.2v-.32c0-.24.47-.08.47-.33v-5.5c0-.25-.47-.08-.47-.33V278c0-.12.12-.2.29-.2h2a1.7,1.7,0,0,1,1.9,1.54v4.11a1.7,1.7,0,0,1-1.9,1.54Zm1.41-6.51c-.16,0-.28.08-.28.2v5.43c0,.12.12.2.28.2h.59c.52,0,.94-.28.94-.8v-4.23c0-.53-.42-.8-.94-.8Z"
></path><path
class="cls-5"
d="M472.09,284.78l-.28-1.32c0-.11-.14-.17-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.41-6.61a.28.28,0,0,1,.29-.17h.75a.26.26,0,0,1,.28.17l1.41,6.61c0,.2,0,.21,0,.22s-.1.19-.28.19h-.33A.28.28,0,0,1,472.09,284.78Zm-1.21-5c-.1,0-.19.2-.28.6l-.37,1.78a1.52,1.52,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a1.93,1.93,0,0,0,0-.24l-.38-1.78C471.07,280,471,279.81,470.88,279.81Z"
></path><path
class="cls-5"
d="M477.51,285h-.36c-.17,0-.29-.08-.29-.2v-3.55c0-.36-.05-.54-.12-.54s-.17.16-.3.5l-.37,1a.25.25,0,0,1-.25.13.26.26,0,0,1-.26-.13l-.37-1c-.13-.34-.23-.5-.31-.5s-.12.18-.12.54v3.55c0,.12-.11.2-.28.2h-.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h.49a.27.27,0,0,1,.27.15l.66,1.8c.07.23.18.34.27.34s.18-.11.27-.34l.67-1.81c0-.08.14-.14.27-.14h.49c.17,0,.28.08.28.2v6.79C477.79,284.88,477.68,285,477.51,285Z"
></path><path
class="cls-5"
d="M481.92,284.78l-.28-1.32c0-.11-.14-.17-.29-.17h-1.29a.28.28,0,0,0-.28.17l-.26,1.32a.26.26,0,0,1-.28.18h-.35c-.18,0-.28-.07-.28-.19a1.79,1.79,0,0,1,0-.22l1.41-6.61a.28.28,0,0,1,.29-.17h.75a.26.26,0,0,1,.28.17l1.41,6.61c0,.2,0,.21,0,.22s-.1.19-.28.19h-.33A.28.28,0,0,1,481.92,284.78Zm-1.21-5c-.1,0-.19.2-.28.6l-.37,1.78a1.52,1.52,0,0,0,0,.24c0,.11.1.18.27.18h.82c.17,0,.29-.06.29-.18a1.93,1.93,0,0,0,0-.24l-.38-1.78C480.9,280,480.81,279.81,480.71,279.81Z"
></path><path
class="cls-5"
d="M486.33,282.57c0-.12-.11-.2-.28-.2h-.34c-.16,0-.28-.08-.28-.2v-.28c0-.12.12-.2.28-.2H487c.17,0,.29.08.29.2v1.59c0,1-1,1.54-1.91,1.54a1.71,1.71,0,0,1-1.91-1.54v-4.23a2,2,0,0,1,3.82,0v.19c0,.12-.12.2-.27.2h-.38c-.16,0-.28-.08-.28-.2v-.25c0-.53-.44-.81-1-.81s-.95.28-.95.81v4.35c0,.53.41.8.94.8s.95-.27.95-.8Z"
></path><path
class="cls-5"
d="M491.58,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2H492c.16,0,.28.08.28.2v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2H492c.16,0,.28.08.28.2v.27c0,.12-.12.21-.28.21h-2.4c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C491.47,281,491.58,281.07,491.58,281.19Z"
></path><path
class="cls-5"
d="M499.68,278v.27c0,.12-.11.21-.28.21h-1c-.17,0-.28.08-.28.2v6.11c0,.12-.12.2-.29.2h-.4c-.17,0-.28-.08-.28-.2v-6.11c0-.12-.12-.2-.29-.2h-.94c-.16,0-.28-.09-.28-.21V278c0-.12.12-.2.28-.2h3.47C499.57,277.77,499.68,277.85,499.68,278Z"
></path><path
class="cls-5"
d="M501.64,278v2.82c0,.12.11.2.28.2h1.33c.17,0,.28-.08.28-.2V278c0-.12.12-.2.28-.2h.39c.17,0,.29.08.29.2v6.79c0,.12-.12.2-.29.2h-.39c-.16,0-.28-.08-.28-.2v-2.89c0-.12-.11-.2-.28-.2h-1.33c-.17,0-.28.08-.28.2v2.89c0,.12-.12.2-.29.2H501c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h.4C501.52,277.77,501.64,277.85,501.64,278Z"
></path><path
class="cls-5"
d="M508.78,281.19v.28c0,.12-.11.2-.28.2h-1.67c-.16,0-.28.08-.28.2v2.21c0,.12.12.2.28.2h2.4c.17,0,.29.08.29.2v.28c0,.12-.12.2-.29.2h-3.36c-.17,0-.29-.08-.29-.2V278c0-.12.12-.2.29-.2h3.36c.17,0,.29.08.29.2v.27c0,.12-.12.21-.29.21h-2.4c-.16,0-.28.08-.28.2v2.14c0,.12.12.2.28.2h1.67C508.67,281,508.78,281.07,508.78,281.19Z"
></path><path
class="cls-5"
d="M513,285c-.17,0-.28-.08-.28-.2v-.32c0-.24.46-.08.46-.33v-5.5c0-.25-.46-.08-.46-.33V278c0-.12.11-.2.28-.2h2a1.71,1.71,0,0,1,1.91,1.54v4.11A1.71,1.71,0,0,1,515,285Zm1.42-6.51c-.17,0-.29.08-.29.2v5.43c0,.12.12.2.29.2H515c.53,0,.94-.28.94-.8v-4.23c0-.53-.41-.8-.94-.8Z"
></path><path
class="cls-5"
d="M521.06,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2h2.39c.17,0,.29.08.29.2v.28c0,.12-.12.2-.29.2h-3.36c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h3.36c.17,0,.29.08.29.2v.27c0,.12-.12.21-.29.21h-2.39c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C521,281,521.06,281.07,521.06,281.19Z"
></path><path
class="cls-5"
d="M523.51,277.94l.89,4.33c.08.4.17.6.29.6s.19-.2.28-.6l.89-4.33c0-.12.12-.17.29-.17h.36c.19,0,.28.06.28.19a.75.75,0,0,1,0,.17l-1.41,6.65c0,.12-.12.18-.29.18h-.75c-.16,0-.25-.06-.28-.18l-1.43-6.65a1.55,1.55,0,0,1,0-.17c0-.13.09-.19.29-.19h.37C523.4,277.77,523.49,277.82,523.51,277.94Z"
></path><path
class="cls-5"
d="M531.63,284.48v.28c0,.12-.12.2-.29.2h-3.46c-.17,0-.29-.08-.29-.2v-.28c0-.12.12-.2.29-.2h.94c.16,0,.28-.08.28-.2v-5.43c0-.12-.12-.2-.28-.2h-.94c-.17,0-.29-.09-.29-.21V278c0-.12.12-.2.29-.2h3.46c.17,0,.29.08.29.2v.27c0,.12-.12.21-.29.21h-1c-.17,0-.28.08-.28.2v5.43c0,.12.11.2.28.2h1C531.51,284.28,531.63,284.36,531.63,284.48Z"
></path><path
class="cls-5"
d="M532.48,279.25a2,2,0,0,1,3.82,0v.19c0,.12-.12.2-.27.2h-.38c-.16,0-.28-.08-.28-.2v-.25a.84.84,0,0,0-1-.81c-.55,0-1,.28-1,.81v4.35c0,.53.42.8,1,.8s1-.27,1-.8v-.35c0-.12.12-.21.28-.21H536c.17,0,.29.09.29.21v.29c0,1-1,1.54-1.91,1.54a1.71,1.71,0,0,1-1.91-1.54Z"
></path><path
class="cls-5"
d="M540.59,281.19v.28c0,.12-.11.2-.28.2h-1.66c-.17,0-.29.08-.29.2v2.21c0,.12.12.2.29.2h2.4c.16,0,.28.08.28.2v.28c0,.12-.12.2-.28.2h-3.37c-.17,0-.28-.08-.28-.2V278c0-.12.11-.2.28-.2h3.37c.16,0,.28.08.28.2v.27c0,.12-.12.21-.28.21h-2.4c-.17,0-.29.08-.29.2v2.14c0,.12.12.2.29.2h1.66C540.48,281,540.59,281.07,540.59,281.19Z"
></path><path
class="cls-5"
d="M543.2,285h-.4c-.17,0-.28-.08-.28-.2v-.38c0-.12.11-.2.28-.2h.4c.17,0,.29.08.29.2v.38C543.49,284.88,543.37,285,543.2,285Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

697
packages/web/public/devices/t-deck.svg

@ -0,0 +1,697 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="696.3 500.37 622.29 968.69">
<defs><style>
.cls-1 {
fill: #2d2d2d;
}
.cls-2 {
fill: #383838;
}
.cls-3 {
fill: #474649;
}
.cls-4 {
fill: #939696;
}
.cls-5, .cls-7 {
fill: #e6e8e8;
}
.cls-11,
.cls-12,
.cls-13,
.cls-14,
.cls-15,
.cls-16,
.cls-17,
.cls-18,
.cls-6 {
fill: none;
}
.cls-16, .cls-6 {
stroke: #939696;
stroke-width: 2px;
}
.cls-18, .cls-6 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-7 {
font-size: 22.85px;
font-family: ArialMT, Arial;
}
.cls-8 {
fill: #515153;
}
.cls-9 {
fill: #e2d299;
}
.cls-10 {
fill: #fff;
}
.cls-11, .cls-13, .cls-14, .cls-15 {
stroke: #050606;
}
.cls-11, .cls-12, .cls-13, .cls-14, .cls-15, .cls-16, .cls-17 {
stroke-miterlimit: 10;
}
.cls-11 {
stroke-width: 1.35px;
}
.cls-12, .cls-17, .cls-18 {
stroke: #fff;
}
.cls-12, .cls-15 {
stroke-width: 1.79px;
}
.cls-13 {
stroke-width: 1.8px;
}
.cls-14 {
stroke-width: 4.05px;
}
.cls-17 {
stroke-width: 1.37px;
}
.cls-18 {
stroke-width: 1.37px;
}
</style></defs><g id="Layer_3" data-name="Layer 3"><path
class="cls-1"
d="M1292.56,1030.81v287.34c0,51.3-17,98.13-78.62,120.23-33.78,12.13-72.45,17.21-107.88,19.81-23.07,1.7-66.69,2.55-98.62,2.85-31.93-.3-75.55-1.15-98.62-2.85-35.43-2.6-74.1-7.68-107.88-19.81-61.6-22.1-78.62-68.93-78.62-120.23V1030.81Z"
/><path
class="cls-2"
d="M1306.83,1210.35c-3,2.5-2.35,7.42-6.33,11.56-2,2.07-5.21,2.65-7.94,2.72v93.52c0,51.3-17,98.13-78.62,120.23-33.78,12.13-72.45,17.21-107.88,19.81-23.07,1.7-66.69,2.55-98.62,2.85-31.93-.3-75.55-1.15-98.62-2.85-35.43-2.6-74.1-7.68-107.88-19.81-61.6-22.1-78.62-68.93-78.62-120.23v-94.29a17.44,17.44,0,0,1-7.13-1.4c-5.08-2.35-3.9-7.73-7.43-11.92a8.73,8.73,0,0,0-3.92-2.65v110.83c0,52.75,17,100.9,78.62,123.63,33.79,12.47,72.21,18,107.6,21.08,21,1.85,69.3,3.79,117.26,3.59h.24c48,.2,96.28-1.74,117.26-3.59,35.39-3.12,73.81-8.61,107.6-21.08,61.59-22.73,78.62-70.88,78.62-123.63V1208.18A13.09,13.09,0,0,0,1306.83,1210.35Z"
/><path
class="cls-3"
d="M722.79,1332.36h0a25.91,25.91,0,0,0,25.92-25.92V1137.88h530.2v186.39a12.8,12.8,0,0,0,12.81,12.8h0v-29l.84-277.22H722.32Z"
/><path
class="cls-1"
d="M1292.56,590.3v440.51H722.32V590.3a74.74,74.74,0,0,1,74.75-74.75h420.74A74.74,74.74,0,0,1,1292.56,590.3Z"
/><rect
class="cls-4"
x="942.13"
y="547.62"
width="132.22"
height="13.89"
rx="6.95"
/><rect
class="cls-5"
x="743.88"
y="1199.81"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-5"
x="743.88"
y="1133.54"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-5"
x="743.88"
y="1266.09"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-5"
x="743.88"
y="1332.36"
width="540.06"
height="13.65"
rx="6.82"
/><path
class="cls-6"
d="M1021.42,1034.73v9.87a34.52,34.52,0,0,1,27,27.08h9.86"
/><path
class="cls-6"
d="M1007.54,1034.76v9.88a34.5,34.5,0,0,0-26.79,27h-9.86"
/><path
class="cls-6"
d="M971,1085.57h9.89a34.53,34.53,0,0,0,26.69,26.57V1122"
/><path
class="cls-6"
d="M1021.42,1122.05v-9.87a34.53,34.53,0,0,0,26.86-26.61h9.89"
/><circle class="cls-5" cx="1014.57" cy="1078.39" r="26.4" /><rect
class="cls-2"
x="755.65"
y="633.64"
width="500.52"
height="377.46"
/><text class="cls-7" transform="translate(762.22 1184.58)">Q</text><text
class="cls-7"
transform="translate(813.86 1184.58)"
>W</text><text class="cls-7" transform="translate(867.23 1184.58)"
>E</text><text class="cls-7" transform="translate(920.6 1184.58)"
>R</text><text class="cls-7" transform="translate(973.98 1184.58)"
>T</text><text class="cls-7" transform="translate(1034.95 1184.58)"
>Y</text><text class="cls-7" transform="translate(1142 1184.58)"
>I</text><text class="cls-7" transform="translate(1088.49 1184.58)"
>U</text><text class="cls-7" transform="translate(1246.93 1184.58)"
>P</text><text class="cls-7" transform="translate(1194.11 1184.58)"
>O</text><text class="cls-7" transform="translate(762.22 1249.77)"
>A</text><text class="cls-7" transform="translate(813.86 1249.77)"
>S</text><text class="cls-7" transform="translate(867.23 1249.77)"
>D</text><text class="cls-7" transform="translate(920.6 1249.77)"
>F</text><text class="cls-7" transform="translate(973.98 1249.77)"
>G</text><text class="cls-7" transform="translate(1034.95 1249.77)"
>H</text><text class="cls-7" transform="translate(1142 1249.77)"
>K</text><text class="cls-7" transform="translate(1088.49 1249.77)"
>J</text><text class="cls-7" transform="translate(1194.11 1249.77)"
>L</text><text class="cls-7" transform="translate(758.45 1316)"
>alt</text><text class="cls-7" transform="translate(813.86 1316)"
>Z</text><text class="cls-7" transform="translate(867.23 1316)"
>X</text><text class="cls-7" transform="translate(920.6 1316)">C</text><text
class="cls-7"
transform="translate(973.98 1316)"
>V</text><text class="cls-7" transform="translate(1034.95 1316)"
>B</text><text class="cls-7" transform="translate(1142 1316)">M</text><text
class="cls-7"
transform="translate(1088.49 1316)"
>N</text><path
class="cls-8"
d="M1316.56,617.77v408.74a6.22,6.22,0,0,1-1.81,4.39l-3.71,3.71v173.57a13.09,13.09,0,0,0-4.21,2.17c-3,2.5-2.35,7.42-6.33,11.56-2,2.07-5.21,2.65-7.94,2.72V590.3a74.74,74.74,0,0,0-74.75-74.75H797.07a74.74,74.74,0,0,0-74.75,74.75v633.56a17.44,17.44,0,0,1-7.13-1.4c-5.08-2.35-3.9-7.73-7.43-11.92a8.73,8.73,0,0,0-3.92-2.65V1034.61l-3.71-3.71-.08-.09a6.2,6.2,0,0,1-1.73-4.3V617.77a6.23,6.23,0,0,1,1.59-4.15l3.93-4.38V594.81a92.42,92.42,0,0,1,92.42-92.42h422.36A92.38,92.38,0,0,1,1311,594.81v14.43l3.93,4.38A6.23,6.23,0,0,1,1316.56,617.77Z"
/></g><g id="Layer_2" data-name="Layer 2"><path
class="cls-9"
d="M743.88,1061.4a14.6,14.6,0,1,1,14.6-14.6A14.62,14.62,0,0,1,743.88,1061.4Zm0-26a11.36,11.36,0,1,0,11.36,11.36A11.38,11.38,0,0,0,743.88,1035.44Z"
/><path class="cls-10" d="M892.79,1438.55v-19.42h4v16.13h9.83v3.29Z" /><path
class="cls-10"
d="M909.28,1438.55V1419h4v19.58Z"
/><path class="cls-10" d="M917.1,1438.55v-19.42h4v16.13h9.83v3.29Z" /><path
class="cls-10"
d="M936.34,1438.55v-8.24L929.17,1419h4.63l4.61,7.75,4.51-7.75h4.56l-7.2,11.37v8.21Z"
/><path
class="cls-10"
d="M958.55,1431.36v-3.3h8.53v7.8a10.79,10.79,0,0,1-3.6,2.11,13.17,13.17,0,0,1-4.78.92,10.74,10.74,0,0,1-5.36-1.29,8.23,8.23,0,0,1-3.43-3.69,11.83,11.83,0,0,1-1.15-5.21,11.35,11.35,0,0,1,1.28-5.44,8.72,8.72,0,0,1,3.76-3.65,10.12,10.12,0,0,1,4.69-1,9.32,9.32,0,0,1,5.69,1.53,6.89,6.89,0,0,1,2.64,4.23l-3.93.73a4.14,4.14,0,0,0-1.55-2.28,4.74,4.74,0,0,0-2.85-.83,5.37,5.37,0,0,0-4.12,1.64,6.93,6.93,0,0,0-1.53,4.88,7.65,7.65,0,0,0,1.55,5.23,5.16,5.16,0,0,0,4.06,1.74,6.77,6.77,0,0,0,2.49-.49,8.55,8.55,0,0,0,2.14-1.18v-2.48Z"
/><path
class="cls-10"
d="M969.92,1428.88a12.38,12.38,0,0,1,.9-5,9,9,0,0,1,1.82-2.68,7.61,7.61,0,0,1,2.53-1.77,10.88,10.88,0,0,1,4.22-.77,9.2,9.2,0,0,1,6.93,2.68q2.59,2.68,2.59,7.47a10.24,10.24,0,0,1-2.57,7.42,10.29,10.29,0,0,1-13.84,0A10.09,10.09,0,0,1,969.92,1428.88Zm4.07-.13a7.34,7.34,0,0,0,1.54,5,5.28,5.28,0,0,0,7.78,0,7.5,7.5,0,0,0,1.52-5.11,7.35,7.35,0,0,0-1.48-5,5,5,0,0,0-3.92-1.65,5,5,0,0,0-3.94,1.67A7.41,7.41,0,0,0,974,1428.75Z"
/><path
class="cls-10"
d="M1004,1438.55v-16.26H998.2V1419h15.56v3.32H1008v16.26Z"
/><path class="cls-10" d="M1014.35,1433.33v-3.75h7.37v3.75Z" /><path
class="cls-10"
d="M1024,1438.55V1419h4v8.7l8-8.7h5.31l-7.37,7.63,7.77,12h-5.11l-5.38-9.19-3.21,3.28v5.91Z"
/><path
class="cls-10"
d="M1051.86,1434l3.74.63a6.13,6.13,0,0,1-2.28,3.13,6.68,6.68,0,0,1-3.89,1.08,6.35,6.35,0,0,1-5.48-2.42,8.08,8.08,0,0,1-1.4-4.89,7.82,7.82,0,0,1,1.84-5.52,6,6,0,0,1,4.66-2,6.32,6.32,0,0,1,5,2.09c1.22,1.39,1.8,3.53,1.75,6.4h-9.41a3.8,3.8,0,0,0,.91,2.6,2.84,2.84,0,0,0,2.17.93,2.31,2.31,0,0,0,1.48-.48A3,3,0,0,0,1051.86,1434Zm.21-3.79a3.64,3.64,0,0,0-.84-2.48,2.7,2.7,0,0,0-4,0,3.41,3.41,0,0,0-.79,2.43Z"
/><path
class="cls-10"
d="M1057.08,1424.37h4l3.4,10.07,3.31-10.07h3.89l-5,13.65-.9,2.47a10.12,10.12,0,0,1-.94,1.9,4.17,4.17,0,0,1-1,1.06,4.48,4.48,0,0,1-1.43.63,7,7,0,0,1-1.91.23,9.46,9.46,0,0,1-2.13-.23l-.33-2.93a8.72,8.72,0,0,0,1.59.17,2.34,2.34,0,0,0,1.93-.77,5.37,5.37,0,0,0,1-2Z"
/><path
class="cls-10"
d="M1073.91,1438.55V1419h3.75V1426a5.32,5.32,0,0,1,4.12-2,5.52,5.52,0,0,1,4.29,1.88,7.75,7.75,0,0,1,1.69,5.38,8.21,8.21,0,0,1-1.73,5.6,5.39,5.39,0,0,1-4.2,2,5.28,5.28,0,0,1-2.4-.61,5.87,5.87,0,0,1-2-1.8v2.08Zm3.73-7.4a6.06,6.06,0,0,0,.69,3.26,3,3,0,0,0,2.59,1.5,2.65,2.65,0,0,0,2.12-1.06,5.27,5.27,0,0,0,.87-3.35,5.49,5.49,0,0,0-.88-3.5,2.77,2.77,0,0,0-2.25-1.08,2.84,2.84,0,0,0-2.25,1A4.79,4.79,0,0,0,1077.64,1431.15Z"
/><path
class="cls-10"
d="M1089.91,1431.26a7.75,7.75,0,0,1,.92-3.62,6.31,6.31,0,0,1,2.62-2.67,7.76,7.76,0,0,1,3.77-.92,7.09,7.09,0,0,1,5.27,2.09,7.18,7.18,0,0,1,2.06,5.28,7.29,7.29,0,0,1-2.08,5.34,7,7,0,0,1-5.22,2.12,8.22,8.22,0,0,1-3.72-.89,6.07,6.07,0,0,1-2.7-2.58A8.69,8.69,0,0,1,1089.91,1431.26Zm3.85.2a4.66,4.66,0,0,0,1,3.23,3.26,3.26,0,0,0,4.94,0,5.76,5.76,0,0,0,0-6.46,3.28,3.28,0,0,0-4.94,0A4.68,4.68,0,0,0,1093.76,1431.46Z"
/><path
class="cls-10"
d="M1110.3,1428.7l-3.41-.62a5.26,5.26,0,0,1,2-3,7.19,7.19,0,0,1,4.16-1,9.08,9.08,0,0,1,3.74.59,3.73,3.73,0,0,1,1.73,1.51,7.65,7.65,0,0,1,.5,3.36l0,4.38a14.16,14.16,0,0,0,.19,2.76,7.9,7.9,0,0,0,.67,1.9h-3.71a11,11,0,0,1-.36-1.1c-.07-.23-.11-.37-.14-.44a6.79,6.79,0,0,1-2.06,1.4,5.88,5.88,0,0,1-2.33.47,4.88,4.88,0,0,1-3.46-1.19,4.23,4.23,0,0,1-.68-5.15,3.78,3.78,0,0,1,1.61-1.45,12.77,12.77,0,0,1,3-.87,21,21,0,0,0,3.65-.92v-.38a1.93,1.93,0,0,0-.54-1.54,3.15,3.15,0,0,0-2-.46,2.74,2.74,0,0,0-1.57.39A2.8,2.8,0,0,0,1110.3,1428.7Zm5,3c-.48.16-1.24.35-2.29.58a6.93,6.93,0,0,0-2,.65,1.56,1.56,0,0,0-.73,1.32,1.86,1.86,0,0,0,.58,1.37,2.08,2.08,0,0,0,1.5.57,3.24,3.24,0,0,0,1.94-.67,2.35,2.35,0,0,0,.89-1.24,7.26,7.26,0,0,0,.15-1.83Z"
/><path
class="cls-10"
d="M1126.3,1438.55h-3.76v-14.18H1126v2a6.1,6.1,0,0,1,1.61-1.89,3,3,0,0,1,1.62-.45,4.67,4.67,0,0,1,2.47.71l-1.16,3.27a3.3,3.3,0,0,0-1.76-.62,2.1,2.1,0,0,0-1.34.44,3,3,0,0,0-.86,1.57,22.25,22.25,0,0,0-.31,4.75Z"
/><path
class="cls-10"
d="M1146.36,1438.55h-3.48v-2.08a5.69,5.69,0,0,1-2.06,1.81,5.18,5.18,0,0,1-2.38.6,5.39,5.39,0,0,1-4.19-2,8,8,0,0,1-1.74-5.49,7.86,7.86,0,0,1,1.7-5.48,5.5,5.5,0,0,1,4.28-1.88,5.32,5.32,0,0,1,4.12,2V1419h3.75Zm-10-7.4a6.49,6.49,0,0,0,.63,3.29,2.84,2.84,0,0,0,2.54,1.47,2.76,2.76,0,0,0,2.2-1.1,5.06,5.06,0,0,0,.91-3.29,5.54,5.54,0,0,0-.88-3.52,2.79,2.79,0,0,0-2.26-1.08,2.83,2.83,0,0,0-2.24,1.06A4.81,4.81,0,0,0,1136.34,1431.15Z"
/><rect
class="cls-11"
x="755.65"
y="633.64"
width="500.52"
height="377.46"
/><path
class="cls-12"
d="M1084.05,1030.81a84.23,84.23,0,0,1-5.85,102.73"
/><path
class="cls-12"
d="M945.08,1030.81a84.23,84.23,0,0,0,5.85,102.73"
/><path
class="cls-12"
d="M1056.1,1030.81a63.17,63.17,0,0,1-10.75,102.73"
/><path
class="cls-12"
d="M973,1030.81a63.15,63.15,0,0,0,10.75,102.73"
/><circle class="cls-12" cx="1014.57" cy="1078.39" r="26.4" /><path
class="cls-13"
d="M703.84,1208.34a10.08,10.08,0,0,1,7.37,8.09c1.15,6.75,7.53,8.15,11.11,7.13"
/><path
class="cls-14"
d="M1315,613.62l-3.93-4.38V594.81a92.42,92.42,0,0,0-92.42-92.42H796.26a92.42,92.42,0,0,0-92.42,92.42v14.43l-3.93,4.38a6.23,6.23,0,0,0-1.59,4.15v408.74a6.22,6.22,0,0,0,1.81,4.39l3.71,3.71v284.11c0,52.75,17,100.9,78.62,123.63,33.79,12.47,72.21,18,107.6,21.08,21,1.85,69.3,3.79,117.26,3.59h.24c48,.2,96.28-1.74,117.26-3.59,35.39-3.12,73.81-8.61,107.6-21.08,61.59-22.73,78.62-70.88,78.62-123.63V1034.61l3.71-3.71a6.22,6.22,0,0,0,1.81-4.39V617.77A6.23,6.23,0,0,0,1315,613.62Zm-22.41,704.53c0,51.3-17,98.13-78.62,120.23-33.78,12.13-72.45,17.21-107.88,19.81-23.07,1.7-66.69,2.55-98.62,2.85-31.93-.3-75.55-1.15-98.62-2.85-35.43-2.6-74.1-7.68-107.88-19.81-61.6-22.1-78.62-68.93-78.62-120.23V590.3a74.74,74.74,0,0,1,74.75-74.75h420.74a74.74,74.74,0,0,1,74.75,74.75Z"
/><path
class="cls-13"
d="M1311.05,1208.34a10.08,10.08,0,0,0-7.37,8.09c-1.15,6.75-7.53,8.15-11.11,7.13"
/><rect
class="cls-11"
x="942.13"
y="547.62"
width="132.22"
height="13.89"
rx="6.95"
/><line
class="cls-11"
x1="722.32"
y1="1030.81"
x2="1292.57"
y2="1030.81"
/><rect
class="cls-13"
x="748.71"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M748.71,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H748.71"
/><rect
class="cls-13"
x="801.73"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M801.73,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H801.73"
/><rect
class="cls-13"
x="854.75"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M854.75,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H854.75"
/><rect
class="cls-13"
x="907.77"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M907.77,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H907.77"
/><rect
class="cls-13"
x="960.79"
y="1147.19"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M960.79,1199.81h45.08V1175a27.9,27.9,0,0,0-28-27.8H960.79"
/><rect
class="cls-13"
x="1225.89"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2504.8 2347) rotate(-180)"
/><path
class="cls-13"
d="M1278.91,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1172.87"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2398.76 2347) rotate(-180)"
/><path
class="cls-13"
d="M1225.89,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1119.85"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2292.72 2347) rotate(-180)"
/><path
class="cls-13"
d="M1172.87,1147.19H1155.8a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1066.83"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2186.68 2347) rotate(-180)"
/><path
class="cls-13"
d="M1119.85,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1013.81"
y="1147.19"
width="53.02"
height="52.62"
transform="translate(2080.64 2347) rotate(-180)"
/><path
class="cls-13"
d="M1066.83,1147.19h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="748.71"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M748.71,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H748.71"
/><rect
class="cls-13"
x="801.73"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M801.73,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H801.73"
/><rect
class="cls-13"
x="854.75"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M854.75,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H854.75"
/><rect
class="cls-13"
x="907.77"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M907.77,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H907.77"
/><rect
class="cls-13"
x="960.79"
y="1213.46"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M960.79,1266.08h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H960.79"
/><rect
class="cls-13"
x="1225.89"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2504.8 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1278.91,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1172.87"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2398.76 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1225.89,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1119.85"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2292.72 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1172.87,1213.46H1155.8a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1066.83"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2186.68 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1119.85,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1013.81"
y="1213.46"
width="53.02"
height="52.62"
transform="translate(2080.64 2479.54) rotate(-180)"
/><path
class="cls-13"
d="M1066.83,1213.46h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="748.71"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M748.71,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H748.71"
/><rect
class="cls-13"
x="801.73"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M801.73,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H801.73"
/><path
class="cls-13"
d="M812.55,1346h17.07a27.9,27.9,0,0,1,28,27.8V1394"
/><path
class="cls-13"
d="M872.15,1346h17.07a27.9,27.9,0,0,1,28,27.8v24.6"
/><rect
class="cls-13"
x="854.75"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M854.75,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H854.75"
/><rect
class="cls-13"
x="907.77"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M907.77,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H907.77"
/><rect
class="cls-13"
x="960.79"
y="1279.73"
width="53.02"
height="52.62"
/><path
class="cls-13"
d="M960.79,1332.35h45.08v-24.82a27.9,27.9,0,0,0-28-27.8H960.79"
/><rect
class="cls-13"
x="1225.89"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2504.8 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1278.91,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1172.87"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2398.76 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1225.89,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1119.85"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2292.72 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1172.87,1279.73H1155.8a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1066.83"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2186.68 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1119.85,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-13"
x="1013.81"
y="1279.73"
width="53.02"
height="52.62"
transform="translate(2080.64 2612.09) rotate(-180)"
/><path
class="cls-13"
d="M1066.83,1279.73h-17.07a27.91,27.91,0,0,0-28,27.8v24.82h45.08"
/><rect
class="cls-15"
x="743.88"
y="1199.81"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-15"
x="743.88"
y="1133.54"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-15"
x="743.88"
y="1266.09"
width="540.06"
height="13.65"
rx="6.82"
/><rect
class="cls-15"
x="743.88"
y="1332.36"
width="540.06"
height="13.65"
rx="6.82"
/><path
class="cls-15"
d="M802.07,1346c0,26.61,14.41,41.86,40.7,46,40.67,6.37,101.92,8.23,181.39,8"
/><line
class="cls-15"
x1="924.85"
y1="1398.7"
x2="924.85"
y2="1346.01"
/><line
class="cls-15"
x1="864.53"
y1="1394.78"
x2="864.53"
y2="1346.01"
/><path
class="cls-13"
d="M1170.33,1394V1373.8a27.9,27.9,0,0,1,28-27.8h17.07"
/><path
class="cls-13"
d="M1110.73,1398.4v-24.6a27.9,27.9,0,0,1,28-27.8h17.07"
/><path
class="cls-15"
d="M1225.89,1346c0,26.61-14.41,41.86-40.7,46-40.67,6.37-101.92,8.23-181.39,8"
/><line
class="cls-15"
x1="1103.11"
y1="1346.01"
x2="1103.11"
y2="1398.7"
/><line
class="cls-15"
x1="1163.43"
y1="1346.01"
x2="1163.43"
y2="1394.78"
/><circle class="cls-1" cx="743.88" cy="1046.8" r="7.19" /><path
class="cls-9"
d="M736.69,1104a5.93,5.93,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1104Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.15,4.15,0,0,0,736.69,1094Z"
/><path
class="cls-9"
d="M736.69,1120.19a5.94,5.94,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1120.19Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.14,4.14,0,0,0,736.69,1110.12Z"
/><path
class="cls-9"
d="M736.69,1136.35a5.93,5.93,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1136.35Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.15,4.15,0,0,0,736.69,1126.28Z"
/><path
class="cls-9"
d="M736.69,1168.68a5.93,5.93,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1168.68Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.15,4.15,0,0,0,736.69,1158.61Z"
/><path
class="cls-9"
d="M736.69,1184.85a5.94,5.94,0,1,1,5.93-5.93A5.94,5.94,0,0,1,736.69,1184.85Zm0-10.07a4.14,4.14,0,1,0,4.14,4.14A4.14,4.14,0,0,0,736.69,1174.78Z"
/><path
class="cls-16"
d="M918.05,1077.65a.77.77,0,0,1,0,.95l-8.88,11.19L903,1097.6a.76.76,0,0,1-.6.29H885.84a.76.76,0,0,1-.6-1.24l14.31-18.05a.77.77,0,0,0,0-.95l-14.32-18.05a.76.76,0,0,1,.6-1.24h16.55a.76.76,0,0,1,.6.29l6.19,7.81Z"
/><path
class="cls-16"
d="M885,1077.65a.77.77,0,0,1,0,.95l-8.88,11.19L870,1097.6a.76.76,0,0,1-.6.29H852.81a.76.76,0,0,1-.6-1.24l14.31-18.05a.77.77,0,0,0,0-.95L852.2,1059.6a.76.76,0,0,1,.6-1.24h16.55a.76.76,0,0,1,.6.29l6.19,7.81Z"
/><path
class="cls-16"
d="M852,1077.65a.77.77,0,0,1,0,.95l-8.88,11.19-6.19,7.81a.76.76,0,0,1-.6.29H819.78a.76.76,0,0,1-.6-1.24l14.31-18.05a.77.77,0,0,0,0-.95l-14.32-18.05a.76.76,0,0,1,.6-1.24h16.55a.76.76,0,0,1,.6.29l6.19,7.81Z"
/><path
class="cls-16"
d="M1111.88,1077.65a.77.77,0,0,0,0,.95l8.87,11.19,6.19,7.81a.79.79,0,0,0,.6.29h16.55a.77.77,0,0,0,.6-1.24l-14.31-18.05a.77.77,0,0,1,0-.95l14.32-18.05a.77.77,0,0,0-.6-1.24h-16.56a.79.79,0,0,0-.6.29l-6.19,7.81Z"
/><path
class="cls-16"
d="M1144.91,1077.65a.77.77,0,0,0,0,.95l8.87,11.19,6.19,7.81a.79.79,0,0,0,.6.29h16.55a.77.77,0,0,0,.6-1.24l-14.31-18.05a.77.77,0,0,1,0-.95l14.32-18.05a.77.77,0,0,0-.6-1.24h-16.56a.79.79,0,0,0-.6.29l-6.19,7.81Z"
/><path
class="cls-16"
d="M1177.94,1077.65a.77.77,0,0,0,0,.95l8.87,11.19,6.19,7.81a.79.79,0,0,0,.6.29h16.55a.77.77,0,0,0,.6-1.24l-14.31-18.05a.77.77,0,0,1,0-.95l14.32-18.05a.77.77,0,0,0-.6-1.24H1193.6a.79.79,0,0,0-.6.29l-6.19,7.81Z"
/><path
class="cls-10"
d="M944.82,608.91V582.67h3.47v23.14h12.92v3.1Z"
/><path class="cls-10" d="M965.94,608.91V582.67h3.47v26.24Z" /><path
class="cls-10"
d="M975.39,608.91V582.67h3.47v23.14h12.93v3.1Z"
/><path
class="cls-10"
d="M1000.6,608.91V597.79l-10.12-15.12h4.23l5.17,7.91q1.43,2.22,2.67,4.44c.78-1.37,1.74-2.92,2.86-4.64l5.08-7.71h4l-10.47,15.12v11.12Z"
/><path
class="cls-10"
d="M1029.93,598.62v-3.08l11.12,0v9.74a19.85,19.85,0,0,1-5.28,3.07,15.79,15.79,0,0,1-5.58,1,14.85,14.85,0,0,1-7-1.66,10.88,10.88,0,0,1-4.77-4.79,15,15,0,0,1-1.61-7,16.24,16.24,0,0,1,1.6-7.15,10.63,10.63,0,0,1,4.61-4.93,14.47,14.47,0,0,1,6.93-1.61,13.8,13.8,0,0,1,5.14.92,8.53,8.53,0,0,1,3.61,2.57,11.52,11.52,0,0,1,2,4.3l-3.14.86a9.81,9.81,0,0,0-1.46-3.16,6.07,6.07,0,0,0-2.51-1.83,9.2,9.2,0,0,0-3.62-.69,10.48,10.48,0,0,0-4.11.73,7.58,7.58,0,0,0-2.8,1.9,9.12,9.12,0,0,0-1.66,2.6,13.68,13.68,0,0,0-1,5.28,12.86,12.86,0,0,0,1.2,5.87,7.72,7.72,0,0,0,3.52,3.51,11,11,0,0,0,4.91,1.14,11.61,11.61,0,0,0,4.4-.86,11.35,11.35,0,0,0,3.26-1.86v-4.88Z"
/><path
class="cls-10"
d="M1045.11,596.13q0-6.54,3.51-10.23a11.92,11.92,0,0,1,9.06-3.7,12.53,12.53,0,0,1,6.55,1.74,11.32,11.32,0,0,1,4.45,4.84,15.73,15.73,0,0,1,1.53,7,15.52,15.52,0,0,1-1.61,7.15,11,11,0,0,1-4.56,4.77,13.07,13.07,0,0,1-6.38,1.62,12.42,12.42,0,0,1-6.62-1.79,11.48,11.48,0,0,1-4.42-4.89A14.84,14.84,0,0,1,1045.11,596.13Zm3.58,0a10.54,10.54,0,0,0,2.56,7.48,8.89,8.89,0,0,0,12.85,0q2.54-2.76,2.53-7.82a13.51,13.51,0,0,0-1.08-5.6,8.28,8.28,0,0,0-3.17-3.7,8.57,8.57,0,0,0-4.68-1.32,8.93,8.93,0,0,0-6.35,2.53Q1048.7,590.25,1048.69,596.18Z"
/><path
class="cls-10"
d="M990.05,1421.1v-4.57h2a2.75,2.75,0,0,1,.93.12,1,1,0,0,1,.51.44,1.23,1.23,0,0,1,.19.69,1.16,1.16,0,0,1-.31.82,1.62,1.62,0,0,1-1,.42,1.32,1.32,0,0,1,.37.23,2.86,2.86,0,0,1,.5.61l.8,1.24h-.76l-.61-.95c-.18-.27-.32-.48-.44-.63a1.27,1.27,0,0,0-.3-.31,1.13,1.13,0,0,0-.28-.12l-.34,0h-.7v2Zm.6-2.55H992a1.84,1.84,0,0,0,.65-.09.72.72,0,0,0,.36-.27.78.78,0,0,0,.12-.41.68.68,0,0,0-.24-.54,1.07,1.07,0,0,0-.74-.21h-1.45Z"
/><path
class="cls-10"
d="M991.8,1422.71a3.74,3.74,0,1,1,3.74-3.74A3.74,3.74,0,0,1,991.8,1422.71Zm0-6.94A3.21,3.21,0,1,0,995,1419,3.21,3.21,0,0,0,991.8,1415.77Z"
/><polyline
class="cls-12"
points="1101.56 1065.39 1111.5 1065.39 1123.2 1051.99 1217.31 1051.99 1245.51 1093.92 1286.27 1093.92"
/><polyline
class="cls-12"
points="927.7 1065.39 917.75 1065.39 906.06 1051.99 811.95 1051.99 783.75 1093.92 764.44 1093.92"
/><polyline
class="cls-12"
points="985.94 1365.91 985.94 1373.8 1042.55 1373.8 1042.55 1365.91"
/><path
class="cls-17"
d="M1266.42,1247.22H1252.5a1.86,1.86,0,0,1-1.19-.44l-5.61-4.67a3,3,0,0,1,0-4.67l5.61-4.68a1.85,1.85,0,0,1,1.19-.43h13.92a1.72,1.72,0,0,1,1.71,1.72v11.45A1.72,1.72,0,0,1,1266.42,1247.22Z"
/><line
class="cls-17"
x1="1254.51"
y1="1235.71"
x2="1262.65"
y2="1243.84"
/><line
class="cls-17"
x1="1262.65"
y1="1235.71"
x2="1254.51"
y2="1243.84"
/><path
class="cls-18"
d="M1261.8,1296.61v6.25a7.19,7.19,0,0,1-7.19,7.19h-7.39l2.9-3.14v6.23l-2.9-3.09"
/><path
class="cls-10"
d="M1249.84,1308s.34,3.83,0,3.83a9.67,9.67,0,0,1-2-1.42v-.91Z"
/></g>
</svg>

After

Width:  |  Height:  |  Size: 27 KiB

195
packages/web/public/devices/t-echo.svg

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?><svg
id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 206.97 481.72"
>
<defs><style>
.cls-1,
.cls-2,
.cls-3,
.cls-4,
.cls-5,
.cls-6,
.cls-7,
.cls-8,
.cls-9,
.cls-10,
.cls-11 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-1, .cls-2, .cls-3, .cls-6, .cls-8, .cls-10, .cls-11 {
fill: #ccc;
}
.cls-1, .cls-11 {
stroke: #999;
stroke-width: 2px;
}
.cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8, .cls-9, .cls-10 {
stroke: #000;
}
.cls-2, .cls-4, .cls-5 {
stroke-width: 1.5px;
}
.cls-2, .cls-4, .cls-8, .cls-9, .cls-12, .cls-13, .cls-11 {
fill-rule: evenodd;
}
.cls-3, .cls-8 {
stroke-width: 1px;
}
.cls-4 {
fill: #242424;
}
.cls-6, .cls-7 {
stroke-width: 0.5px;
}
.cls-7 {
fill: #999;
}
.cls-9 {
fill: #fff;
stroke-width: 0.75px;
}
.cls-10 {
stroke-width: 0.22px;
}
.cls-12, .cls-13, .cls-14, .cls-15 {
stroke-width: 0px;
}
.cls-12, .cls-15 {
fill: #00afef;
}
.cls-13, .cls-14 {
fill: #b7b7b7;
}
</style></defs><path
class="cls-2"
d="M97.84,232.81h91.76c9.14,0,16.62,7.48,16.62,16.62v214.92c0,9.14-7.48,16.62-16.62,16.62H17.37c-9.14,0-16.62-7.48-16.62-16.62v-154.84c0-9.14,7.48-16.62,16.62-16.62h51.48c8.68,0,12.45-2.57,12.45-14.56v-28.98c0-9.14,7.4-16.54,16.54-16.54Z"
/><path
class="cls-4"
d="M135.52,201.13h66.32v21.47c0,.38-.31.69-.69.69h-64.94c-.38,0-.69-.31-.69-.69v-21.47Z"
/><polygon
class="cls-4"
points="201.84 201.13 194.29 182.05 143.47 182.05 135.52 201.13 201.84 201.13"
/><polygon
class="cls-4"
points="168.68 182.05 194.33 182.05 194.33 .75 143.03 .75 143.03 182.05 168.68 182.05"
/><path
class="cls-4"
d="M168.68,19.05c-8.57.07-22.61.49-25.65,2.54,0,0-1.61,6.89,0,11.41,0,0,13.59-1.34,25.65-1.34s25.65,1.34,25.65,1.34c1.61-4.52,0-11.41,0-11.41-3.05-2.04-17.08-2.47-25.65-2.54Z"
/><rect
class="cls-3"
x="7.06"
y="305.93"
width="193.13"
height="171.26"
rx="22.77"
ry="22.77"
/><rect
class="cls-6"
x="50.31"
y="330.36"
width="122.74"
height="121.76"
rx="10.5"
ry="10.5"
/><path
class="cls-7"
d="M66.49,335.98h90.38c5.2,0,9.41,4.22,9.41,9.41v91.69c0,5.2-4.22,9.41-9.41,9.41h-90.38c-5.2,0-9.41-4.22-9.41-9.41v-91.69c0-5.2,4.22-9.41,9.41-9.41Z"
/><path
class="cls-2"
d="M96.65,232.86h19.83v-2.85c0-.4-.32-.72-.72-.72h-18.38c-.4,0-.72.32-.72.72v2.85Z"
/><rect
class="cls-10"
x="92.66"
y="239.37"
width="102.73"
height="58.83"
rx="2.83"
ry="2.83"
/><rect
class="cls-5"
x="99.69"
y="245.56"
width="88.66"
height="46.46"
/><path
class="cls-2"
d="M138.06,232.81h51.53c3.1,0,6,.86,8.49,2.35v-7.04c0-2-1.02-3.78-2.56-4.83h-54.9c-1.54,1.06-2.56,2.83-2.56,4.83v4.69Z"
/><path
class="cls-2"
d="M67.74,292.89H29.51v-2.73c0-1.5,1.23-2.73,2.73-2.73h32.76c1.5,0,2.73,1.23,2.73,2.73v2.73Z"
/><path
class="cls-11"
d="M44.05,329.75c3.68,0,6.68-3,6.68-6.68s-3-6.68-6.68-6.68-6.68,3-6.68,6.68,3,6.68,6.68,6.68Z"
/><path
class="cls-11"
d="M181.27,329.75c3.68,0,6.68-3,6.68-6.68s-3-6.68-6.68-6.68-6.68,3-6.68,6.68,3,6.68,6.68,6.68Z"
/><path
class="cls-11"
d="M44.05,466.27c3.68,0,6.68-3,6.68-6.68s-3-6.68-6.68-6.68-6.68,3-6.68,6.68,3,6.68,6.68,6.68Z"
/><circle class="cls-1" cx="181.27" cy="459.59" r="6.68" /><polygon
class="cls-12"
points="108.38 262.94 108.38 274.8 114.94 274.8 114.94 276.94 105.81 276.94 105.81 262.94 108.38 262.94"
/><rect
class="cls-15"
x="117.34"
y="262.94"
width="2.57"
height="14"
/><polygon
class="cls-12"
points="125.83 262.94 125.83 274.8 132.38 274.8 132.38 276.94 123.25 276.94 123.25 262.94 125.83 262.94"
/><polygon
class="cls-12"
points="137.09 268.97 140.83 262.94 143.67 262.94 138.36 271.3 138.36 276.94 135.79 276.94 135.79 271.3 130.48 262.94 133.33 262.94 137.06 268.97 137.09 268.97"
/><path
class="cls-12"
d="M153.84,271.58h-3.14v-2.14h5.71v7.07c-.21.08-.47.16-.8.24-.33.08-.69.16-1.09.23-.4.07-.81.12-1.24.16-.43.04-.85.06-1.26.06-1.26,0-2.35-.17-3.29-.51-.94-.34-1.72-.82-2.34-1.43-.63-.61-1.09-1.35-1.4-2.19-.31-.85-.46-1.79-.46-2.81,0-.73.08-1.42.25-2.08.16-.66.41-1.27.73-1.83.32-.56.71-1.07,1.16-1.52.45-.45.98-.84,1.56-1.16.58-.32,1.22-.56,1.92-.74.69-.17,1.44-.26,2.23-.26.7,0,1.38.05,2.01.15.63.1,1.15.23,1.56.37v2.16c-.54-.17-1.09-.3-1.65-.38-.55-.09-1.11-.13-1.68-.13-.76,0-1.47.11-2.14.34-.66.23-1.24.56-1.72,1.01-.49.44-.87.99-1.15,1.64-.28.65-.42,1.4-.42,2.25,0,1.65.44,2.9,1.29,3.73.86.83,2.07,1.24,3.64,1.24.29,0,.6-.01.91-.05.31-.03.59-.07.83-.12v-3.28Z"
/><path
class="cls-12"
d="M169.93,269.93c0-.85-.1-1.6-.31-2.24-.21-.64-.5-1.17-.87-1.6-.37-.43-.81-.74-1.31-.95s-1.06-.31-1.67-.31-1.16.1-1.67.31-.95.53-1.31.95c-.37.43-.66.96-.87,1.6-.21.64-.31,1.38-.31,2.24s.1,1.6.31,2.24c.21.64.5,1.17.87,1.59.37.42.81.74,1.31.95.51.21,1.06.32,1.67.32s1.17-.11,1.67-.32c.51-.21.95-.53,1.31-.95.37-.43.66-.95.87-1.59.21-.64.31-1.39.31-2.24h0ZM172.58,269.93c0,1.07-.15,2.05-.45,2.94-.3.89-.75,1.66-1.33,2.3-.58.64-1.3,1.14-2.15,1.5-.85.35-1.81.53-2.89.53s-2.05-.18-2.89-.53c-.85-.36-1.57-.86-2.15-1.5-.58-.64-1.03-1.41-1.33-2.3-.3-.89-.46-1.87-.46-2.94s.15-2.05.46-2.94c.3-.89.75-1.66,1.33-2.3.58-.64,1.3-1.14,2.15-1.5.85-.35,1.81-.53,2.89-.53s2.05.18,2.89.53c.85.36,1.57.86,2.15,1.5.58.64,1.03,1.41,1.33,2.3.3.89.45,1.87.45,2.94Z"
/><path
class="cls-12"
d="M180.07,263.91c0,.22-.06.4-.18.55-.12.15-.3.26-.56.33h0s.93,1.28.93,1.28h-.68l-.84-1.2h-.39v1.2h-.57v-3.1h.94c.16,0,.3,0,.44.03.13.02.25.04.34.08.18.07.32.17.42.31.1.14.15.31.15.52h0ZM179.02,261.32c-.89,0-1.69.36-2.27.94-.58.58-.94,1.39-.94,2.27s.35,1.67.92,2.25l.02.02c.58.58,1.39.94,2.27.94s1.69-.36,2.27-.94c.58-.58.94-1.39.94-2.27s-.36-1.69-.94-2.27c-.58-.58-1.39-.94-2.27-.94h0ZM180.75,262.81c-.44-.44-1.05-.71-1.73-.71s-1.29.27-1.73.71c-.44.44-.71,1.05-.71,1.73s.27,1.27.7,1.71l.02.02c.44.44,1.05.71,1.73.71s1.28-.27,1.73-.71c.44-.44.71-1.05.71-1.73s-.27-1.28-.71-1.73h0ZM178.63,264.41c.13,0,.24,0,.33-.02.09-.01.17-.03.23-.05.11-.04.19-.1.24-.18.04-.07.07-.16.07-.26,0-.08-.02-.16-.05-.22-.03-.06-.09-.11-.18-.15-.05-.03-.12-.04-.2-.05-.08-.01-.18-.02-.3-.02h-.4v.95h.28Z"
/><polygon
class="cls-13"
points="22.89 342.21 42.82 342.21 42.82 344.85 25.23 344.85 25.23 354.65 22.89 354.65 22.89 342.21"
/><rect
class="cls-14"
x="22.89"
y="359.51"
width="19.94"
height="2.65"
/><polygon
class="cls-13"
points="22.89 367.95 42.82 367.95 42.82 370.6 25.23 370.6 25.23 380.4 22.89 380.4 22.89 367.95"
/><path
class="cls-13"
d="M22.89,388.37h8.45l11.49-7.69v3.17l-6.03,3.94c-1.12.73-2.24,1.42-3.36,2.04,1.04.61,2.21,1.35,3.51,2.2l5.88,3.86v3.08l-11.49-7.96h-8.45v-2.65Z"
/><path
class="cls-13"
d="M30.71,411.91h2.34v8.44h-7.39c-1.03-1.29-1.81-2.63-2.33-4.01-.52-1.38-.78-2.79-.78-4.24,0-1.96.42-3.74,1.26-5.34.84-1.6,2.05-2.81,3.63-3.62,1.59-.82,3.36-1.23,5.31-1.23s3.75.4,5.43,1.22c1.68.81,2.93,1.98,3.74,3.5.82,1.52,1.23,3.28,1.23,5.26,0,1.44-.23,2.74-.7,3.91-.47,1.16-1.12,2.08-1.95,2.74-.83.66-1.93,1.16-3.27,1.51l-.65-2.38c1.01-.3,1.81-.67,2.39-1.11.58-.45,1.04-1.08,1.39-1.9.35-.82.52-1.74.52-2.74,0-1.2-.19-2.24-.55-3.12-.37-.88-.85-1.58-1.45-2.13-.6-.54-1.26-.96-1.97-1.25-1.24-.51-2.58-.76-4.02-.76-1.78,0-3.27.31-4.47.91-1.2.61-2.09,1.5-2.67,2.67-.58,1.17-.87,2.41-.87,3.72,0,1.14.22,2.26.66,3.34.45,1.09.91,1.91,1.42,2.47h3.74v-5.85Z"
/><path
class="cls-13"
d="M32.59,424.69c3.3,0,5.89.89,7.76,2.67,1.87,1.78,2.8,4.07,2.8,6.88,0,1.84-.44,3.5-1.32,4.98-.88,1.48-2.1,2.6-3.68,3.38-1.57.77-3.35,1.16-5.34,1.16s-3.83-.41-5.42-1.23c-1.6-.82-2.8-1.97-3.62-3.47-.82-1.5-1.23-3.11-1.23-4.84,0-1.88.45-3.55,1.36-5.04.91-1.48,2.14-2.6,3.71-3.36,1.56-.76,3.22-1.14,4.97-1.14h0ZM32.55,427.42c-2.4,0-4.29.65-5.67,1.94-1.38,1.29-2.07,2.91-2.07,4.86s.7,3.62,2.09,4.9c1.39,1.28,3.37,1.92,5.93,1.92,1.62,0,3.03-.27,4.24-.82,1.21-.55,2.14-1.35,2.81-2.4.66-1.06,1-2.24,1-3.56,0-1.87-.64-3.47-1.92-4.82-1.28-1.35-3.42-2.02-6.41-2.02Z"
/><path
class="cls-8"
d="M7.06,338.45h-1.67c-.92,0-1.67.75-1.67,1.67v11.46c0,.92.75,1.67,1.67,1.67h1.67v-14.79Z"
/><path
class="cls-8"
d="M7.06,438.01h-1.67c-.92,0-1.67.75-1.67,1.67v11.46c0,.92.75,1.67,1.67,1.67h1.67v-14.79Z"
/><path
class="cls-8"
d="M200.2,338.45h1.67c.92,0,1.67.75,1.67,1.67v11.46c0,.92-.75,1.67-1.67,1.67h-1.67v-14.79Z"
/><path
class="cls-8"
d="M200.2,438.01h1.67c.92,0,1.67.75,1.67,1.67v11.46c0,.92-.75,1.67-1.67,1.67h-1.67v-14.79Z"
/><path
class="cls-9"
d="M181.07,394.74c1.93,0,3.51-1.57,3.51-3.51s-1.57-3.51-3.51-3.51-3.51,1.57-3.51,3.51,1.57,3.51,3.51,3.51Z"
/><path
class="cls-9"
d="M190.07,394.74c1.93,0,3.51-1.57,3.51-3.51s-1.57-3.51-3.51-3.51-3.51,1.57-3.51,3.51,1.57,3.51,3.51,3.51Z"
/>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

126
packages/web/public/devices/t-watch-s3.svg

@ -0,0 +1,126 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="733.42 451.82 573.87 931.48">
<defs><style>
.cls-1 {
fill: #8e8d8e;
}
.cls-2 {
fill: #383839;
}
.cls-3 {
fill: #cccccb;
}
.cls-4 {
fill: #222226;
}
.cls-5, .cls-6 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-5 {
stroke-width: 1.87px;
}
.cls-6 {
stroke-width: 3.77px;
}
.cls-7 {
fill: #4c4c4d;
}
</style></defs><g id="Layer_4" data-name="Layer 4"><path
class="cls-1"
d="M1277.27,847.59h4.35a8.09,8.09,0,0,1,8.09,8.08v138a8.09,8.09,0,0,1-8.09,8.09h-4.35"
></path><path
class="cls-1"
d="M1277.27,732.73h18a10.14,10.14,0,0,1,10.14,10.14v43A10.14,10.14,0,0,1,1295.26,796h-18a0,0,0,0,1,0,0V732.73A0,0,0,0,1,1277.27,732.73Z"
></path><path
class="cls-2"
d="M1256.49,1200.6h0a14.19,14.19,0,0,1-2.83,12.5c-8.13,9.86-19.94,18.58-46,30.75-19.15,9-28.65,16-38.35,29.6a93.15,93.15,0,0,0-8.7,14.61c-6.95,15.17-11.77,44.44-11.77,65.66v3.61a24.09,24.09,0,0,1-24.1,24.09H887.83a24.09,24.09,0,0,1-24.1-24.09v-3.61c0-21.22-4.82-50.49-11.77-65.66a93.15,93.15,0,0,0-8.7-14.61c-9.7-13.63-19.2-20.65-38.35-29.6-26.06-12.17-37.87-20.89-46-30.75a14.22,14.22,0,0,1-2.82-12.5h0"
></path><path
class="cls-2"
d="M756.09,634.53h0a14.19,14.19,0,0,1,2.83-12.5c8.12-9.86,19.93-18.58,46-30.75,19.15-8.95,28.65-16,38.35-29.6a93.15,93.15,0,0,0,8.7-14.61c6.95-15.17,11.77-44.44,11.77-65.66V477.8a24.09,24.09,0,0,1,24.1-24.09h236.92a24.09,24.09,0,0,1,24.1,24.09v3.61c0,21.22,4.82,50.49,11.77,65.66a93.15,93.15,0,0,0,8.7,14.61c9.7,13.63,19.2,20.65,38.35,29.6,26,12.17,37.86,20.89,46,30.75a14.19,14.19,0,0,1,2.83,12.5h0"
></path><rect
class="cls-3"
x="735.31"
y="598.25"
width="541.96"
height="638.99"
rx="96.44"
></rect><path
class="cls-2"
d="M1247.38,694.68v446.11a66.63,66.63,0,0,1-66.54,66.56H831.75a66.62,66.62,0,0,1-66.56-66.56V694.68a66.63,66.63,0,0,1,66.56-66.55h349.09A66.64,66.64,0,0,1,1247.38,694.68Z"
></path><rect
class="cls-4"
x="817.71"
y="721.76"
width="379.03"
height="388.6"
></rect><path
class="cls-5"
d="M1247.38,694.68v446.11a66.63,66.63,0,0,1-66.54,66.56H831.75a66.62,66.62,0,0,1-66.56-66.56V694.68a66.63,66.63,0,0,1,66.56-66.55h349.09A66.64,66.64,0,0,1,1247.38,694.68Z"
></path><rect
class="cls-6"
x="735.31"
y="598.25"
width="541.96"
height="638.99"
rx="96.44"
></rect><path
class="cls-6"
d="M1256.49,1200.6h0a14.19,14.19,0,0,1-2.83,12.5c-8.13,9.86-19.94,18.58-46,30.75-19.15,9-28.65,16-38.35,29.6a93.15,93.15,0,0,0-8.7,14.61c-6.95,15.17-11.77,44.44-11.77,65.66v3.61a24.09,24.09,0,0,1-24.1,24.09H887.83a24.09,24.09,0,0,1-24.1-24.09v-3.61c0-21.22-4.82-50.49-11.77-65.66a93.15,93.15,0,0,0-8.7-14.61c-9.7-13.63-19.2-20.65-38.35-29.6-26.06-12.17-37.87-20.89-46-30.75a14.22,14.22,0,0,1-2.82-12.5h0"
></path><path
class="cls-6"
d="M756.09,634.53h0a14.19,14.19,0,0,1,2.83-12.5c8.12-9.86,19.93-18.58,46-30.75,19.15-8.95,28.65-16,38.35-29.6a93.15,93.15,0,0,0,8.7-14.61c6.95-15.17,11.77-44.44,11.77-65.66V477.8a24.09,24.09,0,0,1,24.1-24.09h236.92a24.09,24.09,0,0,1,24.1,24.09v3.61c0,21.22,4.82,50.49,11.77,65.66a93.15,93.15,0,0,0,8.7,14.61c9.7,13.63,19.2,20.65,38.35,29.6,26,12.17,37.86,20.89,46,30.75a14.19,14.19,0,0,1,2.83,12.5h0"
></path><rect
class="cls-5"
x="817.71"
y="721.76"
width="379.03"
height="388.6"
></rect><path
class="cls-6"
d="M1277.27,847.59h4.35a8.09,8.09,0,0,1,8.09,8.08v138a8.09,8.09,0,0,1-8.09,8.09h-4.35"
></path><path
class="cls-6"
d="M1277.27,732.73h18a10.14,10.14,0,0,1,10.14,10.14v43A10.14,10.14,0,0,1,1295.26,796h-18a0,0,0,0,1,0,0V732.73A0,0,0,0,1,1277.27,732.73Z"
></path><circle
class="cls-7"
cx="1083.08"
cy="1177.35"
r="16.6"
></circle><rect
class="cls-2"
x="1280.24"
y="739.77"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="750.91"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="762.06"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="773.2"
width="16.77"
height="4.59"
rx="2.29"
></rect><rect
class="cls-2"
x="1280.24"
y="784.34"
width="16.77"
height="4.59"
rx="2.29"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

2514
packages/web/public/devices/tbeam-s3-core.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 85 KiB

3447
packages/web/public/devices/tbeam.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 131 KiB

493
packages/web/public/devices/tlora-c6.svg

@ -0,0 +1,493 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="270.22 240.95 404.28 462.85">
<defs><style>
.cls-1 {
fill: #1b1b1b;
}
.cls-2 {
fill: #434143;
}
.cls-3 {
fill: #353535;
}
.cls-4 {
fill: #2b2b2b;
}
.cls-5 {
fill: #f9d498;
}
.cls-6 {
fill: #fff;
}
.cls-7 {
fill: none;
stroke: #050606;
stroke-miterlimit: 10;
}
.cls-8 {
fill: #181818;
}
.cls-9 {
fill: #cccccb;
}
</style></defs><g id="Layer_2" data-name="Layer 2"><rect
class="cls-1"
x="312.24"
y="260.33"
width="312.56"
height="442.97"
></rect><path
class="cls-2"
d="M674,267.08V696.56a6.75,6.75,0,0,1-6.75,6.74H277.51a6.62,6.62,0,0,1-1.95-.29,3.57,3.57,0,0,1-.46-.16,5.87,5.87,0,0,1-1.46-.78,3,3,0,0,1-.42-.31,4.17,4.17,0,0,1-.38-.34,5.77,5.77,0,0,1-.42-.44l0,0a3.25,3.25,0,0,1-.23-.29,3.43,3.43,0,0,1-.24-.33h0a3.15,3.15,0,0,1-.3-.48,1.71,1.71,0,0,1-.12-.23,2.7,2.7,0,0,1-.17-.34,2.44,2.44,0,0,1-.1-.24c-.05-.13-.1-.26-.14-.39a2,2,0,0,1-.07-.23c0-.13-.07-.27-.1-.41a1.55,1.55,0,0,1,0-.21,3.11,3.11,0,0,1-.07-.44,2.64,2.64,0,0,1,0-.28,1.64,1.64,0,0,1,0-.22,2.81,2.81,0,0,1,0-.29V267.08a6.75,6.75,0,0,1,6.75-6.75h44.73v28a8.34,8.34,0,0,0,2.44,5.9l21,21,5,5a7.1,7.1,0,0,0,.71.63,5.09,5.09,0,0,0,.47.34l.19.13c.14.09.28.18.43.26a8.16,8.16,0,0,0,2.06.83l.61.13h0l.56.08H356q.33,0,.66,0h59.05a3.44,3.44,0,0,0,3.44-3.44V317a3.44,3.44,0,0,0-3.44-3.44H362.22a4.62,4.62,0,0,1-.65-.07h0q-.31,0-.63-.12a6.29,6.29,0,0,1-.62-.17l-.34-.11-.1,0-.36-.14-.51-.24-.18-.1a5.45,5.45,0,0,1-.66-.39,6.26,6.26,0,0,1-.66-.49,8,8,0,0,1-.61-.55l-22.07-22.07a6.89,6.89,0,0,1-.62-.7,6.55,6.55,0,0,1-.39-.53l-.06-.09c-.11-.16-.21-.34-.31-.51s-.1-.17-.14-.26a5.59,5.59,0,0,1-.38-.87,6.69,6.69,0,0,1-.31-1,5.35,5.35,0,0,1-.11-.55v-.06c0-.22-.06-.44-.08-.66s0-.45,0-.68V260.33H614.66v22.86a8.31,8.31,0,0,1-2.45,5.9l-22.06,22.07a5.22,5.22,0,0,1-.43.39l-.05,0-.32.26a4.29,4.29,0,0,1-.55.4h0c-.16.1-.31.2-.47.28s-.22.13-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.6,4.6,0,0,1-.52.06c-.23,0-.45,0-.68,0H531.38a3.44,3.44,0,0,0-3.44,3.44v2.19c0,.12,0,.24,0,.35a3.55,3.55,0,0,0,.08.47,1.7,1.7,0,0,0,.1.32.09.09,0,0,0,0,.05,1.42,1.42,0,0,0,.08.18s0,.11.08.17a.91.91,0,0,0,.09.17,2.05,2.05,0,0,0,.24.36h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37l.23.17a4.08,4.08,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0,.35,0h59a8.36,8.36,0,0,0,5.9-2.44l26-26a8.31,8.31,0,0,0,2.45-5.9v-28h42.44a4.58,4.58,0,0,1,.53,0l.35,0a1.19,1.19,0,0,1,.32.05,3,3,0,0,1,.52.11l.57.18a.17.17,0,0,1,.1,0l.37.16a2.6,2.6,0,0,1,.34.16.72.72,0,0,1,.19.11,4.09,4.09,0,0,1,.48.29,5.2,5.2,0,0,1,.47.35l.09.06.44.41c.15.15.3.31.44.48a5,5,0,0,1,.39.52q.15.22.3.48a.27.27,0,0,0,.06.1c.06.12.12.25.17.38a3.79,3.79,0,0,1,.18.42,3.57,3.57,0,0,1,.16.46A6.82,6.82,0,0,1,674,267.08Z"
></path><path
class="cls-3"
d="M270.76,658.06h33.53a8.5,8.5,0,0,0,8.5-8.5V320.42a8.5,8.5,0,0,0-8.5-8.5H270.76"
></path><path
class="cls-3"
d="M674,658.06H640.46a8.51,8.51,0,0,1-8.5-8.5V320.42a8.5,8.5,0,0,1,8.5-8.5H674"
></path><path
class="cls-4"
d="M632,380.26v19.3l-26.29,33a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56Z"
></path><path
class="cls-4"
d="M558.84,424.91,632,333.07v19.31l-63.85,80.2a5.89,5.89,0,0,1-8.39.89A6.17,6.17,0,0,1,558.84,424.91Z"
></path><polygon
class="cls-4"
points="671.03 303.31 664.17 311.92 648.8 311.92 655.65 303.31 671.03 303.31"
></polygon><path
class="cls-4"
d="M633.46,303.31,530.54,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56L627.91,291v12.32Z"
></path><path
class="cls-4"
d="M565.12,322.67h15.36L493,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56Z"
></path><path
class="cls-4"
d="M614.66,260.44v19.3l-25.88,32.52h0c-.16.1-.31.2-.47.28s-.22.13-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.6,4.6,0,0,1-.52.06c-.23,0-.45,0-.68,0H572.34Z"
></path><polygon
class="cls-4"
points="627.91 260.33 627.91 263.09 624.8 267 624.8 260.33 627.91 260.33"
></polygon><path
class="cls-4"
d="M531.38,322.67h11.54L455.41,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56L528.64,321.3h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37l.23.17a4.08,4.08,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0Z"
></path><polygon
class="cls-4"
points="592.55 260.33 550.14 313.6 534.77 313.6 577.19 260.33 592.55 260.33"
></polygon><path
class="cls-4"
d="M555,260.33,417.85,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56l131-164.58Z"
></path><path
class="cls-4"
d="M517.42,260.33,380.28,432.58a5.89,5.89,0,0,1-8.39.89,6.18,6.18,0,0,1-.87-8.56l131-164.58Z"
></path><path
class="cls-4"
d="M479.86,260.33,342.72,432.58a5.89,5.89,0,0,1-8.39.89,6.16,6.16,0,0,1-.87-8.56l81.4-102.24,4.24-5.33,45.39-57Z"
></path><polygon
class="cls-4"
points="377.29 322.67 392.66 322.67 312.79 423 312.79 403.68 377.29 322.67"
></polygon><polygon
class="cls-4"
points="442.29 260.33 399.88 313.6 384.51 313.6 426.93 260.33 442.29 260.33"
></polygon><path
class="cls-4"
d="M355.18,322.55h0l-42.41,53.26v-19.3l32.89-41.31,5,5a7.1,7.1,0,0,0,.71.63,5.09,5.09,0,0,0,.47.34l.19.13a3.78,3.78,0,0,0,.43.26,8.16,8.16,0,0,0,2.06.83Z"
></path><path
class="cls-4"
d="M404.73,260.33l-42.4,53.26h-.11a4.62,4.62,0,0,1-.65-.07h0q-.31,0-.63-.12a6.29,6.29,0,0,1-.62-.17l-.34-.11-.1,0-.36-.14-.51-.24-.18-.1a5.45,5.45,0,0,1-.66-.39,6.26,6.26,0,0,1-.66-.49,8,8,0,0,1-.61-.55l-4.45-4.45,36.92-46.38Z"
></path><path
class="cls-4"
d="M324.75,294.27l8.56,8.56-20.52,25.78v-8.19a8.45,8.45,0,0,0-3.43-6.82Z"
></path><path
class="cls-4"
d="M367.14,260.33l-27.07,34-5.25-5.25a6.89,6.89,0,0,1-.62-.7,6.55,6.55,0,0,1-.39-.53l-.06-.09c-.11-.16-.21-.34-.31-.51s-.1-.17-.14-.26a5.59,5.59,0,0,1-.38-.87,6.69,6.69,0,0,1-.31-1,5.35,5.35,0,0,1-.11-.55v0l19.29-24.22Z"
></path><polygon
class="cls-4"
points="279.98 303.31 295.35 303.31 288.49 311.92 273.12 311.92 279.98 303.31"
></polygon><polygon
class="cls-4"
points="322.24 260.33 322.24 269.53 316.84 276.31 316.84 260.33 322.24 260.33"
></polygon><path
class="cls-4"
d="M632,573.46v19.31L544,703.3h-11.5a6.14,6.14,0,0,1,.93-6Z"
></path><path
class="cls-4"
d="M632,617.6v19.3l-52.87,66.4h-11.5a6.14,6.14,0,0,1,.93-6Z"
></path><path
class="cls-4"
d="M603.66,697.28l24.25-30.46v19.31L614.24,703.3h-11.5A6.16,6.16,0,0,1,603.66,697.28Z"
></path><path
class="cls-4"
d="M650.26,658.06l-1.9,2.39H633l2.95-3.7a8.45,8.45,0,0,0,4.53,1.31Z"
></path><path
class="cls-4"
d="M632,526.28v19.3L506.38,703.3h-11.5a6.18,6.18,0,0,1,.93-6Z"
></path><path
class="cls-4"
d="M607.21,527.33a6.17,6.17,0,0,1-1.33,3.83L468.82,703.3h-11.5a6.14,6.14,0,0,1,.93-6L596.61,523.49a5.9,5.9,0,0,1,8.4-.88A6.1,6.1,0,0,1,607.21,527.33Z"
></path><path
class="cls-4"
d="M569.65,527.33a6.14,6.14,0,0,1-1.34,3.83l-137,172.14H419.75a6.18,6.18,0,0,1,.93-6L559.05,523.49a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,569.65,527.33Z"
></path><path
class="cls-4"
d="M532.08,527.33a6.17,6.17,0,0,1-1.33,3.83L393.69,703.3h-11.5a6.14,6.14,0,0,1,.93-6L521.49,523.49a5.89,5.89,0,0,1,8.39-.88A6.1,6.1,0,0,1,532.08,527.33Z"
></path><path
class="cls-4"
d="M494.52,527.33a6.14,6.14,0,0,1-1.34,3.83l-137,172.14h-11.5a6.16,6.16,0,0,1,.92-6L483.92,523.49a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,494.52,527.33Z"
></path><path
class="cls-4"
d="M457,527.33a6.17,6.17,0,0,1-1.33,3.83L318.56,703.3h-1.72V686.16L446.36,523.49a5.89,5.89,0,0,1,8.39-.88A6.1,6.1,0,0,1,457,527.33Z"
></path><path
class="cls-4"
d="M419.39,527.33a6.14,6.14,0,0,1-1.34,3.83L315.12,660.45H299.75l109-137a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,419.39,527.33Z"
></path><polygon
class="cls-4"
points="279.45 658.06 277.55 660.45 270.76 660.45 270.76 658.06 279.45 658.06"
></polygon><path
class="cls-4"
d="M381.83,527.33a6.14,6.14,0,0,1-1.34,3.83l-67.7,85v-19.3l58.44-73.4a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,381.83,527.33Z"
></path><path
class="cls-4"
d="M344.26,527.33a6.14,6.14,0,0,1-1.34,3.83L312.79,569v-19.3l20.87-26.22a5.89,5.89,0,0,1,8.39-.88A6.11,6.11,0,0,1,344.26,527.33Z"
></path><path
class="cls-2"
d="M422.78,253.73,430.69,243a3.83,3.83,0,0,1,3.07-1.55h75.52a3.8,3.8,0,0,1,3.22,1.78l6.64,10.51"
></path><path
class="cls-5"
d="M312.71,327.38a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="326.03" r="8.36"></circle><path
class="cls-7"
d="M312.71,327.38a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,326a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V317.71a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,326Z"
></path><path
class="cls-5"
d="M312.71,362.54a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="361.19" r="8.36"></circle><path
class="cls-7"
d="M312.71,362.54a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,361.19a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V352.87a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,361.19Z"
></path><path
class="cls-5"
d="M312.71,397.7a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84V385c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="396.35" r="8.36"></circle><path
class="cls-7"
d="M312.71,397.7a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84V385c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,396.35a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V388a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,396.35Z"
></path><path
class="cls-5"
d="M312.71,432.85A11.38,11.38,0,0,1,293.85,440a3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="431.5" r="8.36"></circle><path
class="cls-7"
d="M312.71,432.85A11.38,11.38,0,0,1,293.85,440a3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,431.5a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V423.18a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,431.5Z"
></path><path
class="cls-5"
d="M312.71,468a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62A11.39,11.39,0,0,1,312.71,468Z"
></path><circle class="cls-6" cx="301.4" cy="466.66" r="8.36"></circle><path
class="cls-7"
d="M312.71,468a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62A11.39,11.39,0,0,1,312.71,468Z"
></path><path
class="cls-6"
d="M279.92,466.66a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V458.34a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,466.66Z"
></path><path
class="cls-5"
d="M312.71,503.17a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="501.82" r="8.36"></circle><path
class="cls-7"
d="M312.71,503.17a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,501.82a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V493.5a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,501.82Z"
></path><path
class="cls-5"
d="M312.71,538.32a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="536.97" r="8.36"></circle><path
class="cls-7"
d="M312.71,538.32a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,537a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V528.65a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,537Z"
></path><path
class="cls-5"
d="M312.71,573.48a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="572.13" r="8.36"></circle><path
class="cls-7"
d="M312.71,573.48a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,572.13a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V563.81a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,572.13Z"
></path><path
class="cls-5"
d="M312.71,608.63a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><circle class="cls-6" cx="301.4" cy="607.28" r="8.36"></circle><path
class="cls-7"
d="M312.71,608.63a11.38,11.38,0,0,1-18.86,7.16,3.51,3.51,0,0,0-2.33-.89H281.45a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62H292a2.31,2.31,0,0,0,1.6-.62,11.39,11.39,0,0,1,19.16,9.59Z"
></path><path
class="cls-6"
d="M279.92,607.28a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V599a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,607.28Z"
></path><path
class="cls-5"
d="M312.24,632.92v19a1.86,1.86,0,0,1-1.86,1.86H293a1.86,1.86,0,0,1-1.86-1.86v-1.9h-9.73a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62h10.16v-1.9a1.86,1.86,0,0,1,1.86-1.86h17.34A1.86,1.86,0,0,1,312.24,632.92Z"
></path><circle class="cls-6" cx="301.4" cy="642.44" r="8.36"></circle><path
class="cls-6"
d="M279.92,642.44a8.36,8.36,0,0,1-8.36,8.36,7,7,0,0,1-.8,0V634.12a7,7,0,0,1,.8,0A8.36,8.36,0,0,1,279.92,642.44Z"
></path><circle
class="cls-4"
cx="292.92"
cy="279.53"
r="10.92"
></circle><circle
class="cls-7"
cx="292.92"
cy="279.53"
r="10.92"
></circle><path
class="cls-8"
d="M300.31,279.53a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,300.31,279.53Z"
></path><circle
class="cls-4"
cx="653.25"
cy="279.53"
r="10.92"
></circle><circle
class="cls-7"
cx="653.25"
cy="279.53"
r="10.92"
></circle><path
class="cls-8"
d="M660.64,279.53a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0v-2.62h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,660.64,279.53Z"
></path><circle
class="cls-4"
cx="292.92"
cy="680.59"
r="10.92"
></circle><circle
class="cls-7"
cx="292.92"
cy="680.59"
r="10.92"
></circle><path
class="cls-8"
d="M300.31,680.59a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V683h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,300.31,680.59Z"
></path><circle
class="cls-4"
cx="653.25"
cy="680.59"
r="10.92"
></circle><circle
class="cls-7"
cx="653.25"
cy="680.59"
r="10.92"
></circle><path
class="cls-8"
d="M660.64,680.59a2.39,2.39,0,0,1-2.38,2.38h-2.62v2.62a2.38,2.38,0,0,1-4.76,0V683h-2.62a2.39,2.39,0,1,1,0-4.77h2.62v-2.62a2.38,2.38,0,0,1,4.76,0v2.62h2.62A2.39,2.39,0,0,1,660.64,680.59Z"
></path><path
class="cls-7"
d="M270.76,658.06h33.53a8.5,8.5,0,0,0,8.5-8.5V320.42a8.5,8.5,0,0,0-8.5-8.5H270.76"
></path><path
class="cls-7"
d="M332.38,260.33v22.86a8.34,8.34,0,0,0,2.44,5.9l22.07,22.07a8.34,8.34,0,0,0,5.9,2.44h52.87A3.44,3.44,0,0,1,419.1,317v2.19a3.44,3.44,0,0,1-3.44,3.44H356.61a8.34,8.34,0,0,1-5.9-2.44l-26-26a8.34,8.34,0,0,1-2.44-5.9v-28"
></path><path
class="cls-7"
d="M614.66,260.33v22.86a8.31,8.31,0,0,1-2.45,5.9l-22.06,22.07a5.22,5.22,0,0,1-.43.39l-.05,0a1.92,1.92,0,0,1-.32.26,4.29,4.29,0,0,1-.55.4h0c-.16.1-.31.2-.47.28a2.21,2.21,0,0,1-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.35,4.35,0,0,1-.52.06c-.23,0-.45,0-.68,0H531.38a3.44,3.44,0,0,0-3.44,3.44v2.19c0,.12,0,.24,0,.35a3.55,3.55,0,0,0,.08.47,1.7,1.7,0,0,0,.1.32.09.09,0,0,0,0,.05,1.42,1.42,0,0,0,.08.18s0,.11.08.17a.56.56,0,0,0,.09.17,2.05,2.05,0,0,0,.24.36h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37l.23.17a3.28,3.28,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0,.35,0h59a8.36,8.36,0,0,0,5.9-2.44l26-26a8.31,8.31,0,0,0,2.45-5.9v-28"
></path><path
class="cls-7"
d="M312.24,632.92v19a1.86,1.86,0,0,1-1.86,1.86H293a1.86,1.86,0,0,1-1.86-1.86v-1.9h-9.73a3.51,3.51,0,0,0-2.33.89,11.36,11.36,0,0,1-8.36,2.84v-22.7c.27,0,.53,0,.8,0a11.35,11.35,0,0,1,7.86,3.14,2.31,2.31,0,0,0,1.6.62h10.16v-1.9a1.86,1.86,0,0,1,1.86-1.86h17.34A1.86,1.86,0,0,1,312.24,632.92Z"
></path><path
class="cls-5"
d="M632,327.38a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,327.38Z"
></path><circle
class="cls-6"
cx="643.34"
cy="326.03"
r="8.36"
></circle><path
class="cls-7"
d="M632,327.38a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,327.38Z"
></path><path
class="cls-6"
d="M664.83,326a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V317.71a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,326Z"
></path><path
class="cls-5"
d="M632,362.54a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,362.54Z"
></path><circle
class="cls-6"
cx="643.34"
cy="361.19"
r="8.36"
></circle><path
class="cls-7"
d="M632,362.54a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,362.54Z"
></path><path
class="cls-6"
d="M664.83,361.19a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V352.87a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,361.19Z"
></path><path
class="cls-5"
d="M632,397.7a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,407.7V385c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,397.7Z"
></path><circle
class="cls-6"
cx="643.34"
cy="396.35"
r="8.36"
></circle><path
class="cls-7"
d="M632,397.7a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,407.7V385c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,397.7Z"
></path><path
class="cls-6"
d="M664.83,396.35a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V388a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,396.35Z"
></path><path
class="cls-5"
d="M632,432.85A11.38,11.38,0,0,0,650.9,440a3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,432.85Z"
></path><circle class="cls-6" cx="643.34" cy="431.5" r="8.36"></circle><path
class="cls-7"
d="M632,432.85A11.38,11.38,0,0,0,650.9,440a3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,432.85Z"
></path><path
class="cls-6"
d="M664.83,431.5a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V423.18a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,431.5Z"
></path><path
class="cls-5"
d="M632,468a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,478v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,468Z"
></path><circle
class="cls-6"
cx="643.34"
cy="466.66"
r="8.36"
></circle><path
class="cls-7"
d="M632,468a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89A11.36,11.36,0,0,0,674,478v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,468Z"
></path><path
class="cls-6"
d="M664.83,466.66a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V458.34a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,466.66Z"
></path><path
class="cls-5"
d="M632,503.17a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,503.17Z"
></path><circle
class="cls-6"
cx="643.34"
cy="501.82"
r="8.36"
></circle><path
class="cls-7"
d="M632,503.17a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,503.17Z"
></path><path
class="cls-6"
d="M664.83,501.82a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V493.5a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,501.82Z"
></path><path
class="cls-5"
d="M632,538.32a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,538.32Z"
></path><circle
class="cls-6"
cx="643.34"
cy="536.97"
r="8.36"
></circle><path
class="cls-7"
d="M632,538.32a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,538.32Z"
></path><path
class="cls-6"
d="M664.83,537a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V528.65a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,537Z"
></path><path
class="cls-5"
d="M632,573.48a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,573.48Z"
></path><circle
class="cls-6"
cx="643.34"
cy="572.13"
r="8.36"
></circle><path
class="cls-7"
d="M632,573.48a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,573.48Z"
></path><path
class="cls-6"
d="M664.83,572.13a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V563.81a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,572.13Z"
></path><path
class="cls-5"
d="M632,608.63a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,608.63Z"
></path><circle
class="cls-6"
cx="643.34"
cy="607.28"
r="8.36"
></circle><path
class="cls-7"
d="M632,608.63a11.38,11.38,0,0,0,18.86,7.16,3.51,3.51,0,0,1,2.33-.89H663.3a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H652.8a2.31,2.31,0,0,1-1.6-.62A11.39,11.39,0,0,0,632,608.63Z"
></path><path
class="cls-6"
d="M664.83,607.28a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V599a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,607.28Z"
></path><path
class="cls-5"
d="M632.51,632.92v19a1.86,1.86,0,0,0,1.86,1.86h17.34a1.86,1.86,0,0,0,1.86-1.86v-1.9h9.73a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H653.57v-1.9a1.86,1.86,0,0,0-1.86-1.86H634.37A1.86,1.86,0,0,0,632.51,632.92Z"
></path><circle
class="cls-6"
cx="643.34"
cy="642.44"
r="8.36"
></circle><path
class="cls-6"
d="M664.83,642.44a8.36,8.36,0,0,0,8.36,8.36,7,7,0,0,0,.8,0V634.12a7,7,0,0,0-.8,0A8.36,8.36,0,0,0,664.83,642.44Z"
></path><path
class="cls-7"
d="M674,658.06H640.46a8.51,8.51,0,0,1-8.5-8.5V320.42a8.5,8.5,0,0,1,8.5-8.5H674"
></path><path
class="cls-7"
d="M632.51,632.92v19a1.86,1.86,0,0,0,1.86,1.86h17.34a1.86,1.86,0,0,0,1.86-1.86v-1.9h9.73a3.51,3.51,0,0,1,2.33.89,11.36,11.36,0,0,0,8.36,2.84v-22.7c-.27,0-.53,0-.8,0a11.35,11.35,0,0,0-7.86,3.14,2.31,2.31,0,0,1-1.6.62H653.57v-1.9a1.86,1.86,0,0,0-1.86-1.86H634.37A1.86,1.86,0,0,0,632.51,632.92Z"
></path><path
class="cls-7"
d="M674,267.08V696.56a6.75,6.75,0,0,1-6.75,6.74H277.51a6.62,6.62,0,0,1-1.95-.29,3.57,3.57,0,0,1-.46-.16,5.87,5.87,0,0,1-1.46-.78,3,3,0,0,1-.42-.31,4.17,4.17,0,0,1-.38-.34,5.77,5.77,0,0,1-.42-.44l0,0a3.25,3.25,0,0,1-.23-.29,3.43,3.43,0,0,1-.24-.33h0a3.15,3.15,0,0,1-.3-.48,1.71,1.71,0,0,1-.12-.23,2.7,2.7,0,0,1-.17-.34,2.44,2.44,0,0,1-.1-.24c-.05-.13-.1-.26-.14-.39a2,2,0,0,1-.07-.23c0-.13-.07-.27-.1-.41a1.55,1.55,0,0,1,0-.21,3.11,3.11,0,0,1-.07-.44,2.64,2.64,0,0,1,0-.28,4.36,4.36,0,0,1,0-.51V267.08a6.75,6.75,0,0,1,6.75-6.75h44.73v28a8.34,8.34,0,0,0,2.44,5.9l21,21,5,5a7.1,7.1,0,0,0,.71.63,5.09,5.09,0,0,0,.47.34l.19.13a3.78,3.78,0,0,0,.43.26,8.16,8.16,0,0,0,2.06.83l.61.13h0l.56.08H356q.33,0,.66,0h59.05a3.44,3.44,0,0,0,3.44-3.44V317a3.44,3.44,0,0,0-3.44-3.44H362.22a4.62,4.62,0,0,1-.65-.07h0q-.31,0-.63-.12a6.29,6.29,0,0,1-.62-.17l-.34-.11-.1,0-.36-.14-.51-.24-.18-.1a5.45,5.45,0,0,1-.66-.39,6.26,6.26,0,0,1-.66-.49,8,8,0,0,1-.61-.55l-22.07-22.07a6.89,6.89,0,0,1-.62-.7,6.55,6.55,0,0,1-.39-.53l-.06-.09c-.11-.16-.21-.34-.31-.51s-.1-.17-.14-.26a5.59,5.59,0,0,1-.38-.87,6.69,6.69,0,0,1-.31-1,5.35,5.35,0,0,1-.11-.55v-.06c0-.22-.06-.44-.08-.66s0-.45,0-.68V260.33H614.66v22.86a8.31,8.31,0,0,1-2.45,5.9l-22.06,22.07a5.22,5.22,0,0,1-.43.39l-.05,0-.32.26a4.29,4.29,0,0,1-.55.4h0c-.16.1-.31.2-.47.28s-.22.13-.34.18l0,0-.12.06-.11.05-.07,0-.35.15-.08,0-.12,0-.38.13-.64.17-.56.1h0a4.6,4.6,0,0,1-.52.06c-.23,0-.45,0-.68,0H531.38a3.44,3.44,0,0,0-3.44,3.44v2.19c0,.12,0,.24,0,.35a3.55,3.55,0,0,0,.08.47,1.7,1.7,0,0,0,.1.32.09.09,0,0,0,0,.05,1.42,1.42,0,0,0,.08.18s0,.11.08.17a.91.91,0,0,0,.09.17,2.05,2.05,0,0,0,.24.36h0a.94.94,0,0,0,.09.12.52.52,0,0,0,.1.11,2.72,2.72,0,0,0,.39.37,1.24,1.24,0,0,0,.23.17,4.08,4.08,0,0,0,.58.32h0l.19.07a1.58,1.58,0,0,0,.31.09l.23.05.23,0,.35,0h59a8.36,8.36,0,0,0,5.9-2.44l26-26a8.31,8.31,0,0,0,2.45-5.9v-28h42.44a4.58,4.58,0,0,1,.53,0l.35,0a1.19,1.19,0,0,1,.32.05,3,3,0,0,1,.52.11l.57.18a.17.17,0,0,1,.1,0l.37.16a2.6,2.6,0,0,1,.34.16.72.72,0,0,1,.19.11,4.09,4.09,0,0,1,.48.29,5.2,5.2,0,0,1,.47.35l.09.06.44.41c.15.15.3.31.44.48a5,5,0,0,1,.39.52q.15.22.3.48a.27.27,0,0,0,.06.1c.06.12.12.25.17.38a3.79,3.79,0,0,1,.18.42,3.57,3.57,0,0,1,.16.46A6.82,6.82,0,0,1,674,267.08Z"
></path><rect
class="cls-5"
x="434.83"
y="246.4"
width="3.3"
height="7.33"
></rect><rect
class="cls-5"
x="453.81"
y="246.4"
width="3.3"
height="7.33"
></rect><rect
class="cls-5"
x="488.83"
y="246.4"
width="3.3"
height="7.33"
></rect><rect
class="cls-5"
x="507.81"
y="246.4"
width="3.3"
height="7.33"
></rect><path
class="cls-9"
d="M413.29,253.73H530.14a1.51,1.51,0,0,1,1.51,1.51v5.09a0,0,0,0,1,0,0H411.78a0,0,0,0,1,0,0v-5.09A1.51,1.51,0,0,1,413.29,253.73Z"
></path><path
class="cls-7"
d="M413.29,253.73H530.14a1.51,1.51,0,0,1,1.51,1.51v5.09a0,0,0,0,1,0,0H411.78a0,0,0,0,1,0,0v-5.09A1.51,1.51,0,0,1,413.29,253.73Z"
></path><path
class="cls-7"
d="M422.78,253.73,430.69,243a3.83,3.83,0,0,1,3.07-1.55h75.52a3.8,3.8,0,0,1,3.22,1.78l6.64,10.51"
></path><path
class="cls-4"
d="M338.2,506.12V450h7.6V499.5h28.29v6.62Z"
></path><path class="cls-4" d="M384.43,506.12V450H392v56.13Z"></path><path
class="cls-4"
d="M405.12,506.12V450h7.6V499.5H441v6.62Z"
></path><path
class="cls-4"
d="M460.29,506.12V482.35L438.15,450h9.24l11.33,16.93q3.13,4.74,5.84,9.49,2.58-4.4,6.27-9.91L482,450h8.86l-22.92,32.36v23.77Z"
></path><path
class="cls-4"
d="M524.51,484.11v-6.59l24.33,0v20.83a43.38,43.38,0,0,1-11.56,6.57,35,35,0,0,1-12.23,2.2,33.22,33.22,0,0,1-15.37-3.54,23.71,23.71,0,0,1-10.44-10.24,31.56,31.56,0,0,1-3.53-15,34.06,34.06,0,0,1,3.51-15.3,23,23,0,0,1,10.08-10.55A32.22,32.22,0,0,1,524.47,449a30.52,30.52,0,0,1,11.26,2,18.62,18.62,0,0,1,7.9,5.49,24.34,24.34,0,0,1,4.35,9.19l-6.86,1.84a20.45,20.45,0,0,0-3.21-6.74,13.16,13.16,0,0,0-5.49-3.92,20.38,20.38,0,0,0-7.91-1.48,23.82,23.82,0,0,0-9,1.55,17,17,0,0,0-6.14,4.08,19.44,19.44,0,0,0-3.62,5.55,28.86,28.86,0,0,0-2.2,11.3,26.93,26.93,0,0,0,2.65,12.56,16.74,16.74,0,0,0,7.7,7.5,24.34,24.34,0,0,0,10.73,2.45,25.94,25.94,0,0,0,9.64-1.86,25.09,25.09,0,0,0,7.13-4V484.11Z"
></path><path
class="cls-4"
d="M557.73,478.79q0-14,7.68-21.89t19.83-7.9a28.07,28.07,0,0,1,14.34,3.71,24.45,24.45,0,0,1,9.73,10.36,32.91,32.91,0,0,1,3.35,15.06,32.44,32.44,0,0,1-3.52,15.28,23.85,23.85,0,0,1-10,10.21,29.07,29.07,0,0,1-13.95,3.46,27.68,27.68,0,0,1-14.5-3.83A24.89,24.89,0,0,1,561,492.8,31.15,31.15,0,0,1,557.73,478.79Zm7.84.11q0,10.16,5.58,16a19.81,19.81,0,0,0,28.13-.06q5.55-5.9,5.55-16.73a28.22,28.22,0,0,0-2.37-12,17.83,17.83,0,0,0-6.94-7.92,19.09,19.09,0,0,0-10.24-2.82,19.69,19.69,0,0,0-13.89,5.42Q565.57,466.23,565.57,478.9Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

294
packages/web/public/devices/tlora-t3s3-epaper.svg

@ -0,0 +1,294 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="546.5 262.94 1017.99 1044.37">
<defs><style>
.cls-1 {
fill: #383838;
}
.cls-2 {
fill: #9f9f9e;
}
.cls-3 {
fill: #cbcccb;
}
.cls-4 {
fill: #b7b7b7;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #b1a368;
}
.cls-7 {
fill: #2c2d2d;
}
.cls-10, .cls-11, .cls-8, .cls-9 {
fill: none;
stroke: #050606;
}
.cls-10, .cls-11, .cls-8 {
stroke-miterlimit: 10;
}
.cls-8, .cls-9 {
stroke-width: 2px;
}
.cls-9 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-10 {
stroke-width: 2.04px;
}
.cls-11 {
stroke-width: 1.99px;
}
.cls-12 {
fill: #c08c2d;
}
.cls-13 {
fill: #af7a2b;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><rect
class="cls-1"
x="625.5"
y="879.33"
width="29.53"
height="404.5"
></rect><polyline
class="cls-2"
points="1542.78 1109.71 1563.49 1109.71 1563.49 1242.3 1542.78 1242.3"
></polyline><path
class="cls-2"
d="M1542.78,895.89h4.69a5.67,5.67,0,0,1,5.67,5.67v84.65a5.67,5.67,0,0,1-5.67,5.67h-4.69"
></path><rect
class="cls-3"
x="645.26"
y="865.2"
width="897.52"
height="441.11"
rx="11.7"
></rect><path
class="cls-2"
d="M678.73,865.2V978.68a3.67,3.67,0,0,0,3.67,3.67h41a2.35,2.35,0,0,1,2.35,2.35v321.61h789.46V865.2Zm811.52,416.11H750.79V974.41a17.06,17.06,0,0,0-17.06-17.06h-27.5a2.5,2.5,0,0,1-2.5-2.5V892.7a2.5,2.5,0,0,1,2.5-2.5h784Z"
></path><path
class="cls-3"
d="M1490.25,890.2v391.11H750.79V974.41a17,17,0,0,0-7.2-13.92V890.2Z"
></path><path
class="cls-4"
d="M743.59,890.2v70.29a17,17,0,0,0-9.86-3.14h-27.5a2.5,2.5,0,0,1-2.5-2.5V892.7a2.5,2.5,0,0,1,2.5-2.5Z"
></path><rect
class="cls-2"
x="669.71"
y="1013.84"
width="13.53"
height="148.4"
></rect><path
class="cls-5"
d="M572,871.09a24.48,24.48,0,0,0-24.48,24.48V960.5h23.89v28.71L592,967h44.49V871.09Zm20,70.58a13.44,13.44,0,1,1,13.43-13.43A13.43,13.43,0,0,1,592,941.67Z"
></path><path
class="cls-5"
d="M576.85,1186.92h59.64v102.83H572a24.48,24.48,0,0,1-24.48-24.48v-60.92h23.89v-25.68Z"
></path><rect
class="cls-6"
x="1266.59"
y="750.8"
width="103.92"
height="64.66"
rx="3.93"
></rect><path
class="cls-6"
d="M1283.29,856.16H1355a2.55,2.55,0,0,1,2.55,2.55v6.48a0,0,0,0,1,0,0h-76.8a0,0,0,0,1,0,0v-6.48A2.55,2.55,0,0,1,1283.29,856.16Z"
></path><path
class="cls-6"
d="M1271.86,815.46h92.43a0,0,0,0,1,0,0v28.12a2.55,2.55,0,0,1-2.55,2.55h-87.32a2.55,2.55,0,0,1-2.55-2.55V815.46A0,0,0,0,1,1271.86,815.46Z"
></path><rect
class="cls-6"
x="1285.94"
y="846.13"
width="65.99"
height="10.03"
></rect><polyline
class="cls-6"
points="1359.86 750.8 1359.86 746.51 1277.14 746.51 1277.14 750.8"
></polyline><path
class="cls-1"
d="M1318.55,263.94h0a44,44,0,0,1,44,44V746.51a0,0,0,0,1,0,0h-88a0,0,0,0,1,0,0V308a44,44,0,0,1,44-44Z"
></path><rect
class="cls-7"
x="1274.53"
y="328.62"
width="88.04"
height="5.99"
></rect><rect
class="cls-7"
x="1274.53"
y="355.81"
width="88.04"
height="5.99"
></rect><path
class="cls-8"
d="M1490.25,890.2v391.11H750.79V974.41a17.06,17.06,0,0,0-17.06-17.06h-27.5a2.5,2.5,0,0,1-2.5-2.5V892.7a2.5,2.5,0,0,1,2.5-2.5h784m25-25H678.73V978.68a3.68,3.68,0,0,0,3.67,3.67h41a2.35,2.35,0,0,1,2.35,2.35v321.61h789.46V865.2Z"
></path><line
class="cls-8"
x1="743.6"
y1="960.49"
x2="743.6"
y2="890.2"
></line><rect
class="cls-8"
x="669.71"
y="1013.84"
width="13.53"
height="148.4"
></rect><path
class="cls-9"
d="M636.49,871.09V967H592l-20.61,22.25V960.5H547.5V895.57A24.48,24.48,0,0,1,572,871.09Z"
></path><path
class="cls-9"
d="M576.85,1186.92h59.64v102.83H572a24.48,24.48,0,0,1-24.48-24.48v-60.92h23.89v-25.68Z"
></path><circle
class="cls-9"
cx="592"
cy="1258.1"
r="13.44"
></circle><circle
class="cls-9"
cx="592"
cy="928.24"
r="13.44"
></circle><line
class="cls-9"
x1="571.39"
y1="960.5"
x2="636.49"
y2="960.5"
></line><line
class="cls-9"
x1="571.39"
y1="1204.35"
x2="636.49"
y2="1204.35"
></line><polyline
class="cls-8"
points="1542.78 1109.71 1563.49 1109.71 1563.49 1242.3 1542.78 1242.3"
></polyline><path
class="cls-8"
d="M1542.78,895.89h4.69a5.67,5.67,0,0,1,5.67,5.67v84.65a5.67,5.67,0,0,1-5.67,5.67h-4.69"
></path><path
class="cls-8"
d="M1318.55,263.94h0a44,44,0,0,1,44,44V746.51a0,0,0,0,1,0,0h-88a0,0,0,0,1,0,0V308a44,44,0,0,1,44-44Z"
></path><rect
class="cls-10"
x="1266.59"
y="750.8"
width="103.92"
height="64.66"
rx="3.93"
></rect><path
class="cls-10"
d="M1283.29,856.16H1355a2.55,2.55,0,0,1,2.55,2.55v6.48a0,0,0,0,1,0,0h-76.8a0,0,0,0,1,0,0v-6.48A2.55,2.55,0,0,1,1283.29,856.16Z"
></path><path
class="cls-10"
d="M1271.86,815.46h92.43a0,0,0,0,1,0,0v28.12a2.55,2.55,0,0,1-2.55,2.55h-87.32a2.55,2.55,0,0,1-2.55-2.55V815.46A0,0,0,0,1,1271.86,815.46Z"
></path><rect
class="cls-11"
x="1285.94"
y="846.13"
width="65.99"
height="10.03"
></rect><polyline
class="cls-10"
points="1359.86 750.8 1359.86 746.51 1277.14 746.51 1277.14 750.8"
></polyline><rect
class="cls-10"
x="1274.53"
y="328.62"
width="88.04"
height="5.99"
></rect><rect
class="cls-10"
x="1274.53"
y="355.81"
width="88.04"
height="5.99"
></rect><path
class="cls-2"
d="M722.88,912.78a14,14,0,1,0,14,14A13.95,13.95,0,0,0,722.88,912.78Zm0,21.5a7.55,7.55,0,1,1,7.54-7.55A7.55,7.55,0,0,1,722.88,934.28Z"
></path><circle
class="cls-8"
cx="722.88"
cy="926.73"
r="7.55"
></circle><circle
class="cls-8"
cx="722.88"
cy="926.73"
r="13.95"
></circle><polyline
class="cls-12"
points="645.26 1186.92 636.49 1186.92 576.85 1186.92 571.39 1178.67 562.49 1178.67 562.49 989.21 571.39 989.21 592 966.96 636.49 966.96 645.26 966.96"
></polyline><line
class="cls-8"
x1="636.49"
y1="1283.83"
x2="645.26"
y2="1283.83"
></line><line
class="cls-8"
x1="636.49"
y1="879.33"
x2="645.26"
y2="879.33"
></line><rect
class="cls-13"
x="562.49"
y="1120.88"
width="82.77"
height="10.25"
></rect><rect
class="cls-13"
x="562.49"
y="1095.19"
width="82.77"
height="1.15"
></rect><rect
class="cls-13"
x="562.49"
y="1038.19"
width="82.77"
height="4.3"
></rect><rect
class="cls-13"
x="562.49"
y="1013.84"
width="82.51"
height="2.29"
></rect><rect
class="cls-13"
x="562.49"
y="999.23"
width="82.77"
height="4.58"
></rect><rect
class="cls-13"
x="562.49"
y="1065.4"
width="82.77"
height="6.02"
></rect><rect
class="cls-13"
x="563.65"
y="1155.63"
width="81.61"
height="6.61"
></rect><polyline
class="cls-9"
points="645.26 1186.92 636.49 1186.92 576.85 1186.92 571.39 1178.67 562.49 1178.67 562.49 989.21 571.39 989.21 592 966.96 636.49 966.96 645.26 966.96"
></polyline><rect
class="cls-8"
x="645.26"
y="865.2"
width="897.52"
height="441.11"
rx="11.7"
></rect></g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

1311
packages/web/public/devices/tlora-t3s3-v1.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 38 KiB

1237
packages/web/public/devices/tlora-v2-1-1_6.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 33 KiB

1237
packages/web/public/devices/tlora-v2-1-1_8.svg

File diff suppressed because it is too large

After

Width:  |  Height:  |  Size: 33 KiB

441
packages/web/public/devices/tracker-t1000-e.svg

@ -0,0 +1,441 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="667.51 476.78 664.98 1035.52">
<defs><style>
.cls-1 {
fill: #333;
}
.cls-11, .cls-15, .cls-16, .cls-17, .cls-2, .cls-4 {
fill: #cbcccb;
}
.cls-2 {
opacity: 0.49;
}
.cls-3 {
fill: #dfac52;
}
.cls-4 {
opacity: 0.33;
}
.cls-5, .cls-9 {
fill: #373838;
}
.cls-10, .cls-13, .cls-6, .cls-7, .cls-8 {
fill: none;
stroke-miterlimit: 10;
}
.cls-10, .cls-6, .cls-7 {
stroke: #050606;
}
.cls-6 {
stroke-width: 2.34px;
}
.cls-7, .cls-8 {
stroke-width: 2.41px;
}
.cls-8 {
stroke: #fff;
}
.cls-9 {
opacity: 0.43;
}
.cls-10 {
stroke-width: 2.1px;
}
.cls-12 {
fill: #fff;
}
.cls-13 {
stroke: #dfac52;
stroke-width: 1.26px;
}
.cls-14 {
fill: #b7802b;
}
.cls-15 {
opacity: 0.5;
}
.cls-16 {
opacity: 0.44;
}
.cls-17 {
opacity: 0.19;
}
</style></defs><g id="Layer_7" data-name="Layer 7"><path
class="cls-1"
d="M1273.43,478H726.56a57.85,57.85,0,0,0-57.84,57.86v917.4a57.85,57.85,0,0,0,57.84,57.85h546.87a57.86,57.86,0,0,0,57.86-57.85V535.85A57.87,57.87,0,0,0,1273.43,478Zm-180.85,58.15a17.73,17.73,0,0,1-12.6,5.22H921.92a17.83,17.83,0,0,1,0-35.65H1080a17.83,17.83,0,0,1,12.6,30.43Z"
></path><path
class="cls-2"
d="M1275.46,490.32H724.6A43.64,43.64,0,0,0,681,534v921.2a43.65,43.65,0,0,0,43.64,43.63h550.86a43.63,43.63,0,0,0,43.63-43.63V534A43.63,43.63,0,0,0,1275.46,490.32Zm-182.88,45.82a17.73,17.73,0,0,1-12.6,5.22H921.92a17.83,17.83,0,0,1,0-35.65H1080a17.83,17.83,0,0,1,12.6,30.43Z"
></path><rect
class="cls-3"
x="1226.45"
y="1082.09"
width="61.6"
height="368.92"
rx="12.69"
></rect><rect
class="cls-4"
x="699.17"
y="1071.28"
width="599.02"
height="391.54"
rx="14.88"
></rect><rect
class="cls-2"
x="716.37"
y="1082.09"
width="497.34"
height="368.92"
rx="20.68"
></rect><path
class="cls-3"
d="M1112.31,1112.18A119.83,119.83,0,1,1,992.49,992.34,119.83,119.83,0,0,1,1112.31,1112.18Z"
></path><circle
class="cls-2"
cx="992.48"
cy="1112.18"
r="150.8"
></circle><path
class="cls-5"
d="M992.48,1000.79a111.39,111.39,0,1,0,111.38,111.39A111.39,111.39,0,0,0,992.48,1000.79Zm0,199.64a88.26,88.26,0,1,1,88.25-88.25A88.26,88.26,0,0,1,992.48,1200.43Z"
></path><path
class="cls-3"
d="M1080.73,1112.18a88.25,88.25,0,1,1-88.25-88.26A88.26,88.26,0,0,1,1080.73,1112.18Z"
></path><rect
class="cls-6"
x="680.97"
y="490.32"
width="638.12"
height="1008.46"
rx="43.63"
></rect><rect
class="cls-7"
x="668.71"
y="477.99"
width="662.57"
height="1033.11"
rx="57.85"
></rect><circle
class="cls-8"
cx="992.48"
cy="1112.18"
r="150.8"
></circle><circle
class="cls-9"
cx="1000"
cy="702.01"
r="103.21"
></circle><circle
class="cls-8"
cx="1000"
cy="702.01"
r="117.37"
></circle><path
class="cls-7"
d="M992.48,1000.79a111.39,111.39,0,1,0,111.38,111.39A111.39,111.39,0,0,0,992.48,1000.79Zm0,199.64a88.26,88.26,0,1,1,88.25-88.25A88.26,88.26,0,0,1,992.48,1200.43Z"
></path><rect
class="cls-10"
x="904.09"
y="505.72"
width="193.71"
height="35.64"
rx="17.82"
></rect><path
class="cls-7"
d="M1080.73,1112.18a88.25,88.25,0,1,1-88.25-88.26A88.26,88.26,0,0,1,1080.73,1112.18Z"
></path><circle
class="cls-11"
cx="1000"
cy="928.96"
r="63.38"
></circle><circle
class="cls-12"
cx="1000"
cy="928.96"
r="35.27"
></circle><circle
class="cls-3"
cx="1000"
cy="702.01"
r="25.23"
></circle><rect
class="cls-13"
x="965.08"
y="672.02"
width="68.35"
height="59.63"
rx="4.15"
></rect><circle
class="cls-11"
cx="973.01"
cy="680.85"
r="5.69"
></circle><circle
class="cls-11"
cx="973.01"
cy="723.01"
r="5.69"
></circle><circle
class="cls-11"
cx="1026.01"
cy="680.85"
r="5.69"
></circle><circle
class="cls-11"
cx="1026.01"
cy="723.01"
r="5.69"
></circle><rect
class="cls-14"
x="996.04"
y="690.54"
width="6.43"
height="22.58"
transform="translate(1701.09 -297.42) rotate(90)"
></rect><rect
class="cls-14"
x="996.04"
y="690.54"
width="6.43"
height="22.58"
></rect><circle
class="cls-3"
cx="833.1"
cy="678.6"
r="6.37"
></circle><circle
class="cls-3"
cx="833.1"
cy="747.04"
r="6.37"
></circle><circle
class="cls-3"
cx="833.1"
cy="709.01"
r="6.37"
></circle><circle
class="cls-3"
cx="1194.88"
cy="684.17"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="781.82"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="813.01"
r="6.37"
></circle><circle
class="cls-3"
cx="1207.62"
cy="831.46"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="844.2"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="875.38"
r="6.37"
></circle><circle
class="cls-3"
cx="1248.54"
cy="906.57"
r="6.37"
></circle><circle
class="cls-3"
cx="1063.37"
cy="869.03"
r="6.37"
></circle><circle
class="cls-3"
cx="820.36"
cy="856"
r="6.37"
></circle><circle
class="cls-3"
cx="910.6"
cy="915.24"
r="6.37"
></circle><circle
class="cls-3"
cx="839.47"
cy="880.73"
r="6.37"
></circle><circle
class="cls-3"
cx="870.09"
cy="928.96"
r="6.37"
></circle><circle
class="cls-3"
cx="870.09"
cy="764.54"
r="6.37"
></circle><circle
class="cls-3"
cx="894.78"
cy="791"
r="6.37"
></circle><circle
class="cls-3"
cx="826.73"
cy="915.24"
r="6.37"
></circle><circle
class="cls-3"
cx="820.36"
cy="883.42"
r="6.37"
></circle><circle
class="cls-3"
cx="872.65"
cy="684.17"
r="6.37"
></circle><circle
class="cls-3"
cx="855.71"
cy="775.45"
r="6.37"
></circle><circle
class="cls-3"
cx="1136.91"
cy="784.63"
r="6.37"
></circle><circle
class="cls-3"
cx="1182.14"
cy="902.5"
r="6.37"
></circle><circle
class="cls-3"
cx="1205.52"
cy="877.05"
r="6.37"
></circle><circle
class="cls-3"
cx="1194.88"
cy="762.71"
r="6.37"
></circle><circle
class="cls-3"
cx="1211.89"
cy="784.63"
r="6.37"
></circle><rect
class="cls-11"
x="888.41"
y="819.38"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="1130.54"
y="917.04"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="896.58"
y="874.81"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="1112.8"
y="839.63"
width="9.14"
height="9.14"
></rect><rect
class="cls-11"
x="1166.63"
y="814.81"
width="9.14"
height="9.14"
></rect><circle
class="cls-5"
cx="788.67"
cy="598.8"
r="12.53"
></circle><circle
class="cls-5"
cx="1188.51"
cy="558.44"
r="12.53"
></circle><circle
class="cls-5"
cx="1201.25"
cy="994.55"
r="12.53"
></circle><circle
class="cls-5"
cx="763.86"
cy="961.38"
r="12.53"
></circle><polygon
class="cls-15"
points="747.85 637.69 747.85 921.61 705.73 921.61 705.73 637.69 723.33 637.69 723.33 896.12 731.42 896.12 731.42 637.69 747.85 637.69"
></polygon><rect
class="cls-5"
x="716.37"
y="1462.82"
width="183.41"
height="10.76"
></rect><rect
class="cls-5"
x="1080.73"
y="1462.82"
width="62.55"
height="10.76"
></rect><rect
class="cls-16"
x="784.29"
y="632.6"
width="4.38"
height="391.32"
></rect><rect
class="cls-16"
x="1219.52"
y="632.6"
width="4.38"
height="391.32"
></rect><rect
class="cls-3"
x="752.71"
y="871.99"
width="11.15"
height="41.04"
></rect><rect
class="cls-3"
x="802.25"
y="935.33"
width="7.3"
height="18.13"
></rect><rect
class="cls-3"
x="799.82"
y="1010.51"
width="4.76"
height="4.76"
></rect><rect
class="cls-3"
x="831.13"
y="994.55"
width="6.25"
height="6.25"
></rect><rect
class="cls-11"
x="813.99"
y="1099.67"
width="6.37"
height="323.31"
></rect><path
class="cls-17"
d="M1275.46,490.32H724.6A43.64,43.64,0,0,0,681,534v921.2a43.65,43.65,0,0,0,43.64,43.63h550.86a43.63,43.63,0,0,0,43.63-43.63V534A43.63,43.63,0,0,0,1275.46,490.32Zm-182.88,45.82a17.73,17.73,0,0,1-12.6,5.22H921.92a17.83,17.83,0,0,1,0-35.65H1080a17.83,17.83,0,0,1,12.6,30.43Z"
></path></g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

242
packages/web/public/devices/unknown.svg

@ -0,0 +1,242 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
class="svg-icon"
style="overflow: hidden; fill: currentColor"
viewBox="0 0 909.87988 546.85529"
version="1.1"
id="svg3"
xml:space="preserve"
width="909.87988"
height="546.85529"
sodipodi:docname="unknown.svg"
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
>
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.57169944"
inkscape:cx="291.23695"
inkscape:cy="107.57401"
inkscape:window-width="1472"
inkscape:window-height="890"
inkscape:window-x="0"
inkscape:window-y="38"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_7"
/><defs
id="defs3"
><style
id="style1"
>
.cls-1 {
fill: #383838;
}
.cls-2 {
fill: #9f9f9e;
}
.cls-3 {
fill: #cbcccb;
}
.cls-4 {
fill: #b7b7b7;
}
.cls-5 {
fill: #353535;
}
.cls-6 {
fill: #b1a368;
}
.cls-7 {
fill: #2c2d2d;
}
.cls-10, .cls-11, .cls-8, .cls-9 {
fill: none;
stroke: #050606;
}
.cls-10, .cls-11, .cls-8 {
stroke-miterlimit: 10;
}
.cls-8, .cls-9 {
stroke-width: 2px;
}
.cls-9 {
stroke-linecap: round;
stroke-linejoin: round;
}
.cls-10 {
stroke-width: 2.04px;
}
.cls-11 {
stroke-width: 1.99px;
}
.cls-12 {
fill: #c08c2d;
}
.cls-13 {
fill: #af7a2b;
}
</style></defs><g
id="Layer_7"
data-name="Layer 7"
transform="translate(-646.6554,-758.05941)"
><path
class="cls-2"
d="m 1545.1753,893.49468 h 4.69 a 5.67,5.67 0 0 1 5.67,5.67 v 84.64998 a 5.67,5.67 0 0 1 -5.67,5.67 h -4.69"
id="path1-4"
/><rect
class="cls-3"
x="647.6554"
y="862.80469"
width="897.52002"
height="441.10999"
rx="11.7"
id="rect2"
/><path
class="cls-2"
d="m 681.12532,862.80468 v 113.47998 a 3.67,3.67 0 0 0 3.67,3.67 h 41 a 2.35,2.35 0 0 1 2.35,2.35 V 1303.9147 H 1517.6053 V 862.80468 Z M 1492.6453,1278.9147 H 753.18532 V 972.01466 a 17.06,17.06 0 0 0 -17.06,-17.06 h -27.5 a 2.5,2.5 0 0 1 -2.5,-2.5 v -62.14998 a 2.5,2.5 0 0 1 2.5,-2.5 h 783.99998 z"
id="path2-7"
/><path
class="cls-3"
d="M 1492.6453,887.80468 V 1278.9147 H 753.18532 V 972.01466 a 17,17 0 0 0 -7.2,-13.92 v -70.28998 z"
id="path3-7"
style="fill: #ffffff"
/><path
class="cls-4"
d="m 745.98532,887.80468 v 70.28998 a 17,17 0 0 0 -9.86,-3.14 h -27.5 a 2.5,2.5 0 0 1 -2.5,-2.5 v -62.14998 a 2.5,2.5 0 0 1 2.5,-2.5 z"
id="path4"
/><rect
class="cls-2"
x="672.10535"
y="1011.4448"
width="13.53"
height="148.39999"
id="rect4"
/><path
class="cls-6"
d="m 1077.2923,853.76468 h 71.71 a 2.55,2.55 0 0 1 2.55,2.55 v 6.48 h -76.8 v -6.48 a 2.55,2.55 0 0 1 2.54,-2.55 z"
id="path7"
/><path
class="cls-8"
d="m 1082.9205,761.22647 h 60.8838 a 6.1958134,4.8451518 0 0 1 6.1958,4.84516 v 77.32638 h -73.2754 v -77.32638 a 6.1958134,4.8451518 0 0 1 6.1958,-4.84516 z"
id="path39"
style="fill: #b1a368"
/><rect
class="cls-8"
x="1066.9833"
y="778.19855"
width="91.504646"
height="55.957298"
rx="5.5511622"
id="rect39"
style="fill: #b1a368"
/><path
class="cls-2"
d="m 1158.4522,782.53954 v 47.24724 a 5.5153484,4.3130254 0 0 1 -5.5512,4.34102 h -80.3665 a 5.5511623,4.341032 0 0 1 -5.587,-4.34102 v -47.24724 a 5.5511623,4.341032 0 0 1 5.587,-4.34103 h 80.5098 a 5.5153484,4.3130254 0 0 1 5.4079,4.34103 z"
id="path41-4"
style="fill: none; stroke: #050606; stroke-width: 3.16706; stroke-miterlimit: 10"
/><rect
class="cls-6"
x="1079.9424"
y="843.73468"
width="65.989998"
height="10.03"
id="rect8"
/><path
class="cls-8"
d="M 1492.6453,887.80468 V 1278.9147 H 753.18532 V 972.01466 a 17.06,17.06 0 0 0 -17.06,-17.06 h -27.5 a 2.5,2.5 0 0 1 -2.5,-2.5 v -62.14998 a 2.5,2.5 0 0 1 2.5,-2.5 h 783.99998 m 25,-25 H 681.12532 v 113.47998 a 3.68,3.68 0 0 0 3.67,3.67 h 41 a 2.35,2.35 0 0 1 2.35,2.35 V 1303.9147 H 1517.6053 V 862.80468 Z"
id="path10"
/><line
class="cls-8"
x1="745.99536"
y1="958.09467"
x2="745.99536"
y2="887.80469"
id="line10"
/><rect
class="cls-8"
x="672.10535"
y="1011.4448"
width="13.53"
height="148.39999"
id="rect11"
/><path
class="cls-8"
d="m 1545.1753,893.49468 h 4.69 a 5.67,5.67 0 0 1 5.67,5.67 v 84.64998 a 5.67,5.67 0 0 1 -5.67,5.67 h -4.69"
id="path14"
/><path
class="cls-10"
d="m 1077.2923,853.76468 h 71.71 a 2.55,2.55 0 0 1 2.55,2.55 v 6.48 h -76.8 v -6.48 a 2.55,2.55 0 0 1 2.54,-2.55 z"
id="path16"
/><rect
class="cls-11"
x="1079.9424"
y="843.73468"
width="65.989998"
height="10.03"
id="rect17"
/><path
class="cls-2"
d="m 725.27532,910.38466 a 14,14 0 1 0 14,14 13.95,13.95 0 0 0 -14,-14 z m 0,21.5 a 7.55,7.55 0 1 1 7.54,-7.55 7.55,7.55 0 0 1 -7.54,7.55 z"
id="path19"
/><circle
class="cls-8"
cx="725.27539"
cy="924.33466"
r="7.5500002"
id="circle19"
/><circle
class="cls-8"
cx="725.27539"
cy="924.33466"
r="13.95"
id="circle20"
/><path
d="m 445.36309,440.05365 c 0,11.52004 10.38375,20.85861 23.19309,20.85861 12.80937,0 23.19311,-9.33857 23.19311,-20.85861 0,-11.52005 -10.38374,-20.85861 -23.19311,-20.85861 -12.80934,0 -23.19309,9.33856 -23.19309,20.85861 z"
fill="#ccc"
id="path1"
style="overflow: hidden; fill: #4d4d4d; stroke-width: 0.458227"
transform="translate(646.6554,758.05941)"
/><path
d="m 469.40305,538.40107 c -119.83415,0 -217.31582,-93.40624 -217.31582,-208.23067 0,-114.82425 97.48167,-208.23058 217.31582,-208.23058 119.83417,0 217.31585,93.40633 217.31585,208.23058 0,114.82443 -97.48168,208.23067 -217.31585,208.23067 z m 0,-386.58065 c -102.63515,0 -186.13149,80.00572 -186.13149,178.34998 0,98.32948 83.49634,178.34997 186.13149,178.34997 102.61966,0 186.13151,-80.01997 186.13151,-178.34997 0,-98.34426 -83.51185,-178.34998 -186.13151,-178.34998 z"
fill="#ccc"
id="path2"
style="overflow: hidden; fill: #4d4d4d; stroke-width: 0.474832"
transform="translate(646.6554,758.05941)"
/><path
d="m 468.55618,391.96713 c -8.53552,0 -15.46205,-6.22977 -15.46205,-13.90533 v -23.51468 c 0,-22.75028 19.32709,-40.13201 36.39722,-55.47009 12.50833,-11.26363 25.45056,-22.88885 25.45056,-32.16398 0,-23.18095 -20.81195,-42.03718 -46.38573,-42.03718 -26.0067,0 -46.38619,18.0497 -46.38619,41.09158 0,7.67594 -6.92654,13.90533 -15.46208,13.90533 -8.53554,0 -15.46207,-6.22977 -15.46207,-13.9058 0,-37.99002 34.68046,-68.90262 77.31034,-68.90262 42.62989,0 77.31034,31.32967 77.31034,69.84869 0,20.81694 -17.54944,36.5856 -34.51132,51.84064 -13.452,12.07016 -27.33645,24.55758 -27.33645,35.77907 v 23.51468 c 0,7.6764 -6.92702,13.91969 -15.46257,13.91969 z"
fill="#ccc"
id="path3"
style="overflow: hidden; fill: #4d4d4d; stroke-width: 0.458227; stroke: #000000; stroke-opacity: 1"
transform="translate(646.6554,758.05941)"
/><rect
class="cls-8"
x="647.6554"
y="862.80469"
width="897.52002"
height="441.10999"
rx="11.7"
id="rect28"
/></g><path
style="fill: #ffffff; fill-opacity: 0; stroke-width: 0.92"
d="m 107.41785,363.03448 -0.23786,-156.30546 -2.99,-3.72057 -2.99,-3.72058 v -34.09394 -34.09394 l 150.64998,0.048 150.64999,0.048 -8.28,3.06943 c -19.31509,7.16019 -34.46167,14.82453 -50.21721,25.41044 -50.57644,33.98158 -84.35747,88.86991 -91.06203,147.96009 -1.43336,12.63279 -0.63536,44.7022 1.3876,55.76392 7.76201,42.44321 25.98398,77.92651 55.67763,108.41989 17.37837,17.84644 33.98994,30.29944 55.42867,41.55255 l 11.30534,5.93414 -134.54212,0.0167 -134.54213,0.0167 z"
id="path11"
/><path
style="fill: #ffffff; fill-opacity: 0; stroke-width: 0.92"
d="m 107.41785,363.03448 -0.23786,-156.30546 -2.99,-3.72057 -2.99,-3.72058 v -34.09394 -34.09394 l 150.64998,0.048 150.64999,0.048 -8.28,3.06943 c -19.31509,7.16019 -34.46167,14.82453 -50.21721,25.41044 -50.57644,33.98158 -84.35747,88.86991 -91.06203,147.96009 -1.43336,12.63279 -0.63536,44.7022 1.3876,55.76392 7.76201,42.44321 25.98398,77.92651 55.67763,108.41989 17.37837,17.84644 33.98994,30.29944 55.42867,41.55255 l 11.30534,5.93414 -134.54212,0.0167 -134.54213,0.0167 z"
id="path12"
/><path
style="fill: #ffffff; fill-opacity: 0; stroke-width: 0.92"
d="m 107.41785,363.03448 -0.23786,-156.30546 -2.99,-3.72057 -2.99,-3.72058 v -34.09394 -34.09394 l 150.64998,0.048 150.64999,0.048 -8.28,3.06943 c -19.31509,7.16019 -34.46167,14.82453 -50.21721,25.41044 -50.57644,33.98158 -84.35747,88.86991 -91.06203,147.96009 -1.43336,12.63279 -0.63536,44.7022 1.3876,55.76392 7.76201,42.44321 25.98398,77.92651 55.67763,108.41989 17.37837,17.84644 33.98994,30.29944 55.42867,41.55255 l 11.30534,5.93414 -134.54212,0.0167 -134.54213,0.0167 z"
id="path13"
/>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save