Merge branch 'develop' of git.digitaltelepresence.com:digital-telepresence/dtp-base into develop

master
rob 2 years ago
commit 3617e43297

@ -0,0 +1,8 @@
.vscode
.git
.env
node_modules
npm-debug.log
data/minio

@ -0,0 +1,115 @@
#
# Site Configuration
#
DTP_SITE_NAME=DTP Base
DTP_SITE_DESCRIPTION=Enabling the success of the Next economy
DTP_SITE_DOMAIN=localhost
DTP_SITE_DOMAIN_KEY=webapp.digitaltelepresence.com
DTP_SITE_COMPANY=DTP Technologies, LLC
DTP_PASSWORD_SALT=b63ebaf1-3afb-4aee-9138-c42059a58a69
#
# Redis
#
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=1f9936ce-9d21-43dd-8638-908088f06a00
REDIS_KEY_PREFIX=soapy
#
# DTP Host Cache
#
DTP_HOST_CACHE_PORT=8000
DTP_HOST_CACHE_PATH=/tmp/dtp/host-cache
DTP_HOST_CACHE_AUTH_KEY=c071fa18-3c48-4337-a6af-6459ebdd8537
DTP_HOST_CACHE_CLEAN_CRON=*/30 * * * * *
#
# MongoDB
#
MONGODB_HOST=mongodb:27017
MONGODB_DATABASE=dtp-base
MONGODB_POOL_SIZE=10
#
# MinIO/S3
#
MINIO_ENDPOINT=nginx
MINIO_PORT=9000
MINIO_USE_SSL=disabled
MINIO_ACCESS_KEY=dtp-base
MINIO_SECRET_KEY=44710206-9115-443b-b02d-2ee74afe156d
MINIO_IMAGE_BUCKET=base-images
MINIO_VIDEO_BUCKET=base-videos
#
# Web Application Server
#
HTTP_BIND_ADDRESS=0.0.0.0
HTTP_BIND_PORT=3000
HTTP_SESSION_SECRET=1c7ea8dc-f92b-49b9-8f35-da040e8f7313
#
# Bitcoin Average API
#
BITCOINAVERAGE_KEY=YjUzZjgzNTI3OWY2NDhhZTk3NDc1YTNjZjQ5YWZhYjE
BITCOINAVERAGE_CRON=0 */30 * * * *
#
# SMTP/email configuration
#
DTP_EMAIL_SERVICE=disabled
DTP_EMAIL_SMTP_HOST=
DTP_EMAIL_SMTP_PORT=465
DTP_EMAIL_SMTP_SECURE=enabled
DTP_EMAIL_SMTP_FROM=
DTP_EMAIL_SMTP_USER=
DTP_EMAIL_SMTP_PASS=
DTP_EMAIL_SMTP_POOL_ENABLED=enabled
DTP_EMAIL_SMTP_POOL_MAX_CONN=5
DTP_EMAIL_SMTP_POOL_MAX_MSGS=100
#
# Work Paths
#
DTP_IMAGE_WORK_PATH=/tmp/dtp/image-work
DTP_VIDEO_WORK_PATH=/tmp/dtp/video-work
#
# FFMPEG options
#
DTP_FFMPEG_PATH=/usr/bin/ffmpeg
DTP_FFPROBE_PATH=/usr/bin/ffprobe
DTP_ENABLE_GPU=disabled
#
# System Logger options
#
DTP_LOG_CONSOLE=enabled
DTP_LOG_MONGODB=enabled
DTP_LOG_FILE=enabled
DTP_LOG_FILE_PATH=/tmp/dtp/logs
DTP_LOG_FILE_NAME_APP=base-app.log
DTP_LOG_FILE_NAME_HTTP=base-access.log
DTP_LOG_DEBUG=enabled
DTP_LOG_INFO=enabled
DTP_LOG_WARN=enabled
DTP_LOG_HTTP_FORMAT=combined

4
.gitignore vendored

