Merge main into multi-lobby

This commit is contained in:
Scott Anderson
2025-06-28 15:28:52 -04:00
139 changed files with 4775 additions and 432 deletions
+1 -1
View File
@@ -127,7 +127,7 @@ jobs:
VERSION_TAG: latest
run: |
echo "::group::deploy.sh"
./deploy.sh "$ENV" "$HOST" "$SUBDOMAIN"
./build-deploy.sh "$ENV" "$HOST" "$SUBDOMAIN"
echo "Deployment created in ${SECONDS} seconds" >> $GITHUB_STEP_SUMMARY
echo "::endgroup::"
- name: ⏳ Wait for deployment to start
+243 -4
View File
@@ -9,19 +9,258 @@ on:
permissions: {}
jobs:
print-release-info:
build:
name: 🏗️ Build
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: 🖨 Print release info
- uses: actions/checkout@v4
- name: 🔗 Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- id: build
env:
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
RELEASE_NAME: ${{ github.event.release.name }}
DOCKER_REPO: openfront-prod
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
RELEASE_BODY: ${{ github.event.release.body }}
RELEASE_NAME: ${{ github.event.release.name }}
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
run: |
set -euxo pipefail
cat <<EOF >> $GITHUB_STEP_SUMMARY
Name: ${RELEASE_NAME}
Tag: ${RELEASE_TAG_NAME}
Changelog:
${RELEASE_BODY}
EOF
./build.sh prod "${RELEASE_TAG_NAME}" "${RELEASE_NAME}" "${RELEASE_BODY}" /tmp/build-metadata.json
IMAGE_ID=$(jq -r '."containerimage.digest"' /tmp/build-metadata.json)
echo "IMAGE_ID=${IMAGE_ID}" >> $GITHUB_OUTPUT
echo "Image ID: \`${IMAGE_ID}\`" >> $GITHUB_STEP_SUMMARY
outputs:
IMAGE_ID: ${{ steps.build.outputs.IMAGE_ID }}
deploy-alpha:
name: 🧪 Deploy to alpha
runs-on: ubuntu-latest
timeout-minutes: 30
needs: [build]
steps:
- uses: actions/checkout@v4
- name: 🔑 Create SSH private key
env:
SERVER_HOST_STAGING: ${{ secrets.SERVER_HOST_STAGING }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
set -euxo pipefail
mkdir -p ~/.ssh
echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
test -n "$SERVER_HOST_STAGING" && ssh-keyscan -H "$SERVER_HOST_STAGING" >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/id_rsa
- name: 🚀 Deploy image
env:
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
DOCKER_REPO: openfront-prod
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
MON_PASSWORD: ${{ secrets.MON_PASSWORD }}
MON_USERNAME: ${{ secrets.MON_USERNAME }}
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
SERVER_HOST_STAGING: ${{ secrets.SERVER_HOST_STAGING }}
SSH_KEY: ~/.ssh/id_rsa
run: |
set -euxo pipefail
bash -x ./deploy.sh staging staging "${IMAGE_ID}" alpha
- name: ⏳ Wait for deployment to start
env:
FQDN: alpha.${{ vars.DOMAIN }}
run: |
echo "::group::Wait for deployment to start"
set -euxo pipefail
while [ "$(curl -s https://${FQDN}/commit.txt)" != "${GITHUB_SHA}" ]; do
if [ "$SECONDS" -ge 300 ]; then
echo "Timeout: deployment did not start within 5 minutes"
exit 1
fi
sleep 10
done
echo "Deployment started in ${SECONDS} seconds" >> $GITHUB_STEP_SUMMARY
echo "::endgroup::"
deploy-beta:
name: 🐞 Deploy to beta
runs-on: ubuntu-latest
needs: [build, deploy-alpha]
timeout-minutes: 30
environment: prod
steps:
- uses: actions/checkout@v4
- name: 🔑 Create SSH private key
env:
SERVER_HOST_NBG1: ${{ secrets.SERVER_HOST_NBG1 }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
set -euxo pipefail
mkdir -p ~/.ssh
echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
test -n "$SERVER_HOST_NBG1" && ssh-keyscan -H "$SERVER_HOST_NBG1" >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/id_rsa
- name: 🚀 Deploy image
env:
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
MON_PASSWORD: ${{ secrets.MON_PASSWORD }}
MON_USERNAME: ${{ secrets.MON_USERNAME }}
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
SERVER_HOST_NBG1: ${{ secrets.SERVER_HOST_NBG1 }}
SSH_KEY: ~/.ssh/id_rsa
run: |
set -euxo pipefail
./deploy.sh prod nbg1 "${IMAGE_ID}" beta
- name: ⏳ Wait for deployment to start
env:
FQDN: beta.${{ vars.DOMAIN }}
run: |
echo "::group::Wait for deployment to start"
set -euxo pipefail
while [ "$(curl -s https://${FQDN}/commit.txt)" != "${GITHUB_SHA}" ]; do
if [ "$SECONDS" -ge 300 ]; then
echo "Timeout: deployment did not start within 5 minutes"
exit 1
fi
sleep 10
done
echo "Deployment started in ${SECONDS} seconds" >> $GITHUB_STEP_SUMMARY
echo "::endgroup::"
deploy-blue:
name: 🔵 Deploy to blue
runs-on: ubuntu-latest
needs: [build, deploy-alpha]
timeout-minutes: 30
environment: prod
steps:
- uses: actions/checkout@v4
- name: 🔑 Create SSH private key
env:
SERVER_HOST_NBG1: ${{ secrets.SERVER_HOST_NBG1 }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
set -euxo pipefail
mkdir -p ~/.ssh
echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
test -n "$SERVER_HOST_NBG1" && ssh-keyscan -H "$SERVER_HOST_NBG1" >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/id_rsa
- name: 🚀 Deploy image
env:
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
MON_PASSWORD: ${{ secrets.MON_PASSWORD }}
MON_USERNAME: ${{ secrets.MON_USERNAME }}
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
SERVER_HOST_NBG1: ${{ secrets.SERVER_HOST_NBG1 }}
SSH_KEY: ~/.ssh/id_rsa
run: |
set -euxo pipefail
./deploy.sh prod nbg1 "${IMAGE_ID}" blue
- name: ⏳ Wait for deployment to start
env:
FQDN: blue.${{ vars.DOMAIN }}
run: |
echo "::group::Wait for deployment to start"
set -euxo pipefail
while [ "$(curl -s https://${FQDN}/commit.txt)" != "${GITHUB_SHA}" ]; do
if [ "$SECONDS" -ge 300 ]; then
echo "Timeout: deployment did not start within 5 minutes"
exit 1
fi
sleep 10
done
echo "Deployment started in ${SECONDS} seconds" >> $GITHUB_STEP_SUMMARY
echo "::endgroup::"
deploy-green:
name: 🟢 Deploy to green
runs-on: ubuntu-latest
needs: [build, deploy-alpha]
timeout-minutes: 30
environment: prod
steps:
- uses: actions/checkout@v4
- name: 🔑 Create SSH private key
env:
SERVER_HOST_NBG1: ${{ secrets.SERVER_HOST_NBG1 }}
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
run: |
set -euxo pipefail
mkdir -p ~/.ssh
echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
test -n "$SERVER_HOST_NBG1" && ssh-keyscan -H "$SERVER_HOST_NBG1" >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/id_rsa
- name: 🚀 Deploy image
env:
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
DOMAIN: ${{ vars.DOMAIN }}
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
MON_PASSWORD: ${{ secrets.MON_PASSWORD }}
MON_USERNAME: ${{ secrets.MON_USERNAME }}
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
SERVER_HOST_NBG1: ${{ secrets.SERVER_HOST_NBG1 }}
SSH_KEY: ~/.ssh/id_rsa
run: |
set -euxo pipefail
./deploy.sh prod nbg1 "${IMAGE_ID}" green
- name: ⏳ Wait for deployment to start
env:
FQDN: green.${{ vars.DOMAIN }}
run: |
echo "::group::Wait for deployment to start"
set -euxo pipefail
while [ "$(curl -s https://${FQDN}/commit.txt)" != "${GITHUB_SHA}" ]; do
if [ "$SECONDS" -ge 300 ]; then
echo "Timeout: deployment did not start within 5 minutes"
exit 1
fi
sleep 10
done
echo "Deployment started in ${SECONDS} seconds" >> $GITHUB_STEP_SUMMARY
echo "::endgroup::"
+1
View File
@@ -8,3 +8,4 @@ resources/images/.DS_Store
resources/.DS_Store
.env*
.DS_Store
.clinic/
+78 -1
View File
@@ -1,6 +1,17 @@
# License Information for OpenFront.io Project
## Overview
As of commit 25d5cc370207fd39e0c3bcaa69873b8fc6c60e68, the src/client directory of the OpenFront.io project has been relicensed from the MIT License to the GNU General Public License (GPL) version 3.0. The rest of the project remains under the MIT License unless otherwise specified. Assets in the `/non-commercial/` directory are licensed under CC BY-NC 4.0 with a commercial exemption for OpenFront LLC. Below are the details of all licenses and their applicability.
## MIT License
**Applies to:** All parts of the OpenFront.io project except the src/client directory as of commit 25d5cc370207fd39e0c3bcaa69873b8fc6c60e68 (March 25 2025) and the `resources/non-commercial/` directory.
MIT License
Copyright (c) 2025 OpenFront.io Team
Portions Copyright (c) 2024 WarFront.io Team
Portions Copyright (c) 2024 OpenFront.io Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -19,3 +30,69 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
## GNU General Public License (GPL) version 3.0
**Applies to:** The src/client directory as of commit 25d5cc370207fd39e0c3bcaa69873b8fc6c60e68.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (c) 2025 OpenFront.io Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
[Full text of the GPL v3.0 license can be found in src/client/LICENSE-GPL.txt, or at <https://www.gnu.org/licenses/gpl-3.0.txt>]
## CC BY-NC 4.0 with Commercial Exemption
**Applies to:** Assets in the `/non-commercial/` directory.
CC BY-NC 4.0 with OpenFront LLC Commercial Exemption
Copyright (c) 2025 OpenFront.io Team and Contributors
This work is licensed under Creative Commons Attribution-NonCommercial 4.0
International License with the following exception:
**OpenFront LLC is granted unlimited commercial use rights for all purposes.**
For all other parties, standard CC BY-NC 4.0 terms apply, which means:
- **Attribution:** You must give appropriate credit
- **NonCommercial:** You may not use the material for commercial purposes
- **No additional restrictions:** You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits
Full CC BY-NC 4.0 license text: https://creativecommons.org/licenses/by-nc/4.0/
## Important Notes
- **MIT License:** A permissive license that allows users to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the software with minimal restrictions, provided the copyright notice and permission notice are included.
- **GPL v3.0:** A copyleft license that requires any derivative works or distributions of the src/client code to also be licensed under GPL v3.0 or later, ensuring that the source code remains open and freely available.
- **CC BY-NC 4.0 with Exemption:** Protects assets from commercial exploitation while allowing OpenFront LLC full commercial rights. Community use for non-commercial purposes is encouraged.
- **Mixed Licensing:** If you are combining code from src/client (GPL) with other parts of the project (MIT), the GPL's copyleft requirements may affect the licensing of the combined work. Consult a legal expert for specific guidance.
- **Contributions:**
- For contributions to src/client, ensure that all contributors agree to the GPL v3.0 terms.
- For contributions to `/non-commercial/`, contributors grant CC BY-NC rights to the public and commercial rights to OpenFront LLC as specified in our contribution guidelines.
- For contributions to other directories, standard MIT terms apply.
## Contributing
Please see our CONTRIBUTING.md file for detailed information about licensing requirements for different parts of the project.
For any questions, contact the OpenFront.io Team.
+4 -1
View File
@@ -17,10 +17,13 @@ This is a fork/rewrite of WarFront.io. Credit to https://github.com/WarFrontIO.
# OpenFront - Licensing
This project uses a dual-licensing approach:
This project uses a multi-licensing approach:
- Code in the `server/` and `core/` directory is licensed under MIT
- Client code (in the `client/` directory) is licensed under GPL v3
- Assets in resources/non-commercial are under CC BY-NC 4.0 with OpenFront LLC Commercial Exemption. By contributing assets to /non-commercial/, contributors agree that OpenFront LLC may use their contributions for commercial purposes while the contributions remain CC BY-NC 4.0 for all other parties.
See LICENSE file for more details.
## 🌟 Features
+96
View File
@@ -0,0 +1,96 @@
#!/bin/bash
# build-deploy.sh - Wrapper script that runs build.sh and deploy.sh in sequence
# This script maintains backward compatibility with the original build-deploy.sh
set -e # Exit immediately if a command exits with a non-zero status
# Function to print section headers
print_header() {
echo "======================================================"
echo "🚀 $1"
echo "======================================================"
}
print_header "BUILD AND DEPLOY WRAPPER"
echo "This script will run build.sh and deploy.sh in sequence."
echo "You can also run them separately:"
echo " ./build.sh [prod|staging] [version_tag]"
echo " ./deploy.sh [prod|staging] [eu|nbg1|staging|masters] [version_tag] [subdomain] [--enable_basic_auth]"
echo ""
# Check command line arguments
if [ $# -lt 3 ] || [ $# -gt 5 ]; then
echo "Error: Please specify environment, host, and subdomain"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate first argument (environment)
if [ "$1" != "prod" ] && [ "$1" != "staging" ]; then
echo "Error: First argument must be either 'prod' or 'staging'"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate second argument (host)
if [ "$2" != "eu" ] && [ "$2" != "nbg1" ] && [ "$2" != "staging" ] && [ "$2" != "masters" ]; then
echo "Error: Second argument must be either 'eu', 'nbg1', 'staging', or 'masters'"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate third argument (subdomain)
if [ -z "$3" ]; then
echo "Error: Subdomain is required"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Generate version tag
VERSION_TAG=$(date +"%Y%m%d-%H%M%S")
echo "Generated version tag: $VERSION_TAG"
# Extract arguments
ENV="$1"
HOST="$2"
SUBDOMAIN="$3"
ENABLE_BASIC_AUTH=""
# Parse remaining arguments
shift 3
while [[ $# -gt 0 ]]; do
case $1 in
--enable_basic_auth)
ENABLE_BASIC_AUTH="--enable_basic_auth"
shift
;;
*)
echo "Error: Unknown argument: $1"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
;;
esac
done
# Step 1: Run build.sh
echo "Step 1: Running build.sh..."
./build.sh "$ENV" "$VERSION_TAG"
if [ $? -ne 0 ]; then
echo "❌ Build failed. Stopping deployment."
exit 1
fi
echo ""
echo "Step 2: Running deploy.sh"
./deploy.sh "$ENV" "$HOST" "$VERSION_TAG" "$SUBDOMAIN"
if [ $? -ne 0 ]; then
echo "❌ Deploy failed."
exit 1
fi
print_header "BUILD AND DEPLOY COMPLETED SUCCESSFULLY"
echo "✅ Both build and deploy operations completed successfully!"
echo "Version tag used: $VERSION_TAG"
echo "======================================================="
Executable
+100
View File
@@ -0,0 +1,100 @@
#!/bin/bash
# build.sh - Build and upload Docker image to Docker Hub
# This script:
# 1. Builds and uploads the Docker image to Docker Hub with appropriate tag
# 2. Optionally saves container metadata to a file (if METADATA_FILE is provided as 3rd argument)
set -e # Exit immediately if a command exits with a non-zero status
# Parse command line arguments
DEPLOY_ENV="$1"
VERSION_TAG="$2"
VERSION_TXT="$3"
CHANGELOG_MD="$4"
METADATA_FILE="$5"
# Set default metadata file if not provided
if [ -z "$METADATA_FILE" ]; then
METADATA_FILE="/tmp/build-metadata-$RANDOM.json"
fi
# Check required arguments
if [ -z "$DEPLOY_ENV" ] || [ -z "$VERSION_TAG" ]; then
echo "Error: Please specify environment and version tag"
echo "Usage: $0 [prod|staging] [version_tag] [metadata_file]"
echo "Note: Provide metadata_file as third argument to save container metadata to a file"
exit 1
fi
# Validate environment argument
if [ "$DEPLOY_ENV" != "prod" ] && [ "$DEPLOY_ENV" != "staging" ]; then
echo "Error: First argument must be either 'prod' or 'staging'"
echo "Usage: $0 [prod|staging] [version_tag] [metadata_file]"
echo "Note: Provide metadata_file as third argument to save container metadata to a file"
exit 1
fi
print_header() {
echo "======================================================"
echo "🚀 ${1}"
echo "======================================================"
}
# Load common environment variables first
if [ -f .env ]; then
echo "Loading common configuration from .env file..."
set -o allexport
source .env
set +o allexport
fi
# Load environment-specific variables
if [ -f .env.$DEPLOY_ENV ]; then
echo "Loading $DEPLOY_ENV-specific configuration from .env.$DEPLOY_ENV file..."
set -o allexport
source .env.$DEPLOY_ENV
set +o allexport
fi
# Check required environment variables for build
if [ -z "$DOCKER_USERNAME" ] || [ -z "$DOCKER_REPO" ]; then
echo "Error: DOCKER_USERNAME or DOCKER_REPO not defined in .env file or environment"
exit 1
fi
DOCKER_IMAGE="${DOCKER_USERNAME}/${DOCKER_REPO}:${VERSION_TAG}"
# Build and upload Docker image to Docker Hub
echo "Environment: ${DEPLOY_ENV}"
echo "Using version tag: $VERSION_TAG"
echo "Docker repository: $DOCKER_REPO"
echo "Metadata file: $METADATA_FILE"
# Get Git commit for build info
GIT_COMMIT=$(git rev-parse HEAD 2> /dev/null || echo "unknown")
echo "Git commit: $GIT_COMMIT"
if [ -n "$CHANGELOG_MD" ]; then
echo "$CHANGELOG_MD" > resources/changelog.md
fi
if [ -n "$VERSION_TXT" ]; then
echo "$VERSION_TXT" > resources/version.txt
fi
docker buildx build \
--platform linux/amd64 \
--build-arg GIT_COMMIT=$GIT_COMMIT \
--metadata-file $METADATA_FILE \
-t $DOCKER_IMAGE \
--push \
.
if [ $? -ne 0 ]; then
echo "❌ Docker build failed."
exit 1
fi
echo "✅ Docker image built and pushed successfully."
echo "Image: $DOCKER_IMAGE"
print_header "BUILD COMPLETED SUCCESSFULLY ${DOCKER_IMAGE}"
+48 -60
View File
@@ -1,9 +1,8 @@
#!/bin/bash
# deploy.sh - Complete deployment script for Hetzner with Docker Hub and R2
# deploy.sh - Deploy application to Hetzner server
# This script:
# 1. Builds and uploads the Docker image to Docker Hub with appropriate tag
# 2. Copies the update script to Hetzner server
# 3. Executes the update script on the Hetzner server
# 1. Copies the update script to Hetzner server
# 2. Executes the update script on the Hetzner server
set -e # Exit immediately if a command exits with a non-zero status
@@ -28,27 +27,6 @@ done
# Restore positional parameters
set -- "${POSITIONAL_ARGS[@]}"
# Check command line arguments
if [ $# -lt 2 ] || [ $# -gt 3 ]; then
echo "Error: Please specify environment and host, with optional subdomain"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate first argument (environment)
if [ "$1" != "prod" ] && [ "$1" != "staging" ]; then
echo "Error: First argument must be either 'prod' or 'staging'"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate second argument (host)
if [ "$2" != "eu" ] && [ "$2" != "nbg1" ] && [ "$2" != "staging" ] && [ "$2" != "masters" ]; then
echo "Error: Second argument must be either 'eu', 'nbg1', 'staging', or 'masters'"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Function to print section headers
print_header() {
echo "======================================================"
@@ -56,17 +34,34 @@ print_header() {
echo "======================================================"
}
# Check command line arguments
if [ $# -ne 4 ]; then
echo "Error: Please specify environment, host, version tag, and subdomain"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [version_tag] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate first argument (environment)
if [ "$1" != "prod" ] && [ "$1" != "staging" ]; then
echo "Error: First argument must be either 'prod' or 'staging'"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [version_tag] [subdomain] [--enable_basic_auth]"
exit 1
fi
# Validate second argument (host)
if [ "$2" != "eu" ] && [ "$2" != "nbg1" ] && [ "$2" != "staging" ] && [ "$2" != "masters" ]; then
echo "Error: Second argument must be either 'eu', 'nbg1', 'staging', or 'masters'"
echo "Usage: $0 [prod|staging] [eu|nbg1|staging|masters] [version_tag] [subdomain] [--enable_basic_auth]"
exit 1
fi
ENV=$1
HOST=$2
SUBDOMAIN=$3 # Optional third argument for custom subdomain
VERSION_TAG=$3
SUBDOMAIN=$4
# Set subdomain - use the custom subdomain if provided, otherwise use REGION
if [ -n "$SUBDOMAIN" ]; then
echo "Using custom subdomain: $SUBDOMAIN"
else
SUBDOMAIN=$HOST
echo "Using host as subdomain: $SUBDOMAIN"
fi
# Set subdomain - use the provided subdomain
echo "Using subdomain: $SUBDOMAIN"
# Load common environment variables first
if [ -f .env ]; then
@@ -80,6 +75,18 @@ if [ -f .env.$ENV ]; then
export $(grep -v '^#' .env.$ENV | xargs)
fi
# Check required environment variables for deployment
if [ -z "$DOCKER_USERNAME" ] || [ -z "$DOCKER_REPO" ]; then
echo "Error: DOCKER_USERNAME or DOCKER_REPO not defined in .env file or environment"
exit 1
fi
if [[ "$VERSION_TAG" == sha256:* ]]; then
DOCKER_IMAGE="${DOCKER_USERNAME}/${DOCKER_REPO}@${VERSION_TAG}"
else
DOCKER_IMAGE="${DOCKER_USERNAME}/${DOCKER_REPO}:${VERSION_TAG}"
fi
if [ "$HOST" == "staging" ]; then
print_header "DEPLOYING TO STAGING HOST"
SERVER_HOST=$SERVER_HOST_STAGING
@@ -121,43 +128,22 @@ REMOTE_USER="openfront"
REMOTE_UPDATE_PATH="/home/$REMOTE_USER"
REMOTE_UPDATE_SCRIPT="$REMOTE_UPDATE_PATH/update-openfront.sh" # Where to place the script on server
VERSION_TAG=$(date +"%Y%m%d-%H%M%S")
DOCKER_IMAGE="${DOCKER_USERNAME}/${DOCKER_REPO}:${VERSION_TAG}"
# Check if update script exists
if [ ! -f "$UPDATE_SCRIPT" ]; then
echo "Error: Update script $UPDATE_SCRIPT not found!"
exit 1
fi
# Step 1: Build and upload Docker image to Docker Hub
print_header "STEP 1: Building and uploading Docker image to Docker Hub"
# Display deployment information
print_header "DEPLOYMENT INFORMATION"
echo "Environment: ${ENV}"
echo "Host: ${HOST}"
echo "Subdomain: ${SUBDOMAIN}"
echo "Using version tag: $VERSION_TAG"
echo "Docker repository: $DOCKER_REPO"
echo "Docker Image: $DOCKER_IMAGE"
echo "Target Server: $SERVER_HOST"
# Get Git commit for build info
GIT_COMMIT=$(git rev-parse HEAD 2> /dev/null || echo "unknown")
echo "Git commit: $GIT_COMMIT"
docker buildx build \
--platform linux/amd64 \
--build-arg GIT_COMMIT=$GIT_COMMIT \
-t $DOCKER_IMAGE \
--push \
.
if [ $? -ne 0 ]; then
echo "❌ Docker build failed. Stopping deployment."
exit 1
fi
echo "✅ Docker image built and pushed successfully."
# Step 2: Copy update script to Hetzner server
print_header "STEP 2: Copying update script to server"
# Copy update script to Hetzner server
print_header "COPYING UPDATE SCRIPT TO SERVER"
echo "Target: $REMOTE_USER@$SERVER_HOST"
# Make sure the update script is executable
@@ -175,6 +161,8 @@ fi
# when multiple deployments are happening at the same time.
ENV_FILE="${REMOTE_UPDATE_PATH}/${SUBDOMAIN}-${RANDOM}.env"
print_header "EXECUTING UPDATE SCRIPT ON SERVER"
ssh -i $SSH_KEY $REMOTE_USER@$SERVER_HOST "chmod +x $REMOTE_UPDATE_SCRIPT && \
cat > $ENV_FILE << 'EOL'
GAME_ENV=$ENV
+7 -1
View File
@@ -14,7 +14,13 @@ export default {
"ts-jest",
{
useESM: true,
tsconfig: "tsconfig.jest.json",
tsconfig: {
target: "ES2020",
module: "es2022",
moduleResolution: "node",
experimentalDecorators: true,
types: ["jest", "node"],
},
},
],
},
+123 -1
View File
@@ -34,6 +34,7 @@
"dotenv": "^16.5.0",
"express": "^4.21.1",
"express-rate-limit": "^7.5.0",
"fastpriorityqueue": "^0.7.5",
"google-auth-library": "^9.14.0",
"googleapis": "^143.0.0",
"hammerjs": "^2.0.8",
@@ -47,6 +48,7 @@
"nanoid": "^3.3.6",
"obscenity": "^0.4.3",
"pg": "^8.13.3",
"pixi.js": "^8.10.1",
"prom-client": "^15.1.3",
"protobufjs": "^7.3.2",
"pureimage": "^0.4.13",
@@ -68,6 +70,7 @@
"@babel/preset-typescript": "^7.24.7",
"@eslint/compat": "^1.2.7",
"@eslint/js": "^9.21.0",
"@types/benchmark": "^2.1.5",
"@types/chai": "^4.3.17",
"@types/d3": "^7.4.3",
"@types/jest": "^30.0.0",
@@ -79,6 +82,7 @@
"@types/systeminformation": "^3.23.1",
"@types/ws": "^8.5.11",
"autoprefixer": "^10.4.20",
"benchmark": "^2.1.4",
"binary-base64-loader": "^1.0.0",
"canvas": "^3.1.0",
"chai": "^5.1.1",
@@ -7941,6 +7945,12 @@
"node": "^18.19.0 || >=20.6.0"
}
},
"node_modules/@pixi/colord": {
"version": "2.9.6",
"resolved": "https://registry.npmjs.org/@pixi/colord/-/colord-2.9.6.tgz",
"integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==",
"license": "MIT"
},
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -8925,6 +8935,13 @@
"@babel/types": "^7.20.7"
}
},
"node_modules/@types/benchmark": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz",
"integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -8985,6 +9002,12 @@
"@types/node": "*"
}
},
"node_modules/@types/css-font-loading-module": {
"version": "0.0.12",
"resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.12.tgz",
"integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==",
"license": "MIT"
},
"node_modules/@types/d3": {
"version": "7.4.3",
"resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
@@ -9269,6 +9292,12 @@
"@types/d3-selection": "*"
}
},
"node_modules/@types/earcut": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-3.0.0.tgz",
"integrity": "sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==",
"license": "MIT"
},
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
@@ -10378,6 +10407,12 @@
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webgpu/types": {
"version": "0.1.61",
"resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.61.tgz",
"integrity": "sha512-w2HbBvH+qO19SB5pJOJFKs533CdZqxl3fcGonqL321VHkW7W/iBo6H8bjDy6pr/+pbMwIu5dnuaAxH7NxBqUrQ==",
"license": "BSD-3-Clause"
},
"node_modules/@webpack-cli/configtest": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz",
@@ -10422,6 +10457,15 @@
}
}
},
"node_modules/@xmldom/xmldom": {
"version": "0.8.10",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
"integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -10912,6 +10956,17 @@
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"license": "MIT"
},
"node_modules/benchmark": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
"integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"lodash": "^4.17.4",
"platform": "^1.3.3"
}
},
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -13005,6 +13060,12 @@
"node": ">= 6"
}
},
"node_modules/earcut": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz",
"integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==",
"license": "ISC"
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -13676,7 +13737,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
"dev": true,
"license": "MIT"
},
"node_modules/events": {
@@ -14011,6 +14071,12 @@
"node": ">= 4.9.1"
}
},
"node_modules/fastpriorityqueue": {
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/fastpriorityqueue/-/fastpriorityqueue-0.7.5.tgz",
"integrity": "sha512-3Pa0n9gwy8yIbEsT3m2j/E9DXgWvvjfiZjjqcJ+AdNKTAlVMIuFYrYG5Y3RHEM8O6cwv9hOpOWY/NaMfywoQVA==",
"license": "Apache-2.0"
},
"node_modules/fastq": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
@@ -14545,6 +14611,15 @@
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
"node_modules/gifuct-js": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/gifuct-js/-/gifuct-js-2.1.2.tgz",
"integrity": "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg==",
"license": "MIT",
"dependencies": {
"js-binary-schema-parser": "^2.0.3"
}
},
"node_modules/gifwrap": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz",
@@ -15620,6 +15695,12 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"license": "ISC"
},
"node_modules/ismobilejs": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
"integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==",
"license": "MIT"
},
"node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
@@ -17528,6 +17609,12 @@
"integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
"license": "BSD-3-Clause"
},
"node_modules/js-binary-schema-parser": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
"integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==",
"license": "MIT"
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -19201,6 +19288,12 @@
"integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==",
"license": "MIT"
},
"node_modules/parse-svg-path": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz",
"integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==",
"license": "MIT"
},
"node_modules/parse5": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
@@ -19506,6 +19599,28 @@
"node": ">=4.0.0"
}
},
"node_modules/pixi.js": {
"version": "8.10.1",
"resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-8.10.1.tgz",
"integrity": "sha512-wjKJXawhTUxuyKIuwE3jK05eBh5I4GKy+YrRVniURFRkK7pYEvRvnV41dEqz6owSXav/YMXdG5783YDJeamiow==",
"license": "MIT",
"dependencies": {
"@pixi/colord": "^2.9.6",
"@types/css-font-loading-module": "^0.0.12",
"@types/earcut": "^3.0.0",
"@webgpu/types": "^0.1.40",
"@xmldom/xmldom": "^0.8.10",
"earcut": "^3.0.1",
"eventemitter3": "^5.0.1",
"gifuct-js": "^2.1.2",
"ismobilejs": "^1.1.1",
"parse-svg-path": "^0.1.2"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/pixijs"
}
},
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -19518,6 +19633,13 @@
"node": ">=8"
}
},
"node_modules/platform": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
"integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==",
"dev": true,
"license": "MIT"
},
"node_modules/pngjs": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz",
+5
View File
@@ -9,6 +9,7 @@
"dev": "cross-env GAME_ENV=dev concurrently \"npm run start:client\" \"npm run start:server-dev\"",
"tunnel": "npm run build-prod && npm run start:server",
"test": "jest",
"perf": "npx tsx tests/perf/*.ts",
"test:coverage": "jest --coverage",
"format": "prettier --ignore-unknown --write .",
"lint": "eslint",
@@ -27,6 +28,7 @@
"@babel/preset-typescript": "^7.24.7",
"@eslint/compat": "^1.2.7",
"@eslint/js": "^9.21.0",
"@types/benchmark": "^2.1.5",
"@types/chai": "^4.3.17",
"@types/d3": "^7.4.3",
"@types/jest": "^30.0.0",
@@ -38,6 +40,7 @@
"@types/systeminformation": "^3.23.1",
"@types/ws": "^8.5.11",
"autoprefixer": "^10.4.20",
"benchmark": "^2.1.4",
"binary-base64-loader": "^1.0.0",
"canvas": "^3.1.0",
"chai": "^5.1.1",
@@ -105,6 +108,7 @@
"dotenv": "^16.5.0",
"express": "^4.21.1",
"express-rate-limit": "^7.5.0",
"fastpriorityqueue": "^0.7.5",
"google-auth-library": "^9.14.0",
"googleapis": "^143.0.0",
"hammerjs": "^2.0.8",
@@ -118,6 +122,7 @@
"nanoid": "^3.3.6",
"obscenity": "^0.4.3",
"pg": "^8.13.3",
"pixi.js": "^8.10.1",
"prom-client": "^15.1.3",
"protobufjs": "^7.3.2",
"pureimage": "^0.4.13",
+140 -16
View File
@@ -4,35 +4,39 @@
"creator": ["1286745100411473930"]
},
"patterns": {
"ABMIVVU=": {
"ABMIVVU": {
"name": "stripes_v"
},
"ABMIDw8=": {
"ABMIDw8": {
"name": "stripes_h"
},
"ABMIpaU=": {
"ABMIpaU": {
"name": "checkerboard"
},
"AFIoAAABOEAHgkAc+AN/4AMcgAAA": {
"AFIoAAABOEAHgkAc-AN_4AMcgAAA": {
"name": "choco"
},
"AHE4AQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIA=": {
"AHE4AQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIA": {
"name": "diagonal",
"role_group": "donor"
},
"AHE4AYACQAQgCBAQCCAEQAKAAYABQAIgBBAICBAEIAJAAYA=": {
"AHE4AYACQAQgCBAQCCAEQAKAAYABQAIgBBAICBAEIAJAAYA": {
"name": "cross",
"role_group": "donor"
},
"AHEYA8AMMDAMwAPAAzAMDDADwA==": {
"AHEYA8AMMDAMwAPAAzAMDDADwA": {
"name": "mini_cross",
"role_group": "donor"
},
"AHE4//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAA=": {
"AHE4__8AAAAAAAAAAAAAAAAAAP__AAAAAAAAAAAAAAAAAAA": {
"name": "horizontal_stripes",
"role_group": "donor"
},
"AHE4AQEAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAA=": {
"AHI4AOAAkACIAEQAIgARjAhUBCgCKAHQACgB1AILAwUABwA": {
"name": "sword",
"role_group": "donor"
},
"AHE4AQEAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAA": {
"name": "sparse_dots",
"role_group": "donor"
},
@@ -40,33 +44,153 @@
"name": "evan",
"role_group": "creator"
},
"AHEYAYACQAQgCBAQCCAEQAKAAQ==": {
"AHEYAYACQAQgCBAQCCAEQAKAAQ": {
"name": "diagonal_stripe",
"role_group": "donor"
},
"AHEYAAAYGDw8fn7//35+PDwYGA==": {
"AHEYAAAYGDw8fn7__35-PDwYGA": {
"name": "mountain_ridge",
"role_group": "donor"
},
"AHEYAAACIAAAAAAAAAAACBAAAA==": {
"AHEYAAACIAAAAAAAAAAACBAAAA": {
"name": "scattered_dots",
"role_group": "donor"
},
"AHEYw8PDwwwMDAwwDDAMw8PDww==": {
"AHEYw8PDwwwMDAwwDDAMw8PDww": {
"name": "circuit_board",
"role_group": "donor"
},
"AHEYSZJJkkmSSZJJkkmSSZJJkg==": {
"AHEYSZJJkkmSSZJJkkmSSZJJkg": {
"name": "vertical_bars",
"role_group": "donor"
},
"AHEYAAAAAAAAAkCCQUQiLnQWaA==": {
"AHEYAAAAAAAAAkCCQUQiLnQWaA": {
"name": "-w-",
"role_group": "donor"
},
"AAIiAAAAAAAAAAAAAAAAAAAAAIDD8YnweTiiD5FIYEIgEpkIRCKBCoFIpCIQeTwyPB6RjEAkEIgQKEQiApFAIEIgEYkIOAKfCIGIIyIAAAAAAAAAAAA=": {
"AHE4AAAAAKAAUAFQAVABCC4EUCQgJCAEIDgm0BBwDwAAAAA": {
"name": "white_rabbit",
"role_group": "donor"
},
"AKFwAAAADMAABSiAAgVAoQBQKAA0CwB6AfDhAwIAQQKQkAAkMgCTSkhlGpYBAQJAjAAgEAAQAgB6AUCAABAgAAoUgAIFoFIBqFcAKhWASgXA8wAAAAA": {
"name": "goat",
"role_group": "donor"
},
"AJhYAAAAGACABACQAAASAEACAMgBAMkBIMkAJCngJAkSIEECIEgABAKAQAAQEAACAiCAAAQQgAAECIAAAfA_AAAA": {
"name": "hand",
"role_group": "donor"
},
"AMFYAAAAAAAAAAzAADgAB_ABPuAH-IE_8Af_4T_8h__wz_zDv_cPAB4AADAAAAAAAIAHAAAeAAD8AADwAwDgHwCAfwAA_wMA8AMAAAAAAAAA": {
"name": "radiation",
"role_group": "donor"
},
"AJhMAAAABACAAQBwAAAeAMAHAPgBAH8A4B8A_AeA_wHwfwD-H8D_A_gHAO8B4DwADA-A4AEAGAAAAAA": {
"name": "cursor",
"role_group": "donor"
},
"AMpkAAAA8DfCnyAQgnTl0KVrvS5d73UJkinIX1V_ABQD8BQ8l5WRRViBLOAEHw7_CtbhfP-ItdU0AmI8wrTwH4DbqPxpVCdIMhJdOL_our9PV681gg6s8BeFHwAAAAA": {
"name": "openfront_qr",
"role_group": "donor"
},
"AAIiAAAAAAAAAAAAAAAAAAAAAIDD8YnweTiiD5FIYEIgEpkIRCKBCoFIpCIQeTwyPB6RjEAkEIgQKEQiApFAIEIgEYkIOAKfCIGIIyIAAAAAAAAAAAA": {
"name": "openfront",
"role_group": "creator"
}
},
"flag": {
"layers": {
"a": { "name": "center_circle" },
"b": { "name": "center_hline" },
"c": { "name": "center_vline" },
"d": { "name": "center_star" },
"e": { "name": "center_flower" },
"f": { "name": "flower_tl" },
"g": { "name": "flower_tc" },
"h": { "name": "flower_tr" },
"i": { "name": "diag_br" },
"j": { "name": "diag_bl" },
"k": { "name": "frame" },
"l": { "name": "full" },
"m": { "name": "triangle_tl" },
"n": { "name": "triangle_bl" },
"o": { "name": "triangle_tr" },
"p": { "name": "triangle_br" },
"q": { "name": "half_l" },
"r": { "name": "half_r" },
"s": { "name": "half_t" },
"t": { "name": "half_b" },
"u": { "name": "mini_tr_bl" },
"v": { "name": "mini_tr_br" },
"w": { "name": "mini_tr_tl" },
"x": { "name": "mini_tr_tr" },
"y": { "name": "triangle_t" },
"z": { "name": "triangle_l" },
"aa": { "name": "triangle_b" },
"ab": { "name": "triangle_r" },
"ac": { "name": "tricolor_l" },
"ad": { "name": "tricolor_c" },
"ae": { "name": "tricolor_r" },
"af": { "name": "tricolor_t" },
"ag": { "name": "tricolor_m" },
"ah": { "name": "tricolor_b" },
"ai": { "name": "nato_emblem" },
"aj": { "name": "eu_star" },
"ak": { "name": "laurel_wreath" },
"al": { "name": "ofm_2025" },
"am": { "name": "octagram" },
"an": { "name": "octagram_2" },
"ao": { "name": "og" },
"ap": { "name": "og_plus" },
"aq": { "name": "beta_tester" },
"ar": { "name": "beta_tester_circle" },
"as": { "name": "rocket" },
"at": { "name": "rocket_mini" },
"au": { "name": "translator" },
"av": { "name": "admin_shield" },
"aw": { "name": "admin_shield_r" },
"ax": { "name": "admin_evan" }
},
"color": {
"a": { "color": "#ff0000", "name": "red" },
"b": { "color": "#ffa500", "name": "orange" },
"c": { "color": "#ffff00", "name": "yellow" },
"d": { "color": "#008000", "name": "green" },
"e": { "color": "#00ffff", "name": "cyan" },
"f": { "color": "#0000ff", "name": "blue" },
"g": { "color": "#000000", "name": "black" },
"h": { "color": "#ffffff", "name": "white" },
"i": { "color": "#800080", "name": "purple" },
"j": { "color": "#ff69b4", "name": "hotpink" },
"k": { "color": "#a52a2a", "name": "brown" },
"l": { "color": "#808080", "name": "gray" },
"m": { "color": "#20b2aa", "name": "teal" },
"n": { "color": "#ff6347", "name": "tomato" },
"o": { "color": "#4682b4", "name": "steelblue" },
"p": { "color": "#90ee90", "name": "lightgreen" },
"q": { "color": "#8b0000", "name": "darkred" },
"r": { "color": "#191970", "name": "navy" },
"s": { "color": "#ffd700", "name": "gold" },
"t": { "color": "#add8e6", "name": "lightblue" },
"u": { "color": "#f5f5dc", "name": "beige" },
"v": { "color": "#ffb6c1", "name": "lightpink" },
"w": { "color": "#708090", "name": "slategray" },
"x": { "color": "#00ff7f", "name": "springgreen" },
"y": { "color": "#dc143c", "name": "crimson" },
"z": { "color": "#ffbf00", "name": "amber" },
"0": { "color": "#3d9970", "name": "olive_green" },
"1": { "color": "#87ceeb", "name": "sky_blue" },
"2": { "color": "#6a5acd", "name": "slate_blue" },
"3": { "color": "#ff66cc", "name": "rose_pink" },
"4": { "color": "#36454f", "name": "charcoal" },
"5": { "color": "#fffff0", "name": "ivory" },
"A": { "color": "rainbow", "name": "rainbow" },
"B": { "color": "bright-rainbow", "name": "bright_rainbow" },
"C": { "color": "gold-glow", "name": "gold_glow" },
"D": { "color": "silver-glow", "name": "silver_glow" },
"E": { "color": "copper-glow", "name": "copper_glow" },
"F": { "color": "neon", "name": "neon" },
"G": { "color": "lava", "name": "lava" },
"H": { "color": "water", "name": "water" }
}
}
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M33.6,39.8c0-.9,0-1.5,0-2.3s-.3-.9-1.2-.9v-.6c.9,0,1.2-.5,1.2-.9,0-.8,0-1.5,0-2.3,0-1.2.5-1.6,1.6-1.6h.6v.6h-.4c-.7,0-.9.3-.9,1.1v2.2c0,.8-.2,1.2-.8,1.3h0c.6.2.8.6.8,1.4v2.2c0,.8.2,1.1.9,1.1h.4v.6h-.6c-1.1,0-1.6-.4-1.6-1.6v-.3Z"/>
<path class="st0" d="M38.7,39.8c0-.9,0-1.5,0-2.3s.3-.9,1.2-.9v-.6c-.9,0-1.2-.5-1.2-.9,0-.8,0-1.5,0-2.3,0-1.2-.5-1.6-1.6-1.6h-.6v.6h.4c.7,0,.9.3.9,1.1v2.2c0,.8.2,1.2.8,1.3h0c-.6.2-.8.6-.8,1.4v2.2c0,.8-.2,1.1-.9,1.1h-.4v.6h.6c1.1,0,1.6-.4,1.6-1.6v-.3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 838 B

+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
fill-rule: evenodd;
}
</style>
</defs>
<path class="st0" d="M35.9,29.8h.3c.5.1.6.4.5.9,0,.2-.2.3-.3.4h0c.2.7.3,1.5.5,2.2,0,.3.2.6.5.8.2,0,.5,0,.7,0,.3-.2.5-.5.6-.8-.3-.4-.3-.7,0-1.1.4-.2.7-.2,1,0,.2.5,0,.8-.3,1.1h-.4c0,.3,0,.5,0,.8v.8c0,.2.2.3.5.3s.5,0,.8-.3.5-.4.8-.7c-.2-.3-.2-.6,0-.8.3-.3.6-.3.9,0,0,0,.2.2.3.4v.4c-.2.4-.5.6-.9.5-.4,1.1-.8,2.2-1.2,3.4h-7.9c-.4-1.1-.8-2.3-1.1-3.4-.4,0-.7,0-.9-.4v-.4c.2-.4.5-.6,1-.4.4.3.5.6.3,1,.4.3.8.6,1.2.8h.7c0,0,.2-.2.2-.4,0-.5,0-.9,0-1.4-.5,0-.8-.2-.8-.7s.4-.8,1-.6c.4.2.5.6.3,1,0,0,0,.2-.2.2.2.2.3.5.5.7s.3.2.5.3c0,0,.2,0,.3,0,.2-.2.3-.5.4-.8.2-.7.4-1.5.5-2.2,0,0-.3-.2-.4-.3-.2-.5,0-.9.4-1.1h0Z"/>
<path class="st0" d="M40,40.4h-8v-1.4h8v1.4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1012 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path id="path3032" class="st0" d="M36,24.4l-.4.3c-2.1,1.7-3.7,2.4-6.1,2.6-.3,0-1.8,0-2.3,0h-.2v5.9c0,3.6,0,6.1,0,6.3,0,.4,0,.8.2,1.2.4,1.7,1.5,3,4,4.6.7.4.9.6,3.3,2,.6.4,1.2.8,1.3.8,0,0,.2.1.2.1,0,0,.2-.1.5-.3.3-.2.9-.6,1.5-.9,3.4-2.1,4.2-2.6,5.2-3.6,1.2-1.2,1.7-2.4,1.9-4,0-.2,0-2.8,0-6.3v-5.9s-.2,0-.2,0c-.5,0-2,0-2.3,0-2.4-.2-4-.9-6.1-2.6l-.4-.3ZM36,26.9l.4.3c1.8,1.2,3.4,1.8,5.5,2.1.3,0,1,0,1.1,0,0,0,0,2.3,0,5.2,0,5.1,0,5.2,0,5.5-.2,1.2-.9,2.1-2.3,3.1-.6.5-1.5,1-3.6,2.3-.6.3-1,.6-1,.6,0,0-1.7-1-2.5-1.5-1.7-1.1-2.6-1.7-3.2-2.3-.7-.7-1.1-1.3-1.3-2.3v-.3c0,0,0-5.2,0-5.2,0-2.8,0-5.2,0-5.2,0,0,.2,0,.4,0,2.5-.2,4.2-.8,6.2-2.1l.4-.3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 971 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M36.1,44.5s.3-.3.9-.5c1.8-1.1,2.6-1.5,3.1-2,1.2-.9,1.8-1.6,2-2.7v-9.2h-.9c-1.8-.3-3.2-.8-4.7-1.8l-.3-.3h0c0,0-.1,0-.1,0v16.3c0,0,.1,0,.1,0Z"/>
</svg>

After

Width:  |  Height:  |  Size: 495 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M47.5,35.9c-.3-3.2-1.5-4.4-6.4-9.4-.3-.8-.9-1.5-1.6-1.9-2.4-1.4-5.9.4-8,3.9-1.7,3-1.8,6.2-.4,8l-6.6,9.3.7,2.1,7.4-10.4c.8.3,1.8.3,2.8,0,2.2.1,5.4-.5,6.4.3.5.4,1.8.9,1.9,1.7.4,1.6.3,3.7,1.2,3.6,1.9-.3,2.8-5.2,2.6-7.3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 572 B

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<ellipse class="st0" cx="35.6" cy="30.8" rx="6.3" ry="4.1" transform="translate(-10.1 42.2) rotate(-54.9)"/>
</svg>

After

Width:  |  Height:  |  Size: 440 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<circle class="st0" cx="36" cy="36" r="9"/>
</svg>

After

Width:  |  Height:  |  Size: 375 B

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M36.3,28c-2.6,2.1-3.5,1.9-3,3.6.8,3,2.6,8.5,2.6,8.5,0,0,2.1-5.4,3-8.4.6-1.7-.3-1.5-2.7-3.8Z"/>
<path class="st0" d="M43.7,33.8c-2.8-1.9-2.9-2.7-4.3-1.7-2.6,1.7-7.3,5.1-7.3,5.1,0,0,5.8.3,8.9.3,1.8,0,1.4-.7,2.8-3.7Z"/>
<path class="st0" d="M40.5,42.6c.9-3.2,1.7-3.6.3-4.7-2.5-2-7.1-5.3-7.1-5.3,0,0,1.5,5.6,2.5,8.5.5,1.7,1.1,1.1,4.4,1.5Z"/>
<path class="st0" d="M31.1,42.3c3.3-.1,3.9.5,4.5-1.2,1.1-2.9,2.9-8.4,2.9-8.4,0,0-4.8,3.1-7.4,5-1.4,1-.7,1.4,0,4.6Z"/>
<path class="st0" d="M28.5,33.3c1.2,3.1.7,3.9,2.5,4,3.1.1,8.9.1,8.9.1,0,0-4.5-3.6-7-5.5-1.4-1.1-1.5-.2-4.4,1.4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 931 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="30.7" y="17" width="10.7" height="38"/>
</svg>

After

Width:  |  Height:  |  Size: 392 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e61a13;
}
</style>
</defs>
<polygon class="st0" points="37.5 34.6 36.1 29.3 34.6 34.6 29.4 36 34.6 37.4 36.1 42.7 37.5 37.4 42.7 36 37.5 34.6"/>
</svg>

After

Width:  |  Height:  |  Size: 449 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="5" y="30.7" width="62" height="10.7"/>
</svg>

After

Width:  |  Height:  |  Size: 391 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="13.8 17 5 17 5 24.3 58.3 55 67 55 67 47.7 13.8 17"/>
</svg>

After

Width:  |  Height:  |  Size: 413 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="67 17 58.2 17 5 47.7 5 55 13.8 55 67 24.3 67 17"/>
</svg>

After

Width:  |  Height:  |  Size: 411 B

+327
View File
@@ -0,0 +1,327 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<g id="s">
<g id="c">
<path id="t" class="st0" d="M36,21.6l-.6,2,1,.3-.3-2.3Z"/>
<path id="t1" data-name="t" class="st0" d="M36,21.6l.6,2-1,.3.3-2.3Z"/>
</g>
<g id="a">
<g id="c1" data-name="c">
<path id="t2" data-name="t" class="st0" d="M38,23h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t3" data-name="t" class="st0" d="M38,23l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
<g id="c2" data-name="c">
<path id="t4" data-name="t" class="st0" d="M37.2,25.4l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t5" data-name="t" class="st0" d="M37.2,25.4l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
</g>
<g id="a1" data-name="a">
<g id="c3" data-name="c">
<path id="t6" data-name="t" class="st0" d="M34,23h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t7" data-name="t" class="st0" d="M34,23l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
<g id="c4" data-name="c">
<path id="t8" data-name="t" class="st0" d="M34.8,25.4l.6-2,1,.3-1.6,1.7Z"/>
<path id="t9" data-name="t" class="st0" d="M34.8,25.4l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
</g>
</g>
<g id="s1" data-name="s">
<g id="c5" data-name="c">
<path id="t10" data-name="t" class="st0" d="M36,46.6l-.6,2,1,.3-.3-2.3Z"/>
<path id="t11" data-name="t" class="st0" d="M36,46.6l.6,2-1,.3.3-2.3Z"/>
</g>
<g id="a2" data-name="a">
<g id="c6" data-name="c">
<path id="t12" data-name="t" class="st0" d="M38,48.1h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t13" data-name="t" class="st0" d="M38,48.1l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
<g id="c7" data-name="c">
<path id="t14" data-name="t" class="st0" d="M37.2,50.4l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t15" data-name="t" class="st0" d="M37.2,50.4l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
</g>
<g id="a3" data-name="a">
<g id="c8" data-name="c">
<path id="t16" data-name="t" class="st0" d="M34,48.1h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t17" data-name="t" class="st0" d="M34,48.1l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
<g id="c9" data-name="c">
<path id="t18" data-name="t" class="st0" d="M34.8,50.4l.6-2,1,.3-1.6,1.7Z"/>
<path id="t19" data-name="t" class="st0" d="M34.8,50.4l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
</g>
</g>
<g id="l">
<g id="s2" data-name="s">
<g id="c10" data-name="c">
<path id="t20" data-name="t" class="st0" d="M23.5,34.1l-.6,2,1,.3-.3-2.3Z"/>
<path id="t21" data-name="t" class="st0" d="M23.5,34.1l.6,2-1,.3.3-2.3Z"/>
</g>
<g id="a4" data-name="a">
<g id="c11" data-name="c">
<path id="t22" data-name="t" class="st0" d="M25.5,35.6h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t23" data-name="t" class="st0" d="M25.5,35.6l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
<g id="c12" data-name="c">
<path id="t24" data-name="t" class="st0" d="M24.7,37.9l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t25" data-name="t" class="st0" d="M24.7,37.9l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
</g>
<g id="a5" data-name="a">
<g id="c13" data-name="c">
<path id="t26" data-name="t" class="st0" d="M21.5,35.6h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t27" data-name="t" class="st0" d="M21.5,35.6l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
<g id="c14" data-name="c">
<path id="t28" data-name="t" class="st0" d="M22.3,37.9l.6-2,1,.3-1.6,1.7Z"/>
<path id="t29" data-name="t" class="st0" d="M22.3,37.9l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
</g>
</g>
<g id="s3" data-name="s">
<g id="c15" data-name="c">
<path id="t30" data-name="t" class="st0" d="M28.5,27l1.7-1.2-.6-.8-1.1,2.1Z"/>
<path id="t31" data-name="t" class="st0" d="M28.5,27l.6-2,1,.3-1.6,1.7Z"/>
</g>
<g id="a6" data-name="a">
<g id="c16" data-name="c">
<path id="t32" data-name="t" class="st0" d="M27.8,24.7l1.7,1.2.6-.8-2.3-.4Z"/>
<path id="t33" data-name="t" class="st0" d="M27.8,24.7h2.1v1s-2.1-1-2.1-1Z"/>
</g>
<g id="c17" data-name="c">
<path id="t34" data-name="t" class="st0" d="M29.7,23.3l-.6,2,1,.3-.3-2.3Z"/>
<path id="t35" data-name="t" class="st0" d="M29.7,23.3l.6,2-1,.3.3-2.3Z"/>
</g>
</g>
<g id="a7" data-name="a">
<g id="c18" data-name="c">
<path id="t36" data-name="t" class="st0" d="M31,27l-1.7-1.2.6-.8,1.1,2.1Z"/>
<path id="t37" data-name="t" class="st0" d="M31,27l-.6-2-1,.3,1.6,1.7Z"/>
</g>
<g id="c19" data-name="c">
<path id="t38" data-name="t" class="st0" d="M31.7,24.7l-1.7,1.2-.6-.8,2.3-.4Z"/>
<path id="t39" data-name="t" class="st0" d="M31.7,24.7h-2.1v1s2.1-1,2.1-1Z"/>
</g>
</g>
</g>
<g id="s4" data-name="s">
<g id="c20" data-name="c">
<path id="t40" data-name="t" class="st0" d="M26.4,31.6l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t41" data-name="t" class="st0" d="M26.4,31.6l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
<g id="a8" data-name="a">
<g id="c21" data-name="c">
<path id="t42" data-name="t" class="st0" d="M23.9,31.6l1.7-1.2-.6-.8-1.1,2.1Z"/>
<path id="t43" data-name="t" class="st0" d="M23.9,31.6l.6-2,1,.3-1.6,1.7Z"/>
</g>
<g id="c22" data-name="c">
<path id="t44" data-name="t" class="st0" d="M23.2,29.3l1.7,1.2.6-.8-2.3-.4Z"/>
<path id="t45" data-name="t" class="st0" d="M23.2,29.3h2.1v1s-2.1-1-2.1-1Z"/>
</g>
</g>
<g id="a9" data-name="a">
<g id="c23" data-name="c">
<path id="t46" data-name="t" class="st0" d="M27.1,29.3l-1.7,1.2-.6-.8,2.3-.4Z"/>
<path id="t47" data-name="t" class="st0" d="M27.1,29.3h-2.1s0,1,0,1l2.1-1Z"/>
</g>
<g id="c24" data-name="c">
<path id="t48" data-name="t" class="st0" d="M25.2,27.9l.6,2-1,.3.3-2.3Z"/>
<path id="t49" data-name="t" class="st0" d="M25.2,27.9l-.6,2,1,.3-.3-2.3Z"/>
</g>
</g>
</g>
<g id="s5" data-name="s">
<g id="c25" data-name="c">
<path id="t50" data-name="t" class="st0" d="M27.1,41.8h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t51" data-name="t" class="st0" d="M27.1,41.8l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
<g id="a10" data-name="a">
<g id="c26" data-name="c">
<path id="t52" data-name="t" class="st0" d="M26.4,44.1l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t53" data-name="t" class="st0" d="M26.4,44.1l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
<g id="c27" data-name="c">
<path id="t54" data-name="t" class="st0" d="M23.9,44.1l1.7-1.2-.6-.8-1.1,2.1Z"/>
<path id="t55" data-name="t" class="st0" d="M23.9,44.1l.6-2,1,.3-1.6,1.7Z"/>
</g>
</g>
<g id="a11" data-name="a">
<g id="c28" data-name="c">
<path id="t56" data-name="t" class="st0" d="M25.2,40.4l.6,2-1,.3.3-2.3Z"/>
<path id="t57" data-name="t" class="st0" d="M25.2,40.4l-.6,2,1,.3-.3-2.3Z"/>
</g>
<g id="c29" data-name="c">
<path id="t58" data-name="t" class="st0" d="M23.2,41.8h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t59" data-name="t" class="st0" d="M23.2,41.8l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
</g>
</g>
<g id="s6" data-name="s">
<g id="c30" data-name="c">
<path id="t60" data-name="t" class="st0" d="M31.7,46.4h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t61" data-name="t" class="st0" d="M31.7,46.4l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
<g id="a12" data-name="a">
<g id="c31" data-name="c">
<path id="t62" data-name="t" class="st0" d="M31,48.7l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t63" data-name="t" class="st0" d="M31,48.7l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
<g id="c32" data-name="c">
<path id="t64" data-name="t" class="st0" d="M28.5,48.7l1.7-1.2-.6-.8-1.1,2.1Z"/>
<path id="t65" data-name="t" class="st0" d="M28.5,48.7l.6-2,1,.3-1.6,1.7Z"/>
</g>
</g>
<g id="a13" data-name="a">
<g id="c33" data-name="c">
<path id="t66" data-name="t" class="st0" d="M29.7,45l.6,2-1,.3.3-2.3Z"/>
<path id="t67" data-name="t" class="st0" d="M29.7,45l-.6,2,1,.3-.3-2.3Z"/>
</g>
<g id="c34" data-name="c">
<path id="t68" data-name="t" class="st0" d="M27.8,46.4h2.1v1s-2.1-1-2.1-1Z"/>
<path id="t69" data-name="t" class="st0" d="M27.8,46.4l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
</g>
</g>
</g>
<g id="l1" data-name="l">
<g id="s7" data-name="s">
<g id="c35" data-name="c">
<path id="t70" data-name="t" class="st0" d="M48.5,34.1l.6,2-1,.3.3-2.3Z"/>
<path id="t71" data-name="t" class="st0" d="M48.5,34.1l-.6,2,1,.3-.3-2.3Z"/>
</g>
<g id="a14" data-name="a">
<g id="c36" data-name="c">
<path id="t72" data-name="t" class="st0" d="M46.5,35.6h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t73" data-name="t" class="st0" d="M46.5,35.6l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
<g id="c37" data-name="c">
<path id="t74" data-name="t" class="st0" d="M47.3,37.9l.6-2,1,.3-1.6,1.7Z"/>
<path id="t75" data-name="t" class="st0" d="M47.3,37.9l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
</g>
<g id="a15" data-name="a">
<g id="c38" data-name="c">
<path id="t76" data-name="t" class="st0" d="M50.5,35.6h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t77" data-name="t" class="st0" d="M50.5,35.6l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
<g id="c39" data-name="c">
<path id="t78" data-name="t" class="st0" d="M49.7,37.9l-.6-2-1,.3,1.6,1.7Z"/>
<path id="t79" data-name="t" class="st0" d="M49.7,37.9l-1.7-1.2.6-.8,1.1,2.1Z"/>
</g>
</g>
</g>
<g id="s8" data-name="s">
<g id="c40" data-name="c">
<path id="t80" data-name="t" class="st0" d="M43.5,27l-1.7-1.2.6-.8,1.1,2.1Z"/>
<path id="t81" data-name="t" class="st0" d="M43.5,27l-.6-2-1,.3,1.6,1.7Z"/>
</g>
<g id="a16" data-name="a">
<g id="c41" data-name="c">
<path id="t82" data-name="t" class="st0" d="M44.2,24.7l-1.7,1.2-.6-.8,2.3-.4Z"/>
<path id="t83" data-name="t" class="st0" d="M44.2,24.7h-2.1v1s2.1-1,2.1-1Z"/>
</g>
<g id="c42" data-name="c">
<path id="t84" data-name="t" class="st0" d="M42.3,23.3l.6,2-1,.3.3-2.3Z"/>
<path id="t85" data-name="t" class="st0" d="M42.3,23.3l-.6,2,1,.3-.3-2.3Z"/>
</g>
</g>
<g id="a17" data-name="a">
<g id="c43" data-name="c">
<path id="t86" data-name="t" class="st0" d="M41,27l1.7-1.2-.6-.8-1.1,2.1Z"/>
<path id="t87" data-name="t" class="st0" d="M41,27l.6-2,1,.3-1.6,1.7Z"/>
</g>
<g id="c44" data-name="c">
<path id="t88" data-name="t" class="st0" d="M40.3,24.7l1.7,1.2.6-.8-2.3-.4Z"/>
<path id="t89" data-name="t" class="st0" d="M40.3,24.7h2.1v1s-2.1-1-2.1-1Z"/>
</g>
</g>
</g>
<g id="s9" data-name="s">
<g id="c45" data-name="c">
<path id="t90" data-name="t" class="st0" d="M45.6,31.6l.6-2,1,.3-1.6,1.7Z"/>
<path id="t91" data-name="t" class="st0" d="M45.6,31.6l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
<g id="a18" data-name="a">
<g id="c46" data-name="c">
<path id="t92" data-name="t" class="st0" d="M48.1,31.6l-1.7-1.2.6-.8,1.1,2.1Z"/>
<path id="t93" data-name="t" class="st0" d="M48.1,31.6l-.6-2-1,.3,1.6,1.7Z"/>
</g>
<g id="c47" data-name="c">
<path id="t94" data-name="t" class="st0" d="M48.8,29.3l-1.7,1.2-.6-.8,2.3-.4Z"/>
<path id="t95" data-name="t" class="st0" d="M48.8,29.3h-2.1v1s2.1-1,2.1-1Z"/>
</g>
</g>
<g id="a19" data-name="a">
<g id="c48" data-name="c">
<path id="t96" data-name="t" class="st0" d="M44.9,29.3l1.7,1.2.6-.8-2.3-.4Z"/>
<path id="t97" data-name="t" class="st0" d="M44.9,29.3h2.1s0,1,0,1l-2.1-1Z"/>
</g>
<g id="c49" data-name="c">
<path id="t98" data-name="t" class="st0" d="M46.8,27.9l-.6,2,1,.3-.3-2.3Z"/>
<path id="t99" data-name="t" class="st0" d="M46.8,27.9l.6,2-1,.3.3-2.3Z"/>
</g>
</g>
</g>
<g id="s10" data-name="s">
<g id="c50" data-name="c">
<path id="t100" data-name="t" class="st0" d="M44.9,41.8h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t101" data-name="t" class="st0" d="M44.9,41.8l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
<g id="a20" data-name="a">
<g id="c51" data-name="c">
<path id="t102" data-name="t" class="st0" d="M45.6,44.1l.6-2,1,.3-1.6,1.7Z"/>
<path id="t103" data-name="t" class="st0" d="M45.6,44.1l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
<g id="c52" data-name="c">
<path id="t104" data-name="t" class="st0" d="M48.1,44.1l-1.7-1.2.6-.8,1.1,2.1Z"/>
<path id="t105" data-name="t" class="st0" d="M48.1,44.1l-.6-2-1,.3,1.6,1.7Z"/>
</g>
</g>
<g id="a21" data-name="a">
<g id="c53" data-name="c">
<path id="t106" data-name="t" class="st0" d="M46.8,40.4l-.6,2,1,.3-.3-2.3Z"/>
<path id="t107" data-name="t" class="st0" d="M46.8,40.4l.6,2-1,.3.3-2.3Z"/>
</g>
<g id="c54" data-name="c">
<path id="t108" data-name="t" class="st0" d="M48.8,41.8h-2.1s0,1,0,1l2.1-1Z"/>
<path id="t109" data-name="t" class="st0" d="M48.8,41.8l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
</g>
</g>
<g id="s11" data-name="s">
<g id="c55" data-name="c">
<path id="t110" data-name="t" class="st0" d="M40.3,46.4h2.1s0,1,0,1l-2.1-1Z"/>
<path id="t111" data-name="t" class="st0" d="M40.3,46.4l1.7,1.2.6-.8-2.3-.4Z"/>
</g>
<g id="a22" data-name="a">
<g id="c56" data-name="c">
<path id="t112" data-name="t" class="st0" d="M41,48.7l.6-2,1,.3-1.6,1.7Z"/>
<path id="t113" data-name="t" class="st0" d="M41,48.7l1.7-1.2-.6-.8-1.1,2.1Z"/>
</g>
<g id="c57" data-name="c">
<path id="t114" data-name="t" class="st0" d="M43.5,48.7l-1.7-1.2.6-.8,1.1,2.1Z"/>
<path id="t115" data-name="t" class="st0" d="M43.5,48.7l-.6-2-1,.3,1.6,1.7Z"/>
</g>
</g>
<g id="a23" data-name="a">
<g id="c58" data-name="c">
<path id="t116" data-name="t" class="st0" d="M42.3,45l-.6,2,1,.3-.3-2.3Z"/>
<path id="t117" data-name="t" class="st0" d="M42.3,45l.6,2-1,.3.3-2.3Z"/>
</g>
<g id="c59" data-name="c">
<path id="t118" data-name="t" class="st0" d="M44.2,46.4h-2.1v1s2.1-1,2.1-1Z"/>
<path id="t119" data-name="t" class="st0" d="M44.2,46.4l-1.7,1.2-.6-.8,2.3-.4Z"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M36.1,17.7c-1.2,1-1.6.9-1.4,1.7.4,1.4,1.2,3.9,1.2,3.9,0,0,1-2.5,1.4-3.9.3-.8,0-.7-1.2-1.7h0Z"/>
<path class="st0" d="M39.5,20.3c-1.3-.9-1.3-1.2-2-.8-1.2.8-3.4,2.3-3.4,2.3,0,0,2.7.1,4.1.1s.6-.3,1.3-1.7h0Z"/>
<path class="st0" d="M38,24.4c.4-1.5.8-1.7,0-2.2-1.1-.9-3.3-2.4-3.3-2.4,0,0,.7,2.6,1.1,3.9.2.8.5.5,2,.7h.1Z"/>
<path class="st0" d="M33.7,24.2c1.5,0,1.8.2,2.1-.6.5-1.3,1.3-3.9,1.3-3.9,0,0-2.2,1.4-3.4,2.3-.6.5-.3.6,0,2.1h0Z"/>
<path class="st0" d="M32.5,20.1c.6,1.4.3,1.8,1.1,1.8h4.1s-2.1-1.7-3.2-2.5c-.6-.5-.7,0-2,.6h0Z"/>
</svg>

After

Width:  |  Height:  |  Size: 890 B

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M26,17.8c-.8.6-1.1.6-.9,1.1.2.9.8,2.6.8,2.6,0,0,.6-1.6.9-2.5.2-.5,0-.5-.8-1.1h0Z"/>
<path class="st0" d="M28.3,19.6c-.8-.6-.9-.8-1.3-.5-.8.5-2.2,1.5-2.2,1.5,0,0,1.7,0,2.7,0s.4-.2.8-1.1h0Z"/>
<path class="st0" d="M27.3,22.2c.3-1,.5-1.1,0-1.4-.8-.6-2.1-1.6-2.1-1.6,0,0,.5,1.7.8,2.6.2.5.3.3,1.3.5h0Z"/>
<path class="st0" d="M24.5,22.1c1,0,1.2.2,1.4-.4.3-.9.9-2.5.9-2.5,0,0-1.4.9-2.2,1.5-.4.3-.2.4,0,1.4Z"/>
<path class="st0" d="M23.7,19.4c.4.9.2,1.2.8,1.2.9,0,2.7,0,2.7,0,0,0-1.4-1.1-2.1-1.7-.4-.3-.5,0-1.3.4Z"/>
</svg>

After

Width:  |  Height:  |  Size: 870 B

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M46,17.9c-.8.6-1.1.6-.9,1.1.2.9.8,2.6.8,2.6,0,0,.6-1.6.9-2.5.2-.5,0-.5-.8-1.1h0Z"/>
<path class="st0" d="M48.3,19.6c-.8-.6-.9-.8-1.3-.5-.8.5-2.2,1.5-2.2,1.5h2.7c1,0,.4-.2.8-1.1h0Z"/>
<path class="st0" d="M47.3,22.3c.3-1,.5-1.1,0-1.4-.8-.6-2.1-1.6-2.1-1.6,0,0,.5,1.7.8,2.6.2.5.3.3,1.3.5h0Z"/>
<path class="st0" d="M44.5,22.2c1,0,1.2.2,1.4-.4.3-.9.9-2.5.9-2.5,0,0-1.4.9-2.2,1.5-.4.3-.2.4,0,1.4h-.1Z"/>
<path class="st0" d="M43.7,19.5c.4.9.2,1.2.8,1.2h2.7s-1.4-1.1-2.1-1.7c-.4-.3-.5,0-1.3.4h-.1Z"/>
</svg>

After

Width:  |  Height:  |  Size: 856 B

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" data-name="レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: none;
stroke: #000;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 2px;
}
</style>
</defs>
<path class="st0" d="M5,17h62v38H5V17Z"/>
</svg>

After

Width:  |  Height:  |  Size: 509 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" data-name="レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,17h62v38H5V17Z"/>
</svg>

After

Width:  |  Height:  |  Size: 400 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,36h62v19H5v-19Z"/>
</svg>

After

Width:  |  Height:  |  Size: 374 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,17h31v38H5V17Z"/>
</svg>

After

Width:  |  Height:  |  Size: 373 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M36,17h31v38h-31V17Z"/>
</svg>

After

Width:  |  Height:  |  Size: 376 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,17h62v19H5v-19Z"/>
</svg>

After

Width:  |  Height:  |  Size: 374 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72"><path fill="#fff" d="M5 17h62v38H5z"/><circle cx="36" cy="36" r="9" fill="#d22f27"/><path fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 17h62v38H5z"/></svg>

After

Width:  |  Height:  |  Size: 266 B

+23
View File
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M48.6,47.4c-1.1.3-2.3.4-3.4.8,1.9-1.6,1.8-4.1,3-6,.4-.5.7-1.1,1.2-1.6-.8,1.5-.4,3.5-1.3,5-.3.6-.8,1.2-1.3,1.6.2,0,.3-.2.5-.3,1.4-1.4,3.3-1.8,4.8-3,.6-.5,1.2-1.1,1.4-1.8-.3,2.3-2.6,4.5-4.8,5.2h-.1ZM53.7,37.9c-.7,1-1.5,1.9-2.2,2.9,0-.8.2-1.8,0-2.5-.5-1.6-1-3.3-1.2-5v-.7c.4,1.8,2.2,3.1,2.1,5.1,0,.5,0,.9-.2,1.3h0c.3-1,.4-2,.8-3,.6-1.3,1.3-2.7,1-4.3.9,1.9.6,4.5-.4,6.2h.2Z"/>
<path class="st0" d="M52.6,27.6c1.2,1.6,1.4,4.1.6,5.9-.3.8-.5,1.6-.7,2.4,0,0,0-.3,0-.5-.5-1.8-2.1-3-2.8-4.7-.2-.5-.4-1.1-.5-1.7.7,1.4,2.6,2.1,3.1,3.6.2.4.2.9.3,1.3h0c-.2-1.5-.2-3.2,0-4.7,0-.8,0-1.6-.6-2.3.3.2.4.5.6.8h.1Z"/>
<path class="st0" d="M51.8,27.3c.3,1.4,0,2.7,0,4.1h0c-.8-1.5-2.4-2.2-3.5-3.4-.6-.7-.9-1.6-1.1-2.5.6,1.5,2.3,1.9,3.3,3.1.3.3.4.7.6,1h0c-.6-1.2-.8-2.6-1.1-3.9-.2-.6-.6-1.1-1.1-1.4,1.3.3,2.4,1.6,2.7,2.8v.2Z"/>
<path class="st0" d="M48.3,24.1c1,.9,1.4,2,1.7,3.1l.2.4c-1.4-1-2.7-2.4-3.6-3.8l-1.1-1.1c1,.4,2,.7,2.8,1.4ZM26.2,22.9c-1,.8-1.6,1.9-2.4,2.9-.6.8-1.5,1.3-2.2,2,.4-.8.4-1.8,1-2.5.8-1.4,2.3-1.9,3.6-2.4Z"/>
<path class="st0" d="M20.9,25.9c.5-.6,1.1-1,1.7-1.2-1.3.9-1.2,2.5-1.6,3.8-.1.5-.4.9-.5,1.5h0c.2-.5.6-1.1,1.1-1.6.9-.9,2.3-1.4,2.8-2.7,0,1.8-1.5,3.1-2.9,4.1-.6.5-1.1,1.1-1.5,1.7v-1.4c-.2-1.5-.3-3.3.8-4.4v.2Z"/>
<path class="st0" d="M18.2,31.1c0-1.6.6-2.8,1.5-4h0c-1,1.5-.2,3.4-.2,5.2v1.8q-.1,0,0,0c0-.2,0-.4.1-.6.2-1.4,1.5-2.4,2.6-3.4.2-.3.4-.5.6-.8,0,.7-.3,1.4-.6,2.1-.8,1.6-2.4,3-2.7,4.9-.1-1.8-1.4-3.2-1.2-5.1h0Z"/>
<path class="st0" d="M17.5,33.4c.1-.5.2-1,.4-1.4-.4,2.1,1,3.5,1.4,5.3.2.7.2,1.4.5,2h0c-.7-1.9.3-3.7,1.3-5.1.2-.4.4-.9.5-1.3.1.9-.1,1.8-.2,2.7-.2,1.1-.6,2.2-.9,3.3-.2.7-.2,1.5,0,2.2h0c-.7-1.4-2.1-2.4-2.6-3.9-.3-1.2-.6-2.5-.3-3.8h0Z"/>
<path class="st0" d="M17.4,37.4c.2,2.2,2.5,3.3,3.6,5.1.3.4.5.8.8,1.1,0-.2-.3-.4-.4-.7-.4-.8-.5-1.7-.4-2.6.1-1.1.6-2.1.4-3.3,1,2.1.7,4.6,1.2,6.9.1.5.4.9.6,1.4-2-1.3-4.6-2.6-5.5-5.1-.4-.8-.4-1.9-.3-2.9h0Z"/>
<path class="st0" d="M18.6,42.4c1.1,2.5,3.8,2.7,5.7,4.2.3.3.7.6,1.1.7h0c-.4-.4-.9-.8-1.2-1.3-1.1-1.5-.7-3.6-1.5-5.2.7.9,1.4,1.8,1.8,2.8.7,1.6.9,3.5,2.4,4.7-1.6-.5-3.6-.4-5-1.4-1.6-1-3-2.6-3.3-4.4h0Z"/>
<path class="st0" d="M21.4,47c1.8,2,4.6,1.3,7,1.9.3,0,.6.2,1,0-.3-.2-.7-.2-1-.3-1.8-.6-2.1-2.6-3.1-4,1.3.8,2.3,2,3.5,3.1.8.7,1.9,1.1,2.9,1.3-.3,0-.6,0-.9,0-1.9.5-4.1,1.2-6.1.6-1.3-.4-2.7-1.5-3.4-2.8h.1Z"/>
<path class="st0" d="M45.2,51.7c-2,.7-4,0-5.6-1.2-.6-.4-1.2-1-2-.9h-.8c1.5.7,2.9,1.7,4.2,2.9-.2.2-.5.5-.8.7-1.2-1.3-2.6-2.6-4.1-3.3-.3,0-.6.2-.9.4-1.2.8-2.5,1.8-3.4,3l-.8-.7c1.3-1.3,2.7-2.3,4.2-3-1.5-.5-2.5.8-3.6,1.4-1.3.9-3.2,1.4-4.9.7-.9-.3-1.7-.8-2.3-1.6,1.3.9,3.1,1,4.6.4,1.9-.8,3.9-1.9,6.3-1.4.4,0,.7.4,1.1,0,1.7-.4,3.7,0,5.2.7l1.5.6c1.4.5,3.3.4,4.5-.5-.6.8-1.5,1.3-2.4,1.7h0Z"/>
<path class="st0" d="M47.3,49.6c-2.2.8-4.5-.2-6.6-.5h-.4c1-.3,2-.6,2.8-1.3,1.2-1.1,2.3-2.3,3.6-3.2-1,1.3-1.1,3.1-2.7,3.9-.4.3-.9.3-1.3.5.6,0,1.1-.2,1.7-.3,2.2-.3,4.7,0,6.2-1.8-.6,1.3-2,2.4-3.3,2.8h0ZM51.4,43.4c-.9.6-1.8,1.1-2.6,1.8h0c1.3-2.2.7-5.2,1.5-7.5l.3-.8c-.2,1.5.5,2.7.4,4.2,0,.9-.3,1.7-.8,2.4h0c.6-.8,1.1-1.7,1.9-2.5,1.1-1.1,2.3-2.2,2.5-3.8.4,2.6-1,4.8-3.2,6.3h0Z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="5 44.1 5 55 15.9 55 5 44.1"/>
</svg>

After

Width:  |  Height:  |  Size: 390 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="56.1 55 67 55 67 44.1 56.1 55"/>
</svg>

After

Width:  |  Height:  |  Size: 393 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="15.9 17 5 17 5 27.9 15.9 17"/>
</svg>

After

Width:  |  Height:  |  Size: 391 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="67 27.9 67 17 56.1 17 67 27.9"/>
</svg>

After

Width:  |  Height:  |  Size: 393 B

+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<g id="layer1">
<path id="path2" class="st0" d="M35.8,20.7v3c0,0,.1,0,.2,0,0,0,.1,0,.2,0v-3h-.3ZM36,25.3l-2.5,8.2-8.2,2.5,8.2,2.5,2.5,8.2,2.5-8.2,8.2-2.5-8.2-2.5-2.5-8.2ZM36,27.5l2,6.3-2,2.2v-8.5ZM37.7,27.7v.4c3.2.7,5.5,3.1,6.2,6.1h.4c-.7-3.2-3.3-5.8-6.6-6.5ZM34.3,27.7c-3.3.7-5.9,3.3-6.6,6.6h.4c.7-3.1,3.1-5.5,6.1-6.2v-.4ZM33.8,34l2.2,1.9h-8.5s6.3-1.9,6.3-1.9ZM14.9,35.8v.3h8.8c0,0,0-.2,0-.2,0,0,0,0,0-.1h-8.8ZM48.3,35.8s0,0,0,.1c0,0,0,.2,0,.2h8.8v-.3h-8.8ZM44.5,36h0s-6.3,2-6.3,2l-2.2-2h8.5ZM36,36v8.5s0,0,0,0l-2-6.3,2-2.2ZM27.7,37.7c.7,3.3,3.3,5.9,6.6,6.6v-.4c-3.1-.7-5.5-3.1-6.2-6.1h-.4ZM44.3,37.7h-.4c-.7,3.1-3.1,5.5-6.1,6.2v.4c3.2-.7,5.8-3.3,6.5-6.6ZM35.8,48.2v3.1h.3v-3.1c0,0-.1,0-.2,0,0,0-.1,0-.2,0Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="36 48.7 33.5 42 27 45 30 38.5 23.3 36 30 33.5 27 27 33.5 30 36 23.3 38.5 30 45 27 42 33.5 48.7 36 42 38.5 45 45 38.5 42 36 48.7"/>
</svg>

After

Width:  |  Height:  |  Size: 491 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<polygon class="st0" points="40.9 47.7 36 42.5 31.1 47.8 31.4 40.6 24.3 40.9 29.5 36 24.2 31.1 31.4 31.4 31.1 24.3 36 29.5 40.9 24.2 40.6 31.4 47.7 31.1 42.5 36 47.8 40.9 40.6 40.6 40.9 47.7"/>
</svg>

After

Width:  |  Height:  |  Size: 525 B

+29
View File
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="150px" height="150px" viewBox="0 0 150 150" version="1.1">
<g id="surface1">
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 63.75 46.140625 C 65.632812 46.222656 67.515625 46.277344 69.402344 46.304688 C 69.507812 47.109375 69.546875 47.925781 69.511719 48.75 C 73.460938 48.75 77.410156 48.75 81.359375 48.75 C 81.359375 47.917969 81.359375 47.082031 81.359375 46.25 C 83.3125 46.140625 85.269531 46.140625 87.226562 46.25 C 88.027344 52.207031 86.214844 57.191406 81.792969 61.195312 C 80.757812 62.011719 79.617188 62.644531 78.371094 63.097656 C 78.316406 63.042969 78.261719 62.988281 78.207031 62.933594 C 80.804688 60.832031 82.816406 58.277344 84.238281 55.273438 C 85.253906 52.914062 85.742188 50.449219 85.707031 47.878906 C 84.808594 47.855469 83.902344 47.855469 82.988281 47.878906 C 83.023438 48.667969 82.988281 49.449219 82.878906 50.21875 C 77.878906 50.289062 72.878906 50.289062 67.878906 50.21875 C 67.773438 49.449219 67.738281 48.667969 67.773438 47.878906 C 66.902344 47.878906 66.03125 47.878906 65.164062 47.878906 C 65.0625 52.378906 66.421875 56.367188 69.238281 59.835938 C 70.3125 60.945312 71.417969 62.015625 72.554688 63.042969 C 72.375 63.117188 72.191406 63.117188 72.011719 63.042969 C 67.910156 61.148438 65.246094 58.015625 64.023438 53.640625 C 63.363281 51.285156 63.183594 48.894531 63.476562 46.46875 C 63.554688 46.339844 63.644531 46.230469 63.75 46.140625 Z M 63.75 46.140625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 69.621094 51.140625 C 73.425781 51.140625 77.226562 51.140625 81.03125 51.140625 C 81.070312 53.027344 81.089844 54.910156 81.085938 56.792969 C 80.78125 59.800781 79.261719 61.898438 76.523438 63.097656 C 76.085938 67.097656 76.828125 70.863281 78.75 74.402344 C 78.695312 74.4375 78.640625 74.476562 78.585938 74.511719 C 76.421875 73.386719 74.230469 73.351562 72.011719 74.402344 C 72.277344 73.5 72.621094 72.59375 73.042969 71.683594 C 74.175781 68.851562 74.519531 65.933594 74.074219 62.933594 C 71.65625 61.886719 70.1875 60.058594 69.675781 57.445312 C 69.621094 55.34375 69.601562 53.242188 69.621094 51.140625 Z M 69.621094 51.140625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 60.164062 55.925781 C 60.613281 56.386719 61.066406 56.859375 61.523438 57.335938 C 61.558594 57.445312 61.59375 57.554688 61.628906 57.664062 C 61.621094 63.316406 61.640625 68.96875 61.683594 74.621094 C 64.039062 74.582031 66.394531 74.621094 68.75 74.726562 C 68.484375 75.097656 68.230469 75.480469 67.988281 75.871094 C 65.390625 75.960938 62.800781 75.941406 60.21875 75.816406 C 60.164062 69.183594 60.144531 62.554688 60.164062 55.925781 Z M 60.164062 55.925781 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 90.378906 55.925781 C 90.449219 55.9375 90.5 55.972656 90.542969 56.03125 C 90.597656 62.664062 90.617188 69.292969 90.597656 75.925781 C 88.0625 76.03125 85.527344 76.050781 82.988281 75.976562 C 82.582031 75.613281 82.328125 75.164062 82.226562 74.621094 C 84.546875 74.621094 86.867188 74.621094 89.183594 74.621094 C 89.21875 69.054688 89.183594 63.492188 89.074219 57.933594 C 89.144531 57.703125 89.199219 57.46875 89.238281 57.226562 C 89.683594 56.835938 90.066406 56.402344 90.378906 55.925781 Z M 90.378906 55.925781 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 87.664062 62.121094 C 87.878906 65.597656 87.953125 69.109375 87.878906 72.664062 C 86.105469 72.699219 84.328125 72.664062 82.554688 72.554688 C 82.742188 72.117188 82.960938 71.699219 83.207031 71.304688 C 84.292969 71.25 85.378906 71.230469 86.46875 71.25 C 86.449219 68.640625 86.46875 66.03125 86.523438 63.425781 C 86.882812 62.972656 87.265625 62.535156 87.664062 62.121094 Z M 87.664062 62.121094 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 62.878906 62.226562 C 62.960938 62.214844 63.035156 62.230469 63.097656 62.28125 C 63.4375 62.730469 63.820312 63.148438 64.238281 63.53125 C 64.273438 66.070312 64.3125 68.605469 64.347656 71.140625 C 65.515625 71.230469 66.695312 71.285156 67.878906 71.304688 C 68.164062 71.722656 68.308594 72.15625 68.316406 72.609375 C 66.539062 72.699219 64.761719 72.679688 62.988281 72.554688 C 62.976562 69.125 62.941406 65.683594 62.878906 62.226562 Z M 62.878906 62.226562 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 71.25 74.726562 C 73.96875 74.710938 76.683594 74.726562 79.402344 74.78125 C 79.710938 75.054688 79.890625 75.398438 79.945312 75.816406 C 77.644531 75.890625 75.34375 75.855469 73.042969 75.707031 C 72.292969 75.722656 71.550781 75.796875 70.816406 75.925781 C 70.875 75.488281 71.019531 75.089844 71.25 74.726562 Z M 71.25 74.726562 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 68.75 77.011719 C 73.132812 76.992188 77.519531 77.011719 81.902344 77.066406 C 82.257812 77.867188 82.585938 78.679688 82.878906 79.511719 C 77.84375 79.65625 72.808594 79.65625 67.773438 79.511719 C 68.078125 78.667969 68.402344 77.832031 68.75 77.011719 Z M 68.75 77.011719 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 34.183594 83.425781 C 37.273438 83.191406 39.410156 84.515625 40.597656 87.390625 C 40.59375 88.339844 40.59375 89.28125 40.597656 90.21875 C 39.734375 92.585938 37.976562 93.835938 35.324219 93.96875 C 32.457031 93.921875 30.574219 92.546875 29.675781 89.835938 C 29.210938 87.015625 30.277344 85.003906 32.878906 83.804688 C 33.328125 83.675781 33.761719 83.546875 34.183594 83.425781 Z M 34.292969 86.46875 C 36.238281 86.09375 37.289062 86.875 37.445312 88.804688 C 37.167969 90.449219 36.1875 91.171875 34.511719 90.976562 C 33.714844 90.835938 33.191406 90.382812 32.933594 89.621094 C 32.566406 88.25 33.019531 87.199219 34.292969 86.46875 Z M 34.292969 86.46875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 94.726562 83.425781 C 96.710938 83.179688 98.394531 83.757812 99.78125 85.164062 C 100.015625 85.796875 100.378906 86.339844 100.871094 86.792969 C 101.839844 90.300781 100.605469 92.65625 97.175781 93.859375 C 93.859375 94.355469 91.503906 93.015625 90.109375 89.835938 C 89.78125 86.363281 91.320312 84.226562 94.726562 83.425781 Z M 94.835938 86.46875 C 96.695312 86.101562 97.746094 86.84375 97.988281 88.695312 C 97.527344 90.867188 96.257812 91.519531 94.183594 90.652344 C 93.34375 89.851562 93.070312 88.890625 93.371094 87.773438 C 93.746094 87.195312 94.238281 86.757812 94.835938 86.46875 Z M 94.835938 86.46875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 41.46875 83.640625 C 43.503906 83.59375 45.53125 83.648438 47.554688 83.804688 C 49.953125 84.585938 50.96875 86.214844 50.597656 88.695312 C 50.089844 89.929688 49.203125 90.671875 47.933594 90.925781 C 46.886719 91.1875 45.816406 91.296875 44.726562 91.25 C 44.738281 92.089844 44.703125 92.902344 44.621094 93.695312 C 43.578125 93.785156 42.546875 93.765625 41.523438 93.640625 C 41.46875 90.308594 41.449219 86.976562 41.46875 83.640625 Z M 46.25 86.359375 C 47.25 86.503906 47.59375 87.046875 47.28125 87.988281 C 47.140625 88.207031 46.941406 88.332031 46.683594 88.371094 C 46.03125 88.441406 45.378906 88.441406 44.726562 88.371094 C 44.835938 87.746094 44.871094 87.113281 44.835938 86.46875 C 45.328125 86.503906 45.800781 86.464844 46.25 86.359375 Z M 46.25 86.359375 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(90.196079%,0%,7.058824%);fill-opacity:1;" d="M 51.46875 83.640625 C 54.074219 83.640625 56.683594 83.640625 59.292969 83.640625 C 59.417969 84.535156 59.417969 85.421875 59.292969 86.304688 C 57.804688 86.324219 56.320312 86.375 54.835938 86.46875 C 54.738281 86.75 54.703125 87.039062 54.726562 87.335938 C 56.105469 87.320312 57.480469 87.335938 58.859375 87.390625 C 59.003906 88.226562 59.003906 89.058594 58.859375 89.890625 C 57.925781 89.847656 56.964844 89.832031 55.976562 89.835938 C 55.59375 89.851562 55.210938 89.90625 54.835938 90 C 54.734375 90.367188 54.695312 90.75 54.726562 91.140625 C 56.3125 91.105469 57.890625 91.140625 59.457031 91.25 C 59.476562 92.039062 59.53125 92.816406 59.621094 93.585938 C 59.582031 93.625 59.546875 93.660156 59.511719 93.695312 C 56.867188 93.769531 54.222656 93.769531 51.574219 93.695312 C 51.46875 90.351562 51.429688 87 51.46875 83.640625 Z M 51.46875 83.640625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 60.597656 83.640625 C 61.503906 83.625 62.410156 83.640625 63.316406 83.695312 C 64.535156 85.171875 65.765625 86.640625 67.011719 88.097656 C 67.171875 87.8125 67.242188 87.503906 67.226562 87.175781 C 67.15625 86.066406 67.121094 84.945312 67.121094 83.804688 C 68.1875 83.644531 69.277344 83.589844 70.378906 83.640625 C 70.378906 87.011719 70.378906 90.378906 70.378906 93.75 C 69.425781 93.796875 68.484375 93.742188 67.554688 93.585938 C 66.667969 92.410156 65.777344 91.230469 64.890625 90.054688 C 64.558594 89.722656 64.234375 89.394531 63.914062 89.074219 C 63.746094 90.554688 63.730469 92.058594 63.859375 93.585938 C 63.332031 93.710938 62.789062 93.765625 62.226562 93.75 C 61.722656 93.730469 61.214844 93.714844 60.707031 93.695312 C 60.632812 93.625 60.5625 93.550781 60.488281 93.476562 C 60.597656 90.207031 60.632812 86.929688 60.597656 83.640625 Z M 60.597656 83.640625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(90.196079%,0%,7.058824%);fill-opacity:1;" d="M 71.683594 83.640625 C 74.292969 83.625 76.902344 83.640625 79.511719 83.695312 C 79.65625 84.566406 79.65625 85.433594 79.511719 86.304688 C 77.988281 86.359375 76.46875 86.375 74.945312 86.359375 C 74.863281 86.820312 74.863281 87.273438 74.945312 87.71875 C 76.359375 87.773438 77.769531 87.789062 79.183594 87.773438 C 79.320312 88.675781 79.320312 89.582031 79.183594 90.488281 C 77.765625 90.453125 76.351562 90.492188 74.945312 90.597656 C 74.835938 91.644531 74.800781 92.695312 74.835938 93.75 C 73.785156 93.75 72.734375 93.75 71.683594 93.75 C 71.683594 90.378906 71.683594 87.011719 71.683594 83.640625 Z M 71.683594 83.640625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 80.488281 83.640625 C 82.375 83.625 84.257812 83.640625 86.140625 83.695312 C 88.582031 84.324219 89.707031 85.882812 89.511719 88.371094 C 89.425781 88.8125 89.261719 89.230469 89.023438 89.621094 C 88.671875 89.96875 88.328125 90.3125 87.988281 90.652344 C 88.433594 91.425781 88.925781 92.167969 89.457031 92.878906 C 89.570312 93.125 89.695312 93.359375 89.835938 93.585938 C 89.800781 93.625 89.765625 93.660156 89.726562 93.695312 C 88.675781 93.769531 87.625 93.769531 86.574219 93.695312 C 86.066406 92.910156 85.539062 92.128906 85 91.359375 C 84.792969 91.289062 84.613281 91.179688 84.457031 91.03125 C 84.261719 91.113281 84.0625 91.183594 83.859375 91.25 C 83.78125 92.050781 83.710938 92.847656 83.640625 93.640625 C 82.601562 93.785156 81.570312 93.785156 80.542969 93.640625 C 80.488281 90.308594 80.472656 86.976562 80.488281 83.640625 Z M 83.75 86.46875 C 84.425781 86.441406 85.09375 86.480469 85.761719 86.574219 C 86.117188 86.699219 86.28125 86.953125 86.25 87.335938 C 86.257812 87.691406 86.148438 88 85.925781 88.261719 C 85.210938 88.410156 84.484375 88.464844 83.75 88.425781 C 83.75 87.773438 83.75 87.121094 83.75 86.46875 Z M 83.75 86.46875 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 102.011719 83.640625 C 102.917969 83.625 103.824219 83.640625 104.726562 83.695312 C 105.167969 84.539062 105.765625 85.320312 106.523438 86.03125 C 106.800781 86.527344 107.160156 86.964844 107.609375 87.335938 C 107.644531 87.300781 107.679688 87.265625 107.71875 87.226562 C 107.960938 87.460938 108.179688 87.714844 108.371094 87.988281 C 108.476562 87.671875 108.53125 87.347656 108.53125 87.011719 C 108.445312 85.933594 108.410156 84.867188 108.425781 83.804688 C 109.5 83.648438 110.585938 83.59375 111.683594 83.640625 C 111.683594 87.011719 111.683594 90.378906 111.683594 93.75 C 110.8125 93.769531 109.945312 93.75 109.074219 93.695312 C 108.085938 92.304688 107.050781 90.949219 105.976562 89.621094 C 105.792969 89.398438 105.574219 89.214844 105.324219 89.074219 C 105.289062 90.597656 105.253906 92.121094 105.21875 93.640625 C 104.167969 93.785156 103.117188 93.785156 102.066406 93.640625 C 102.027344 92.753906 101.972656 91.863281 101.902344 90.976562 C 102 88.46875 102.035156 86.023438 102.011719 83.640625 Z M 102.011719 83.640625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 112.226562 83.640625 C 115.199219 83.625 118.171875 83.640625 121.140625 83.695312 C 121.285156 84.566406 121.285156 85.433594 121.140625 86.304688 C 120.234375 86.359375 119.332031 86.375 118.425781 86.359375 C 118.421875 88.789062 118.421875 91.199219 118.425781 93.585938 C 117.390625 93.765625 116.339844 93.800781 115.273438 93.695312 C 115.179688 93.523438 115.105469 93.34375 115.054688 93.152344 C 115.054688 90.949219 115.089844 88.8125 115.164062 86.738281 C 115.066406 86.578125 114.921875 86.488281 114.726562 86.46875 C 114.003906 86.390625 113.28125 86.335938 112.554688 86.304688 C 112.410156 86.125 112.265625 85.941406 112.121094 85.761719 C 112.085938 85.023438 112.121094 84.316406 112.226562 83.640625 Z M 112.226562 83.640625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 67.226562 96.03125 C 67.738281 96.015625 68.242188 96.03125 68.75 96.085938 C 69.75 96.304688 69.878906 96.757812 69.128906 97.445312 C 68.617188 97.179688 68.09375 97.160156 67.554688 97.390625 C 68.085938 97.625 68.628906 97.84375 69.183594 98.042969 C 70.230469 98.984375 70.15625 99.820312 68.96875 100.542969 C 67.976562 100.925781 67.050781 100.796875 66.195312 100.164062 C 66.160156 100.300781 66.109375 100.425781 66.03125 100.542969 C 65.597656 100.617188 65.164062 100.617188 64.726562 100.542969 C 64.726562 100.355469 64.652344 100.15625 64.511719 99.945312 C 63.972656 99.820312 63.425781 99.800781 62.878906 99.890625 C 62.75 100.097656 62.640625 100.316406 62.554688 100.542969 C 61.601562 100.523438 60.660156 100.523438 59.726562 100.542969 C 59.640625 99.992188 59.585938 99.429688 59.566406 98.859375 C 59.289062 99.21875 59.070312 99.617188 58.914062 100.054688 C 58.585938 100.199219 58.261719 100.199219 57.933594 100.054688 C 57.867188 99.953125 57.886719 99.859375 57.988281 99.78125 C 57.6875 99.527344 57.453125 99.21875 57.28125 98.859375 C 57.128906 99.425781 57.078125 100.003906 57.121094 100.597656 C 56.691406 100.628906 56.273438 100.59375 55.871094 100.488281 C 55.816406 99.039062 55.796875 97.589844 55.816406 96.140625 C 56.214844 96.125 56.613281 96.140625 57.011719 96.195312 C 57.464844 96.882812 57.933594 97.554688 58.425781 98.207031 C 58.917969 97.582031 59.355469 96.914062 59.726562 96.195312 C 60.125 96.140625 60.523438 96.125 60.925781 96.140625 C 60.886719 97.554688 60.925781 98.96875 61.03125 100.378906 C 61.707031 99.03125 62.324219 97.65625 62.878906 96.25 C 63.386719 96.105469 63.894531 96.105469 64.402344 96.25 C 64.917969 97.460938 65.460938 98.65625 66.03125 99.835938 C 66.242188 99.601562 66.421875 99.347656 66.574219 99.074219 C 67.117188 99.429688 67.695312 99.539062 68.316406 99.402344 C 68.460938 99.292969 68.460938 99.183594 68.316406 99.074219 C 67.695312 98.980469 67.113281 98.78125 66.574219 98.476562 C 65.84375 97.402344 66.058594 96.585938 67.226562 96.03125 Z M 63.53125 97.878906 C 63.746094 98.066406 63.890625 98.300781 63.96875 98.585938 C 63.753906 98.640625 63.535156 98.660156 63.316406 98.640625 C 63.355469 98.378906 63.429688 98.125 63.53125 97.878906 Z M 63.53125 97.878906 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 84.945312 96.03125 C 87.058594 95.84375 87.730469 96.710938 86.957031 98.640625 C 86.746094 98.824219 86.546875 99.023438 86.359375 99.238281 C 86.71875 99.292969 87.082031 99.3125 87.445312 99.292969 C 87.445312 99.726562 87.445312 100.164062 87.445312 100.597656 C 86.324219 100.597656 85.199219 100.597656 84.074219 100.597656 C 83.914062 100.226562 83.933594 99.867188 84.128906 99.511719 C 84.792969 98.90625 85.390625 98.253906 85.925781 97.554688 C 85.886719 97.375 85.777344 97.265625 85.597656 97.226562 C 85.320312 97.328125 85.050781 97.433594 84.78125 97.554688 C 84.476562 97.402344 84.1875 97.21875 83.914062 97.011719 C 84.089844 96.527344 84.433594 96.199219 84.945312 96.03125 Z M 84.945312 96.03125 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 89.074219 96.03125 C 90.355469 95.882812 91.171875 96.425781 91.523438 97.664062 C 91.820312 98.917969 91.441406 99.878906 90.378906 100.542969 C 88.644531 100.800781 87.703125 100.042969 87.554688 98.261719 C 87.621094 97.195312 88.128906 96.453125 89.074219 96.03125 Z M 89.511719 97.226562 C 89.714844 97.265625 89.878906 97.375 90 97.554688 C 90.199219 98.097656 90.199219 98.644531 90 99.183594 C 89.757812 99.457031 89.503906 99.457031 89.238281 99.183594 C 88.960938 98.46875 89.050781 97.816406 89.511719 97.226562 Z M 89.511719 97.226562 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 92.554688 96.03125 C 93.492188 95.835938 94.269531 96.089844 94.890625 96.792969 C 95.214844 97.886719 94.867188 98.703125 93.859375 99.238281 C 94.292969 99.292969 94.726562 99.3125 95.164062 99.292969 C 95.140625 99.421875 95.175781 99.53125 95.273438 99.621094 C 95.390625 99.414062 95.535156 99.234375 95.707031 99.074219 C 96.21875 99.386719 96.761719 99.460938 97.335938 99.292969 C 97.46875 99.160156 97.46875 99.035156 97.335938 98.914062 C 96.71875 98.910156 96.121094 98.820312 95.542969 98.640625 C 95.519531 97.808594 95.539062 96.976562 95.597656 96.140625 C 96.613281 96.140625 97.625 96.140625 98.640625 96.140625 C 98.640625 96.539062 98.640625 96.9375 98.640625 97.335938 C 98.0625 97.335938 97.480469 97.335938 96.902344 97.335938 C 96.902344 97.445312 96.902344 97.554688 96.902344 97.664062 C 98.476562 97.589844 99.074219 98.3125 98.695312 99.835938 C 97.652344 100.863281 96.511719 100.96875 95.273438 100.164062 C 95.171875 100.292969 95.132812 100.4375 95.164062 100.597656 C 94.011719 100.632812 92.871094 100.597656 91.738281 100.488281 C 91.667969 100.199219 91.667969 99.910156 91.738281 99.621094 C 92.355469 99.003906 92.972656 98.386719 93.585938 97.773438 C 93.640625 97.632812 93.660156 97.484375 93.640625 97.335938 C 93.171875 97.210938 92.792969 97.355469 92.5 97.773438 C 92.140625 97.503906 91.796875 97.210938 91.46875 96.902344 C 91.757812 96.503906 92.121094 96.214844 92.554688 96.03125 Z M 92.554688 96.03125 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 69.835938 96.140625 C 71.105469 96.140625 72.375 96.140625 73.640625 96.140625 C 73.640625 96.539062 73.640625 96.9375 73.640625 97.335938 C 73.25 97.304688 72.867188 97.339844 72.5 97.445312 C 72.445312 98.496094 72.425781 99.546875 72.445312 100.597656 C 71.980469 100.628906 71.527344 100.59375 71.085938 100.488281 C 71.03125 99.4375 71.015625 98.386719 71.03125 97.335938 C 70.632812 97.335938 70.234375 97.335938 69.835938 97.335938 C 69.835938 96.9375 69.835938 96.539062 69.835938 96.140625 Z M 69.835938 96.140625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(90.196079%,0%,7.058824%);fill-opacity:1;" d="M 73.96875 96.140625 C 75.164062 96.140625 76.359375 96.140625 77.554688 96.140625 C 77.554688 96.539062 77.554688 96.9375 77.554688 97.335938 C 76.828125 97.335938 76.105469 97.335938 75.378906 97.335938 C 75.378906 97.445312 75.378906 97.554688 75.378906 97.664062 C 75.996094 97.664062 76.613281 97.664062 77.226562 97.664062 C 77.226562 98.0625 77.226562 98.460938 77.226562 98.859375 C 76.613281 98.859375 75.996094 98.859375 75.378906 98.859375 C 75.378906 99.003906 75.378906 99.148438 75.378906 99.292969 C 76.140625 99.292969 76.902344 99.292969 77.664062 99.292969 C 77.664062 99.726562 77.664062 100.164062 77.664062 100.597656 C 76.441406 100.632812 75.226562 100.597656 74.023438 100.488281 C 73.96875 99.039062 73.949219 97.589844 73.96875 96.140625 Z M 73.96875 96.140625 "/>
<path style=" stroke:none;fill-rule:evenodd;fill:rgb(89.803922%,0%,6.666667%);fill-opacity:1;" d="M 77.988281 96.140625 C 78.96875 96.125 79.945312 96.140625 80.925781 96.195312 C 81.925781 96.625 82.269531 97.367188 81.957031 98.425781 C 81.796875 98.691406 81.597656 98.925781 81.359375 99.128906 C 81.652344 99.558594 81.90625 100.011719 82.121094 100.488281 C 81.652344 100.617188 81.179688 100.632812 80.707031 100.542969 C 80.445312 100.246094 80.230469 99.921875 80.054688 99.566406 C 79.839844 99.511719 79.621094 99.492188 79.402344 99.511719 C 79.402344 99.875 79.402344 100.234375 79.402344 100.597656 C 78.9375 100.628906 78.484375 100.59375 78.042969 100.488281 C 77.988281 99.039062 77.972656 97.589844 77.988281 96.140625 Z M 79.511719 97.335938 C 79.765625 97.320312 80.019531 97.335938 80.273438 97.390625 C 80.65625 97.589844 80.691406 97.84375 80.378906 98.152344 C 80.054688 98.207031 79.730469 98.222656 79.402344 98.207031 C 79.378906 97.90625 79.414062 97.613281 79.511719 97.335938 Z M 79.511719 97.335938 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M48.4,32h0s0,0,0,0c3.1-3.3-.7-8.5-4.8-6.5h0c.6-4.5-5.5-6.5-7.6-2.5-2.2-4-8.2-2-7.6,2.5h0c-4.1-1.9-7.9,3.2-4.8,6.5h0c-4.5.9-4.5,7.3,0,8.1h0s0,0,0,0c-3.1,3.3.7,8.5,4.8,6.5h0c-.6,4.5,5.5,6.5,7.6,2.5,2.2,4,8.2,2,7.6-2.5h0c4.1,1.9,7.9-3.2,4.8-6.5h0c4.5-.9,4.5-7.3,0-8.1ZM34.4,42.6l-.3.3-6.8-6.4,2.6-2.7,4,3.8,7.9-8.4,2.7,2.6-10.2,10.8Z"/>
</svg>

After

Width:  |  Height:  |  Size: 686 B

+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0, .st1 {
fill: #e60012;
}
.st1 {
fill-rule: evenodd;
}
</style>
</defs>
<path class="st0" d="M45,36.7h0s0,0,0,0c2.3-2.4-.5-6.1-3.4-4.7h0c.4-3.3-4-4.7-5.5-1.8-1.6-2.9-6-1.5-5.5,1.8h0c-3-1.4-5.7,2.3-3.4,4.7h0c-3.2.6-3.2,5.3,0,5.9h0s0,0,0,0c-2.3,2.4.5,6.1,3.4,4.7h0c-.4,3.3,4,4.7,5.5,1.8,1.6,2.9,6,1.5,5.5-1.8h0c3,1.4,5.7-2.3,3.4-4.7h0c3.2-.6,3.2-5.3,0-5.9ZM34.9,44.4l-.2.2-4.9-4.6,1.9-2,2.9,2.8,5.8-6.1,2,1.9-7.4,7.9Z"/>
<path class="st1" d="M21.7,21.4l.3-.3c.7-.3,1,0,1.3.6.2.2,0,.5,0,.7h0c.8.6,1.6,1.5,2.4,2.1.3.3.7.5,1.3.5.3,0,.6-.4.8-.6.2-.5.1-1,0-1.4-.7-.2-.9-.5-.9-1.3.3-.6.6-.8,1.2-.7.7.4.8.8.6,1.5l-.5.3c.3.3.4.6.6,1l.7.9c.2.2.5.2.8,0s.5-.5.7-1,.2-.9.3-1.5c-.5-.2-.7-.5-.7-.9,0-.6.4-.9.9-.9.2,0,.4,0,.7.2l.3.5c.1.6,0,1.1-.6,1.3.5,1.6,1,3.2,1.5,4.9l-9,6.7c-1.4-.9-2.9-1.9-4.1-2.9-.4.5-.8.6-1.4.3l-.3-.5c-.1-.6,0-1.1.8-1.3.7,0,1.1.3,1.2.9.7,0,1.4,0,2-.1l.8-.6c0-.2,0-.4-.1-.6-.4-.6-.8-1-1.3-1.5-.6.4-1.1.5-1.5-.1s-.2-1.3.6-1.5c.6-.1,1.1.3,1.2.9,0,0,0,.3,0,.4.4,0,.8.3,1.2.4s.5,0,.8,0c.1,0,.2-.2.3-.4,0-.4,0-.8-.2-1.3-.4-1-.8-2-1.3-2.9-.1,0-.5,0-.7,0-.7-.4-.8-1-.5-1.6h-.2Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M46,23.1c-4.3,0-10.1,2.9-13.9,8h-3.2c-2.3,0-3.6,1.7-4.6,3.6l-1.2,2.5h5.8l3,3,3,3v5.8l2.5-1.2c1.8-.9,3.6-2.2,3.6-4.6v-3.2c5.1-3.9,8-9.6,8-13.9v-2.9h-2.9ZM40.9,29.1c1.1,0,2,.9,2,2s-.9,2-2,2-2-.9-2-2,.9-2,2-2ZM27.9,41.1l-1,1c-1.4,1.4-2,5-2,5,0,0,3.4-.4,5-2l1-1-3-3Z"/>
</svg>

After

Width:  |  Height:  |  Size: 618 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M41,29.9c-2.1,0-5,1.5-7,4h-1.6c-1.2,0-1.8.9-2.3,1.8l-.6,1.2h2.9l1.5,1.5,1.5,1.5v2.9l1.2-.6c.9-.5,1.8-1.1,1.8-2.3v-1.6c2.5-1.9,4-4.8,4-7v-1.4s-1.4,0-1.4,0ZM38.4,32.9c.6,0,1,.4,1,1s-.4,1-1,1-1-.4-1-1,.4-1,1-1ZM31.9,38.9l-.5.5c-.7.7-1,2.5-1,2.5,0,0,1.7-.2,2.5-1l.5-.5s-1.5-1.5-1.5-1.5Z"/>
</svg>

After

Width:  |  Height:  |  Size: 638 B

+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: none;
stroke: #e60012;
stroke-miterlimit: 10;
stroke-width: .5px;
}
</style>
</defs>
<path class="st0" d="M36,29.7c-3.5,0-6.3,2.8-6.3,6.3,0,3.5,2.8,6.3,6.3,6.3,3.5,0,6.3-2.8,6.3-6.3,0-3.4-2.8-6.2-6.3-6.3h0Z"/>
<path class="st0" d="M36,29.7v12.6M42.3,36h-12.6M31.1,32.1c2.9,2.1,6.8,2.1,9.7,0M40.9,39.9c-2.9-2.1-6.8-2.1-9.7,0M35.5,29.9c-3.4,2.9-3.8,8-1,11.4.3.3.6.7,1,1M36.5,42.2c3.4-2.9,3.8-8,1-11.4-.3-.3-.6-.7-1-1"/>
</svg>

After

Width:  |  Height:  |  Size: 747 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M67,55H5l31-19,31,19Z"/>
</svg>

After

Width:  |  Height:  |  Size: 377 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M67,55H5V17"/>
</svg>

After

Width:  |  Height:  |  Size: 367 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M67,17v38H5"/>
</svg>

After

Width:  |  Height:  |  Size: 367 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,55V17l31.7,19L5,55Z"/>
</svg>

After

Width:  |  Height:  |  Size: 378 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M36,36l31-19v38l-31-19Z"/>
</svg>

After

Width:  |  Height:  |  Size: 379 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,17h62l-31,19L5,17Z"/>
</svg>

After

Width:  |  Height:  |  Size: 377 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" data-name="レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,55V17h62"/>
</svg>

After

Width:  |  Height:  |  Size: 394 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<path class="st0" d="M5,17h62v38"/>
</svg>

After

Width:  |  Height:  |  Size: 367 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="5" y="42.3" width="62" height="12.7"/>
</svg>

After

Width:  |  Height:  |  Size: 391 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="25.7" y="17" width="20.7" height="38"/>
</svg>

After

Width:  |  Height:  |  Size: 392 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="5" y="17" width="20.7" height="38"/>
</svg>

After

Width:  |  Height:  |  Size: 389 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="5" y="29.7" width="62" height="12.7"/>
</svg>

After

Width:  |  Height:  |  Size: 391 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="46.3" y="17" width="20.7" height="38"/>
</svg>

After

Width:  |  Height:  |  Size: 392 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="_レイヤー_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 72 72">
<!-- Generator: Adobe Illustrator 29.4.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 152) -->
<defs>
<style>
.st0 {
fill: #e60012;
}
</style>
</defs>
<rect class="st0" x="5" y="17" width="62" height="12.7"/>
</svg>

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 B

After

Width:  |  Height:  |  Size: 221 B

-2
View File
@@ -3,8 +3,6 @@
<svg
fill="#000000"
width="800px"
height="800px"
viewBox="0 0 24 24"
version="1.1"
id="svg4"

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

+42 -4
View File
@@ -1,5 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" fill="#FFF" xml:space="preserve">
<g>
<path d="M 382.702 195.718 L 384 153.6 L 384 102.4 L 320 153.6 L 269.5 194 L 255.568 194.854 L 256 153.6 L 256 102.4 L 192 153.6 L 143.191 191.818 L 128 191.674 L 128 128 L 128 72.215 L 111.057 51.805 L 64 51.2 L 21.179 51.2 L 0 74.4 L 0 256 L 0 460.8 L 256 460.8 L 512 460.8 L 512 281.6 L 512 102.4 L 448 153.6 L 396.932 194.367 L 382.702 195.718 Z M 179.2 384 L 153.6 384 L 128 384 L 128 345.6 L 128 307.2 C 127.777 306.306 138.701 301.558 144.203 301.359 C 148.36 301.209 154.679 301.411 161.651 301.552 C 168.881 301.698 178.003 306.906 179.2 307.2 L 179.2 345.6 L 179.2 384 Z M 307.2 384 L 281.6 384 L 256 384 L 256 345.6 L 256 307.2 L 271.48 300.354 L 289.861 300.122 L 307.2 307.2 L 307.2 345.6 L 307.2 384 Z M 435.2 384 L 409.6 384 L 384 384 L 384 345.6 L 384 307.2 L 399.183 300.354 L 417.852 300.289 L 435.2 307.2 L 435.2 345.6 L 435.2 384 Z" transform="matrix(1, 0, 0, 1, 6.528259374621939, -25.993545919560574)"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 32 32"
fill="#ffffff"
xml:space="preserve"
sodipodi:docname="FactoryIconWhite.svg"
width="32"
height="32"
inkscape:version="1.4.2 (f4327f4, 2025-05-13)"
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"><defs
id="defs1" /><sodipodi:namedview
id="namedview1"
pagecolor="#5d5d5d"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="6.0390625"
inkscape:cx="57.956016"
inkscape:cy="54.727038"
inkscape:window-width="1920"
inkscape:window-height="991"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" />
<g
id="g1">
<path
d="m 23.203054,12.861316 0.07072,-2.415754 V 7.5088935 l -3.487177,2.9366685 -2.751603,2.317216 -0.759116,0.04898 0.02354,-2.3662 V 7.5088935 l -3.487181,2.9366685 -2.659468,2.192064 -0.8277125,-0.0083 V 8.9772305 5.7775778 L 8.4018789,4.6069268 5.8378723,4.5722089 H 3.504675 L 2.350691,5.9028882 V 16.318899 28.065575 H 16.299415 30.248143 V 17.787234 7.5088935 l -3.487181,2.9366685 -2.782554,2.338265 z M 12.114798,23.660571 H 10.719925 9.3250543 v -2.202501 -2.2025 c -0.012167,-0.05128 0.583066,-0.323608 0.8828537,-0.335023 0.226503,-0.0086 0.57081,0.0029 0.950693,0.01108 0.393944,0.0084 0.890977,0.307088 0.956197,0.323952 v 2.202501 z m 6.974362,0 h -1.394871 -1.394874 v -2.202501 -2.2025 l 0.843464,-0.392665 1.001527,-0.01333 0.944754,0.405974 v 2.202501 z m 6.974365,0 h -1.394873 -1.394874 v -2.202501 -2.2025 l 0.827282,-0.392665 1.017219,-0.0037 0.945246,0.396393 v 2.2025 z"
id="path1"
style="stroke-width:0.0559037" />
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

-86
View File
@@ -1,86 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#000000"
height="800px"
width="800px"
version="1.1"
id="Icons"
viewBox="0 0 32 32"
xml:space="preserve"
sodipodi:docname="RocketSiloIconWhite.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
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"><defs
id="defs13" /><sodipodi:namedview
id="namedview11"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.09125"
inkscape:cx="178.69416"
inkscape:cy="397.70905"
inkscape:window-width="3072"
inkscape:window-height="1653"
inkscape:window-x="0"
inkscape:window-y="38"
inkscape:window-maximized="1"
inkscape:current-layer="Icons" />
<g
id="g8">
<path
id="path2"
style="stroke-width:25"
transform="scale(0.04)"
d="m 104.49023,583.2168 c -0.0475,0.005 -0.0898,0.0209 -0.125,0.0469 -0.0897,0.0662 -0.1134,0.22145 -0.0859,0.44531 0.0945,-0.16261 0.18903,-0.32383 0.2832,-0.48632 -0.024,-0.001 -0.0506,-0.008 -0.0723,-0.006 z" />
<path
id="path4"
style="stroke-width:25"
transform="scale(0.04)"
d="m 398.75,48.75 c -8.125,0 -16.25,3.75 -21.25,11.25 l -50,75 c 0,5 -2.5,10 -2.5,15 v 167.5 l -72.5,120 c -5,7.5 -5,17.5 0,25 5,7.5 12.5,12.5 22.5,12.5 h 250 c 10,0 17.5,-5 22.5,-12.5 5,-7.5 5,-17.5 0,-25 L 475,317.5 V 150 c 0,-5 -2.5,-10 -5,-15 L 420,60 C 415,52.5 406.875,48.75 398.75,48.75 Z" />
<path
id="path6"
style="stroke-width:25"
transform="scale(0.04)"
d="m 400,500 c -15,0 -25,10 -25,25 v 75 c 0,15 10,25 25,25 15,0 25,-10 25,-25 v -75 c 0,-15 -10,-25 -25,-25 z" />
</g>
<ellipse
style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.04"
id="path1551"
cx="16.057112"
cy="27.825054"
rx="12.692628"
ry="1.9371578" /><ellipse
style="fill:#ff0000;fill-rule:evenodd;stroke-width:0.04"
id="path1553"
cx="22.051313"
cy="29.516819"
rx="0.53854793"
ry="0.019182237" /><path
style="fill:#ffffff;stroke:none;stroke-width:0.91638"
d="m 336.31157,742.57746 c -64.10675,-2.73184 -96.35975,-5.10869 -135.62428,-9.99467 -65.84565,-8.19368 -108.369339,-20.55125 -115.027982,-33.42765 -9.213823,-17.81757 52.596912,-35.62711 155.348712,-44.76066 48.06575,-4.27253 78.28696,-5.61411 140.20618,-6.224 88.15143,-0.86828 156.77477,2.44417 223.5968,10.79301 71.65567,8.95277 116.73192,24.08998 113.2343,38.02562 -5.44535,21.696 -102.07526,39.68224 -243.23455,45.27454 -20.17937,0.79944 -121.7049,1.02948 -138.49918,0.31381 z"
id="path1672"
transform="scale(0.04)" /><path
style="fill:#ffffff;stroke-width:0.91638"
d="m 316.1512,741.30843 c -50.59618,-2.71561 -71.33695,-4.25003 -99.42726,-7.3557 C 138.8581,725.34385 89.219492,711.32972 85.606719,696.93529 81.493809,680.54815 143.8897,663.72225 241.9244,654.78211 c 54.02316,-4.92657 98.75384,-6.34315 180.06253,-5.70242 69.63124,0.54871 91.66091,1.45537 139.296,5.73293 83.98725,7.54194 144.60633,21.76524 154.80219,36.32187 12.95197,18.49152 -57.41631,37.71396 -170.38065,46.54273 -46.47603,3.63235 -56.00093,3.92443 -135.62429,4.15884 -43.84879,0.1291 -86.11684,-0.10834 -93.92898,-0.52763 z"
id="path1748"
transform="scale(0.04)" /><path
style="fill:#ffffff;stroke-width:0.91638"
d="m 395.4181,624.03958 c -8.54628,-1.74507 -14.15841,-5.98769 -17.54748,-13.26544 l -2.13679,-4.58857 -0.009,-43.18376 c -0.01,-46.57633 0.0787,-47.54106 4.93893,-53.91311 1.18953,-1.55955 4.37731,-4.05284 7.08397,-5.54065 4.29402,-2.36035 5.85547,-2.7051 12.25223,-2.7051 6.39676,0 7.95821,0.34475 12.25223,2.7051 2.70666,1.48781 5.89444,3.9811 7.08397,5.54065 4.8602,6.37205 4.94858,7.33678 4.93893,53.91311 l -0.009,43.18376 -2.1573,4.63286 c -4.50315,9.67058 -16.0552,15.39283 -26.69077,13.22115 z"
id="path1787"
transform="scale(0.04)" /><path
style="fill:#ffffff;stroke-width:0.91638"
d="m 267.74187,473.33145 c -14.07258,-4.41441 -22.07846,-19.50972 -16.66853,-31.42897 0.9777,-2.1541 18.08205,-30.88885 38.00965,-63.85502 l 36.23202,-59.93847 0.0313,-85.05678 c 0.0289,-78.40313 0.15927,-85.59443 1.66727,-91.92964 1.54167,-6.47669 3.12153,-9.09962 27.40785,-45.50342 16.49492,-24.724954 26.94454,-39.525002 29.0296,-41.115363 9.88792,-7.541884 24.92944,-6.440366 33.16408,2.428667 4.11259,4.429421 52.40823,77.221396 55.24103,83.260156 l 2.37067,5.05367 0.24734,86.46152 0.24733,86.46153 36.23928,59.95051 c 19.93161,32.97277 37.08285,61.85753 38.11388,64.18833 4.58482,10.36476 -1.20515,23.65555 -12.78176,29.34034 l -5.25049,2.57829 -129.66781,0.1742 c -107.00742,0.14375 -130.3607,-0.0432 -133.6327,-1.06955 z"
id="path1826"
transform="scale(0.04)" /><path
style="fill:#ffffff;stroke-width:0.91638"
d="m 306.52921,740.81162 c -87.19059,-4.45544 -154.17018,-13.39697 -191.52348,-25.56769 -16.873321,-5.49779 -29.782362,-13.67791 -29.782362,-18.8723 0,-10.70958 23.369172,-20.94319 67.691822,-29.64297 36.72878,-7.20924 87.73185,-12.78609 149.03212,-16.29568 28.05995,-1.60649 170.34184,-1.59744 198.85452,0.0127 41.28348,2.33126 79.77543,5.77849 110.42383,9.88924 54.44397,7.30236 94.73314,18.84269 103.92658,29.76847 3.65577,4.34464 3.19598,7.70457 -1.69574,12.39166 -18.84113,18.05298 -99.16958,32.16166 -218.61114,38.39627 -33.70301,1.75923 -153.32023,1.70864 -188.31615,-0.0796 z"
id="path1902"
transform="scale(0.04)" /></svg>

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 B

After

Width:  |  Height:  |  Size: 266 B

-32
View File
@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="svg4" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" viewBox="0 0 24 24">
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
<defs>
<style>
.st0 {
fill: #333;
}
.st0, .st1 {
fill-opacity: 0;
}
.st1 {
fill: #ececec;
}
.st2 {
fill: #fff;
}
</style>
</defs>
<sodipodi:namedview id="namedview6" bordercolor="#666666" borderopacity="1.0" inkscape:current-layer="svg4" inkscape:cx="11.986254" inkscape:cy="11.931271" inkscape:pagecheckerboard="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="1653" inkscape:window-maximized="1" inkscape:window-width="3072" inkscape:window-x="0" inkscape:window-y="38" inkscape:zoom="36.375" pagecolor="#ffffff" showgrid="false"/>
<path id="path2" d="M12,0c-3.4,2.9-5.5,3-9,3v11.5c0,4.6,3.2,5.8,9,9.5,5.8-3.7,9-4.9,9-9.5V3c-3.5,0-5.6,0-9-3ZM12,2.5c2.5,1.8,4.6,2.3,7,2.4v9.6c0,3-1.7,3.8-7,7.1-5.3-3.3-7-4.1-7-7.1V5c2.4,0,4.5-.6,7-2.4h0ZM13.2,6.1h0ZM16.6,7.1h0ZM16.9,13.8h0ZM13.5,14h0Z"/>
<path id="path862" class="st1" d="M12,0l-.4.3c-2.1,1.7-3.7,2.4-6.1,2.6h-2.5v12.6c.4,2.2,1.4,3.5,4.2,5.3.7.4,1,.6,2.8,1.8.6.4,1.3.8,1.6,1s.4.2.4.2c0,0,.3-.2.6-.3.3-.2,1.1-.7,1.7-1.1,3-1.8,3.8-2.4,4.7-3.3s1.6-2.1,1.9-3.6V3h-.7c-1.9,0-2.7,0-3.6-.4-1.4-.4-2.7-1-4.3-2.3l-.4-.4h.1ZM12,2.5l.3.2c1.5,1,2.9,1.7,4.5,2,.7,0,1,.2,2,.2h.2v10.7c-.3,1.5-1.1,2.4-3.8,4.1-.4.2-1.2.8-1.9,1.2-.7.4-1.3.8-1.3.8,0,0-2.8-1.7-3.3-2-2.5-1.6-3.3-2.5-3.6-4V5h.6c.3,0,1.1,0,1.4-.2,1.7-.3,3.1-.9,4.6-1.9l.4-.3h0Z"/>
<path id="path1012" class="st0" d="M12,0l-.4.3c-2.1,1.7-3.7,2.4-6.1,2.6h-2.5v12.6c.4,2.2,1.4,3.5,4.2,5.3.7.4,1,.6,2.8,1.8.6.4,1.3.8,1.6,1s.4.2.4.2c0,0,.3-.2.6-.3.3-.2,1.1-.7,1.7-1.1,3-1.8,3.8-2.4,4.7-3.3s1.6-2.1,1.9-3.6V3h-.7c-1.9,0-2.7,0-3.6-.4-1.4-.4-2.7-1-4.3-2.3l-.4-.4h.1ZM12,2.5l.3.2c1.5,1,2.9,1.7,4.5,2,.7,0,1,.2,2,.2h.2v10.7c-.3,1.5-1.1,2.4-3.8,4.1-.4.2-1.2.8-1.9,1.2-.7.4-1.3.8-1.3.8,0,0-2.8-1.7-3.3-2-2.5-1.6-3.3-2.5-3.6-4V5h.6c.3,0,1.1,0,1.4-.2,1.7-.3,3.1-.9,4.6-1.9l.4-.3h0Z"/>
<path id="path1162" class="st0" d="M12,0l-.4.3c-2.1,1.7-3.7,2.4-6.1,2.6h-2.5v12.6c.4,2.2,1.4,3.5,4.2,5.3.7.4,1,.6,2.8,1.8.6.4,1.3.8,1.6,1s.4.2.4.2c0,0,.3-.2.6-.3.3-.2,1.1-.7,1.7-1.1,3-1.8,3.8-2.4,4.7-3.3s1.6-2.1,1.9-3.6V3h-.7c-1.9,0-2.7,0-3.6-.4-1.4-.4-2.7-1-4.3-2.3l-.4-.4h.1ZM12,2.5l.3.2c1.5,1,2.9,1.7,4.5,2,.7,0,1,.2,2,.2h.2v10.7c-.3,1.5-1.1,2.4-3.8,4.1-.4.2-1.2.8-1.9,1.2-.7.4-1.3.8-1.3.8,0,0-2.8-1.7-3.3-2-2.5-1.6-3.3-2.5-3.6-4V5h.6c.3,0,1.1,0,1.4-.2,1.7-.3,3.1-.9,4.6-1.9l.4-.3h0Z"/>
<path id="path1201" d="M12,0l-.4.3c-2.1,1.7-3.7,2.4-6.1,2.6h-2.5v12.6c.4,2.2,1.4,3.5,4.2,5.3.7.4,1,.6,2.8,1.8.6.4,1.3.8,1.6,1s.4.2.4.2c0,0,.3-.2.6-.3.3-.2,1.1-.7,1.7-1.1,3-1.8,3.8-2.4,4.7-3.3s1.6-2.1,1.9-3.6V3h-.7c-1.9,0-2.7,0-3.6-.4-1.4-.4-2.7-1-4.3-2.3l-.4-.4h.1ZM12,2.5l.3.2c1.5,1,2.9,1.7,4.5,2,.7,0,1,.2,2,.2h.2v10.7c-.3,1.5-1.1,2.4-3.8,4.1-.4.2-1.2.8-1.9,1.2-.7.4-1.3.8-1.3.8,0,0-2.8-1.7-3.3-2-2.5-1.6-3.3-2.5-3.6-4V5h.6c.3,0,1.1,0,1.4-.2,1.7-.3,3.1-.9,4.6-1.9l.4-.3h0Z"/>
<path id="path3032" class="st2" d="M12,0l-.4.3c-2.1,1.7-3.7,2.4-6.1,2.6h-2.5v12.2c0,.4,0,.8.2,1.2.4,1.7,1.5,3,4,4.6.7.4.9.6,3.3,2,.6.4,1.2.8,1.3.8h.2c0,.1.2,0,.5-.2.3-.2.9-.6,1.5-.9,3.4-2.1,4.2-2.6,5.2-3.6s1.7-2.4,1.9-4V3h-2.5c-2.4-.2-4-.9-6.1-2.6l-.4-.3h-.1ZM12,2.5l.4.3c1.8,1.2,3.4,1.8,5.5,2.1h1.1v10.7c-.2,1.2-.9,2.1-2.3,3.1-.6.5-1.5,1-3.6,2.3-.6.3-1,.6-1,.6,0,0-1.7-1-2.5-1.5-1.7-1.1-2.6-1.7-3.2-2.3-.7-.7-1.1-1.3-1.3-2.3V4.8h.4c2.5-.2,4.2-.8,6.2-2.1l.4-.3h-.1Z"/>
<path id="path1787" class="st2" d="M8.6,17.8c-.2-.1-.2-.3-.2-.5h0c0-.1.5-1,.5-1,.5-1,.6-1,.7-1h.5c.1,0,.2,0,.2.2v.2q0,.2-.5,1.2l-.5.9h0c-.2.2-.5.2-.7,0h0Z"/>
<path id="path1826" class="st2" d="M7.7,13.2c-.2-.3-.2-.7,0-.8,0,0,.7-.4,1.5-.9l1.4-.8,1-1.7c.9-1.6,1-1.8,1.1-1.9s.2-.2,1.1-.6c.6-.3,1-.5,1.1-.5.3,0,.6.2.7.4,0,0,.2,2.2.2,2.4h0c0,.1-1,1.9-1,1.9l-1,1.8v3.5c0,.3-.3.5-.6.5h-.1l-2.7-1.5-2.7-1.8Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 B

After

Width:  |  Height:  |  Size: 238 B

-2
View File
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="24"
height="24"
viewBox="0 0 24 24"
version="1.1"
id="svg4"

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

+9
View File
@@ -269,6 +269,8 @@
"attack_keybinds": "Attack Keybinds",
"boat_attack": "Boat Attack",
"boat_attack_desc": "Send a boat attack to the tile under your cursor.",
"ground_attack": "Ground Attack",
"ground_attack_desc": "Send a ground attack to the tile under your cursor.",
"zoom_controls": "Zoom Controls",
"zoom_out": "Zoom Out",
"zoom_out_desc": "Zoom out the map",
@@ -488,6 +490,7 @@
"cross": "Cross",
"mini_cross": "Mini Cross",
"horizontal_stripes": "Horizontal Stripes (Alt)",
"sword": "Sword",
"sparse_dots": "Sparse Dots",
"evan": "Evan",
"diagonal_stripe": "Diagonal Stripe",
@@ -496,6 +499,12 @@
"circuit_board": "Circuit Board",
"vertical_bars": "Vertical Bars",
"-w-": ".w.",
"white_rabbit": "White Rabbit",
"goat": "Goat",
"cursor": "Cursor",
"hand": "Hand",
"radiation": "Radiation",
"openfront_qr": "OpenFront.io QR code",
"openfront": "OpenFront"
}
}
+9
View File
@@ -0,0 +1,9 @@
License: CC BY-NC 4.0 with Commercial Exemption
This work is licensed under Creative Commons Attribution-NonCommercial 4.0
International License with the following exception:
OpenFront LLC is granted unlimited commercial use rights for all purposes.
For all other parties, standard CC BY-NC 4.0 terms apply.
Full license text: https://creativecommons.org/licenses/by-nc/4.0/
Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,172 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#000000"
version="1.1"
id="Icons"
viewBox="0 0 32 32"
xml:space="preserve"
sodipodi:docname="MissileSiloIconWhite.svg"
inkscape:version="1.4.2 (f4327f4, 2025-05-13)"
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"><defs
id="defs13"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect4"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.98396776,0,1 @ F,0,0,1,0,0.90902474,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect3"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.99419457,0,1 @ F,0,0,1,0,0.88997446,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect3-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.99419457,0,1 @ F,0,0,1,0,0.88997446,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect3-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.99419457,0,1 @ F,0,0,1,0,0.88997446,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /></defs><sodipodi:namedview
id="namedview11"
pagecolor="#999999"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="2.1825"
inkscape:cx="-105.38373"
inkscape:cy="0.68728522"
inkscape:window-width="1920"
inkscape:window-height="991"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="Icons"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<path
id="path2"
style="fill:#ffffff;stroke-width:0.677186"
d="m 25.898883,7.6636543 c -0.04144,0.04884 -3.863384,-3.2777509 -3.863384,-3.2777509 1.46078,-1.721777 3.509825,-2.3838038 4.576668,-1.4786782 1.066845,0.9051262 0.747497,3.0346514 -0.713284,4.7564291 z"
sodipodi:nodetypes="ccsc" /><path
id="rect3"
style="fill:#ffffff;stroke-width:1.1798"
d="m 12.748325,7.3692592 h 6.599784 v 9.7262258 a 0.98396776,0.98396776 135 0 1 -0.983968,0.983968 H 13.65735 a 0.90902474,0.90902474 45 0 1 -0.909025,-0.909025 z"
inkscape:path-effect="#path-effect4"
inkscape:original-d="m 12.748325,7.3692592 h 6.599784 V 18.079453 h -6.599784 z"
transform="matrix(0.58656255,0.49764806,-0.57368061,0.67617979,18.00944,-6.0548174)" /><path
style="fill:#ffffff"
d="M 12.316287,10.791417 12.02519,14.786754 9.5403643,15.849128 A 0.64473841,0.64473841 33.887593 0 1 8.6422492,15.245902 l 0.010113,-0.626994 a 1.8979735,1.8979735 116.0463 0 1 0.7076373,-1.447901 z"
id="path3"
inkscape:path-effect="#path-effect3"
inkscape:original-d="m 12.316287,10.791417 -0.291097,3.995337 -3.3989742,1.453213 0.040499,-2.510918 z"
transform="matrix(0.57903787,0.50638361,-0.89799211,1.0268331,20.723968,-10.08514)"
sodipodi:nodetypes="ccccc" /><path
style="fill:#ffffff"
d="M 12.316287,10.791417 12.02519,14.786754 9.5403643,15.849128 A 0.64473841,0.64473841 33.887593 0 1 8.6422492,15.245902 l 0.010113,-0.626994 a 1.8979735,1.8979735 116.0463 0 1 0.7076373,-1.447901 z"
id="path3-1"
inkscape:path-effect="#path-effect3-7"
inkscape:original-d="m 12.316287,10.791417 -0.291097,3.995337 -3.3989742,1.453213 0.040499,-2.510918 z"
transform="matrix(-0.59419498,-0.4885095,-0.86629519,1.0537118,40.501308,6.456681)"
sodipodi:nodetypes="ccccc" /><path
style="fill:#ffffff;stroke-width:1.06472"
d="m 13.737178,16.80511 c 0,0 -9.3199199,7.391956 -7.1372902,13.873745 l 5.2775782,0.03513 c -2.0517202,-5.22962 3.28918,-12.748302 3.28918,-12.748302 z"
id="path4"
sodipodi:nodetypes="ccccc" /><circle
style="fill:#ffffff"
id="path5"
cx="3.7514319"
cy="29.066437"
r="0.88774341" /><circle
style="fill:#ffffff"
id="path5-4"
cx="12.046965"
cy="29.945017"
r="0.88774341" /><ellipse
style="fill:#ffffff;stroke-width:1.33861"
id="path5-3"
cx="11.284078"
cy="27.854525"
rx="1.1741122"
ry="1.2027493" /><circle
style="fill:#ffffff"
id="path5-2"
cx="6.2749138"
cy="27.315006"
r="0.88774341" /><ellipse
style="fill:#ffffff;stroke-width:2.01452"
id="path5-6"
cx="5.9450173"
cy="29.290951"
rx="1.8613975"
ry="1.7182131" /><ellipse
style="fill:#ffffff;stroke-width:0.807137"
id="path5-6-9"
cx="2.4461236"
cy="26.341803"
rx="0.70718539"
ry="0.7259956" /><circle
style="fill:#ffffff;stroke-width:0.806452"
id="path5-5"
cx="14.434135"
cy="28.200459"
r="0.71592212" /><circle
style="fill:#ffffff;stroke-width:1.29032"
id="path5-61"
cx="4.2863698"
cy="23.691866"
r="1.1454754" /></svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg4"
version="1.1"
viewBox="0 0 24 24"
sodipodi:docname="SamLauncherIconWhite.svg"
inkscape:version="1.4.2 (f4327f4, 2025-05-13)"
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">
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
<defs
id="defs1">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect11"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.31531758,0,1 @ F,0,0,1,0,0.056759862,0,1 @ F,0,0,1,0,0.16487468,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.19973466,0,1 @ F,0,0,1,0,0.075242437,0,1 @ F,0,0,1,0,0.3011792,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect10"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect9"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.49680354,0,1 @ F,0,0,1,0,0.46383368,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect8"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.20544103,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect6"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.6771002,0,1 @ F,0,0,1,0,0.21443289,0,1 @ F,0,0,1,0,0.20068725,0,1 @ F,0,0,1,0,0.61305832,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<style
id="style1">
.st0 {
fill: #333;
}
.st0, .st1 {
fill-opacity: 0;
}
.st1 {
fill: #ececec;
}
.st2 {
fill: #fff;
}
</style>
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect6-9"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.6771002,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.21443289,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="namedview6"
bordercolor="#666666"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="-1.3745704"
inkscape:cy="8.2199313"
inkscape:pagecheckerboard="0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:window-height="991"
inkscape:window-maximized="1"
inkscape:window-width="1920"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:zoom="18.1875"
pagecolor="#828282"
showgrid="false"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1">
<path
style="fill:#ffffff;stroke-width:1.32815"
d="m 17.680103,4.3837562 1.471937,2.3505899 c 0,0 1.557345,-0.6986001 0.828902,-1.8430742 -0.709885,-1.115248 -2.300839,-0.5075157 -2.300839,-0.5075157 z"
id="path3"
sodipodi:nodetypes="ccsc" />
<path
id="rect4"
style="fill:#ffffff;stroke-width:1.06832"
d="m 7.412439,8.3385684 c 2.2265471,0.022033 5.06556,-0.00697 7.576035,-0.0086 0.118341,-7.68e-5 0.214275,0.095934 0.214275,0.2143622 l 0,2.2790372 a 0.20068725,0.20068725 135 0 1 -0.200687,0.200687 H 7.3484537 A 0.61305832,0.61305832 45 0 1 6.7353954,10.410996 V 9.0069971 c 0,-0.3739521 0.3031104,-0.672129 0.6770436,-0.6684287 z"
inkscape:path-effect="#path-effect6"
inkscape:original-d="m 6.7353954,8.3298969 c 2.3661435,0.038026 5.6449026,0 8.4673536,0 V 11.024054 H 6.7353954 Z"
sodipodi:nodetypes="ccccc"
transform="matrix(1.3871173,-0.56218381,0.7027184,1.1097117,-10.354938,3.8136388)" />
<path
style="fill:#ffffff;stroke-width:1.32815"
d="m 17.46913,1.7477688 0.735969,1.1752951 c 0,0 0.998735,-0.2087137 1.51062,0.2066682 0.110775,-0.097941 0.30661,-0.5279917 0.05425,-0.8744476 -0.813874,-1.0688142 -2.30084,-0.5075157 -2.30084,-0.5075157 z"
id="path3-8"
sodipodi:nodetypes="ccccc" />
<path
id="rect4-8"
style="fill:#ffffff;stroke-width:1.48584"
d="M 16.185391,1.9343439 C 12.701012,3.3485891 8.7751898,4.9780406 5.6675841,6.2067613 5.1462949,6.4128743 4.9569987,6.9059035 5.2454361,7.3098295 l 0.3037033,0.425192 11.6233046,-4.9169042 -0.5456,-0.776552 C 16.540403,1.9185247 16.342728,1.8704833 16.185391,1.9343439 Z"
sodipodi:nodetypes="cscccc" />
<path
id="rect6"
style="fill:#ffffff"
d="m 9.9518898,14.020619 2.9965632,-1.457045 v 1.949931 a 0.4923079,0.4923079 135.26041 0 1 -0.496783,0.492288 l -2.063457,-0.01876 a 0.45488806,0.45488806 46.078703 0 1 -0.4505676,-0.46786 z"
sodipodi:nodetypes="ccccc"
inkscape:path-effect="#path-effect9"
inkscape:original-d="m 9.9518898,14.020619 2.9965632,-1.457045 v 2.446735 l -3.0240546,-0.02749 z"
transform="matrix(1.5549622,0,0,1.2439898,-5.3629748,-5.3468075)" />
<rect
style="fill:#ffffff;stroke-width:1.27479"
id="rect7"
width="2.9068708"
height="3.1029518"
x="11.007972"
y="14.623526" />
<path
id="rect8"
style="fill:#ffffff;stroke-width:1.80595"
d="m 6.3154251,19.421168 v 0.803136 a 0.10556598,0.10575084 0 0 1 -0.102369,0.105707 l -1.2284353,0.03728 a 0.30883774,0.30937857 0 0 0 -0.2994769,0.307034 l -0.012108,1.703993 15.9080751,-0.01409 0.003,-1.626855 a 0.37070023,0.37134941 0 0 0 -0.359663,-0.371867 l -1.146325,-0.03449 a 0.13990479,0.14014979 0 0 1 -0.135706,-0.140085 v -0.795287 a 0.54344015,0.54439183 0 0 0 -0.543439,-0.544393 l -11.5146875,-1.7e-5 a 0.56894912,0.56994548 0 0 0 -0.5688864,0.569952 z"
sodipodi:nodetypes="ccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

@@ -0,0 +1,172 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#000000"
version="1.1"
id="Icons"
viewBox="0 0 32 32"
xml:space="preserve"
sodipodi:docname="MissileSiloIconWhite.svg"
inkscape:version="1.4.2 (f4327f4, 2025-05-13)"
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"><defs
id="defs13"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect4"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.98396776,0,1 @ F,0,0,1,0,0.90902474,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect3"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.99419457,0,1 @ F,0,0,1,0,0.88997446,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect3-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.99419457,0,1 @ F,0,0,1,0,0.88997446,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect3-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.99419457,0,1 @ F,0,0,1,0,0.88997446,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /></defs><sodipodi:namedview
id="namedview11"
pagecolor="#999999"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="2.1825"
inkscape:cx="-105.38373"
inkscape:cy="0.68728522"
inkscape:window-width="1920"
inkscape:window-height="991"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="Icons"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<path
id="path2"
style="fill:#ffffff;stroke-width:0.677186"
d="m 25.898883,7.6636543 c -0.04144,0.04884 -3.863384,-3.2777509 -3.863384,-3.2777509 1.46078,-1.721777 3.509825,-2.3838038 4.576668,-1.4786782 1.066845,0.9051262 0.747497,3.0346514 -0.713284,4.7564291 z"
sodipodi:nodetypes="ccsc" /><path
id="rect3"
style="fill:#ffffff;stroke-width:1.1798"
d="m 12.748325,7.3692592 h 6.599784 v 9.7262258 a 0.98396776,0.98396776 135 0 1 -0.983968,0.983968 H 13.65735 a 0.90902474,0.90902474 45 0 1 -0.909025,-0.909025 z"
inkscape:path-effect="#path-effect4"
inkscape:original-d="m 12.748325,7.3692592 h 6.599784 V 18.079453 h -6.599784 z"
transform="matrix(0.58656255,0.49764806,-0.57368061,0.67617979,18.00944,-6.0548174)" /><path
style="fill:#ffffff"
d="M 12.316287,10.791417 12.02519,14.786754 9.5403643,15.849128 A 0.64473841,0.64473841 33.887593 0 1 8.6422492,15.245902 l 0.010113,-0.626994 a 1.8979735,1.8979735 116.0463 0 1 0.7076373,-1.447901 z"
id="path3"
inkscape:path-effect="#path-effect3"
inkscape:original-d="m 12.316287,10.791417 -0.291097,3.995337 -3.3989742,1.453213 0.040499,-2.510918 z"
transform="matrix(0.57903787,0.50638361,-0.89799211,1.0268331,20.723968,-10.08514)"
sodipodi:nodetypes="ccccc" /><path
style="fill:#ffffff"
d="M 12.316287,10.791417 12.02519,14.786754 9.5403643,15.849128 A 0.64473841,0.64473841 33.887593 0 1 8.6422492,15.245902 l 0.010113,-0.626994 a 1.8979735,1.8979735 116.0463 0 1 0.7076373,-1.447901 z"
id="path3-1"
inkscape:path-effect="#path-effect3-7"
inkscape:original-d="m 12.316287,10.791417 -0.291097,3.995337 -3.3989742,1.453213 0.040499,-2.510918 z"
transform="matrix(-0.59419498,-0.4885095,-0.86629519,1.0537118,40.501308,6.456681)"
sodipodi:nodetypes="ccccc" /><path
style="fill:#ffffff;stroke-width:1.06472"
d="m 13.737178,16.80511 c 0,0 -9.3199199,7.391956 -7.1372902,13.873745 l 5.2775782,0.03513 c -2.0517202,-5.22962 3.28918,-12.748302 3.28918,-12.748302 z"
id="path4"
sodipodi:nodetypes="ccccc" /><circle
style="fill:#ffffff"
id="path5"
cx="3.7514319"
cy="29.066437"
r="0.88774341" /><circle
style="fill:#ffffff"
id="path5-4"
cx="12.046965"
cy="29.945017"
r="0.88774341" /><ellipse
style="fill:#ffffff;stroke-width:1.33861"
id="path5-3"
cx="11.284078"
cy="27.854525"
rx="1.1741122"
ry="1.2027493" /><circle
style="fill:#ffffff"
id="path5-2"
cx="6.2749138"
cy="27.315006"
r="0.88774341" /><ellipse
style="fill:#ffffff;stroke-width:2.01452"
id="path5-6"
cx="5.9450173"
cy="29.290951"
rx="1.8613975"
ry="1.7182131" /><ellipse
style="fill:#ffffff;stroke-width:0.807137"
id="path5-6-9"
cx="2.4461236"
cy="26.341803"
rx="0.70718539"
ry="0.7259956" /><circle
style="fill:#ffffff;stroke-width:0.806452"
id="path5-5"
cx="14.434135"
cy="28.200459"
r="0.71592212" /><circle
style="fill:#ffffff;stroke-width:1.29032"
id="path5-61"
cx="4.2863698"
cy="23.691866"
r="1.1454754" /></svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg4"
version="1.1"
viewBox="0 0 24 24"
sodipodi:docname="SamLauncherIconWhite.svg"
inkscape:version="1.4.2 (f4327f4, 2025-05-13)"
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">
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
<defs
id="defs1">
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect11"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.31531758,0,1 @ F,0,0,1,0,0.056759862,0,1 @ F,0,0,1,0,0.16487468,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.19973466,0,1 @ F,0,0,1,0,0.075242437,0,1 @ F,0,0,1,0,0.3011792,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect10"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect9"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.49680354,0,1 @ F,0,0,1,0,0.46383368,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect8"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.20544103,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect6"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.6771002,0,1 @ F,0,0,1,0,0.21443289,0,1 @ F,0,0,1,0,0.20068725,0,1 @ F,0,0,1,0,0.61305832,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
<style
id="style1">
.st0 {
fill: #333;
}
.st0, .st1 {
fill-opacity: 0;
}
.st1 {
fill: #ececec;
}
.st2 {
fill: #fff;
}
</style>
<inkscape:path-effect
effect="fillet_chamfer"
id="path-effect6-9"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0.6771002,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.21443289,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" />
</defs>
<sodipodi:namedview
id="namedview6"
bordercolor="#666666"
borderopacity="1.0"
inkscape:current-layer="layer1"
inkscape:cx="-1.3745704"
inkscape:cy="8.2199313"
inkscape:pagecheckerboard="0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:window-height="991"
inkscape:window-maximized="1"
inkscape:window-width="1920"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:zoom="18.1875"
pagecolor="#828282"
showgrid="false"
inkscape:showpageshadow="2"
inkscape:deskcolor="#d1d1d1" />
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1">
<path
style="fill:#ffffff;stroke-width:1.32815"
d="m 17.680103,4.3837562 1.471937,2.3505899 c 0,0 1.557345,-0.6986001 0.828902,-1.8430742 -0.709885,-1.115248 -2.300839,-0.5075157 -2.300839,-0.5075157 z"
id="path3"
sodipodi:nodetypes="ccsc" />
<path
id="rect4"
style="fill:#ffffff;stroke-width:1.06832"
d="m 7.412439,8.3385684 c 2.2265471,0.022033 5.06556,-0.00697 7.576035,-0.0086 0.118341,-7.68e-5 0.214275,0.095934 0.214275,0.2143622 l 0,2.2790372 a 0.20068725,0.20068725 135 0 1 -0.200687,0.200687 H 7.3484537 A 0.61305832,0.61305832 45 0 1 6.7353954,10.410996 V 9.0069971 c 0,-0.3739521 0.3031104,-0.672129 0.6770436,-0.6684287 z"
inkscape:path-effect="#path-effect6"
inkscape:original-d="m 6.7353954,8.3298969 c 2.3661435,0.038026 5.6449026,0 8.4673536,0 V 11.024054 H 6.7353954 Z"
sodipodi:nodetypes="ccccc"
transform="matrix(1.3871173,-0.56218381,0.7027184,1.1097117,-10.354938,3.8136388)" />
<path
style="fill:#ffffff;stroke-width:1.32815"
d="m 17.46913,1.7477688 0.735969,1.1752951 c 0,0 0.998735,-0.2087137 1.51062,0.2066682 0.110775,-0.097941 0.30661,-0.5279917 0.05425,-0.8744476 -0.813874,-1.0688142 -2.30084,-0.5075157 -2.30084,-0.5075157 z"
id="path3-8"
sodipodi:nodetypes="ccccc" />
<path
id="rect4-8"
style="fill:#ffffff;stroke-width:1.48584"
d="M 16.185391,1.9343439 C 12.701012,3.3485891 8.7751898,4.9780406 5.6675841,6.2067613 5.1462949,6.4128743 4.9569987,6.9059035 5.2454361,7.3098295 l 0.3037033,0.425192 11.6233046,-4.9169042 -0.5456,-0.776552 C 16.540403,1.9185247 16.342728,1.8704833 16.185391,1.9343439 Z"
sodipodi:nodetypes="cscccc" />
<path
id="rect6"
style="fill:#ffffff"
d="m 9.9518898,14.020619 2.9965632,-1.457045 v 1.949931 a 0.4923079,0.4923079 135.26041 0 1 -0.496783,0.492288 l -2.063457,-0.01876 a 0.45488806,0.45488806 46.078703 0 1 -0.4505676,-0.46786 z"
sodipodi:nodetypes="ccccc"
inkscape:path-effect="#path-effect9"
inkscape:original-d="m 9.9518898,14.020619 2.9965632,-1.457045 v 2.446735 l -3.0240546,-0.02749 z"
transform="matrix(1.5549622,0,0,1.2439898,-5.3629748,-5.3468075)" />
<rect
style="fill:#ffffff;stroke-width:1.27479"
id="rect7"
width="2.9068708"
height="3.1029518"
x="11.007972"
y="14.623526" />
<path
id="rect8"
style="fill:#ffffff;stroke-width:1.80595"
d="m 6.3154251,19.421168 v 0.803136 a 0.10556598,0.10575084 0 0 1 -0.102369,0.105707 l -1.2284353,0.03728 a 0.30883774,0.30937857 0 0 0 -0.2994769,0.307034 l -0.012108,1.703993 15.9080751,-0.01409 0.003,-1.626855 a 0.37070023,0.37134941 0 0 0 -0.359663,-0.371867 l -1.146325,-0.03449 a 0.13990479,0.14014979 0 0 1 -0.135706,-0.140085 v -0.795287 a 0.54344015,0.54439183 0 0 0 -0.543439,-0.544393 l -11.5146875,-1.7e-5 a 0.56894912,0.56994548 0 0 0 -0.5688864,0.569952 z"
sodipodi:nodetypes="ccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

+55 -15
View File
@@ -27,6 +27,7 @@ import { UserSettings } from "../core/game/UserSettings";
import { WorkerClient } from "../core/worker/WorkerClient";
import {
DoBoatAttackEvent,
DoGroundAttackEvent,
InputHandler,
MouseMoveEvent,
MouseUpEvent,
@@ -246,9 +247,16 @@ export class ClientGameRunner {
1000,
);
}, 20000);
this.eventBus.on(MouseUpEvent, (e) => this.inputEvent(e));
this.eventBus.on(MouseMoveEvent, (e) => this.onMouseMove(e));
this.eventBus.on(DoBoatAttackEvent, (e) => this.doBoatAttackUnderCursor());
this.eventBus.on(MouseUpEvent, this.inputEvent.bind(this));
this.eventBus.on(MouseMoveEvent, this.onMouseMove.bind(this));
this.eventBus.on(
DoBoatAttackEvent,
this.doBoatAttackUnderCursor.bind(this),
);
this.eventBus.on(
DoGroundAttackEvent,
this.doGroundAttackUnderCursor.bind(this),
);
this.renderer.initialize();
this.input.initialize();
@@ -418,20 +426,10 @@ export class ClientGameRunner {
}
private doBoatAttackUnderCursor(): void {
if (!this.isActive || !this.lastMousePosition) {
const tile = this.getTileUnderCursor();
if (tile === null) {
return;
}
if (this.gameView.inSpawnPhase()) {
return;
}
const cell = this.renderer.transformHandler.screenToWorldCoordinates(
this.lastMousePosition.x,
this.lastMousePosition.y,
);
if (!this.gameView.isValidCoord(cell.x, cell.y)) {
return;
}
const tile = this.gameView.ref(cell.x, cell.y);
if (this.myPlayer === null) {
const myPlayer = this.gameView.playerByClientID(this.lobby.clientID);
@@ -446,6 +444,48 @@ export class ClientGameRunner {
});
}
private doGroundAttackUnderCursor(): void {
const tile = this.getTileUnderCursor();
if (tile === null) {
return;
}
if (this.myPlayer === null) {
const myPlayer = this.gameView.playerByClientID(this.lobby.clientID);
if (myPlayer === null) return;
this.myPlayer = myPlayer;
}
this.myPlayer.actions(tile).then((actions) => {
if (this.myPlayer === null) return;
if (actions.canAttack) {
this.eventBus.emit(
new SendAttackIntentEvent(
this.gameView.owner(tile).id(),
this.myPlayer.troops() * this.renderer.uiState.attackRatio,
),
);
}
});
}
private getTileUnderCursor(): TileRef | null {
if (!this.isActive || !this.lastMousePosition) {
return null;
}
if (this.gameView.inSpawnPhase()) {
return null;
}
const cell = this.renderer.transformHandler.screenToWorldCoordinates(
this.lastMousePosition.x,
this.lastMousePosition.y,
);
if (!this.gameView.isValidCoord(cell.x, cell.y)) {
return null;
}
return this.gameView.ref(cell.x, cell.y);
}
private canBoatAttack(actions: PlayerActions, tile: TileRef): boolean {
const bu = actions.buildableUnits.find(
(bu) => bu.type === UnitType.TransportShip,
+8
View File
@@ -79,6 +79,8 @@ export class ShowEmojiMenuEvent implements GameEvent {
export class DoBoatAttackEvent implements GameEvent {}
export class DoGroundAttackEvent implements GameEvent {}
export class AttackRatioEvent implements GameEvent {
constructor(public readonly attackRatio: number) {}
}
@@ -133,6 +135,7 @@ export class InputHandler {
attackRatioDown: "Digit1",
attackRatioUp: "Digit2",
boatAttack: "KeyB",
groundAttack: "KeyG",
modifierKey: "ControlLeft",
altKey: "AltLeft",
...JSON.parse(localStorage.getItem("settings.keybinds") ?? "{}"),
@@ -265,6 +268,11 @@ export class InputHandler {
this.eventBus.emit(new DoBoatAttackEvent());
}
if (e.code === this.keybinds.groundAttack) {
e.preventDefault();
this.eventBus.emit(new DoGroundAttackEvent());
}
if (e.code === this.keybinds.attackRatioDown) {
e.preventDefault();
this.eventBus.emit(new AttackRatioEvent(-10));
+662 -3
View File
@@ -1,5 +1,638 @@
The client of OpenFront game.
Copyright (C) 2025 OpenFront
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -12,4 +645,30 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+5 -1
View File
@@ -220,6 +220,7 @@ class Client {
loginDiscordButton.hidden = false;
loginDiscordButton.addEventListener("click", discordLogin);
logoutDiscordButton.hidden = true;
territoryModal.onLogout();
});
// Look up the discord user object.
// TODO: Add caching
@@ -232,9 +233,12 @@ class Client {
logoutDiscordButton.hidden = true;
return;
}
console.log(
`Your player ID is ${userMeResponse.player.publicId}\n` +
"Sharing this ID will allow others to view your game history and stats.",
);
loginDiscordButton.translationKey = "main.logged_in";
loginDiscordButton.hidden = true;
const { user, player } = userMeResponse;
territoryModal.onUserMe(userMeResponse);
});
}

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