aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-09-30 08:57:29 +0200
committerJakob Odersky <jodersky@gmail.com>2014-09-30 08:57:29 +0200
commit8ec08695eade13b053caa6bd103065a056cdf179 (patch)
tree9ce23ab688b4a469ecf40d4b1c31a848ed7dca64
downloadmavigator-8ec08695eade13b053caa6bd103065a056cdf179.tar.gz
mavigator-8ec08695eade13b053caa6bd103065a056cdf179.tar.bz2
mavigator-8ec08695eade13b053caa6bd103065a056cdf179.zip
initial commit
-rw-r--r--.gitignore26
-rw-r--r--backend/.gitignore25
-rw-r--r--backend/app/controllers/Application.scala12
-rw-r--r--backend/app/views/index.scala.html16
-rw-r--r--backend/app/views/main.scala.html55
-rw-r--r--backend/conf/application.conf62
-rw-r--r--backend/conf/routes9
-rw-r--r--backend/public/fonts/DIGITAL.TXT40
-rw-r--r--backend/public/fonts/DS-DIGIB.TTFbin0 -> 24896 bytes
-rw-r--r--backend/public/fonts/DS-DIGII.TTFbin0 -> 24676 bytes
-rw-r--r--backend/public/fonts/DS-DIGIT.TTFbin0 -> 25480 bytes
-rw-r--r--backend/public/fonts/ds-digi.ttfbin0 -> 24448 bytes
-rw-r--r--backend/public/images/instruments/attitude.svg538
-rw-r--r--backend/public/images/instruments/heading.svg1034
-rw-r--r--backend/public/images/leds/green-off.svg283
-rw-r--r--backend/public/images/leds/green-on.svg283
-rw-r--r--backend/public/images/leds/none.svg284
-rw-r--r--backend/public/images/leds/red-off.svg284
-rw-r--r--backend/public/images/leds/red-on.svg284
-rw-r--r--backend/public/images/leds/yellow-on.svg284
-rw-r--r--backend/public/images/logo.svg94
-rw-r--r--backend/public/stylesheets/main.css66
-rw-r--r--frontend/.gitignore25
-rw-r--r--frontend/src/main/scala/Frontend.scala36
-rw-r--r--project/Build.scala66
-rw-r--r--project/Dependencies.scala19
-rw-r--r--project/build.properties1
-rw-r--r--project/plugins.sbt7
28 files changed, 3833 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5d954ad
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+# sbt
+.cache
+.history/
+.lib/
+dist/*
+target/
+lib_managed/
+src_managed/
+project/boot/
+project/plugins/project/
+
+# scala-ide specific
+/.settings
+/.scala_dependencies
+/.project
+/.classpath
+/.cache
+/.history
+
+# general files
+/*.jar
+*.swp
+*.class
+*.log
+*~
+
diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 0000000..ed1de16
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,25 @@
+# sbt
+.cache
+.history/
+.lib/
+dist/*
+target/
+lib_managed/
+src_managed/
+project/boot/
+project/plugins/project/
+
+# scala-ide specific
+/.settings
+/.scala_dependencies
+/.project
+/.classpath
+/.cache
+/.history
+
+# general files
+/*.jar
+*.swp
+*.class
+*.log
+*~ \ No newline at end of file
diff --git a/backend/app/controllers/Application.scala b/backend/app/controllers/Application.scala
new file mode 100644
index 0000000..6cd886f
--- /dev/null
+++ b/backend/app/controllers/Application.scala
@@ -0,0 +1,12 @@
+package controllers
+
+import play.api._
+import play.api.mvc._
+
+object Application extends Controller {
+
+ def index() = Action {
+ Ok(views.html.index())
+ }
+
+} \ No newline at end of file
diff --git a/backend/app/views/index.scala.html b/backend/app/views/index.scala.html
new file mode 100644
index 0000000..f1da555
--- /dev/null
+++ b/backend/app/views/index.scala.html
@@ -0,0 +1,16 @@
+@main(""){
+ <span id='ct' ></span>
+
+ <object id="attitude" type="image/svg+xml" data="@routes.Assets.at("images/instruments/attitude.svg")" width="300px" height="300px">Cannot load or display SVG image.</object>
+
+ <object id="heading" type="image/svg+xml" data="@routes.Assets.at("images/instruments/heading.svg")" width="200px" height="200px">Cannot load or display SVG image.</object>
+
+ <script type="text/javascript">
+
+ window.onload = function () {
+ var frontend = new Frontend('#attitude', '#heading')
+ frontend.main()
+ }
+ </script>
+}
+
diff --git a/backend/app/views/main.scala.html b/backend/app/views/main.scala.html
new file mode 100644
index 0000000..4005beb
--- /dev/null
+++ b/backend/app/views/main.scala.html
@@ -0,0 +1,55 @@
+@(title: String)(content: Html)
+
+<!DOCTYPE html>
+
+<html>
+<head>
+ <title>@title</title>
+ <link rel="stylesheet" media="screen" href="@routes.Assets.at("lib/bootstrap/css/bootstrap.css")">
+ <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
+ <script type="text/javascript" src="@routes.Assets.at("lib/vfd-frontend-fastopt.js")"></script>
+ <script type="text/javascript" src="@routes.Assets.at("lib/jquery/jquery.js")"></script>
+ <script type="text/javascript" src="@routes.Assets.at("lib/bootstrap/js/bootstrap.min.js")"></script>
+</head>
+<body>
+ <header>
+ <nav class="navbar navbar-inverse navbar-static-top" role="navigation">
+ <div class="container-fluid">
+ <!-- Brand and toggle get grouped for better mobile display -->
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-main-collapse">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="@routes.Application.index">
+ <img style="max-height: 32px;" src="@routes.Assets.at("images/logo.svg")" alt="logo">
+ Virtual Flight Deck
+ </a>
+ </div>
+
+ <!-- Collect the nav links, forms, and other content for toggling -->
+ <div class="collapse navbar-collapse" id="navbar-main-collapse">
+ <ul class="nav navbar-nav">
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">options<b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li>
+ <form method="POST" action="">
+ <button type="submit" style="width: 100%;" class="btn btn-default">Sign Out</button>
+ </form>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div><!-- /.navbar-collapse -->
+ </div><!-- /.container-fluid -->
+ </nav>
+ </header>
+ @content
+
+</body>
+</html> \ No newline at end of file
diff --git a/backend/conf/application.conf b/backend/conf/application.conf
new file mode 100644
index 0000000..ba58ed1
--- /dev/null
+++ b/backend/conf/application.conf
@@ -0,0 +1,62 @@
+# This is the main configuration file for the application.
+# ~~~~~
+
+# Secret key
+# ~~~~~
+# The secret key is used to secure cryptographics functions.
+#
+# This must be changed for production, but we recommend not changing it in this file.
+#
+# See http://www.playframework.com/documentation/latest/ApplicationSecret for more details.
+application.secret="[8DUF73Kj;0t:Y09:Miqn]BRQiHp0R2FRm^jwVD8y>z/kw=ALX[Q8abEYio;n0>a"
+
+# The application languages
+# ~~~~~
+application.langs="en"
+
+# Global object class
+# ~~~~~
+# Define the Global object class for this application.
+# Default to Global in the root package.
+# application.global=Global
+
+# Router
+# ~~~~~
+# Define the Router object to use for this application.
+# This router will be looked up first when the application is starting up,
+# so make sure this is the entry point.
+# Furthermore, it's assumed your route file is named properly.
+# So for an application router like `my.application.Router`,
+# you may need to define a router file `conf/my.application.routes`.
+# Default to Routes in the root package (and conf/routes)
+# application.router=my.application.Routes
+
+# Database configuration
+# ~~~~~
+# You can declare as many datasources as you want.
+# By convention, the default datasource is named `default`
+#
+# db.default.driver=org.h2.Driver
+# db.default.url="jdbc:h2:mem:play"
+# db.default.user=sa
+# db.default.password=""
+
+# Evolutions
+# ~~~~~
+# You can disable evolutions if needed
+# evolutionplugin=disabled
+
+# Logger
+# ~~~~~
+# You can also configure logback (http://logback.qos.ch/),
+# by providing an application-logger.xml file in the conf directory.
+
+# Root logger:
+logger.root=ERROR
+
+# Logger used by the framework:
+logger.play=INFO
+
+# Logger provided to your application:
+logger.application=DEBUG
+
diff --git a/backend/conf/routes b/backend/conf/routes
new file mode 100644
index 0000000..20fd042
--- /dev/null
+++ b/backend/conf/routes
@@ -0,0 +1,9 @@
+# Routes
+# This file defines all application routes (Higher priority routes first)
+# ~~~~
+
+# Home page
+GET / controllers.Application.index
+
+# Map static resources from the /public folder to the /assets URL path
+GET /assets/*file controllers.Assets.at(path="/public", file)
diff --git a/backend/public/fonts/DIGITAL.TXT b/backend/public/fonts/DIGITAL.TXT
new file mode 100644
index 0000000..484dd47
--- /dev/null
+++ b/backend/public/fonts/DIGITAL.TXT
@@ -0,0 +1,40 @@
+DS-Font's TrueType Fonts
+Font name: DS-Digital (Normal, Bold, Italic, Bold Italic), Version 1.0
+Author: Dusit Supasawat
+Web Site: http://ds-font.hypermart.net
+Contact me: Dusit Supasawat, 325/38 Suksawat32 Ratburana Bangkok Thailand 10140
+Email address: dusit@mailcity.com
+
+Thanks for trying! We hope you really enjoy this my typeface. This font is
+distributed as shareware. You can use this font for a long time as you want.
+After all, when you think this font can be usefulness for you. You can send
+me some money, that would be way cool.
+
+I'm only asking $20 US shareware fee per this typeface for personal use.
+And $45 US is the usual amount per this typeface for commercial use.
+
+Distribution: You are free to distribute this archive so long as this text
+file is distributed with the archive, the font file have not been modified,
+and it is understood that the font's copyright remains with the original
+author (Dusit Supasawat).
+
+To register send your payment to:
+
+Dusit Supasawat
+325/38 Suksawat32 Ratburana
+Bangkok Thailand 10140
+
+And fill out something as this order form, and send it in with your payment.
+
+Font name:_________________________________________
+Your information
+Name:______________________________________________
+Address:___________________________________________
+City, State : _____________________________________
+Zip Code:__________________________________________
+Country:___________________________________________
+E-MAIL address:____________________________________
+
+
+You will receive fonts which you order by Email after registration. These fonts
+will be generated for you by specify your name in font information. \ No newline at end of file
diff --git a/backend/public/fonts/DS-DIGIB.TTF b/backend/public/fonts/DS-DIGIB.TTF
new file mode 100644
index 0000000..064ad47
--- /dev/null
+++ b/backend/public/fonts/DS-DIGIB.TTF
Binary files differ
diff --git a/backend/public/fonts/DS-DIGII.TTF b/backend/public/fonts/DS-DIGII.TTF
new file mode 100644
index 0000000..2aae3d8
--- /dev/null
+++ b/backend/public/fonts/DS-DIGII.TTF
Binary files differ
diff --git a/backend/public/fonts/DS-DIGIT.TTF b/backend/public/fonts/DS-DIGIT.TTF
new file mode 100644
index 0000000..65642f9
--- /dev/null
+++ b/backend/public/fonts/DS-DIGIT.TTF
Binary files differ
diff --git a/backend/public/fonts/ds-digi.ttf b/backend/public/fonts/ds-digi.ttf
new file mode 100644
index 0000000..0925877
--- /dev/null
+++ b/backend/public/fonts/ds-digi.ttf
Binary files differ
diff --git a/backend/public/images/instruments/attitude.svg b/backend/public/images/instruments/attitude.svg
new file mode 100644
index 0000000..7f0452c
--- /dev/null
+++ b/backend/public/images/instruments/attitude.svg
@@ -0,0 +1,538 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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="110"
+ height="110"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="attitude.svg"
+ viewBox="-55 -55 110 110">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3341">
+ <path
+ sodipodi:type="arc"
+ style="fill:#00ff00;fill-opacity:1;stroke:none"
+ id="path3343"
+ sodipodi:cx="55"
+ sodipodi:cy="55"
+ sodipodi:rx="50"
+ sodipodi:ry="50"
+ d="M 105,55 A 50,50 0 1 1 5,55 50,50 0 1 1 105,55 z"
+ transform="translate(-55,-55)" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="116.6015"
+ inkscape:cy="56.323079"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ showborder="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1029"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-grids="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ units="px"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingy="1px"
+ spacingx="1px"
+ originx="50px"
+ originy="50px"
+ dotted="false" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <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 />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="roll"
+ clip-path="url(#clipPath3341)">
+ <g
+ id="pitch">
+ <rect
+ style="fill:#2eccfa;fill-opacity:1;stroke:none"
+ id="rect3861"
+ width="100"
+ height="100"
+ x="-50"
+ y="-100" />
+ <rect
+ style="fill:#61380b;fill-opacity:1;stroke:none"
+ id="rect3863"
+ width="100"
+ height="100"
+ x="-50"
+ y="0" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3866"
+ width="0.5"
+ height="100"
+ x="-0.25"
+ y="-50"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="1174.9999" />
+ <rect
+ inkscape:transform-center-x="352.49997"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-15"
+ x="9.75"
+ height="30"
+ width="0.5"
+ id="rect3872"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3874"
+ width="0.5"
+ height="30"
+ x="19.75"
+ y="-15"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="352.49997" />
+ <rect
+ inkscape:transform-center-x="352.49997"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-15"
+ x="29.75"
+ height="30"
+ width="0.5"
+ id="rect3876"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3878"
+ width="0.5"
+ height="30"
+ x="-20.25"
+ y="-15"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="352.49997" />
+ <rect
+ inkscape:transform-center-x="352.49997"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-15"
+ x="-30.25"
+ height="30"
+ width="0.5"
+ id="rect3880"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ inkscape:transform-center-x="352.49997"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-15"
+ x="-10.25"
+ height="30"
+ width="0.5"
+ id="rect3882"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3884"
+ width="0.5"
+ height="20"
+ x="4.75"
+ y="-10"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="234.99998" />
+ <rect
+ inkscape:transform-center-x="234.99998"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-10"
+ x="14.75"
+ height="20"
+ width="0.5"
+ id="rect3886"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3888"
+ width="0.5"
+ height="20"
+ x="24.75"
+ y="-10"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="234.99998" />
+ <rect
+ inkscape:transform-center-x="234.99998"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-10"
+ x="-5.25"
+ height="20"
+ width="0.5"
+ id="rect3890"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3892"
+ width="0.5"
+ height="20"
+ x="-15.25"
+ y="-10"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="234.99998" />
+ <rect
+ inkscape:transform-center-x="234.99998"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-10"
+ x="-25.25"
+ height="20"
+ width="0.5"
+ id="rect3894"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3896"
+ y="11.698608"
+ x="15.550568"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="11.698608"
+ x="15.550568"
+ id="tspan3898"
+ sodipodi:role="line">10</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="15.550568"
+ y="-18.301392"
+ id="text3920"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3922"
+ x="15.550568"
+ y="-18.301392">20</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3924"
+ y="-28.301392"
+ x="15.550568"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="-28.301392"
+ x="15.550568"
+ id="tspan3926"
+ sodipodi:role="line">30</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="15.550568"
+ y="21.698608"
+ id="text3928"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3930"
+ x="15.550568"
+ y="21.698608">20</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3932"
+ y="31.698608"
+ x="15.550568"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="31.698608"
+ x="15.550568"
+ id="tspan3934"
+ sodipodi:role="line">30</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3936"
+ y="-8.3013916"
+ x="15.550568"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="-8.3013916"
+ x="15.550568"
+ id="tspan3938"
+ sodipodi:role="line">10</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-21.544434"
+ y="-8.3013916"
+ id="text3940"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3942"
+ x="-21.544434"
+ y="-8.3013916">10</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3956"
+ y="11.698608"
+ x="-21.544434"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="11.698608"
+ x="-21.544434"
+ id="tspan3958"
+ sodipodi:role="line">10</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-21.544434"
+ y="21.698608"
+ id="text3960"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3962"
+ x="-21.544434"
+ y="21.698608">20</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3964"
+ y="31.698608"
+ x="-21.544434"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="31.698608"
+ x="-21.544434"
+ id="tspan3966"
+ sodipodi:role="line">30</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3968"
+ y="-18.301392"
+ x="-21.544434"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="-18.301392"
+ x="-21.544434"
+ id="tspan3970"
+ sodipodi:role="line">20</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:5px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-21.544434"
+ y="-28.301392"
+ id="text3972"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3974"
+ x="-21.544434"
+ y="-28.301392">30</tspan></text>
+ </g>
+ <path
+ sodipodi:type="star"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="path3769"
+ sodipodi:sides="3"
+ sodipodi:cx="-59"
+ sodipodi:cy="60"
+ sodipodi:r1="3.6055512"
+ sodipodi:r2="1.8027756"
+ sodipodi:arg1="1.0471976"
+ sodipodi:arg2="2.0943952"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M -57.197225,63.122499 -59.901388,61.561249 -62.605551,60 l 2.704163,-1.56125 2.704164,-1.561249 0,3.122499 z"
+ transform="matrix(-1.6169678e-4,-0.93374506,0.83266641,-1.8132539e-4,-49.96923,-103.39675)"
+ inkscape:transform-center-y="0.50505596" />
+ <rect
+ transform="matrix(0.93969262,-0.34202014,0.34202014,0.93969262,0,0)"
+ y="-47.848526"
+ x="-0.28910306"
+ height="3"
+ width="0.5"
+ id="rect3832"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-43.610196"
+ inkscape:transform-center-x="16.138873" />
+ <rect
+ transform="matrix(0.98480775,-0.17364818,0.17364818,0.98480775,0,0)"
+ y="-47.887447"
+ x="-0.26598009"
+ height="3"
+ width="0.5"
+ id="rect3830"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-45.750151"
+ inkscape:transform-center-x="8.3208343" />
+ <rect
+ inkscape:transform-center-x="-46.999996"
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-48.999996"
+ x="-0.17979249"
+ height="4"
+ width="0.5"
+ id="rect3816"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ transform="matrix(0.98480775,0.17364818,-0.17364818,0.98480775,0,0)"
+ y="-47.974239"
+ x="-0.24160324"
+ height="3"
+ width="0.5"
+ id="rect3828"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-45.836941"
+ inkscape:transform-center-x="-7.8284371" />
+ <rect
+ transform="matrix(0.93969262,0.34202014,-0.34202014,0.93969262,0,0)"
+ y="-48.019543"
+ x="-0.24104837"
+ height="3"
+ width="0.5"
+ id="rect3826"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-43.781215"
+ inkscape:transform-center-x="-15.669033" />
+ <rect
+ inkscape:transform-center-x="-40.703191"
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,0,0)"
+ y="-48.964905"
+ x="-0.18920913"
+ height="4"
+ width="0.5"
+ id="rect3814"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-23.500008" />
+ <rect
+ inkscape:transform-center-x="-23.500002"
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,0,0)"
+ y="-48.939209"
+ x="-0.21489985"
+ height="4"
+ width="0.5"
+ id="rect3812"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-40.703202" />
+ <rect
+ inkscape:transform-center-x="23.500002"
+ transform="matrix(0.8660254,-0.5,0.5,0.8660254,0,0)"
+ y="-48.939209"
+ x="-0.28510073"
+ height="4"
+ width="0.5"
+ id="rect3810"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-40.703202" />
+ <rect
+ inkscape:transform-center-x="46.999996"
+ transform="matrix(0,-1,1,0,0,0)"
+ y="-48.999996"
+ x="-0.32020748"
+ height="4"
+ width="0.5"
+ id="rect3808"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ inkscape:transform-center-x="40.703191"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)"
+ y="-48.964901"
+ x="-0.3107909"
+ height="4"
+ width="0.5"
+ id="rect3804"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ inkscape:transform-center-y="-23.500008" />
+ <path
+ transform="matrix(1.1232449,0,0,1.1232449,0,-112.25429)"
+ d="m 40,100 a 40,40 0 1 1 -80,0 40,40 0 1 1 80,0 z"
+ sodipodi:ry="40"
+ sodipodi:rx="40"
+ sodipodi:cy="100"
+ sodipodi:cx="0"
+ id="path3985"
+ style="fill:none;stroke:#ffffff;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="fixed">
+ <path
+ id="path3976"
+ d="m 0,-55 c -30.37566,0 -55,24.62432 -55,55.00002 0,30.3756 24.62434,55 55,55 30.37566,0 55,-24.6244 55,-55 C 55,-30.37568 30.37566,-55 0,-55 z m 0,5.00002 c 27.61424,0 50,22.3857 50,50 0,27.6142 -22.38576,50 -50,50 -27.61424,0 -50,-22.3858 -50,-50 0,-27.6143 22.38576,-50 50,-50 z"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:transform-center-y="-0.52004486"
+ transform="matrix(-1.6169678e-4,0.96137262,0.83266641,1.8669043e-4,-49.96923,16.02602)"
+ d="M -57.197225,63.122499 -59.901388,61.561249 -62.605551,60 l 2.704163,-1.56125 2.704164,-1.561249 0,3.122499 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="2.0943952"
+ sodipodi:arg1="1.0471976"
+ sodipodi:r2="1.8027756"
+ sodipodi:r1="3.6055512"
+ sodipodi:cy="60"
+ sodipodi:cx="-59"
+ sodipodi:sides="3"
+ id="path3778"
+ style="fill:none;stroke:#ff6600;stroke-opacity:1"
+ sodipodi:type="star" />
+ <rect
+ y="-0.5"
+ x="-20"
+ height="1"
+ width="15"
+ id="rect3990"
+ style="fill:#ff6600;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ id="rect3992"
+ width="15"
+ height="1"
+ x="5"
+ y="-0.5" />
+ <path
+ id="path3996"
+ d="m 0,-4.99998 c -2.76142,0 -5,2.2386 -5,5 0,2.7614 2.23858,5 5,5 2.76142,0 5,-2.2386 5,-5 0,-2.7614 -2.23858,-5 -5,-5 z m 0,1 c 2.20914,0 4,1.7908 4,4 0,2.2091 -1.79086,4 -4,4 -2.20914,0 -4,-1.7909 -4,-4 0,-2.2092 1.79086,-4 4,-4 z"
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="matrix(0.5,0,0,0.5,0,-49.99998)"
+ d="m 1,100 c 0,0.55228 -0.44771525,1 -1,1 -0.55228475,0 -1,-0.44772 -1,-1 0,-0.552285 0.44771525,-1 1,-1 0.55228475,0 1,0.447715 1,1 z"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="100"
+ sodipodi:cx="0"
+ id="path4001"
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+</svg>
diff --git a/backend/public/images/instruments/heading.svg b/backend/public/images/instruments/heading.svg
new file mode 100644
index 0000000..83cf17b
--- /dev/null
+++ b/backend/public/images/instruments/heading.svg
@@ -0,0 +1,1034 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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="110"
+ height="110"
+ id="svg2987"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="heading.svg"
+ viewBox="-55 -55 110 110">
+ <defs
+ id="defs2989" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#ffffff"
+ borderopacity="0.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="0"
+ inkscape:zoom="2.8"
+ inkscape:cx="80.925724"
+ inkscape:cy="121.2003"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1029"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-grids="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2997"
+ units="px"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2992">
+ <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 />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ sodipodi:type="arc"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="path2999"
+ sodipodi:cx="660"
+ sodipodi:cy="592.36218"
+ sodipodi:rx="380"
+ sodipodi:ry="380"
+ d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
+ transform="matrix(0.14473684,0,0,0.14473684,-95.526315,-85.73663)" />
+ <g
+ id="heading">
+ <path
+ sodipodi:type="arc"
+ style="fill:#333333;fill-opacity:1;stroke:none"
+ id="path3016"
+ sodipodi:cx="660"
+ sodipodi:cy="592.36218"
+ sodipodi:rx="380"
+ sodipodi:ry="380"
+ d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
+ transform="matrix(0.13157895,0,0,0.13157895,-86.842106,-77.942392)" />
+ <text
+ inkscape:transform-center-x="0.13476562"
+ inkscape:transform-center-y="-45.863281"
+ sodipodi:linespacing="125%"
+ id="text3025"
+ y="-43"
+ x="0.025250001"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="-43"
+ x="0.025250001"
+ id="tspan3027"
+ sodipodi:role="line">N</tspan></text>
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3089"
+ width="0.5"
+ height="7"
+ x="-0.25"
+ y="-42"
+ inkscape:transform-center-x="0.25"
+ inkscape:transform-center-y="-38.5" />
+ <rect
+ inkscape:transform-center-x="-3.2247624"
+ transform="matrix(0.9961947,0.08715574,-0.08715574,0.9961947,0,0)"
+ inkscape:transform-center-y="-36.859204"
+ y="-39"
+ x="-0.25"
+ height="4"
+ width="0.5"
+ id="rect4329"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ inkscape:transform-center-x="-6.6854549"
+ transform="matrix(0.98480775,0.17364818,-0.17364818,0.98480775,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4401"
+ width="0.5"
+ height="7"
+ x="-0.25"
+ y="-42"
+ inkscape:transform-center-y="-37.915098" />
+ <rect
+ inkscape:transform-center-y="-36.178166"
+ y="-42"
+ x="-0.25000006"
+ height="7"
+ width="0.5"
+ id="rect4403"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.93969262,0.34202015,-0.34202015,0.93969262,0,0)"
+ inkscape:transform-center-x="-13.167776" />
+ <rect
+ inkscape:transform-center-x="-19.250001"
+ transform="matrix(0.8660254,0.50000001,-0.50000001,0.8660254,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4405"
+ width="0.5"
+ height="7"
+ x="-0.25000003"
+ y="-42"
+ inkscape:transform-center-y="-33.341978" />
+ <rect
+ inkscape:transform-center-y="-29.492711"
+ y="-42"
+ x="-0.24999996"
+ height="7"
+ width="0.5"
+ id="rect4407"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.76604444,0.64278762,-0.64278762,0.76604444,0,0)"
+ inkscape:transform-center-x="-24.747324" />
+ <rect
+ inkscape:transform-center-x="-29.492712"
+ transform="matrix(0.6427876,0.76604445,-0.76604445,0.6427876,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4409"
+ width="0.5"
+ height="7"
+ x="-0.24999987"
+ y="-42"
+ inkscape:transform-center-y="-24.747323" />
+ <rect
+ inkscape:transform-center-y="-19.25"
+ y="-42"
+ x="-0.24999973"
+ height="7"
+ width="0.5"
+ id="rect4411"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.49999999,0.86602541,-0.86602541,0.49999999,0,0)"
+ inkscape:transform-center-x="-33.341979" />
+ <rect
+ inkscape:transform-center-x="-36.178167"
+ transform="matrix(0.34202013,0.93969262,-0.93969262,0.34202013,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4413"
+ width="0.5"
+ height="7"
+ x="-0.2499996"
+ y="-42"
+ inkscape:transform-center-y="-13.167775" />
+ <rect
+ inkscape:transform-center-y="-6.6854543"
+ y="-42"
+ x="-0.24999942"
+ height="7"
+ width="0.5"
+ id="rect4415"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.17364817,0.98480776,-0.98480776,0.17364817,0,0)"
+ inkscape:transform-center-x="-37.9151" />
+ <rect
+ inkscape:transform-center-x="-38.500001"
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4417"
+ width="0.5"
+ height="7"
+ x="-0.24999921"
+ y="-42" />
+ <rect
+ inkscape:transform-center-y="6.6854551"
+ y="-42"
+ x="-0.24999905"
+ height="7"
+ width="0.5"
+ id="rect4419"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.17364818,0.98480775,-0.98480775,-0.17364818,0,0)"
+ inkscape:transform-center-x="-37.915099" />
+ <rect
+ inkscape:transform-center-x="-36.178166"
+ transform="matrix(-0.34202015,0.93969262,-0.93969262,-0.34202015,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4421"
+ width="0.5"
+ height="7"
+ x="-0.24999894"
+ y="-42"
+ inkscape:transform-center-y="13.167776" />
+ <rect
+ inkscape:transform-center-y="19.250001"
+ y="-42"
+ x="-0.24999893"
+ height="7"
+ width="0.5"
+ id="rect4423"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.50000001,0.8660254,-0.8660254,-0.50000001,0,0)"
+ inkscape:transform-center-x="-33.341978" />
+ <rect
+ inkscape:transform-center-x="-29.492711"
+ transform="matrix(-0.64278762,0.76604444,-0.76604444,-0.64278762,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4425"
+ width="0.5"
+ height="7"
+ x="-0.24999887"
+ y="-42"
+ inkscape:transform-center-y="24.747324" />
+ <rect
+ inkscape:transform-center-y="29.492712"
+ y="-42"
+ x="-0.24999881"
+ height="7"
+ width="0.5"
+ id="rect4427"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.76604445,0.6427876,-0.6427876,-0.76604445,0,0)"
+ inkscape:transform-center-x="-24.747322" />
+ <rect
+ inkscape:transform-center-x="-19.249999"
+ transform="matrix(-0.86602541,0.49999999,-0.49999999,-0.86602541,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4429"
+ width="0.5"
+ height="7"
+ x="-0.24999879"
+ y="-42"
+ inkscape:transform-center-y="33.341979" />
+ <rect
+ inkscape:transform-center-y="36.178166"
+ y="-42"
+ x="-0.24999875"
+ height="7"
+ width="0.5"
+ id="rect4431"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.93969262,0.34202013,-0.34202013,-0.93969262,0,0)"
+ inkscape:transform-center-x="-13.167774" />
+ <rect
+ inkscape:transform-center-x="-6.6854535"
+ transform="matrix(-0.98480776,0.17364817,-0.17364817,-0.98480776,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4433"
+ width="0.5"
+ height="7"
+ x="-0.24999879"
+ y="-42"
+ inkscape:transform-center-y="37.915099" />
+ <rect
+ inkscape:transform-center-y="38.5"
+ y="-42"
+ x="-0.24999879"
+ height="7"
+ width="0.5"
+ id="rect4435"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="scale(-1,-1)" />
+ <rect
+ inkscape:transform-center-x="6.6854549"
+ transform="matrix(-0.98480775,-0.17364818,0.17364818,-0.98480775,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4437"
+ width="0.5"
+ height="7"
+ x="-0.24999881"
+ y="-42"
+ inkscape:transform-center-y="37.915098" />
+ <rect
+ inkscape:transform-center-y="36.178165"
+ y="-42"
+ x="-0.2499989"
+ height="7"
+ width="0.5"
+ id="rect4439"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.93969262,-0.34202015,0.34202015,-0.93969262,0,0)"
+ inkscape:transform-center-x="13.167776" />
+ <rect
+ inkscape:transform-center-x="19.25"
+ transform="matrix(-0.8660254,-0.50000001,0.50000001,-0.8660254,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4441"
+ width="0.5"
+ height="7"
+ x="-0.24999903"
+ y="-42"
+ inkscape:transform-center-y="33.341977" />
+ <rect
+ inkscape:transform-center-y="29.49271"
+ y="-42"
+ x="-0.24999921"
+ height="7"
+ width="0.5"
+ id="rect4443"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.76604444,-0.64278762,0.64278762,-0.76604444,0,0)"
+ inkscape:transform-center-x="24.747323" />
+ <rect
+ inkscape:transform-center-x="29.492711"
+ transform="matrix(-0.6427876,-0.76604445,0.76604445,-0.6427876,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4445"
+ width="0.5"
+ height="7"
+ x="-0.24999939"
+ y="-42"
+ inkscape:transform-center-y="24.747322" />
+ <rect
+ inkscape:transform-center-y="19.249999"
+ y="-42"
+ x="-0.24999951"
+ height="7"
+ width="0.5"
+ id="rect4447"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.49999999,-0.86602541,0.86602541,-0.49999999,0,0)"
+ inkscape:transform-center-x="33.341978" />
+ <rect
+ inkscape:transform-center-x="36.178165"
+ transform="matrix(-0.34202013,-0.93969262,0.93969262,-0.34202013,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4449"
+ width="0.5"
+ height="7"
+ x="-0.24999961"
+ y="-42"
+ inkscape:transform-center-y="13.167774" />
+ <rect
+ inkscape:transform-center-y="6.6854537"
+ y="-42"
+ x="-0.24999981"
+ height="7"
+ width="0.5"
+ id="rect4451"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(-0.17364817,-0.98480776,0.98480776,-0.17364817,0,0)"
+ inkscape:transform-center-x="37.915098" />
+ <rect
+ inkscape:transform-center-x="38.499999"
+ transform="matrix(0,-1,1,0,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4453"
+ width="0.5"
+ height="7"
+ x="-0.24999996"
+ y="-42" />
+ <rect
+ inkscape:transform-center-y="-6.6854548"
+ y="-42"
+ x="-0.25000012"
+ height="7"
+ width="0.5"
+ id="rect4455"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.17364818,-0.98480775,0.98480775,0.17364818,0,0)"
+ inkscape:transform-center-x="37.915097" />
+ <rect
+ inkscape:transform-center-x="36.178165"
+ transform="matrix(0.34202015,-0.93969262,0.93969262,0.34202015,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4457"
+ width="0.5"
+ height="7"
+ x="-0.25000036"
+ y="-42"
+ inkscape:transform-center-y="-13.167775" />
+ <rect
+ inkscape:transform-center-y="-19.249999"
+ y="-42"
+ x="-0.25000054"
+ height="7"
+ width="0.5"
+ id="rect4459"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.50000001,-0.8660254,0.8660254,0.50000001,0,0)"
+ inkscape:transform-center-x="33.341977" />
+ <rect
+ inkscape:transform-center-x="29.49271"
+ transform="matrix(0.64278762,-0.76604444,0.76604444,0.64278762,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4461"
+ width="0.5"
+ height="7"
+ x="-0.2500008"
+ y="-42"
+ inkscape:transform-center-y="-24.747322" />
+ <rect
+ inkscape:transform-center-y="-29.49271"
+ y="-42"
+ x="-0.25000107"
+ height="7"
+ width="0.5"
+ id="rect4463"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.76604445,-0.6427876,0.6427876,0.76604445,0,0)"
+ inkscape:transform-center-x="24.747322" />
+ <rect
+ inkscape:transform-center-x="19.249999"
+ transform="matrix(0.86602541,-0.49999999,0.49999999,0.86602541,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4465"
+ width="0.5"
+ height="7"
+ x="-0.25000131"
+ y="-42"
+ inkscape:transform-center-y="-33.341977" />
+ <rect
+ inkscape:transform-center-y="-36.178165"
+ y="-42"
+ x="-0.25000155"
+ height="7"
+ width="0.5"
+ id="rect4467"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ transform="matrix(0.93969262,-0.34202013,0.34202013,0.93969262,0,0)"
+ inkscape:transform-center-x="13.167775" />
+ <rect
+ inkscape:transform-center-x="6.6854547"
+ transform="matrix(0.98480776,-0.17364817,0.17364817,0.98480776,0,0)"
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4469"
+ width="0.5"
+ height="7"
+ x="-0.25000167"
+ y="-42"
+ inkscape:transform-center-y="-37.915098" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4473"
+ width="0.5"
+ height="4"
+ x="-0.24999999"
+ y="-39"
+ inkscape:transform-center-y="-35.739256"
+ transform="matrix(0.96592583,0.25881904,-0.25881904,0.96592583,0,0)"
+ inkscape:transform-center-x="-9.5763045" />
+ <rect
+ inkscape:transform-center-x="-15.636876"
+ transform="matrix(0.90630779,0.42261826,-0.42261826,0.90630779,0,0)"
+ inkscape:transform-center-y="-33.533388"
+ y="-39"
+ x="-0.24999994"
+ height="4"
+ width="0.5"
+ id="rect4475"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4477"
+ width="0.5"
+ height="4"
+ x="-0.24999994"
+ y="-39"
+ inkscape:transform-center-y="-30.308626"
+ transform="matrix(0.81915205,0.57357643,-0.57357643,0.81915205,0,0)"
+ inkscape:transform-center-x="-21.222328" />
+ <rect
+ inkscape:transform-center-x="-26.162951"
+ transform="matrix(0.70710679,0.70710678,-0.70710678,0.70710679,0,0)"
+ inkscape:transform-center-y="-26.162951"
+ y="-39"
+ x="-0.24999991"
+ height="4"
+ width="0.5"
+ id="rect4479"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4481"
+ width="0.5"
+ height="4"
+ x="-0.24999993"
+ y="-39"
+ inkscape:transform-center-y="-21.222328"
+ transform="matrix(0.57357644,0.81915204,-0.81915204,0.57357644,0,0)"
+ inkscape:transform-center-x="-30.308626" />
+ <rect
+ inkscape:transform-center-x="-33.533388"
+ transform="matrix(0.42261827,0.90630778,-0.90630778,0.42261827,0,0)"
+ inkscape:transform-center-y="-15.636876"
+ y="-39"
+ x="-0.24999987"
+ height="4"
+ width="0.5"
+ id="rect4483"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4485"
+ width="0.5"
+ height="4"
+ x="-0.24999985"
+ y="-39"
+ inkscape:transform-center-y="-9.5763052"
+ transform="matrix(0.25881906,0.96592582,-0.96592582,0.25881906,0,0)"
+ inkscape:transform-center-x="-35.739255" />
+ <rect
+ inkscape:transform-center-x="-36.859204"
+ transform="matrix(0.08715576,0.9961947,-0.9961947,0.08715576,0,0)"
+ inkscape:transform-center-y="-3.2247632"
+ y="-39"
+ x="-0.24999991"
+ height="4"
+ width="0.5"
+ id="rect4487"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4489"
+ width="0.5"
+ height="4"
+ x="-0.2499999"
+ y="-39"
+ inkscape:transform-center-y="3.2247619"
+ transform="matrix(-0.08715573,0.9961947,-0.9961947,-0.08715573,0,0)"
+ inkscape:transform-center-x="-36.859204" />
+ <rect
+ inkscape:transform-center-x="-35.739256"
+ transform="matrix(-0.25881903,0.96592583,-0.96592583,-0.25881903,0,0)"
+ inkscape:transform-center-y="9.576304"
+ y="-39"
+ x="-0.24999988"
+ height="4"
+ width="0.5"
+ id="rect4491"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4493"
+ width="0.5"
+ height="4"
+ x="-0.24999984"
+ y="-39"
+ inkscape:transform-center-y="15.636875"
+ transform="matrix(-0.42261825,0.90630779,-0.90630779,-0.42261825,0,0)"
+ inkscape:transform-center-x="-33.533388" />
+ <rect
+ inkscape:transform-center-x="-30.308626"
+ transform="matrix(-0.57357643,0.81915205,-0.81915205,-0.57357643,0,0)"
+ inkscape:transform-center-y="21.222328"
+ y="-39"
+ x="-0.2499999"
+ height="4"
+ width="0.5"
+ id="rect4495"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4497"
+ width="0.5"
+ height="4"
+ x="-0.24999987"
+ y="-39"
+ inkscape:transform-center-y="26.162951"
+ transform="matrix(-0.70710678,0.70710679,-0.70710679,-0.70710678,0,0)"
+ inkscape:transform-center-x="-26.162951" />
+ <rect
+ inkscape:transform-center-x="-21.222328"
+ transform="matrix(-0.81915204,0.57357644,-0.57357644,-0.81915204,0,0)"
+ inkscape:transform-center-y="30.308626"
+ y="-39"
+ x="-0.24999988"
+ height="4"
+ width="0.5"
+ id="rect4499"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4501"
+ width="0.5"
+ height="4"
+ x="-0.24999982"
+ y="-39"
+ inkscape:transform-center-y="33.533388"
+ transform="matrix(-0.90630778,0.42261827,-0.42261827,-0.90630778,0,0)"
+ inkscape:transform-center-x="-15.636876" />
+ <rect
+ inkscape:transform-center-x="-9.5763052"
+ transform="matrix(-0.96592582,0.25881906,-0.25881906,-0.96592582,0,0)"
+ inkscape:transform-center-y="35.739255"
+ y="-39"
+ x="-0.24999981"
+ height="4"
+ width="0.5"
+ id="rect4503"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4505"
+ width="0.5"
+ height="4"
+ x="-0.24999987"
+ y="-39"
+ inkscape:transform-center-y="36.859204"
+ transform="matrix(-0.9961947,0.08715576,-0.08715576,-0.9961947,0,0)"
+ inkscape:transform-center-x="-3.2247632" />
+ <rect
+ inkscape:transform-center-x="3.2247619"
+ transform="matrix(-0.9961947,-0.08715573,0.08715573,-0.9961947,0,0)"
+ inkscape:transform-center-y="36.859204"
+ y="-39"
+ x="-0.24999985"
+ height="4"
+ width="0.5"
+ id="rect4507"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4509"
+ width="0.5"
+ height="4"
+ x="-0.24999984"
+ y="-39"
+ inkscape:transform-center-y="35.739256"
+ transform="matrix(-0.96592583,-0.25881903,0.25881903,-0.96592583,0,0)"
+ inkscape:transform-center-x="9.576304" />
+ <rect
+ inkscape:transform-center-x="15.636875"
+ transform="matrix(-0.90630779,-0.42261825,0.42261825,-0.90630779,0,0)"
+ inkscape:transform-center-y="33.533388"
+ y="-39"
+ x="-0.24999979"
+ height="4"
+ width="0.5"
+ id="rect4511"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4513"
+ width="0.5"
+ height="4"
+ x="-0.24999985"
+ y="-39"
+ inkscape:transform-center-y="30.308626"
+ transform="matrix(-0.81915205,-0.57357643,0.57357643,-0.81915205,0,0)"
+ inkscape:transform-center-x="21.222328" />
+ <rect
+ inkscape:transform-center-x="26.162951"
+ transform="matrix(-0.70710679,-0.70710678,0.70710678,-0.70710679,0,0)"
+ inkscape:transform-center-y="26.162951"
+ y="-39"
+ x="-0.24999982"
+ height="4"
+ width="0.5"
+ id="rect4515"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4517"
+ width="0.5"
+ height="4"
+ x="-0.24999984"
+ y="-39"
+ inkscape:transform-center-y="21.222328"
+ transform="matrix(-0.57357644,-0.81915204,0.81915204,-0.57357644,0,0)"
+ inkscape:transform-center-x="30.308626" />
+ <rect
+ inkscape:transform-center-x="33.533388"
+ transform="matrix(-0.42261827,-0.90630778,0.90630778,-0.42261827,0,0)"
+ inkscape:transform-center-y="15.636876"
+ y="-39"
+ x="-0.24999979"
+ height="4"
+ width="0.5"
+ id="rect4519"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4521"
+ width="0.5"
+ height="4"
+ x="-0.24999978"
+ y="-39"
+ inkscape:transform-center-y="9.5763052"
+ transform="matrix(-0.25881906,-0.96592582,0.96592582,-0.25881906,0,0)"
+ inkscape:transform-center-x="35.739255" />
+ <rect
+ inkscape:transform-center-x="36.859204"
+ transform="matrix(-0.08715576,-0.9961947,0.9961947,-0.08715576,0,0)"
+ inkscape:transform-center-y="3.2247632"
+ y="-39"
+ x="-0.24999984"
+ height="4"
+ width="0.5"
+ id="rect4523"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4525"
+ width="0.5"
+ height="4"
+ x="-0.24999982"
+ y="-39"
+ inkscape:transform-center-y="-3.2247619"
+ transform="matrix(0.08715573,-0.9961947,0.9961947,0.08715573,0,0)"
+ inkscape:transform-center-x="36.859204" />
+ <rect
+ inkscape:transform-center-x="35.739256"
+ transform="matrix(0.25881903,-0.96592583,0.96592583,0.25881903,0,0)"
+ inkscape:transform-center-y="-9.576304"
+ y="-39"
+ x="-0.24999981"
+ height="4"
+ width="0.5"
+ id="rect4527"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4529"
+ width="0.5"
+ height="4"
+ x="-0.24999976"
+ y="-39"
+ inkscape:transform-center-y="-15.636875"
+ transform="matrix(0.42261825,-0.90630779,0.90630779,0.42261825,0,0)"
+ inkscape:transform-center-x="33.533388" />
+ <rect
+ inkscape:transform-center-x="30.308626"
+ transform="matrix(0.57357643,-0.81915205,0.81915205,0.57357643,0,0)"
+ inkscape:transform-center-y="-21.222328"
+ y="-39"
+ x="-0.24999982"
+ height="4"
+ width="0.5"
+ id="rect4531"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4533"
+ width="0.5"
+ height="4"
+ x="-0.24999979"
+ y="-39"
+ inkscape:transform-center-y="-26.162951"
+ transform="matrix(0.70710678,-0.70710679,0.70710679,0.70710678,0,0)"
+ inkscape:transform-center-x="26.162951" />
+ <rect
+ inkscape:transform-center-x="21.222328"
+ transform="matrix(0.81915204,-0.57357644,0.57357644,0.81915204,0,0)"
+ inkscape:transform-center-y="-30.308626"
+ y="-39"
+ x="-0.24999981"
+ height="4"
+ width="0.5"
+ id="rect4535"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4537"
+ width="0.5"
+ height="4"
+ x="-0.24999976"
+ y="-39"
+ inkscape:transform-center-y="-33.533388"
+ transform="matrix(0.90630778,-0.42261827,0.42261827,0.90630778,0,0)"
+ inkscape:transform-center-x="15.636876" />
+ <rect
+ inkscape:transform-center-x="9.5763052"
+ transform="matrix(0.96592582,-0.25881906,0.25881906,0.96592582,0,0)"
+ inkscape:transform-center-y="-35.739255"
+ y="-39"
+ x="-0.24999975"
+ height="4"
+ width="0.5"
+ id="rect4539"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect4541"
+ width="0.5"
+ height="4"
+ x="-0.24999981"
+ y="-39"
+ inkscape:transform-center-y="-36.859204"
+ transform="matrix(0.9961947,-0.08715576,0.08715576,0.9961947,0,0)"
+ inkscape:transform-center-x="3.2247632" />
+ <text
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,0,0)"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="0.0072135464"
+ y="-43.067314"
+ id="text4549"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="-39.786151"
+ inkscape:transform-center-x="-22.814931"><tspan
+ sodipodi:role="line"
+ id="tspan4551"
+ x="0.0072135464"
+ y="-43.067314">3</tspan></text>
+ <text
+ inkscape:transform-center-x="-39.651384"
+ inkscape:transform-center-y="-23.048351"
+ sodipodi:linespacing="125%"
+ id="text4553"
+ y="-43.116589"
+ x="-0.042062506"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,0,0)"><tspan
+ y="-43.116589"
+ x="-0.042062506"
+ id="tspan4555"
+ sodipodi:role="line">6</tspan></text>
+ <text
+ transform="matrix(0,1,-1,0,0,0)"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-0.10937481"
+ y="-43.134624"
+ id="text4557"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="-0.13476539"
+ inkscape:transform-center-x="-45.863281"><tspan
+ sodipodi:role="line"
+ id="tspan4559"
+ x="-0.10937481"
+ y="-43.134624">E</tspan></text>
+ <text
+ inkscape:transform-center-x="-39.786149"
+ inkscape:transform-center-y="22.81493"
+ sodipodi:linespacing="125%"
+ id="text4561"
+ y="-43.116589"
+ x="-0.17668717"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,0,0)"><tspan
+ y="-43.116589"
+ x="-0.17668717"
+ id="tspan4563"
+ sodipodi:role="line">12</tspan></text>
+ <text
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,0,0)"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-0.22596352"
+ y="-43.067314"
+ id="text4565"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="39.651385"
+ inkscape:transform-center-x="-23.048352"><tspan
+ sodipodi:role="line"
+ id="tspan4567"
+ x="-0.22596352"
+ y="-43.067314">15</tspan></text>
+ <text
+ inkscape:transform-center-x="-0.13476577"
+ inkscape:transform-center-y="45.863281"
+ sodipodi:linespacing="125%"
+ id="text4569"
+ y="-43"
+ x="-0.24399991"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ transform="scale(-1,-1)"><tspan
+ y="-43"
+ x="-0.24399991"
+ id="tspan4571"
+ sodipodi:role="line">S</tspan></text>
+ <text
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-0.22596374"
+ y="-42.932686"
+ id="text4573"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="39.786148"
+ inkscape:transform-center-x="22.814929"><tspan
+ sodipodi:role="line"
+ id="tspan4575"
+ x="-0.22596374"
+ y="-42.932686">21</tspan></text>
+ <text
+ inkscape:transform-center-x="39.651383"
+ inkscape:transform-center-y="23.048351"
+ sodipodi:linespacing="125%"
+ id="text4577"
+ y="-42.883411"
+ x="-0.17668764"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)"><tspan
+ y="-42.883411"
+ x="-0.17668764"
+ id="tspan4579"
+ sodipodi:role="line">24</tspan></text>
+ <text
+ transform="matrix(0,-1,1,0,0,0)"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-0.10937551"
+ y="-42.865376"
+ id="text4581"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="0.13476589"
+ inkscape:transform-center-x="45.863281"><tspan
+ sodipodi:role="line"
+ id="tspan4583"
+ x="-0.10937551"
+ y="-42.865376">W</tspan></text>
+ <text
+ inkscape:transform-center-x="39.786149"
+ inkscape:transform-center-y="-22.81493"
+ sodipodi:linespacing="125%"
+ id="text4585"
+ y="-42.883411"
+ x="-0.042063359"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)"><tspan
+ y="-42.883411"
+ x="-0.042063359"
+ id="tspan4587"
+ sodipodi:role="line">30</tspan></text>
+ <text
+ transform="matrix(0.8660254,-0.5,0.5,0.8660254,0,0)"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="0.0072127138"
+ y="-42.932686"
+ id="text4589"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="-39.651382"
+ inkscape:transform-center-x="23.04835"><tspan
+ sodipodi:role="line"
+ id="tspan4591"
+ x="0.0072127138"
+ y="-42.932686">33</tspan></text>
+ </g>
+ <g
+ id="fixed">
+ <path
+ sodipodi:type="arc"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none"
+ id="path3018"
+ sodipodi:cx="660"
+ sodipodi:cy="592.36218"
+ sodipodi:rx="380"
+ sodipodi:ry="380"
+ d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
+ transform="matrix(0.09210526,0,0,0.09210526,-60.789473,-54.559673)" />
+ <path
+ id="path3085"
+ d="m -15,-20 c -2.761424,0 -5,2.238576 -5,5 0,2.761424 2.238576,5 5,5 2.761424,0 5,-2.238576 5,-5 0,-2.761424 -2.238576,-5 -5,-5 z m 0,0.5 c 2.485281,0 4.5,2.014719 4.5,4.5 0,2.485281 -2.014719,4.5 -4.5,4.5 -2.485281,0 -4.5,-2.014719 -4.5,-4.5 0,-2.485281 2.014719,-4.5 4.5,-4.5 z"
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ d="m 15,-20 c -2.761424,0 -5,2.238576 -5,5 0,2.761424 2.238576,5 5,5 2.761424,0 5,-2.238576 5,-5 0,-2.761424 -2.238576,-5 -5,-5 z m 0,0.5 c 2.485281,0 4.5,2.014719 4.5,4.5 0,2.485281 -2.014719,4.5 -4.5,4.5 -2.485281,0 -4.5,-2.014719 -4.5,-4.5 0,-2.485281 2.014719,-4.5 4.5,-4.5 z"
+ id="path3093" />
+ <path
+ id="path3095"
+ d="m 15,10 c -2.761424,0 -5,2.238576 -5,5 0,2.761424 2.238576,5 5,5 2.761424,0 5,-2.238576 5,-5 0,-2.761424 -2.238576,-5 -5,-5 z m 0,0.5 c 2.485281,0 4.5,2.014719 4.5,4.5 0,2.485281 -2.014719,4.5 -4.5,4.5 -2.485281,0 -4.5,-2.014719 -4.5,-4.5 0,-2.485281 2.014719,-4.5 4.5,-4.5 z"
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#ff6600;fill-opacity:1;stroke:none"
+ d="m -15,10 c -2.761424,0 -5,2.238576 -5,5 0,2.761424 2.238576,5 5,5 2.761424,0 5,-2.238576 5,-5 0,-2.761424 -2.238576,-5 -5,-5 z m 0,0.5 c 2.485281,0 4.5,2.014719 4.5,4.5 0,2.485281 -2.014719,4.5 -4.5,4.5 -2.485281,0 -4.5,-2.014719 -4.5,-4.5 0,-2.485281 2.014719,-4.5 4.5,-4.5 z"
+ id="path3097" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3099"
+ d="M -11.558058,11.558058 11.558058,-11.558058"
+ style="fill:none;stroke:#ff6600;stroke-width:0.49999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3101"
+ d="M -11.558058,-11.558058 11.558058,11.558058"
+ style="fill:none;stroke:#ff6600;stroke-width:0.49999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:transform-center-y="-0.52004486"
+ transform="matrix(-1.6169678e-4,0.96137262,0.83266641,1.8669043e-4,-49.964312,26.269061)"
+ d="M -57.197225,63.122499 -59.901388,61.561249 -62.605551,60 l 2.704163,-1.56125 2.704164,-1.561249 0,3.122499 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="false"
+ sodipodi:arg2="2.0943952"
+ sodipodi:arg1="1.0471976"
+ sodipodi:r2="1.8027756"
+ sodipodi:r1="3.6055512"
+ sodipodi:cy="60"
+ sodipodi:cx="-59"
+ sodipodi:sides="3"
+ id="path3778"
+ style="fill:none;stroke:#ff6600;stroke-width:0.55884141;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="star" />
+ </g>
+ </g>
+</svg>
diff --git a/backend/public/images/leds/green-off.svg b/backend/public/images/leds/green-off.svg
new file mode 100644
index 0000000..1c227fd
--- /dev/null
+++ b/backend/public/images/leds/green-off.svg
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="red-off.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient3803"
+ inkscape:collect="always">
+ <stop
+ id="stop3805"
+ offset="0"
+ style="stop-color:#cfcfcf;stop-opacity:0.51141554" />
+ <stop
+ id="stop3807"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.04109589" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3891">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.26940638"
+ offset="0"
+ id="stop3893" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15525115"
+ offset="1"
+ id="stop3895" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3883">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.02283105"
+ offset="0"
+ id="stop3885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3887" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3849">
+ <stop
+ id="stop3851"
+ offset="0"
+ style="stop-color:#00ac00;stop-opacity:1" />
+ <stop
+ id="stop3853"
+ offset="1"
+ style="stop-color:#8cff00;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3809" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.25"
+ offset="1"
+ id="stop3811" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3787">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop3789" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="1"
+ id="stop3791" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3777">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3779" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ offset="1"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3777"
+ id="linearGradient3783"
+ x1="16.608555"
+ y1="18.651081"
+ x2="75.365089"
+ y2="69.463295"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3787"
+ id="radialGradient3793"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0026007,0.01478583,-0.01619592,1.0982174,0.55265642,-4.8228038)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3891"
+ id="linearGradient3901"
+ x1="10.083722"
+ y1="34.833542"
+ x2="44.591557"
+ y2="14.1497"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3807"
+ id="radialGradient3794"
+ gradientUnits="userSpaceOnUse"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3803"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)"
+ x1="-11.46802"
+ y1="62.658627"
+ x2="53.882328"
+ y2="18.582912" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.34375"
+ inkscape:cx="4.4967747"
+ inkscape:cy="30.440278"
+ inkscape:current-layer="layer2"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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>
+ <g
+ id="layer1"
+ inkscape:label="background"
+ inkscape:groupmode="layer"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path2993"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)" />
+ <path
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3771"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3785"
+ style="fill:url(#radialGradient3793);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3783)"
+ id="path3775"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)" />
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3795"
+ style="fill:#46ff00;fill-opacity:0;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="color"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3773"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="reflection"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3805"
+ style="fill:url(#radialGradient3794);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 13.661019,17.992002 c -2.716552,0 -5.3380492,0.375822 -7.8315903,1.074244 -1.8971123,3.856752 -2.9801626,8.198554 -2.9801626,12.786977 0,16.017772 12.9868349,29.004607 29.0046069,29.004607 2.703688,0 5.313926,-0.382194 7.796937,-1.074245 1.910078,-3.867248 3.014816,-8.21652 3.014816,-12.82163 0,-16.017772 -12.986835,-28.969953 -29.004607,-28.969953 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3901);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 31.853873,2.8486171 c -4.086863,0 -7.978121,0.8657411 -11.504814,2.3910608 2.453382,-0.6830778 5.034928,-1.0742447 7.692978,-1.0742447 16.52263,0 29.905586,14.0815598 29.905586,31.4303198 0,5.007819 -1.133611,9.729358 -3.118775,13.930528 3.772658,-4.895422 6.029632,-11.014661 6.029632,-17.673058 0,-16.017771 -12.986835,-29.0046059 -29.004607,-29.0046059 z"
+ id="path3857"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/images/leds/green-on.svg b/backend/public/images/leds/green-on.svg
new file mode 100644
index 0000000..c358e3a
--- /dev/null
+++ b/backend/public/images/leds/green-on.svg
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="green-other.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient3803"
+ inkscape:collect="always">
+ <stop
+ id="stop3805"
+ offset="0"
+ style="stop-color:#cfcfcf;stop-opacity:0.51141554" />
+ <stop
+ id="stop3807"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.04109589" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3891">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.26940638"
+ offset="0"
+ id="stop3893" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15525115"
+ offset="1"
+ id="stop3895" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3883">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.02283105"
+ offset="0"
+ id="stop3885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3887" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3849">
+ <stop
+ id="stop3851"
+ offset="0"
+ style="stop-color:#00ac00;stop-opacity:1" />
+ <stop
+ id="stop3853"
+ offset="1"
+ style="stop-color:#8cff00;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3809" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.5"
+ offset="1"
+ id="stop3811" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3787">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop3789" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="1"
+ id="stop3791" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3777">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3779" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ offset="1"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3777"
+ id="linearGradient3783"
+ x1="16.608555"
+ y1="18.651081"
+ x2="75.365089"
+ y2="69.463295"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3787"
+ id="radialGradient3793"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0026007,0.01478583,-0.01619592,1.0982174,0.55265642,-4.8228038)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3891"
+ id="linearGradient3901"
+ x1="10.083722"
+ y1="34.833542"
+ x2="44.591557"
+ y2="14.1497"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3807"
+ id="radialGradient3794"
+ gradientUnits="userSpaceOnUse"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientTransform="matrix(1.8217016,0,0,1.8217016,-39.564835,-34.392156)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3803"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)"
+ x1="-11.46802"
+ y1="62.658627"
+ x2="53.882328"
+ y2="18.582912" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.34375"
+ inkscape:cx="25.192171"
+ inkscape:cy="36.435594"
+ inkscape:current-layer="layer3"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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 />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="background"
+ inkscape:groupmode="layer"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path2993"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)" />
+ <path
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3771"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3785"
+ style="fill:url(#radialGradient3793);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3783)"
+ id="path3775"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)" />
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3795"
+ style="fill:#46ff00;fill-opacity:0;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="color"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#07ff00;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3773"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="reflection"
+ style="display:inline">
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3805"
+ style="fill:url(#radialGradient3794);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 13.661019,17.992002 c -2.716552,0 -5.3380492,0.375822 -7.8315903,1.074244 -1.8971123,3.856752 -2.9801626,8.198554 -2.9801626,12.786977 0,16.017772 12.9868349,29.004607 29.0046069,29.004607 2.703688,0 5.313926,-0.382194 7.796937,-1.074245 1.910078,-3.867248 3.014816,-8.21652 3.014816,-12.82163 0,-16.017772 -12.986835,-28.969953 -29.004607,-28.969953 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3901);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 31.853873,2.8486171 c -4.086863,0 -7.978121,0.8657411 -11.504814,2.3910608 2.453382,-0.6830778 5.034928,-1.0742447 7.692978,-1.0742447 16.52263,0 29.905586,14.0815598 29.905586,31.4303198 0,5.007819 -1.133611,9.729358 -3.118775,13.930528 3.772658,-4.895422 6.029632,-11.014661 6.029632,-17.673058 0,-16.017771 -12.986835,-29.0046059 -29.004607,-29.0046059 z"
+ id="path3857"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/images/leds/none.svg b/backend/public/images/leds/none.svg
new file mode 100644
index 0000000..85bc475
--- /dev/null
+++ b/backend/public/images/leds/none.svg
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="green-other-off.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient3803"
+ inkscape:collect="always">
+ <stop
+ id="stop3805"
+ offset="0"
+ style="stop-color:#cfcfcf;stop-opacity:0.51141554" />
+ <stop
+ id="stop3807"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.04109589" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3891">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.26940638"
+ offset="0"
+ id="stop3893" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15525115"
+ offset="1"
+ id="stop3895" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3883">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.02283105"
+ offset="0"
+ id="stop3885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3887" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3849">
+ <stop
+ id="stop3851"
+ offset="0"
+ style="stop-color:#00ac00;stop-opacity:1" />
+ <stop
+ id="stop3853"
+ offset="1"
+ style="stop-color:#8cff00;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3809" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.5"
+ offset="1"
+ id="stop3811" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3787">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop3789" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="1"
+ id="stop3791" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3777">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3779" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ offset="1"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3777"
+ id="linearGradient3783"
+ x1="16.608555"
+ y1="18.651081"
+ x2="75.365089"
+ y2="69.463295"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3787"
+ id="radialGradient3793"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0026007,0.01478583,-0.01619592,1.0982174,0.55265642,-4.8228038)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3891"
+ id="linearGradient3901"
+ x1="10.083722"
+ y1="34.833542"
+ x2="44.591557"
+ y2="14.1497"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3807"
+ id="radialGradient3794"
+ gradientUnits="userSpaceOnUse"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientTransform="matrix(1.7287032,0,0,1.7287032,-35.086972,-30.499726)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3803"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)"
+ x1="-11.46802"
+ y1="62.658627"
+ x2="53.882328"
+ y2="18.582912" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.34375"
+ inkscape:cx="24.862874"
+ inkscape:cy="36.435594"
+ inkscape:current-layer="layer2"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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>
+ <g
+ id="layer1"
+ inkscape:label="background"
+ inkscape:groupmode="layer"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path2993"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)" />
+ <path
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3771"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3785"
+ style="fill:url(#radialGradient3793);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3783)"
+ id="path3775"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)" />
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3795"
+ style="fill:#46ff00;fill-opacity:0;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="color"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3773"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="reflection"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3805"
+ style="fill:url(#radialGradient3794);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 13.661019,17.992002 c -2.716552,0 -5.3380492,0.375822 -7.8315903,1.074244 -1.8971123,3.856752 -2.9801626,8.198554 -2.9801626,12.786977 0,16.017772 12.9868349,29.004607 29.0046069,29.004607 2.703688,0 5.313926,-0.382194 7.796937,-1.074245 1.910078,-3.867248 3.014816,-8.21652 3.014816,-12.82163 0,-16.017772 -12.986835,-28.969953 -29.004607,-28.969953 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3901);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 31.853873,2.8486171 c -4.086863,0 -7.978121,0.8657411 -11.504814,2.3910608 2.453382,-0.6830778 5.034928,-1.0742447 7.692978,-1.0742447 16.52263,0 29.905586,14.0815598 29.905586,31.4303198 0,5.007819 -1.133611,9.729358 -3.118775,13.930528 3.772658,-4.895422 6.029632,-11.014661 6.029632,-17.673058 0,-16.017771 -12.986835,-29.0046059 -29.004607,-29.0046059 z"
+ id="path3857"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/images/leds/red-off.svg b/backend/public/images/leds/red-off.svg
new file mode 100644
index 0000000..ecd3ca5
--- /dev/null
+++ b/backend/public/images/leds/red-off.svg
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="red-other.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient3803"
+ inkscape:collect="always">
+ <stop
+ id="stop3805"
+ offset="0"
+ style="stop-color:#cfcfcf;stop-opacity:0.51141554" />
+ <stop
+ id="stop3807"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.04109589" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3891">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.26940638"
+ offset="0"
+ id="stop3893" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15525115"
+ offset="1"
+ id="stop3895" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3883">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.02283105"
+ offset="0"
+ id="stop3885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3887" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3849">
+ <stop
+ id="stop3851"
+ offset="0"
+ style="stop-color:#00ac00;stop-opacity:1" />
+ <stop
+ id="stop3853"
+ offset="1"
+ style="stop-color:#8cff00;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3809" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.5"
+ offset="1"
+ id="stop3811" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3787">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop3789" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="1"
+ id="stop3791" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3777">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3779" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ offset="1"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3777"
+ id="linearGradient3783"
+ x1="16.608555"
+ y1="18.651081"
+ x2="75.365089"
+ y2="69.463295"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3787"
+ id="radialGradient3793"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0026007,0.01478583,-0.01619592,1.0982174,0.55265642,-4.8228038)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3891"
+ id="linearGradient3901"
+ x1="10.083722"
+ y1="34.833542"
+ x2="44.591557"
+ y2="14.1497"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3807"
+ id="radialGradient3794"
+ gradientUnits="userSpaceOnUse"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientTransform="matrix(1.7287032,0,0,1.7287032,-35.086972,-30.499726)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3803"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)"
+ x1="-11.46802"
+ y1="62.658627"
+ x2="53.882328"
+ y2="18.582912" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.34375"
+ inkscape:cx="24.862874"
+ inkscape:cy="36.435594"
+ inkscape:current-layer="layer2"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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>
+ <g
+ id="layer1"
+ inkscape:label="background"
+ inkscape:groupmode="layer"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path2993"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)" />
+ <path
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3771"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3785"
+ style="fill:url(#radialGradient3793);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3783)"
+ id="path3775"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)" />
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3795"
+ style="fill:#46ff00;fill-opacity:0;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="color"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#782121;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3773"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="reflection"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3805"
+ style="fill:url(#radialGradient3794);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 13.661019,17.992002 c -2.716552,0 -5.3380492,0.375822 -7.8315903,1.074244 -1.8971123,3.856752 -2.9801626,8.198554 -2.9801626,12.786977 0,16.017772 12.9868349,29.004607 29.0046069,29.004607 2.703688,0 5.313926,-0.382194 7.796937,-1.074245 1.910078,-3.867248 3.014816,-8.21652 3.014816,-12.82163 0,-16.017772 -12.986835,-28.969953 -29.004607,-28.969953 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3901);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 31.853873,2.8486171 c -4.086863,0 -7.978121,0.8657411 -11.504814,2.3910608 2.453382,-0.6830778 5.034928,-1.0742447 7.692978,-1.0742447 16.52263,0 29.905586,14.0815598 29.905586,31.4303198 0,5.007819 -1.133611,9.729358 -3.118775,13.930528 3.772658,-4.895422 6.029632,-11.014661 6.029632,-17.673058 0,-16.017771 -12.986835,-29.0046059 -29.004607,-29.0046059 z"
+ id="path3857"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/images/leds/red-on.svg b/backend/public/images/leds/red-on.svg
new file mode 100644
index 0000000..e7fffea
--- /dev/null
+++ b/backend/public/images/leds/red-on.svg
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="red-other.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient3803"
+ inkscape:collect="always">
+ <stop
+ id="stop3805"
+ offset="0"
+ style="stop-color:#cfcfcf;stop-opacity:0.51141554" />
+ <stop
+ id="stop3807"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.04109589" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3891">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.26940638"
+ offset="0"
+ id="stop3893" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15525115"
+ offset="1"
+ id="stop3895" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3883">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.02283105"
+ offset="0"
+ id="stop3885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3887" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3849">
+ <stop
+ id="stop3851"
+ offset="0"
+ style="stop-color:#00ac00;stop-opacity:1" />
+ <stop
+ id="stop3853"
+ offset="1"
+ style="stop-color:#8cff00;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3809" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.5"
+ offset="1"
+ id="stop3811" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3787">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop3789" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="1"
+ id="stop3791" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3777">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3779" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ offset="1"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3777"
+ id="linearGradient3783"
+ x1="16.608555"
+ y1="18.651081"
+ x2="75.365089"
+ y2="69.463295"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3787"
+ id="radialGradient3793"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0026007,0.01478583,-0.01619592,1.0982174,0.55265642,-4.8228038)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3891"
+ id="linearGradient3901"
+ x1="10.083722"
+ y1="34.833542"
+ x2="44.591557"
+ y2="14.1497"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3807"
+ id="radialGradient3794"
+ gradientUnits="userSpaceOnUse"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientTransform="matrix(1.7287032,0,0,1.7287032,-35.086972,-30.499726)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3803"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)"
+ x1="-11.46802"
+ y1="62.658627"
+ x2="53.882328"
+ y2="18.582912" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.34375"
+ inkscape:cx="24.862874"
+ inkscape:cy="36.435594"
+ inkscape:current-layer="layer2"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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>
+ <g
+ id="layer1"
+ inkscape:label="background"
+ inkscape:groupmode="layer"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path2993"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)" />
+ <path
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3771"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3785"
+ style="fill:url(#radialGradient3793);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3783)"
+ id="path3775"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)" />
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3795"
+ style="fill:#46ff00;fill-opacity:0;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="color"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3773"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="reflection"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3805"
+ style="fill:url(#radialGradient3794);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 13.661019,17.992002 c -2.716552,0 -5.3380492,0.375822 -7.8315903,1.074244 -1.8971123,3.856752 -2.9801626,8.198554 -2.9801626,12.786977 0,16.017772 12.9868349,29.004607 29.0046069,29.004607 2.703688,0 5.313926,-0.382194 7.796937,-1.074245 1.910078,-3.867248 3.014816,-8.21652 3.014816,-12.82163 0,-16.017772 -12.986835,-28.969953 -29.004607,-28.969953 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3901);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 31.853873,2.8486171 c -4.086863,0 -7.978121,0.8657411 -11.504814,2.3910608 2.453382,-0.6830778 5.034928,-1.0742447 7.692978,-1.0742447 16.52263,0 29.905586,14.0815598 29.905586,31.4303198 0,5.007819 -1.133611,9.729358 -3.118775,13.930528 3.772658,-4.895422 6.029632,-11.014661 6.029632,-17.673058 0,-16.017771 -12.986835,-29.0046059 -29.004607,-29.0046059 z"
+ id="path3857"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/images/leds/yellow-on.svg b/backend/public/images/leds/yellow-on.svg
new file mode 100644
index 0000000..3b271b0
--- /dev/null
+++ b/backend/public/images/leds/yellow-on.svg
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="red-other.svg">
+ <defs
+ id="defs2987">
+ <linearGradient
+ id="linearGradient3803"
+ inkscape:collect="always">
+ <stop
+ id="stop3805"
+ offset="0"
+ style="stop-color:#cfcfcf;stop-opacity:0.51141554" />
+ <stop
+ id="stop3807"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0.04109589" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3891">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.26940638"
+ offset="0"
+ id="stop3893" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.15525115"
+ offset="1"
+ id="stop3895" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3883">
+ <stop
+ style="stop-color:#000000;stop-opacity:0.02283105"
+ offset="0"
+ id="stop3885" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop3887" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3849">
+ <stop
+ id="stop3851"
+ offset="0"
+ style="stop-color:#00ac00;stop-opacity:1" />
+ <stop
+ id="stop3853"
+ offset="1"
+ style="stop-color:#8cff00;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3807">
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="0"
+ id="stop3809" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.5"
+ offset="1"
+ id="stop3811" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3787">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop3789" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="1"
+ id="stop3791" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3777">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop3779" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1"
+ offset="1"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3777"
+ id="linearGradient3783"
+ x1="16.608555"
+ y1="18.651081"
+ x2="75.365089"
+ y2="69.463295"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3787"
+ id="radialGradient3793"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0026007,0.01478583,-0.01619592,1.0982174,0.55265642,-4.8228038)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3891"
+ id="linearGradient3901"
+ x1="10.083722"
+ y1="34.833542"
+ x2="44.591557"
+ y2="14.1497"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3807"
+ id="radialGradient3794"
+ gradientUnits="userSpaceOnUse"
+ cx="48.149883"
+ cy="41.854801"
+ fx="48.149883"
+ fy="41.854801"
+ r="27.765808"
+ gradientTransform="matrix(1.7287032,0,0,1.7287032,-35.086972,-30.499726)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3803"
+ id="linearGradient3801"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1088977,0,0,1.1088977,-3.2150185,-2.383994)"
+ x1="-11.46802"
+ y1="62.658627"
+ x2="53.882328"
+ y2="18.582912" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="13.34375"
+ inkscape:cx="16.019783"
+ inkscape:cy="36.435594"
+ inkscape:current-layer="layer2"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1024"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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>
+ <g
+ id="layer1"
+ inkscape:label="background"
+ inkscape:groupmode="layer"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path2993"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)" />
+ <path
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3771"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(-1.1268556,0,0,1.1268556,86.070613,-15.351671)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3785"
+ style="fill:url(#radialGradient3793);fill-opacity:1;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3783)"
+ id="path3775"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0565207,0,0,1.0565207,82.725544,-12.366264)" />
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3795"
+ style="fill:#46ff00;fill-opacity:0;fill-rule:nonzero;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="color"
+ style="display:inline">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffd42a;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3773"
+ sodipodi:cx="48.149883"
+ sodipodi:cy="41.854801"
+ sodipodi:rx="27.765808"
+ sodipodi:ry="27.765808"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="reflection"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ transform="matrix(-1.0445488,0,0,1.0445488,82.149098,-11.865182)"
+ d="m 75.915691,41.854801 a 27.765808,27.765808 0 1 1 -55.531616,0 27.765808,27.765808 0 1 1 55.531616,0 z"
+ sodipodi:ry="27.765808"
+ sodipodi:rx="27.765808"
+ sodipodi:cy="41.854801"
+ sodipodi:cx="48.149883"
+ id="path3805"
+ style="fill:url(#radialGradient3794);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ style="fill:url(#linearGradient3801);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 13.661019,17.992002 c -2.716552,0 -5.3380492,0.375822 -7.8315903,1.074244 -1.8971123,3.856752 -2.9801626,8.198554 -2.9801626,12.786977 0,16.017772 12.9868349,29.004607 29.0046069,29.004607 2.703688,0 5.313926,-0.382194 7.796937,-1.074245 1.910078,-3.867248 3.014816,-8.21652 3.014816,-12.82163 0,-16.017772 -12.986835,-28.969953 -29.004607,-28.969953 z"
+ id="path3815"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:url(#linearGradient3901);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ d="m 31.853873,2.8486171 c -4.086863,0 -7.978121,0.8657411 -11.504814,2.3910608 2.453382,-0.6830778 5.034928,-1.0742447 7.692978,-1.0742447 16.52263,0 29.905586,14.0815598 29.905586,31.4303198 0,5.007819 -1.133611,9.729358 -3.118775,13.930528 3.772658,-4.895422 6.029632,-11.014661 6.029632,-17.673058 0,-16.017771 -12.986835,-29.0046059 -29.004607,-29.0046059 z"
+ id="path3857"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/images/logo.svg b/backend/public/images/logo.svg
new file mode 100644
index 0000000..eb38e8f
--- /dev/null
+++ b/backend/public/images/logo.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<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="64"
+ height="64"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="logo.svg"
+ viewBox="0 0 64 64">
+ <defs
+ id="defs2987" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="11.178414"
+ inkscape:cy="36.371776"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1029"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata2990">
+ <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>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#222222;fill-opacity:1;stroke:none"
+ id="rect3798"
+ width="64"
+ height="64"
+ x="0"
+ y="-2.6645353e-15" />
+ <path
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#f9f9f9"
+ d="m 15.863636,5.6278409 c -5.595824,0 -10.144886,4.5490621 -10.144886,10.1448861 0,5.595824 4.549062,10.144886 10.144886,10.144886 5.595824,0 10.144886,-4.549062 10.144886,-10.144886 0,-5.595824 -4.549062,-10.1448861 -10.144886,-10.1448861 z m 0,1.7765239 c 4.619372,0 8.368362,3.7489902 8.368362,8.3683622 0,4.619372 -3.74899,8.368362 -8.368362,8.368362 -4.619372,0 -8.3683621,-3.74899 -8.3683621,-8.368362 0,-4.619372 3.7489901,-8.3683622 8.3683621,-8.3683622 z"
+ id="path2993"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3008"
+ d="m 47.863636,5.6278409 c -5.595824,0 -10.144886,4.5490621 -10.144886,10.1448861 0,5.595824 4.549062,10.144886 10.144886,10.144886 5.595824,0 10.144886,-4.549062 10.144886,-10.144886 0,-5.595824 -4.549062,-10.1448861 -10.144886,-10.1448861 z m 0,1.7765239 c 4.619372,0 8.368362,3.7489902 8.368362,8.3683622 0,4.619372 -3.74899,8.368362 -8.368362,8.368362 -4.619372,0 -8.368362,-3.74899 -8.368362,-8.368362 0,-4.619372 3.74899,-8.3683622 8.368362,-8.3683622 z"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#f9f9f9" />
+ <path
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#f9f9f9"
+ d="m 47.863636,37.627841 c -5.595824,0 -10.144886,4.549062 -10.144886,10.144886 0,5.595824 4.549062,10.144886 10.144886,10.144886 5.595824,0 10.144886,-4.549062 10.144886,-10.144886 0,-5.595824 -4.549062,-10.144886 -10.144886,-10.144886 z m 0,1.776524 c 4.619372,0 8.368362,3.74899 8.368362,8.368362 0,4.619372 -3.74899,8.368362 -8.368362,8.368362 -4.619372,0 -8.368362,-3.74899 -8.368362,-8.368362 0,-4.619372 3.74899,-8.368362 8.368362,-8.368362 z"
+ id="path3010"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3012"
+ d="m 15.863636,37.627841 c -5.595824,0 -10.1448856,4.549062 -10.1448856,10.144886 0,5.595824 4.5490616,10.144886 10.1448856,10.144886 5.595824,0 10.144886,-4.549062 10.144886,-10.144886 0,-5.595824 -4.549062,-10.144886 -10.144886,-10.144886 z m 0,1.776524 c 4.619372,0 8.368362,3.74899 8.368362,8.368362 0,4.619372 -3.74899,8.368362 -8.368362,8.368362 -4.619372,0 -8.3683616,-3.74899 -8.3683616,-8.368362 0,-4.619372 3.7489896,-8.368362 8.3683616,-8.368362 z"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#f9f9f9" />
+ <path
+ style="fill:#f9f9f9;stroke:#f9f9f9;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 22.454545,22.090909 41.363636,41"
+ id="path3014"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#f9f9f9;stroke:#f9f9f9;stroke-width:1.79999995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 22.090909,41.090909 19,-19"
+ id="path3016"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/backend/public/stylesheets/main.css b/backend/public/stylesheets/main.css
new file mode 100644
index 0000000..24fb7bc
--- /dev/null
+++ b/backend/public/stylesheets/main.css
@@ -0,0 +1,66 @@
+@font-face {
+ font-family: ds-digi;
+ src: url('../fonts/ds-digi.ttf')
+}
+
+nav.side {
+ position: absolute;
+ left: 0;
+ width: 15%;
+ height: 100%;
+ background: #FFFFCC;
+ border: 1px solid #969696;
+ box-sizing: border-box;
+ -moz-box-sizing:border-box;
+}
+
+.status-table {
+ border-collapse: collapse;
+ background: #e5e5e5;
+ border: 1px solid #969696;
+ margin-right: 10px;
+}
+
+.status-table td {
+ padding: 10px;
+}
+
+
+.status {
+ font-size: 25px;
+ font-family: ds-digi;
+}
+
+.status.error {
+ color: #ff0000;
+}
+
+.status.critical {
+ animation-name: blinker;
+ animation-duration: 1s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+
+ -webkit-animation-name: blinker;
+ -webkit-animation-duration: 1s;
+ -webkit-animation-timing-function: linear;
+ -webkit-animation-iteration-count: infinite;
+}
+
+@-moz-keyframes blinker { /* Decimal not necessary, 0 and 1 is enough */
+ 0% { opacity: 1.0; }
+ 50% { opacity: 0.0; }
+ 100% { opacity: 1.0; }
+}
+
+@-webkit-keyframes blinker {
+ 0% { opacity: 1.0; }
+ 50% { opacity: 0.0; }
+ 100% { opacity: 1.0; }
+}
+
+@keyframes blinker {
+ 0% { opacity: 1.0; }
+ 50% { opacity: 0.0; }
+ 100% { opacity: 1.0; }
+} \ No newline at end of file
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000..ed1de16
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,25 @@
+# sbt
+.cache
+.history/
+.lib/
+dist/*
+target/
+lib_managed/
+src_managed/
+project/boot/
+project/plugins/project/
+
+# scala-ide specific
+/.settings
+/.scala_dependencies
+/.project
+/.classpath
+/.cache
+/.history
+
+# general files
+/*.jar
+*.swp
+*.class
+*.log
+*~ \ No newline at end of file
diff --git a/frontend/src/main/scala/Frontend.scala b/frontend/src/main/scala/Frontend.scala
new file mode 100644
index 0000000..33ae87b
--- /dev/null
+++ b/frontend/src/main/scala/Frontend.scala
@@ -0,0 +1,36 @@
+
+
+import scala.scalajs.js
+import js.annotation.JSExport
+import org.scalajs.dom
+
+@JSExport
+class Frontend(attitudeSelector: String, azimuthSelector: String) {
+
+ val svg = dom.document.querySelector(attitudeSelector).asInstanceOf[dom.HTMLObjectElement]
+ val svg2 = dom.document.querySelector(azimuthSelector).asInstanceOf[dom.HTMLObjectElement]
+ var svgDoc = svg.contentDocument;
+ var svgDoc2 = svg2.contentDocument;
+
+ @JSExport
+ def main() = {
+ dom.setInterval(() => foo, 50)
+ }
+
+ var a = 0.0
+ var r = 0.0
+ var p = 0.0
+ def foo() = {
+ a += 3
+ r += 0.05
+ p += 0.1
+ var roll = svgDoc.getElementById("roll");
+ var pitch = svgDoc.getElementById("pitch");
+ pitch.setAttribute("transform", "translate(0, " + 30 * math.sin(p) + ")");
+ roll.setAttribute("transform", "rotate(" + 60 * math.sin(r) + ")");
+
+ var azimuth = svgDoc2.getElementById("heading");
+ azimuth.setAttribute("transform", "rotate(" + a + ")");
+ }
+
+} \ No newline at end of file
diff --git a/project/Build.scala b/project/Build.scala
new file mode 100644
index 0000000..af78ff5
--- /dev/null
+++ b/project/Build.scala
@@ -0,0 +1,66 @@
+import sbt._
+import sbt.Keys._
+import play._
+import play.PlayImport.PlayKeys._
+import scala.scalajs.sbtplugin.ScalaJSPlugin
+import scala.scalajs.sbtplugin.ScalaJSPlugin.ScalaJSKeys._
+
+
+object ApplicationBuild extends Build {
+
+ val common = Seq(
+ scalaVersion := "2.11.2",
+ scalacOptions ++= Seq("-feature")
+ )
+
+ lazy val root = Project("root", file(".")).aggregate(
+ backend,
+ frontend
+ )
+
+ lazy val backend = (
+ Project("vfd-backend", file("backend"))
+ enablePlugins(PlayScala)
+ settings(common: _*)
+ settings(
+ libraryDependencies ++= Dependencies.backend
+ )
+ dependsOnJs(frontend)
+ )
+
+ lazy val frontend = (
+ Project("vfd-frontend", file("frontend"))
+ settings(ScalaJSPlugin.scalaJSSettings: _*)
+ settings(common: _*)
+ settings(
+ libraryDependencies ++= Dependencies.frontend
+ )
+ )
+
+
+
+ implicit class ScalaJSPlayProject(val project: Project) {
+ def dependsOnJs(reference: Project): Project = project.settings(
+ resourceGenerators in Compile += Def.task{
+ val outDir: File = (resourceManaged in Compile).value / "public" / "lib"
+
+ val optimized: Seq[File] = (fastOptJS in (reference, Compile)).value.allCode.map(_.path).map(file(_))
+
+ val outFiles = optimized.map(file => outDir / file.name)
+
+ for ((opt, out) <- optimized zip outFiles) {
+ if (!out.exists || out.lastModified < opt.lastModified) {
+ IO.copyFile(opt, out, true)
+ val map = opt.getParentFile / (out.name + ".map")
+ IO.copyFile(map, outDir / map.name)
+ }
+ }
+ outFiles
+ }.taskValue,
+ playMonitoredFiles ++= (watchSources in reference).value.map(_.getCanonicalPath)
+ )
+ }
+
+
+
+} \ No newline at end of file
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
new file mode 100644
index 0000000..17c96f1
--- /dev/null
+++ b/project/Dependencies.scala
@@ -0,0 +1,19 @@
+import sbt._
+import scala.scalajs.sbtplugin.ScalaJSPlugin._
+
+object Dependencies {
+
+ val flow = "org.github.jodersky" %% "flow" % "2.0.5"
+ val flowNative = "org.github.jodersky" % "flow-native" % "2.0.5"
+
+ val dom = "org.scala-lang.modules.scalajs" %%%! "scalajs-dom" % "0.6"
+ val rx = "com.scalarx" %%%! "scalarx" % "0.2.5"
+
+ val bootstrap = "org.webjars" % "bootstrap" % "3.2.0"
+ val fontawesome = "org.webjars" % "font-awesome" % "4.2.0"
+ val jquery = "org.webjars" % "jquery" % "2.1.1"
+
+
+ def backend = Seq(bootstrap, fontawesome, jquery)
+ def frontend = Seq(dom, rx)
+} \ No newline at end of file
diff --git a/project/build.properties b/project/build.properties
new file mode 100644
index 0000000..be6c454
--- /dev/null
+++ b/project/build.properties
@@ -0,0 +1 @@
+sbt.version=0.13.5
diff --git a/project/plugins.sbt b/project/plugins.sbt
new file mode 100644
index 0000000..2c768c0
--- /dev/null
+++ b/project/plugins.sbt
@@ -0,0 +1,7 @@
+resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
+
+// The Play plugin
+addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.4")
+
+// Scala.js plugin
+addSbtPlugin("org.scala-lang.modules.scalajs" % "scalajs-sbt-plugin" % "0.5.5") \ No newline at end of file