@ -1,6 +1,8 @@
.env
.env.docker
ssl/*crt
ssl/*key
data/minio
node_modules
dist
data/minio

@ -5,7 +5,7 @@
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"type": "node",
"request": "launch",
"name": "web:dtp-sites",
"skipFiles": [
@ -18,7 +18,7 @@
}
},
{
"type": "pwa-node",
"type": "node",
"request": "launch",
"name": "cli:dtp-sites",
"skipFiles": [
@ -29,7 +29,7 @@
"args": ["--action=reset-indexes", "all"]
},
{
"type": "pwa-node",
"type": "node",
"request": "launch",
"name": "worker:sample",
"skipFiles": [

@ -0,0 +1,21 @@
FROM node:16.16-alpine
WORKDIR /home/dtp/live/dtp-base
ENV NODE_ENV=production
# Populate git deploy keys
COPY docker/.ssh /root/.ssh
RUN chown -R root:root /root/.ssh
RUN chmod go-rwx /root/.ssh
RUN chmod 644 /root/.ssh/config
RUN chmod 600 /root/.ssh/id_rsa
# Install system dependencies
RUN apk update
RUN apk add ffmpeg git openrc openssh
# Populate Node.js application
COPY package.json yarn.lock ./
RUN yarn
COPY . .

@ -6,6 +6,8 @@ DTP Sites is an open source blogging platform built on Node.js and the DTP ecosy
The only qualified operated system for hosting a DTP Sites suite is [Ubuntu 20.04 LTS](https://releases.ubuntu.com/20.04/). It is acceptable to run it in a virtual machine for development and testing, but it should be run as close to bare metal as can be had for production environments.
## Install Data Tier Components
You will need MongoDB and MinIO installed and running before you can start DTP Sites web services.
1. [Install MongoDB](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/)
@ -16,17 +18,43 @@ Install redis:
sudo apt-get install redis
```
## Environment Configuration
## Install Node Version Manager (NVM) and Node.js
On a new host or host image, copy `.env.default` to `.env` and edit it as necessary.
```sh
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
```
For password salt and service passwords, the `uuidgen` tool may be useful to help generate hard-to-guess passwords for use in a development environment. Something more sophisticated than a UUID should be used in production.
## Resolve Global Node Dependencies
Yarn, Gulp, and Forever are required to be installed globally. This should be done once per developer workstation and repeated when updates are required.
```sh
nvm install --lts
npm install -g yarn gulp forever
```
Install application dependencies by running Yarn. You should do this on initial install and after every update or `git pull` as dependencies do change often, become upgraded to new versions, receive security fixes, etc.
## Preparing a Fresh Install
### Clone the DTP Base Repository
```sh
cd ~/live
git clone git@git.digitaltelepresence.com:digital-telepresence/dtp-base.git
```
### Install Required Dependencies
```sh
cd ~/live/dtp-base
yarn
```
### Generate SSL/TLS Certificate
```sh
cd ~/live/dtp-base/ssl
./mkcert
```
### Environment Configuration
On a new host or host image, copy `.env.default` to `.env` and edit it as necessary.
For password salt and service passwords, the `uuidgen` tool may be useful to help generate hard-to-guess passwords for use in a development environment. Something more sophisticated than a UUID should be used in production.
## Starting DTP Sites In Development Mode
@ -48,6 +76,8 @@ DTP Sites is a multi-tier web hosting engine built on:
## Production Environment Information
The only qualified operated system for hosting a DTP Base suite is [Ubuntu 20.04 LTS](https://releases.ubuntu.com/20.04/). It is acceptable to run it in a virtual machine for development and testing, but it should be run as close to bare metal as possible in production environments.
It's impossible to give 100% generic advice here, but it all depends on how large your audience is and how much they use your website. Larger, more active audiences will require a different kind of production server deployment than smaller and less active audiences.
Generally, it's possible to stack all components on one host and operate a fast site for small-to-medium audiences. The size of the host may vary, but it's possible to keep the system stacked and handle quite a large audience.

@ -313,6 +313,9 @@ class CoreNodeService extends SiteService {
.cursor()
.eachAsync(async (core) => {
try {
if (!core.kaleidoscope || !core.kaleidoscope.token) {
throw new Error('Core has not provided a Kaleidoscope token');
}
const response = await this.sendRequest(core, request);
results.push({ coreId: core._id, request, response });
} catch (error) {
@ -344,6 +347,10 @@ class CoreNodeService extends SiteService {
},
};
if (core.kaleidoscope && core.kaleidoscope.token) {
options.headers.Authorization = `Bearer ${core.kaleidoscope.token}`;
}
req.created = new Date();
req.core = core._id;
if (request.tokenized) {
@ -529,6 +536,7 @@ class CoreNodeService extends SiteService {
'oauth.clientSecret': client.secret,
'oauth.scopes': client.scopes,
'oauth.redirectUri': client.redirectUri,
'kaleidoscope.token': client.kaleidoscope.token,
},
},
);

@ -57,6 +57,7 @@ class OAuth2Service extends SiteService {
registerPassport ( ) {
const verifyClient = this.verifyClient.bind(this);
const verifyHttpBearer = this.verifyHttpBearer.bind(this);
const verifyKaleidoscopeBearer = this.verifyKaleidoscopeBearer.bind(this);
const basicStrategy = new BasicStrategy(verifyClient);
this.log.info('registering Basic strategy', { name: basicStrategy.name });
@ -69,6 +70,10 @@ class OAuth2Service extends SiteService {
const httpBearerStrategy = new BearerStrategy(verifyHttpBearer);
this.log.info('registering Bearer strategy', { name: httpBearerStrategy.name });
passport.use(httpBearerStrategy);
const kaleidoscopeBearerStrategy = new BearerStrategy(verifyKaleidoscopeBearer);
this.log.info('registering Kaleidoscope Bearer strategy');
passport.use(kaleidoscopeBearerStrategy);
}
async serializeClient (client, done) {
@ -392,6 +397,7 @@ class OAuth2Service extends SiteService {
async verifyHttpBearer (accessToken, done) {
const token = await this.getAccessToken(accessToken);
if (!token) {
this.log.error('no bearer token for client', { accessToken });
return done(null, false);
}
return done(null, token.user, { scope: token.scope });
@ -411,6 +417,45 @@ class OAuth2Service extends SiteService {
.lean();
return tokens;
}
async getKaleidoscopeClient (accessToken) {
const client = await OAuth2Client
.findOne({ 'kaleidoscope.token': accessToken })
.select('-secret -kaleidoscope -admin') // don't fetch them
.lean();
if (!client) {
return; // we don't have one, be undefined
}
/*
* extreme paranoia also serializes the object to absolutely prevent leaking
* a secret even if the underlying Mongoose library has a bug today.
*/
return {
_id: client._id,
created: client.created,
updated: client.updated,
site: client.site,
scopes: client.scopes,
flags: client.flags,
};
}
async verifyKaleidoscopeBearer (accessToken, done) {
const client = await this.getKaleidoscopeClient(accessToken);
if (!client) {
this.log.error('no Kaleidoscope token for client', { accessToken });
return done(null, false);
}
/*
* Minor hack here. You don't get a User or CoreUser for use with
* Kaleidoscope. This is machine-to-machine, there simply is no "user" in
* this transaction. Instead, you get a Client - the machine.
*
* So, up in controller space, req.user isn't a User or CoreUser for
* Kaleidoscope APIs. It is the OAuth2 Client or Service Node.
*/
return done(null, client);
}
}
module.exports = {

@ -3,7 +3,7 @@ include ../components/page-sidebar
include ../user/components/profile-icon
doctype html
html(lang='en')
- var DEFAULT_THEME = 'dtp-dark';
- var DEFAULT_THEME = 'dtp-light';
head
meta(charset='UTF-8')
meta(name='viewport', content='width=device-width, initial-scale=1.0')

@ -0,0 +1,6 @@
#!/bin/sh
yarn --production=false
gulp build
docker build . -t dtp/base

@ -0,0 +1,15 @@
#!/bin/bash
echo "stopping all containers"
docker stop $(docker ps -a -q)
echo "removing all containers"
docker rm $(docker ps -a -q)
echo "removing all volumes"
docker volume rm $(docker volume ls -q)
echo "removing all images"
docker rmi $(docker images -a -q)
echo "Docker cleanup done"

@ -0,0 +1,195 @@
version: '3.7'
# Settings common for all MinIO containers
x-minio-common: &minio-common
image: quay.io/minio/minio:RELEASE.2022-03-08T22-28-51Z
command: server --console-address ":9001" http://minio{1...4}/data{1...2}
expose:
- 9000
- 9001
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
# Settings common for all DTP Base containers
x-base-common: &base-common
image: dtp/base
restart: always
stop_signal: SIGINT
env_file:
- .env.docker
environment:
- NODE_ENV=production
volumes:
- /tmp/dtp:/tmp/dtp
depends_on:
- redis
- mongodb
- minio1
- minio2
- minio3
- minio4
services:
minio1:
<<: *minio-common
hostname: minio1
volumes:
- data1-1:/data1
- data1-2:/data2
minio2:
<<: *minio-common
hostname: minio2
volumes:
- data2-1:/data1
- data2-2:/data2
minio3:
<<: *minio-common
hostname: minio3
volumes:
- data3-1:/data1
- data3-2:/data2
minio4:
<<: *minio-common
hostname: minio4
volumes:
- data4-1:/data1
- data4-2:/data2
redis:
image: redis:6.2-alpine
hostname: redis
restart: always
expose:
- 6379
command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
mongodb:
image: mongo:latest
hostname: mongodb
restart: always
expose:
- 27017
volumes:
- mongodb_data:/data/db
base-host-services:
<<: *base-common
hostname: base-host-services
command: node app/workers/host-services.js
environment:
- DTP_HOST_CACHE_HOST=0.0.0.0
expose:
- "8000/udp"
base-reeeper:
<<: *base-common
hostname: base-reeeper
command: node app/workers/reeeper.js
environment:
- DTP_HOST_CACHE_HOST=base-host-services
depends_on:
- base-host-services
# base-analytics:
# <<: *base-common
# hostname: base-analytics
# command: node app/workers/base-analytics.js
# environment:
# - DTP_HOST_CACHE_HOST=base-host-services
# Base Crypto
# Makes calls to a Cryptocurrency exchange API to fetch the current exchange
# rate versus the US Dollar.
# base-crypto:
# <<: *base-common
# hostname: base-crypto
# command: node app/workers/base-crypto.js
# environment:
# - DTP_HOST_CACHE_HOST=base-host-services
# Base Newsletter Worker
# Processes newsletter transmit jobs and their email jobs.
base-newsletter:
<<: *base-common
hostname: base-newsletter
command: node app/workers/newsletter.js
environment:
- DTP_HOST_CACHE_HOST=base-host-services
depends_on:
- base-host-services
# Base Web Application
# Provides the DTP Base Node.js web application
base-app-001:
<<: *base-common
hostname: base-app-001
command: node dtp-webapp.js
environment:
- DTP_HOST_CACHE_HOST=base-host-services
expose:
- 3000
depends_on:
- base-host-services
- base-newsletter
- base-reeeper
# Nginx
# Provides an HTTP front-end to MinIO and the DTP Base application components
# running in their various containers in the stack.
nginx:
image: nginx:1.19.2-alpine
hostname: nginx
restart: always
volumes:
- ./docker/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "3000:3000"
- "8000:8000"
- "8001:8001"
- "9000:9000"
- "9001:9001"
depends_on:
- base-app-001
- minio1
- minio2
- minio3
- minio4
dns-proxy-server:
image: defreitas/dns-proxy-server
hostname: dns.mageddo
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/resolv.conf:/etc/resolv.conf
ports:
- "5380:5380"
depends_on:
- nginx
- base-app-001
## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
mongodb_data:
redis_data:
data1-1:
data1-2:
data2-1:
data2-2:
data3-1:
data3-2:
data4-1:
data4-2:

@ -0,0 +1,2 @@
#!/bin/bash
docker-compose run base-host-services sh

@ -0,0 +1,5 @@
#!/bin/bash
docker run --rm --hostname dns.mageddo --name dns-proxy-server -p 5380:5380 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/resolv.conf:/etc/resolv.conf \
defreitas/dns-proxy-server

@ -0,0 +1,3 @@
Host git.digitaltelepresence.com
User git
CertificateFile /root/.ssh/id_rsa

@ -0,0 +1,38 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzrPnvWYJQ9KSL+rwS6mA1KbWEY2uORqEDFSsEJ1yAgqcBfBK9Y3DEiPl+l60xB5qmlVskebraqoULiSNXnAtMv6g3ENb9IAY6M7R2ZIrtSrZOJagPkuQ8DgBKBD9xqycruSUmlBSjPAA/H8cErjawvIjYTpOZaOEJt/66XY6tFCTdjOtmmPZvJIKfbfrdA4DwM1V+9rFDwKgrrGQyZlc0uQigRmzcIvpC/UEmqIn/oB3qM+LIoQ3tECY2OV+tz8n0PRTwoB/rws96vUFublJvZFDrm8v0cZLG+Xs0XK+JCjjlaW4GtZ2cw9MtHto2XrUxY9jCMag7XV/mMAc3+qZg301f2PdTx929Z30POvJvwocA5SRgWsKbHXP3i653IitCfyDJI00R7OjJNNS74BwFByWhv9KJjCJEarXcSV3NrMh2ptxq8SbvFgoWoRKFS/viiqb41UOBsZZrLVnObB+d9LVSgEEwDZdbbdPa8zeX7AzMjoYjP01fKkcT2bytJp8= support@digitaltelepresence.com

@ -0,0 +1,2 @@
|1|5jczd9sZCMV0zY+B2tHMNweYEhY=|Nh/+S/QWhYLG+vfiwY0J8VuBKfA= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLNxeRruHUCy2HUyFVnOKv17vQbFth6iqc8T1i1DyRKC2nrS15VIEnwfHPo0qR7merRJEa/50CyunYY4PvbeYiU=
|1|Dy5o3mQ4SXKNMhgMYNzYVdi/KAs=|vg+t7yhXLjtkX3yd54VRzRROJXo= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLNxeRruHUCy2HUyFVnOKv17vQbFth6iqc8T1i1DyRKC2nrS15VIEnwfHPo0qR7merRJEa/50CyunYY4PvbeYiU=

@ -0,0 +1,138 @@
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# include /etc/nginx/conf.d/*.conf;
upstream base_app {
least_conn;
server base-app-001:3000;
}
upstream minio {
server minio1:9000;
server minio2:9000;
server minio3:9000;
server minio4:9000;
}
upstream console {
ip_hash;
server minio1:9001;
server minio2:9001;
server minio3:9001;
server minio4:9001;
}
server {
listen 9000;
listen [::]:9000;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://minio;
}
}
server {
listen 9001;
listen [::]:9001;
server_name localhost;
# To allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# To disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# To support websocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
chunked_transfer_encoding off;
proxy_pass http://console;
}
}
# DTP Base Application Server
# Provides load-balanced front-end to the Base web app
server {
server_name localhost;
listen [::]:3000 ipv6only=on;
listen 3000;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 20m;
location / {
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://base_app;
}
}
}

@ -0,0 +1,26 @@
# Docker Support
Docker is only supported for use in development/local environments to emulate a production environment with scaled-out infrastructure. The Docker environment is defined and described in `docker-compose.yml`
The host services worker is required to be operating on each host. And, we tend to think of a Docker container as a "host" - but it's not. And, they can easily map a path to a path on the host's file system. So, we map /tmp/dtp on the host into each DTP container, and we point all DTP processes at one container running the host services worker. Do not emulate that topology in a production environment, it would defeat the purpose of the host services worker as an edge cache.
## Initialize the Environment
```sh
docker-compose run sites-host-services node dtp-sites-cli.js --action=create-domain shing.tv
```
## Grand Admin Access
```sh
docker-compose run sites-host-services node dtp-sites-cli.js --action=grant --permission=admin [email address]
```
## Start the Environment
```sh
docker-compose up -d
```
## Stop the Environment
```sh
docker-compose down
```

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>DTP Soapbox Community Engine</title>
<style type="text/css">
html, body {
margin: 0;
padding: 0;
}
body {
position: fixed;
top: 0; right: 0; bottom: 0; left: 0;
width: 100%;
height: 100%;
background-color: #1a1a1a;
color: #e8e8e8;
}
img.responsive {
display: block;
margin: 0 auto;
width: 100%;
max-width: 160px;
height: auto;
}
.container {
display: flex;
flex-direction: column;
height: 100%;
justify-content: center;
max-width: 960px;
margin: 0 auto;
background-color: #000000;
color: #e8e8e8;
}
.container section {
padding: 25px 8px;
text-align: center;
}
.container h1 {
font-size: 2em;
}
</style>
</head>
<body>
<div class="container">
<section>
<img src="/static/img/dtp-core.svg" class="responsive" alt="DTP Core Logo"/>
<p>The system is down for maintenance and will be back online shortly...</p>
</section>
</div>
</body>
</html>

@ -0,0 +1,400 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="477.11536pt"
height="477.12122pt"
version="1.1"
viewBox="0 0 477.11536 477.12122"
id="svg216"
sodipodi:docname="dtp-core.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata220">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1019"
id="namedview218"
showgrid="false"
inkscape:zoom="1.0114286"
inkscape:cx="288.51293"
inkscape:cy="296.52704"
inkscape:window-x="0"
inkscape:window-y="36"
inkscape:window-maximized="1"
inkscape:current-layer="g214" />
<defs
id="defs68">
<symbol
id="i"
overflow="visible"
style="overflow:visible">
<path
d="m 18.766,-1.125 c -0.96875,0.5 -1.9805,0.875 -3.0312,1.125 -1.043,0.25781 -2.1367,0.39062 -3.2812,0.39062 -3.3984,0 -6.0898,-0.94531 -8.0781,-2.8438 -1.9922,-1.9062 -2.9844,-4.4844 -2.9844,-7.7344 0,-3.2578 0.99219,-5.8359 2.9844,-7.7344 1.9883,-1.9062 4.6797,-2.8594 8.0781,-2.8594 1.1445,0 2.2383,0.13281 3.2812,0.39062 1.0508,0.25 2.0625,0.625 3.0312,1.125 v 4.2188 c -0.98047,-0.65625 -1.9453,-1.1406 -2.8906,-1.4531 -0.94922,-0.3125 -1.9492,-0.46875 -3,-0.46875 -1.875,0 -3.3516,0.60547 -4.4219,1.8125 -1.0742,1.1992 -1.6094,2.8555 -1.6094,4.9688 0,2.1055 0.53516,3.7617 1.6094,4.9688 1.0703,1.1992 2.5469,1.7969 4.4219,1.7969 1.0508,0 2.0508,-0.14844 3,-0.45312 0.94531,-0.3125 1.9102,-0.80078 2.8906,-1.4688 z"
id="path2"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="c"
overflow="visible"
style="overflow:visible">
<path
d="m 13.734,-11.141 c -0.4375,-0.19531 -0.87109,-0.34375 -1.2969,-0.4375 -0.41797,-0.10156 -0.83984,-0.15625 -1.2656,-0.15625 -1.2617,0 -2.2305,0.40625 -2.9062,1.2188 -0.67969,0.80469 -1.0156,1.9531 -1.0156,3.4531 v 7.0625 H 2.3591 v -15.312 h 4.8906 v 2.5156 c 0.625,-1 1.3438,-1.7266 2.1562,-2.1875 0.82031,-0.46875 1.8008,-0.70312 2.9375,-0.70312 0.16406,0 0.34375,0.01172 0.53125,0.03125 0.19531,0.01172 0.47656,0.03906 0.84375,0.07813 z"
id="path5"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="a"
overflow="visible"
style="overflow:visible">
<path
d="m 17.641,-7.7031 v 1.4062 H 6.188 c 0.125,1.1484 0.53906,2.0078 1.25,2.5781 0.70703,0.57422 1.7031,0.85938 2.9844,0.85938 1.0312,0 2.082,-0.14844 3.1562,-0.45312 1.082,-0.3125 2.1914,-0.77344 3.3281,-1.3906 v 3.7656 c -1.1562,0.4375 -2.3125,0.76562 -3.4688,0.98438 -1.1562,0.22656 -2.3125,0.34375 -3.4688,0.34375 -2.7734,0 -4.9297,-0.70312 -6.4688,-2.1094 -1.5312,-1.4062 -2.2969,-3.3789 -2.2969,-5.9219 0,-2.5 0.75391,-4.4609 2.2656,-5.8906 1.5078,-1.4375 3.582,-2.1562 6.2188,-2.1562 2.4062,0 4.332,0.73047 5.7812,2.1875 1.4453,1.4492 2.1719,3.3828 2.1719,5.7969 z m -5.0312,-1.625 c 0,-0.92578 -0.27344,-1.6719 -0.8125,-2.2344 -0.54297,-0.57031 -1.25,-0.85938 -2.125,-0.85938 -0.94922,0 -1.7188,0.26562 -2.3125,0.79688 -0.5937,0.53126 -0.96484,1.2969 -1.1094,2.2969 z"
id="path8"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="k"
overflow="visible"
style="overflow:visible">
<path
d="m 9.2188,-6.8906 c -1.0234,0 -1.793,0.17188 -2.3125,0.51562 -0.51172,0.34375 -0.76562,0.85547 -0.76562,1.5312 0,0.625 0.20703,1.1172 0.625,1.4688 0.41406,0.34375 0.98828,0.51562 1.7188,0.51562 0.92578,0 1.7031,-0.32812 2.3281,-0.98438 0.63281,-0.66406 0.95312,-1.4922 0.95312,-2.4844 v -0.5625 z m 7.4688,-1.8438 V 0 h -4.9219 v -2.2656 c -0.65625,0.92969 -1.3984,1.6055 -2.2188,2.0312 -0.82422,0.41406 -1.8242,0.625 -3,0.625 -1.5859,0 -2.8711,-0.45703 -3.8594,-1.375 -0.99219,-0.92578 -1.4844,-2.1289 -1.4844,-3.6094 0,-1.7891 0.61328,-3.1016 1.8438,-3.9375 1.2383,-0.84375 3.1797,-1.2656 5.8281,-1.2656 h 2.8906 v -0.39062 c 0,-0.76953 -0.30859,-1.332 -0.92188,-1.6875 -0.61719,-0.36328 -1.5703,-0.54688 -2.8594,-0.54688 -1.0547,0 -2.0312,0.10547 -2.9375,0.3125 -0.89844,0.21094 -1.7305,0.52344 -2.5,0.9375 v -3.7344 c 1.0391,-0.25 2.0859,-0.44141 3.1406,-0.57812 1.0625,-0.13281 2.125,-0.20312 3.1875,-0.20312 2.7578,0 4.75,0.54688 5.9688,1.6406 1.2266,1.0859 1.8438,2.8555 1.8438,5.3125 z"
id="path11"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="b"
overflow="visible"
style="overflow:visible">
<path
d="m 7.7031,-19.656 v 4.3438 H 12.75 v 3.5 H 7.7031 v 6.5 c 0,0.71094 0.14062,1.1875 0.42188,1.4375 0.28126,0.25 0.83594,0.375 1.6719,0.375 h 2.5156 v 3.5 h -4.1875 c -1.9375,0 -3.3125,-0.39844 -4.125,-1.2031 -0.80469,-0.8125 -1.2031,-2.1797 -1.2031,-4.1094 v -6.5 h -2.4219 v -3.5 h 2.4219 v -4.3438 z"
id="path14"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="j"
overflow="visible"
style="overflow:visible">
<path
d="m 12.766,-13.078 v -8.2031 h 4.9219 V -10e-5 H 12.766 v -2.2188 c -0.66797,0.90625 -1.4062,1.5703 -2.2188,1.9844 -0.8126,0.4141 -1.7578,0.625 -2.8281,0.625 -1.8867,0 -3.4336,-0.75 -4.6406,-2.25 -1.2109,-1.5 -1.8125,-3.4258 -1.8125,-5.7812 0,-2.3633 0.60156,-4.2969 1.8125,-5.7969 1.207,-1.5 2.7539,-2.25 4.6406,-2.25 1.0625,0 2,0.21484 2.8125,0.64062 0.82031,0.42969 1.5664,1.0859 2.2344,1.9688 z m -3.2188,9.9219 c 1.0391,0 1.8359,-0.37891 2.3906,-1.1406 0.55078,-0.76953 0.82812,-1.8828 0.82812,-3.3438 0,-1.457 -0.27734,-2.5664 -0.82812,-3.3281 -0.55469,-0.76953 -1.3516,-1.1562 -2.3906,-1.1562 -1.043,0 -1.8398,0.38672 -2.3906,1.1562 -0.55469,0.76172 -0.82812,1.8711 -0.82812,3.3281 0,1.4609 0.27344,2.5742 0.82812,3.3438 0.55078,0.76172 1.3477,1.1406 2.3906,1.1406 z"
id="path17"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="g"
overflow="visible"
style="overflow:visible">
<path
d="m 10.5,-3.1562 c 1.0508,0 1.8516,-0.37891 2.4062,-1.1406 0.55078,-0.76953 0.82812,-1.8828 0.82812,-3.3438 0,-1.457 -0.27734,-2.5664 -0.82812,-3.3281 -0.55469,-0.76953 -1.3555,-1.1562 -2.4062,-1.1562 -1.0547,0 -1.8594,0.38672 -2.4219,1.1562 -0.55469,0.77344 -0.82812,1.8828 -0.82812,3.3281 0,1.4492 0.27344,2.5586 0.82812,3.3281 0.5625,0.77344 1.3672,1.1562 2.4219,1.1562 z m -3.25,-9.9219 c 0.67578,-0.88281 1.4219,-1.5391 2.2344,-1.9688 0.82031,-0.42578 1.7656,-0.64062 2.8281,-0.64062 1.8945,0 3.4453,0.75 4.6562,2.25 1.207,1.5 1.8125,3.4336 1.8125,5.7969 0,2.3555 -0.60547,4.2812 -1.8125,5.7812 -1.2109,1.5 -2.7617,2.25 -4.6562,2.25 -1.0625,0 -2.0078,-0.21094 -2.8281,-0.625 C 8.6719,-0.6602 7.9258,-1.32032 7.25,-2.21882 V -2e-5 H 2.3594 v -21.281 H 7.25 Z"
id="path20"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="f"
overflow="visible"
style="overflow:visible">
<path
d="m 0.34375,-15.312 h 4.8906 l 4.125,10.391 3.5,-10.391 h 4.8906 l -6.4375,16.766 c -0.64844,1.6953 -1.4023,2.8828 -2.2656,3.5625 -0.86719,0.6875 -2,1.0312 -3.4062,1.0312 H 2.79685 V 2.8289 h 1.5312 c 0.83203,0 1.4375,-0.13672 1.8125,-0.40625 C 6.52336,2.16093 6.82024,1.69218 7.03117,1.01645 L 7.17179,0.59457 Z"
id="path23"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="e"
overflow="visible"
style="overflow:visible">
<path
d="m 2.1875,-5.9688 v -9.3438 h 4.9219 v 1.5312 c 0,0.83594 -0.00781,1.875 -0.015625,3.125 -0.011719,1.25 -0.015625,2.0859 -0.015625,2.5 0,1.2422 0.03125,2.1328 0.09375,2.6719 0.070313,0.54297 0.17969,0.93359 0.32812,1.1719 0.20703,0.32422 0.47266,0.57422 0.79688,0.75 0.32031,0.16797 0.69141,0.25 1.1094,0.25 1.0195,0 1.8203,-0.39062 2.4062,-1.1719 0.58203,-0.78125 0.875,-1.8672 0.875,-3.2656 v -7.5625 h 4.8906 V -6e-4 H 12.6875 V -2.2194 C 11.94531,-1.32096 11.1641,-0.6608 10.3437,-0.235 9.51948,0.17906 8.6093,0.39 7.6093,0.39 5.8476,0.39 4.5038,-0.14906 3.5781,-1.235 2.64841,-2.317 2.1875,-3.8952 2.1875,-5.9694 Z"
id="path26"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="v"
overflow="visible"
style="overflow:visible">
<path
d="m 7.8281,-16.438 v 12.453 h 1.8906 c 2.1562,0 3.8008,-0.53125 4.9375,-1.5938 1.1328,-1.0625 1.7031,-2.6133 1.7031,-4.6562 0,-2.0195 -0.57031,-3.5547 -1.7031,-4.6094 -1.125,-1.0625 -2.7734,-1.5938 -4.9375,-1.5938 z m -5.25,-3.9688 H 8.125 c 3.0938,0 5.3984,0.21875 6.9219,0.65625 1.5195,0.4375 2.8203,1.1875 3.9062,2.25 0.95703,0.91797 1.6641,1.9805 2.125,3.1875 0.46875,1.1992 0.70312,2.5586 0.70312,4.0781 0,1.543 -0.23438,2.918 -0.70312,4.125 -0.46094,1.2109 -1.168,2.2773 -2.125,3.2031 -1.0938,1.0547 -2.4062,1.8047 -3.9375,2.25 C 13.4844,-0.21935 11.1875,-6e-4 8.125,-6e-4 H 2.5781 Z"
id="path29"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="u"
overflow="visible"
style="overflow:visible">
<path
d="m 14.312,-14.828 v 3.7188 c -1.043,-0.4375 -2.0547,-0.76562 -3.0312,-0.98438 -0.98047,-0.21875 -1.9023,-0.32812 -2.7656,-0.32812 -0.92969,0 -1.6211,0.11719 -2.0781,0.34375 -0.44922,0.23047 -0.67188,0.58984 -0.67188,1.0781 0,0.38672 0.17188,0.68359 0.51562,0.89062 0.34375,0.21094 0.95703,0.36719 1.8438,0.46875 l 0.85938,0.125 c 2.5078,0.32422 4.1953,0.85156 5.0625,1.5781 0.86328,0.73047 1.2969,1.8711 1.2969,3.4219 0,1.6367 -0.60547,2.8672 -1.8125,3.6875 -1.1992,0.8125 -2.9922,1.2188 -5.375,1.2188 -1.0234,0 -2.0742,-0.078125 -3.1562,-0.23438 -1.0742,-0.15625 -2.1797,-0.39453 -3.3125,-0.71875 v -3.7188 c 0.96875,0.48047 1.9609,0.83984 2.9844,1.0781 1.0312,0.23047 2.0781,0.34375 3.1406,0.34375 0.95703,0 1.6758,-0.12891 2.1562,-0.39062 0.47656,-0.26953 0.71875,-0.66406 0.71875,-1.1875 0,-0.4375 -0.16797,-0.75781 -0.5,-0.96875 -0.33594,-0.21875 -0.99609,-0.38281 -1.9844,-0.5 L 7.34339,-6.01551 c -2.1797,-0.26953 -3.7031,-0.77344 -4.5781,-1.5156 -0.875,-0.73828 -1.3125,-1.8594 -1.3125,-3.3594 0,-1.625 0.55078,-2.8281 1.6562,-3.6094 1.1133,-0.78906 2.8203,-1.1875 5.125,-1.1875 0.89453,0 1.8359,0.07422 2.8281,0.21875 1,0.13672 2.082,0.35156 3.25,0.64062 z"
id="path32"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="t"
overflow="visible"
style="overflow:visible">
<path
d="M 2.3594,-15.312 H 7.25 V 0 H 2.3594 Z m 0,-5.9688 H 7.25 v 4 H 2.3594 Z"
id="path35"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="s"
overflow="visible"
style="overflow:visible">
<path
d="m 12.766,-2.5938 c -0.66797,0.88672 -1.4062,1.543 -2.2188,1.9688 C 9.7347,-0.20703 8.7894,0 7.7191,0 5.8519,0 4.3129,-0.73438 3.0941,-2.2031 1.8753,-3.6797 1.266,-5.5547 1.266,-7.8281 c 0,-2.2891 0.60938,-4.1641 1.8281,-5.625 1.2188,-1.4688 2.7578,-2.2031 4.625,-2.2031 1.0703,0 2.0156,0.21484 2.8281,0.64062 0.8125,0.41797 1.5508,1.0742 2.2188,1.9688 v -2.2656 h 4.9219 v 13.766 c 0,2.457 -0.77734,4.3359 -2.3281,5.6406 -1.5547,1.3008 -3.8086,1.9531 -6.7656,1.9531 -0.94922,0 -1.8711,-0.074219 -2.7656,-0.21875 C 4.93016,5.68013 4.0317,5.45748 3.1255,5.15669 v -3.8125 c 0.86328,0.48828 1.7031,0.85156 2.5156,1.0938 0.82031,0.23828 1.6484,0.35938 2.4844,0.35938 1.6016,0 2.7734,-0.35156 3.5156,-1.0469 0.75,-0.69922 1.125,-1.7969 1.125,-3.2969 z M 9.5472,-12.125 c -1.0117,0 -1.8047,0.375 -2.375,1.125 -0.5625,0.74219 -0.84375,1.7969 -0.84375,3.1719 0,1.3984 0.26953,2.4609 0.8125,3.1875 0.55078,0.71875 1.3516,1.0781 2.4062,1.0781 1.0195,0 1.8125,-0.36719 2.375,-1.1094 0.5625,-0.75 0.84375,-1.8008 0.84375,-3.1562 0,-1.375 -0.28125,-2.4297 -0.84375,-3.1719 -0.5625,-0.75 -1.3555,-1.125 -2.375,-1.125 z"
id="path38"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="h"
overflow="visible"
style="overflow:visible">
<path
d="M 17.75,-9.3281 V 0 h -4.9219 v -7.1406 c 0,-1.3203 -0.03125,-2.2344 -0.09375,-2.7344 -0.0625,-0.5 -0.16797,-0.86719 -0.3125,-1.1094 -0.1875,-0.3125 -0.44922,-0.55469 -0.78125,-0.73438 -0.32422,-0.17578 -0.69531,-0.26562 -1.1094,-0.26562 -1.0234,0 -1.8242,0.39844 -2.4062,1.1875 -0.58594,0.78125 -0.875,1.8711 -0.875,3.2656 V -1e-4 H 2.3594 v -15.312 H 7.25 v 2.2344 c 0.73828,-0.88281 1.5195,-1.5391 2.3438,-1.9688 0.83203,-0.42578 1.75,-0.64062 2.75,-0.64062 1.7695,0 3.1133,0.54688 4.0312,1.6406 0.91406,1.0859 1.375,2.6562 1.375,4.7188 z"
id="path41"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="r"
overflow="visible"
style="overflow:visible">
<path
d="m 12.422,-21.281 v 3.2188 H 9.7189 c -0.6875,0 -1.1719,0.125 -1.4531,0.375 -0.27344,0.25 -0.40625,0.6875 -0.40625,1.3125 v 1.0625 h 4.1875 v 3.5 H 7.85955 V -2e-4 h -4.8906 v -11.812 h -2.4375 v -3.5 h 2.4375 v -1.0625 c 0,-1.6641 0.46094,-2.8984 1.3906,-3.7031 0.92578,-0.80078 2.3672,-1.2031 4.3281,-1.2031 z"
id="path44"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="d"
overflow="visible"
style="overflow:visible">
<path
d="m 9.6406,-12.188 c -1.0859,0 -1.9141,0.39062 -2.4844,1.1719 -0.57422,0.78125 -0.85938,1.9062 -0.85938,3.375 0,1.4688 0.28516,2.5938 0.85938,3.375 0.57031,0.77344 1.3984,1.1562 2.4844,1.1562 1.0625,0 1.875,-0.38281 2.4375,-1.1562 0.57031,-0.78125 0.85938,-1.9062 0.85938,-3.375 0,-1.4688 -0.28906,-2.5938 -0.85938,-3.375 -0.5625,-0.78125 -1.375,-1.1719 -2.4375,-1.1719 z m 0,-3.5 c 2.6328,0 4.6914,0.71484 6.1719,2.1406 1.4766,1.418 2.2188,3.3867 2.2188,5.9062 0,2.5117 -0.74219,4.4805 -2.2188,5.9062 C 14.332,-0.317 12.2734,0.39 9.6406,0.39 6.9922,0.39 4.9258,-0.31703 3.4375,-1.735 1.9453,-3.1608 1.2031,-5.1295 1.2031,-7.6412 c 0,-2.5195 0.74219,-4.4883 2.2344,-5.9062 1.4883,-1.4258 3.5547,-2.1406 6.2031,-2.1406 z"
id="path47"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="q"
overflow="visible"
style="overflow:visible">
<path
d="m 16.547,-12.766 c 0.61328,-0.94531 1.3477,-1.6719 2.2031,-2.1719 0.85156,-0.5 1.7891,-0.75 2.8125,-0.75 1.7578,0 3.0977,0.54688 4.0156,1.6406 0.92578,1.0859 1.3906,2.6562 1.3906,4.7188 V -4e-4 h -4.9219 v -7.9844 -0.35938 c 0.0078,-0.13281 0.01563,-0.32031 0.01563,-0.5625 0,-1.082 -0.16406,-1.8633 -0.48438,-2.3438 -0.3125,-0.48828 -0.82422,-0.73438 -1.5312,-0.73438 -0.92969,0 -1.6484,0.38672 -2.1562,1.1562 -0.51172,0.76172 -0.77344,1.8672 -0.78125,3.3125 v 7.5156 h -4.9219 v -7.9844 c 0,-1.6953 -0.14844,-2.7852 -0.4375,-3.2656 -0.29297,-0.48828 -0.8125,-0.73438 -1.5625,-0.73438 -0.9375,0 -1.6641,0.38672 -2.1719,1.1562 -0.51172,0.76172 -0.76562,1.8594 -0.76562,3.2969 v 7.5312 h -4.9219 v -15.312 h 4.9219 v 2.2344 c 0.60156,-0.86328 1.2891,-1.5156 2.0625,-1.9531 0.78125,-0.4375 1.6406,-0.65625 2.5781,-0.65625 1.0625,0 2,0.25781 2.8125,0.76562 0.8125,0.51172 1.4258,1.2305 1.8438,2.1562 z"
id="path50"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="p"
overflow="visible"
style="overflow:visible">
<path
d="M 17.75,-9.3281 V 0 h -4.9219 v -7.1094 c 0,-1.3438 -0.03125,-2.2656 -0.09375,-2.7656 -0.0625,-0.5 -0.16797,-0.86719 -0.3125,-1.1094 -0.1875,-0.3125 -0.44922,-0.55469 -0.78125,-0.73438 -0.32422,-0.17578 -0.69531,-0.26562 -1.1094,-0.26562 -1.0234,0 -1.8242,0.39844 -2.4062,1.1875 -0.58594,0.78125 -0.875,1.8711 -0.875,3.2656 V -1e-4 H 2.3594 v -21.281 H 7.25 v 8.2031 c 0.73828,-0.88281 1.5195,-1.5391 2.3438,-1.9688 0.83203,-0.42578 1.75,-0.64062 2.75,-0.64062 1.7695,0 3.1133,0.54688 4.0312,1.6406 0.91406,1.0859 1.375,2.6562 1.375,4.7188 z"
id="path53"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="o"
overflow="visible"
style="overflow:visible">
<path
d="m 2.5781,-20.406 h 5.875 l 7.4219,14 v -14 h 4.9844 V 0 h -5.875 L 7.5625,-14 V 0 H 2.5781 Z"
id="path56"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="n"
overflow="visible"
style="overflow:visible">
<path
d="m 2.5781,-20.406 h 8.7344 c 2.5938,0 4.582,0.57812 5.9688,1.7344 1.3945,1.1484 2.0938,2.7891 2.0938,4.9219 0,2.1367 -0.69922,3.7812 -2.0938,4.9375 -1.3867,1.1562 -3.375,1.7344 -5.9688,1.7344 H 7.8281 V 3e-4 h -5.25 z m 5.25,3.8125 v 5.7031 H 10.75 c 1.0195,0 1.8047,-0.25 2.3594,-0.75 0.5625,-0.5 0.84375,-1.2031 0.84375,-2.1094 0,-0.91406 -0.28125,-1.6172 -0.84375,-2.1094 -0.55469,-0.48828 -1.3398,-0.73438 -2.3594,-0.73438 z"
id="path59"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="m"
overflow="visible"
style="overflow:visible">
<path
d="M 2.3594,-15.312 H 7.25 v 15.031 c 0,2.0508 -0.49609,3.6172 -1.4844,4.7031 -0.98047,1.082 -2.4062,1.625 -4.2812,1.625 H -0.9375 V 2.8283 h 0.85938 c 0.92578,0 1.5625,-0.21094 1.9062,-0.625 0.35156,-0.41797 0.53125,-1.2461 0.53125,-2.4844 z m 0,-5.9688 H 7.25 v 4 H 2.3594 Z"
id="path62"
inkscape:connector-curvature="0" />
</symbol>
<symbol
id="l"
overflow="visible"
style="overflow:visible">
<path
d="m 14.719,-14.828 v 3.9844 c -0.65625,-0.45703 -1.3242,-0.79688 -2,-1.0156 -0.66797,-0.21875 -1.3594,-0.32812 -2.0781,-0.32812 -1.3672,0 -2.4336,0.40234 -3.2031,1.2031 -0.76172,0.79297 -1.1406,1.9062 -1.1406,3.3438 0,1.4297 0.37891,2.543 1.1406,3.3438 0.76953,0.79297 1.8359,1.1875 3.2031,1.1875 0.75781,0 1.4844,-0.10938 2.1719,-0.32812 0.6875,-0.22656 1.3203,-0.56641 1.9062,-1.0156 v 4 c -0.76172,0.28125 -1.5391,0.48828 -2.3281,0.625 -0.78125,0.14453 -1.5742,0.21875 -2.375,0.21875 -2.7617,0 -4.9219,-0.70703 -6.4844,-2.125 -1.5547,-1.4141 -2.3281,-3.3828 -2.3281,-5.9062 0,-2.5312 0.77344,-4.5039 2.3281,-5.9219 1.5625,-1.4141 3.7227,-2.125 6.4844,-2.125 0.80078,0 1.5938,0.07422 2.375,0.21875 0.78125,0.13672 1.5547,0.35156 2.3281,0.64062 z"
id="path65"
inkscape:connector-curvature="0" />
</symbol>
</defs>
<g
id="g214"
transform="translate(-111.4435,-41.446575)">
<path
d="M 553.38,235.79 394.24,76.63 c -28.992,-6.2773 -59.461,-6.2773 -88.445,0 l -159.14,159.16 c -6.2773,28.965 -6.2773,59.465 0,88.434 l 159.14,159.15 c 28.992,6.2812 59.461,6.2812 88.445,0 l 159.14,-159.15 c 6.2656,-28.973 6.2656,-59.469 0,-88.434 z m -20.535,44.926 c -0.0625,13.273 -1.5078,26.527 -4.4141,39.434 -0.21094,0.98047 -0.68359,1.8555 -1.3828,2.5352 l -134.36,134.36 c -0.70703,0.70703 -1.5625,1.1914 -2.5352,1.4062 -13.145,2.9453 -26.652,4.4336 -40.152,4.4336 -0.91797,0 -1.8359,-0.0234 -2.75,-0.043 h -0.20703 c -12.504,-0.19141 -25,-1.6797 -37.184,-4.3906 -0.96484,-0.23438 -1.8477,-0.69922 -2.5469,-1.4062 l -134.34,-134.36 c -0.69922,-0.68359 -1.1797,-1.5586 -1.3984,-2.5352 -2.9219,-13.059 -4.4023,-26.477 -4.4258,-39.91 0,-0.0664 -0.0156,-0.14453 -0.0156,-0.22266 0,-0.0898 0.0156,-0.15625 0.0156,-0.23438 0.0156,-13.43 1.4961,-26.852 4.4258,-39.91 0.21875,-0.96875 0.69531,-1.8477 1.3984,-2.5352 l 134.34,-134.36 c 0.69922,-0.69531 1.5742,-1.1719 2.5469,-1.3984 12.828,-2.867198 25.996,-4.339798 39.184,-4.402298 0.0742,-0.0039 0.13281,-0.02734 0.23047,-0.02734 h 0.0273 c 0.0508,0 0.10156,0.01563 0.15625,0.01563 13.676,-0.05078 27.383,1.4219 40.699,4.414098 0.97266,0.23047 1.832,0.69922 2.5352,1.3984 l 134.36,134.34 c 0.69922,0.69922 1.1719,1.5781 1.3828,2.5469 2.9688,13.227 4.4531,26.836 4.4297,40.453 v 0.16406 c -0.004,0.0664 -0.0195,0.14453 -0.0195,0.22656 z"
id="path70"
inkscape:connector-curvature="0" />
<path
d="m 146.74,345.84 c -2.0391,-2.0273 -5.3438,-2.0508 -7.3711,0 l -26.402,26.398 c -2.0312,2.0273 -2.0312,5.3242 0,7.3516 1.0234,1.0195 2.3516,1.5391 3.6914,1.5391 1.3398,0 2.6641,-0.52734 3.6797,-1.5391 l 26.402,-26.395 c 2.0273,-2.0234 2.0273,-5.3281 0,-7.3555 z"
id="path72"
inkscape:connector-curvature="0" />
<path
d="m 174.23,373.33 c -2.043,-2.043 -5.3438,-2.043 -7.3711,0 l -26.402,26.398 c -2.0312,2.0273 -2.0312,5.332 0,7.3594 1.0234,1.0117 2.3516,1.5195 3.6914,1.5195 1.3281,0 2.6641,-0.50781 3.6797,-1.5195 l 26.402,-26.398 c 2.0273,-2.0273 2.0273,-5.3242 0,-7.3594 z"
id="path74"
inkscape:connector-curvature="0" />
<path
d="m 201.71,400.82 c -2.0391,-2.0508 -5.3359,-2.0508 -7.3711,0 l -26.395,26.395 c -2.0391,2.0312 -2.0391,5.332 0,7.3594 1.0117,1.0352 2.3398,1.5391 3.6797,1.5391 1.3399,0 2.6641,-0.50781 3.6914,-1.5391 l 26.395,-26.395 c 2.0352,-2.0352 2.0352,-5.332 0,-7.3594 z"
id="path76"
inkscape:connector-curvature="0" />
<path
d="m 229.2,428.3 c -2.0391,-2.0508 -5.3438,-2.0508 -7.3711,0 l -26.402,26.398 c -2.0273,2.0273 -2.0273,5.3242 0,7.3594 1.0234,1.0117 2.3516,1.5391 3.6914,1.5391 1.3398,0 2.6641,-0.53125 3.6797,-1.5391 l 26.402,-26.398 c 2.0352,-2.0273 2.0352,-5.332 0,-7.3594 z"
id="path78"
inkscape:connector-curvature="0" />
<path
d="m 256.69,455.8 c -2.0391,-2.0312 -5.3438,-2.0508 -7.3711,0 l -26.402,26.395 c -2.0273,2.0273 -2.0273,5.332 0,7.3594 1.0234,1.0195 2.3516,1.5195 3.6914,1.5195 1.3281,0 2.6641,-0.50391 3.6797,-1.5195 l 26.402,-26.395 c 2.0273,-2.0312 2.0273,-5.3281 0,-7.3594 z"
id="path80"
inkscape:connector-curvature="0" />
<path
d="m 276.8,483.29 -26.395,26.395 c -2.0312,2.0312 -2.0312,5.332 0,7.3594 1.0234,1.0195 2.3516,1.5234 3.6914,1.5234 1.3281,0 2.6641,-0.50781 3.6797,-1.5234 l 26.402,-26.395 c 2.0273,-2.0273 2.0273,-5.332 0,-7.3594 -2.043,-2.0547 -5.3398,-2.0547 -7.3789,0 z"
id="path82"
inkscape:connector-curvature="0" />
<path
d="m 419.51,78.27 c 1.3203,0 2.6758,-0.51562 3.6836,-1.5273 l 26.398,-26.395 c 2.0273,-2.043 2.0273,-5.3438 0,-7.3711 -2.0273,-2.0273 -5.332,-2.0273 -7.3594,0 l -26.414,26.395 c -2.0273,2.0391 -2.0273,5.3438 0,7.3711 1.0352,1.0156 2.3633,1.5273 3.6914,1.5273 z"
id="path84"
inkscape:connector-curvature="0" />
<path
d="m 443.3,104.23 c 1.043,1.0195 2.3633,1.5234 3.6914,1.5234 1.3281,0 2.6758,-0.50391 3.6914,-1.5234 l 26.395,-26.395 c 2.0312,-2.0391 2.0312,-5.3359 0,-7.3711 -2.0273,-2.0391 -5.3242,-2.0391 -7.3516,0 l -26.422,26.395 c -2.0312,2.0391 -2.0312,5.3438 -0.004,7.3711 z"
id="path86"
inkscape:connector-curvature="0" />
<path
d="m 470.8,131.72 c 1.0352,1.0117 2.3633,1.5352 3.6914,1.5352 1.3203,0 2.6758,-0.51953 3.6836,-1.5352 l 26.398,-26.395 c 2.0273,-2.0391 2.0273,-5.3359 0,-7.3711 -2.0312,-2.0312 -5.332,-2.0312 -7.3594,0 l -26.414,26.395 c -2.0312,2.0391 -2.0312,5.3359 0,7.3711 z"
id="path88"
inkscape:connector-curvature="0" />
<path
d="m 498.28,159.2 c 1.0352,1.0117 2.3633,1.5234 3.6914,1.5234 1.3281,0 2.6758,-0.50781 3.6914,-1.5234 l 26.395,-26.395 c 2.0273,-2.0391 2.0273,-5.3438 0,-7.3711 -2.0273,-2.0391 -5.3242,-2.0391 -7.3594,0 l -26.414,26.395 c -2.0352,2.043 -2.0352,5.3438 -0.004,7.3711 z"
id="path90"
inkscape:connector-curvature="0" />
<path
d="m 525.77,186.69 c 1.0352,1.0117 2.3633,1.5234 3.6836,1.5234 1.3281,0 2.6758,-0.50781 3.6914,-1.5234 l 26.395,-26.395 c 2.0312,-2.0391 2.0312,-5.3438 0,-7.3711 -2.0273,-2.0391 -5.3242,-2.0391 -7.3516,0 l -26.414,26.398 c -2.0391,2.0391 -2.0391,5.3359 -0.004,7.3672 z"
id="path92"
inkscape:connector-curvature="0" />
<path
d="m 553.26,214.18 c 1.0195,1.0117 2.3633,1.5195 3.6914,1.5195 1.3203,0 2.6758,-0.50391 3.6836,-1.5195 l 26.398,-26.395 c 2.0273,-2.043 2.0273,-5.3438 0,-7.3711 -2.0273,-2.0391 -5.332,-2.0391 -7.3594,0 l -26.414,26.395 c -2.0273,2.0391 -2.0273,5.332 0,7.3711 z"
id="path94"
inkscape:connector-curvature="0" />
<path
d="m 276.8,76.742 c 1.0234,1.0117 2.3516,1.5195 3.6914,1.5195 1.3398,0 2.6641,-0.50391 3.6914,-1.5195 2.0273,-2.0391 2.0273,-5.3438 0,-7.3711 l -26.402,-26.395 c -2.0273,-2.0391 -5.332,-2.0391 -7.3711,0 -2.0312,2.0312 -2.0312,5.332 0,7.3711 z"
id="path96"
inkscape:connector-curvature="0" />
<path
d="m 249.3,104.23 c 1.0234,1.0195 2.3516,1.5234 3.6914,1.5234 1.3398,0 2.6641,-0.50391 3.6914,-1.5234 2.0273,-2.0273 2.0273,-5.332 0,-7.3711 l -26.402,-26.395 c -2.0273,-2.0391 -5.332,-2.0391 -7.3711,0 -2.0273,2.0391 -2.0273,5.3438 0,7.3711 z"
id="path98"
inkscape:connector-curvature="0" />
<path
d="m 221.82,131.72 c 1.0234,1.0117 2.3516,1.5234 3.6914,1.5234 1.3398,0 2.6641,-0.50781 3.6914,-1.5234 2.0312,-2.0273 2.0312,-5.332 0,-7.3711 l -26.402,-26.395 c -2.0273,-2.0312 -5.332,-2.0312 -7.3711,0 -2.0273,2.0391 -2.0273,5.3438 0,7.3711 z"
id="path100"
inkscape:connector-curvature="0" />
<path
d="m 194.34,159.2 c 1.0117,1.0117 2.3398,1.5234 3.6797,1.5234 1.3398,0 2.6641,-0.50781 3.6914,-1.5234 2.0312,-2.0312 2.0312,-5.332 0,-7.3711 l -26.402,-26.395 c -2.0312,-2.0391 -5.332,-2.0391 -7.3711,0 -2.0273,2.0273 -2.0273,5.332 0,7.3711 z"
id="path102"
inkscape:connector-curvature="0" />
<path
d="m 166.85,186.69 c 1.0195,1.0117 2.3398,1.5234 3.6797,1.5234 1.3399,0 2.6641,-0.50781 3.6914,-1.5234 2.0273,-2.0312 2.0273,-5.332 0,-7.3711 l -26.402,-26.398 c -2.0312,-2.0391 -5.332,-2.0391 -7.3711,0 -2.0312,2.0312 -2.0312,5.332 0,7.3711 z"
id="path104"
inkscape:connector-curvature="0" />
<path
d="m 139.37,214.18 c 1.0117,1.0117 2.3516,1.5195 3.6797,1.5195 1.3398,0 2.6758,-0.50391 3.6914,-1.5195 2.0273,-2.0391 2.0273,-5.3438 0,-7.3711 l -26.402,-26.395 c -2.0273,-2.0391 -5.332,-2.0391 -7.3711,0 -2.0312,2.0312 -2.0312,5.332 0,7.3711 z"
id="path106"
inkscape:connector-curvature="0" />
<path
d="m 560.64,345.84 c -2.0273,-2.0508 -5.3242,-2.0508 -7.375,0 -2.0273,2.0273 -2.0273,5.332 0,7.3594 l 26.414,26.395 c 1.0195,1.0195 2.3398,1.5391 3.668,1.5391 1.3438,0 2.6758,-0.52734 3.6914,-1.5391 2.0273,-2.0273 2.0273,-5.3242 0,-7.3516 z"
id="path108"
inkscape:connector-curvature="0" />
<path
d="m 533.15,373.33 c -2.0273,-2.043 -5.332,-2.043 -7.375,0 -2.0312,2.0312 -2.0312,5.332 0,7.3594 l 26.414,26.398 c 1.0117,1.0117 2.3398,1.5391 3.668,1.5391 1.3438,0 2.6758,-0.53125 3.6836,-1.5391 2.0312,-2.0273 2.0312,-5.332 0,-7.3594 z"
id="path110"
inkscape:connector-curvature="0" />
<path
d="m 505.66,400.82 c -2.0312,-2.0508 -5.332,-2.0508 -7.3789,0 -2.0273,2.0273 -2.0273,5.3242 0,7.3594 l 26.414,26.395 c 1.0195,1.0352 2.3477,1.5391 3.668,1.5391 1.3477,0 2.6758,-0.50781 3.6914,-1.5391 2.0273,-2.0273 2.0273,-5.3242 0,-7.3594 z"
id="path112"
inkscape:connector-curvature="0" />
<path
d="m 478.17,428.3 c -2.0273,-2.0508 -5.3242,-2.0508 -7.3594,0 -2.043,2.0273 -2.043,5.332 0,7.3594 l 26.398,26.398 c 1.0195,1.0117 2.3398,1.5391 3.668,1.5391 1.3438,0 2.6758,-0.53125 3.6914,-1.5391 2.0273,-2.0312 2.0273,-5.332 0,-7.3594 z"
id="path114"
inkscape:connector-curvature="0" />
<path
d="m 450.69,455.8 c -2.0273,-2.0508 -5.332,-2.0508 -7.3789,0 -2.0273,2.0273 -2.0273,5.3242 0,7.3594 l 26.422,26.395 c 1.0117,1.0195 2.3398,1.5195 3.668,1.5195 1.3438,0 2.6758,-0.50391 3.6836,-1.5195 2.0312,-2.0273 2.0312,-5.332 0,-7.3594 z"
id="path116"
inkscape:connector-curvature="0" />
<path
d="m 423.2,483.29 c -2.0273,-2.0508 -5.3242,-2.0508 -7.3516,0 -2.0508,2.0273 -2.0508,5.332 0,7.3594 l 26.395,26.395 c 1.0195,1.0195 2.3477,1.5234 3.668,1.5234 1.3477,0 2.6758,-0.50781 3.6914,-1.5234 2.0273,-2.0273 2.0273,-5.3242 0,-7.3594 z"
id="path118"
inkscape:connector-curvature="0" />
<path
d="m 448.56,281.75 c 0,9.3125 7.5781,16.891 16.891,16.891 9.3086,0 16.891,-7.5781 16.891,-16.891 0,-9.3008 -7.582,-16.891 -16.891,-16.891 -9.3164,0.008 -16.891,7.5898 -16.891,16.891 z"
id="path120"
inkscape:connector-curvature="0"
style="fill:#000000" />
<path
d="m 364.41,399.67 c 0,-9.3125 -7.582,-16.891 -16.891,-16.891 -9.3086,0 -16.879,7.5781 -16.879,16.891 0,9.3129 7.5664,16.891 16.879,16.891 9.3125,-0.004 16.891,-7.5781 16.891,-16.891 z"
id="path122"
inkscape:connector-curvature="0"
style="fill:#000000" />
<path
d="m 247.22,282.48 c 0,-9.3125 -7.5664,-16.891 -16.891,-16.891 -9.3008,0 -16.867,7.5781 -16.867,16.891 0,9.3242 7.5664,16.879 16.867,16.879 9.3242,0 16.891,-7.5547 16.891,-16.879 z"
id="path124"
inkscape:connector-curvature="0"
style="fill:#000000" />
<path
d="m 331.38,164.56 c 0,9.3125 7.582,16.891 16.891,16.891 9.3008,0 16.879,-7.5781 16.879,-16.891 0,-9.3008 -7.582,-16.879 -16.879,-16.879 -9.3086,0.004 -16.891,7.5781 -16.891,16.879 z"
id="path126"
inkscape:connector-curvature="0"
style="fill:#000000" />
<path
d="m 492.02,275.46 30.359,-0.14453 c -0.29297,-10.668 -1.5391,-21.309 -3.7852,-31.719 l -132.19,-132.18 c -10.484,-2.25 -21.219,-3.5234 -31.965,-3.7852 l -0.21875,30.277 c 12.195,2.7227 21.352,13.637 21.352,26.652 0,15.055 -12.242,27.301 -27.301,27.301 -15.055,0 -27.301,-12.254 -27.301,-27.301 0,-13.539 9.9023,-24.797 22.832,-26.938 l 0.21094,-29.949 c -10.219,0.35156 -20.418,1.5898 -30.406,3.7344 l -132.19,132.19 c -2.207,10.242 -3.457,20.703 -3.7695,31.199 h 26.492 c 3.3281,-11.328 13.816,-19.629 26.191,-19.629 15.062,0 27.312,12.258 27.312,27.312 0,15.059 -12.254,27.301 -27.312,27.301 -14.125,0 -25.781,-10.797 -27.156,-24.555 h -25.531 c 0.3125,10.484 1.5625,20.945 3.7695,31.191 l 132.19,132.17 c 9.2344,1.9883 18.652,3.2031 28.125,3.6523 l -0.76172,-26.062 c -11.906,-2.9453 -20.742,-13.727 -20.742,-26.512 0,-15.055 12.242,-27.289 27.301,-27.289 15.055,0 27.312,12.242 27.312,27.289 0,13.742 -10.207,25.145 -23.441,27.035 l 0.75,25.715 c 11.52,-0.13281 23.023,-1.4062 34.242,-3.832 l 132.19,-132.17 c 2.168,-10.074 3.4141,-20.363 3.7461,-30.684 l -29.887,0.14453 c -2.0117,13.098 -13.355,23.172 -26.996,23.172 -15.055,0 -27.316,-12.258 -27.316,-27.312 0,-15.059 12.258,-27.301 27.316,-27.301 12.91,0.008 23.727,8.9922 26.578,21.027 z m -78.227,-27.07 c -7.0117,0 -13.469,-2.2461 -18.766,-6.0547 l -19.641,19.656 c 3.7852,5.2812 6.0469,11.754 6.0469,18.742 0,7 -2.2617,13.461 -6.0469,18.75 l 19.641,19.641 c 5.293,-3.7852 11.754,-6.0312 18.766,-6.0312 17.723,0 32.148,14.43 32.148,32.156 0,17.746 -14.426,32.172 -32.148,32.172 -17.746,0 -32.172,-14.426 -32.172,-32.172 0,-6.9883 2.2383,-13.469 6.0469,-18.742 l -19.66,-19.66 c -5.2656,3.8086 -11.754,6.0547 -18.738,6.0547 -7,0 -13.473,-2.2461 -18.754,-6.0547 l -19.652,19.66 c 3.8086,5.2695 6.0547,11.754 6.0547,18.742 0,17.746 -14.426,32.172 -32.168,32.172 -17.734,0 -32.172,-14.426 -32.172,-32.172 0,-17.723 14.438,-32.156 32.172,-32.156 6.9883,0 13.461,2.2461 18.742,6.0312 l 19.652,-19.641 c -3.8086,-5.2852 -6.043,-11.754 -6.043,-18.75 0,-6.9961 2.2344,-13.461 6.043,-18.742 l -19.652,-19.656 c -5.2812,3.8086 -11.754,6.0547 -18.742,6.0547 -17.734,0 -32.172,-14.426 -32.172,-32.168 0,-17.746 14.438,-32.168 32.172,-32.168 17.734,0 32.168,14.422 32.168,32.168 0,6.9883 -2.2578,13.461 -6.0547,18.742 l 19.652,19.66 c 5.2812,-3.8086 11.754,-6.0547 18.754,-6.0547 6.9883,0 13.473,2.2461 18.738,6.0547 l 19.66,-19.66 c -3.8086,-5.2812 -6.0469,-11.754 -6.0469,-18.742 0,-17.746 14.426,-32.168 32.172,-32.168 17.723,0 32.148,14.422 32.148,32.168 0,17.742 -14.426,32.168 -32.148,32.168 z"
id="path128"
inkscape:connector-curvature="0" />
<path
d="m 413.79,367.01 c 11.988,0 21.727,-9.7422 21.727,-21.75 0,-11.988 -9.7383,-21.727 -21.727,-21.727 -12.012,0 -21.75,9.7383 -21.75,21.727 0,12.004 9.7383,21.75 21.75,21.75 z"
id="path130"
inkscape:connector-curvature="0" />
<path
d="m 284.75,323.53 c -11.996,0 -21.758,9.7383 -21.758,21.727 0,12.008 9.7617,21.75 21.758,21.75 11.977,0 21.738,-9.7422 21.738,-21.75 0,-11.988 -9.7539,-21.727 -21.738,-21.727 z"
id="path132"
inkscape:connector-curvature="0" />
<path
d="m 349.27,259 c -11.988,0 -21.75,9.7617 -21.75,21.75 0,11.996 9.7617,21.734 21.75,21.734 11.984,0 21.746,-9.7383 21.746,-21.734 0,-11.992 -9.7617,-21.75 -21.746,-21.75 z"
id="path134"
inkscape:connector-curvature="0"
style="fill:#00ff00" />
<path
d="m 284.75,194.48 c -11.996,0 -21.758,9.7617 -21.758,21.746 0,11.984 9.7617,21.75 21.758,21.75 11.977,0 21.738,-9.7617 21.738,-21.75 0,-11.988 -9.7539,-21.746 -21.738,-21.746 z"
id="path136"
inkscape:connector-curvature="0"
style="fill:#000000" />
<path
d="m 413.79,194.48 c -12.012,0 -21.75,9.7617 -21.75,21.746 0,11.984 9.7383,21.75 21.75,21.75 11.988,0 21.727,-9.7617 21.727,-21.75 0.004,-11.988 -9.7422,-21.746 -21.727,-21.746 z"
id="path138"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

@ -0,0 +1,13 @@
[program:dtp-base:newsletter]
numprocs=1
process_name=%(program_name)s_%(process_num)02d
command=/home/dtp/.nvm/versions/node/v16.13.0/bin/node --optimize_for_size --max_old_space_size=1024 --gc_interval=100 app/workers/newsletter.js
directory=/home/dtp/live/dtp-base
autostart=true
autorestart=true
startretries=3
stopsignal=INT
stderr_logfile=/var/log/dtp-base/newsletter.err.log
stdout_logfile=/var/log/dtp-base/newsletter.out.log
user=dtp
environment=HOME='/home/dtp/live/dtp-base',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=newsletter

@ -0,0 +1,13 @@
[program:dtp-base]
numprocs=1
process_name=%(program_name)s_%(process_num)02d
command=/home/dtp/.nvm/versions/node/v16.13.0/bin/node --optimize_for_size --max_old_space_size=1024 --gc_interval=100 dtp-webapp.js
directory=/home/dtp/live/dtp-base
autostart=true
autorestart=true
startretries=3
stopsignal=INT
stderr_logfile=/var/log/dtp-base/dtp-base.err.log
stdout_logfile=/var/log/dtp-base/dtp-base.out.log
user=dtp
environment=HOME='/home/dtp/live/dtp-base',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=dtp-base

@ -10,4 +10,4 @@ stopsignal=INT
stderr_logfile=/var/log/dtp-sites/host-services.err.log
stdout_logfile=/var/log/dtp-sites/host-services.out.log
user=dtp
environment=HOME='/home/dtp/live/dtp-sites',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=host-services
environment=HOME='/home/dtp/live/dtp-sites',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=host-services
Loading…
Cancel
Save